par Ron Lee - Mis en ligne le 02/02/2005 - Publié en Mars 2004
Pendant longtemps, je me suis demandé s'il existait un moyen simple et efficace
de trier un sous-fichier. J'avais bien sûr essayé des tris bulle et des fichiers logiques
multiples, tout en pensant qu'il devait exister un meilleur moyen. Voilà quelques
années, j'ai participé à un projet dans lequel l'utilisateur devait pouvoir sélectionner
la colonne sous-fichier à trier et à classer (tri dans l'ordre décroissant) ...Grâce à
une entrée Series Network dans un forum, j'ai découvert les files d'attente de données
indexées. En utilisant une file d'attente de données indexées, j'ai pu transférer
le sous-fichier dans la file d'attente, le faire trier par le système puis le lire en
retour pour recharger le
sous-fichier. A cet effet,
j'ai utilisé trois API : QCL
RDTAQ — Clear Data
Queue, QRCVDTAQ —
Receive Data Queue, et
QSNDDTAQ — Send Data
Queue.
Cet article explique
comment trier/classer un
sous-fichier en utilisant
une file d'attente de données
indexées et signale
certains des pièges à éviter.
Les fragments de code
inclus sont en Cobol, mais
les programmeurs RPG
peuvent utiliser la même
technique. Nous allons
voir les points suivants :
- Créer la file d'attente de données indexées avec un programme CL
- Comment créer le fichier d'affichage
- Comment effacer, écrire dans et lire à partir de la file d'attente de données
indexées
- Comment trier et classer le sous-fichier
- Comment traiter les nombres négatifs
- Comment utiliser la file d'attente de
données indexées comme entré
Pour commencer, regardons l’écran
utilisé pour cet exemple (figure 1). On
utilise un sous-fichier pour afficher les
montants A/R (comptes client) current
(courant) et aged (anciens) dus par
point de vente. F6 imprime le contenu
du sous-fichier. F7 trie le sous-fichier
par colonne et F8 classe (c’est-à -dire,
trie en ordre décroissant) le sous-fichier
par colonne. L’utilisateur amène
le curseur sur la colonne à trier/classer
puis appuie sur F7 pour trier ou sur F8
pour classer.
La figure 2 est un fragment de code
CL qui montre comment créer la file
d’attente de données indexées. Dans
ce cas, je l’ai créée dans QTEMP afin
qu’un seul utilisateur puisse se servir
de la file d’attente. Il est important que
le paramètre MAXLEN soit exactement
de même longueur que l’enregistrement
du sous-fichier. Faute de quoi, on
obtiendra des résultats imprévisibles.
On constatera généralement la manifestation
suivante : le programme travaillera
sur la première tentative de tri
du sous-fichier, mais il vous déconnectera
du système à la deuxième tentative.
Si vous rencontrez des problèmes
inhabituels, commencez par vérifier le
paramètre MAXLEN. Vous pouvez obtenir
la longueur du sous-fichier à partir
du listing de compilation du fichier
d’affichage. Le *KEYED dans le paramètre
SEQ indique qu’il s’agit d’une
file d’attente de données indexées.
Faites en sorte que KEYLEN, la longueur
du champ clé, soit suffisant pour
le plus grand champ possible.
La figure 3 est un fragment de code
DSPF qui montre comment mettre en
place le DDS pour renvoyer le nom du
champ sur lequel le curseur est placé.L’instruction 0057 utilise le mot-clé
RTNCSRLOC pour renvoyer l’enregistrement,
le champ et la position du
curseur. La variable &CSRFLD contiendra
le nom du champ sur lequel se
trouve le curseur. Si le curseur n’est
pas placé sur un champ, &CSRFLD sera
vierge. Cette technique est très commode
pour de tels programmes et elle
est bien plus facile que d’essayer de
trouver la position du curseur par colonne
et par ligne.
Notez aussi qu’il s’agit d’un sous-fichier
dans lequel vous allez charger
toutes les données. Le SLFSIZ est supérieur
au SFLPAG. Examinez le motclé
SFLCSRRRN de l’instruction 0056.
Ce mot-clé renverra le numéro d’enregistrement
relatif (Relative Record
Number) dans le sous-fichier sur lequel
se trouve le curseur. Il n’est pas
utilisé pour le tri, mais dans ce programme
particulier, je l’utilise pour obtenir
le numéro d’outlet (point de
vente) de l’enregistrement de sous-fichier
sur lequel se trouve le curseur.
Cela est utilisé avec la touche de fonction
F13 pour afficher l’enregistrement
customer master (figure 1).
La figure 4 est un fragment de code
Cobol qui montre, dans Working-
Storage, les champs utilisés par les API
de la file d’attente de données indexées.
Les noms de la plupart des
champs sont suffisamment explicites,
mais voici une brève explication :
- DTAQ-NAME — nom de la file d’attente
de données.
- DTAQ-LIBRARY — nom de la bibliothèque
où la file d’attente de données
a été créée.
- DTAQ-SIZE — taille de l’enregistrement
de la file d’attente de données.
Répétons que ce doit être la même
taille que celle de l’enregistrement
du sous-fichier
- DTAQ-KEY-LENG — longueur du
champ de la file d’attente de données.
- DTAQ-WAIT — temps d’attente, en secondes, pour voir si la file d’attente
de données est vide. Zéro signifie
que l’attente est nulle.
- DTAQ-ORDER — utilisé avec DTAQKEY-
DATA pour explorer la file d’attente
de données. Dans ce cas, il n’y
aura pas d’exploration, donc ‘GE’ fera
l’affaire.
- DTAQ-KEY-DATA — pas utilisé ; laisser
vierge.
- DTAQ-SENDER-LENGTH — pas utilisé
; laisser zéro.
- DTAQ-SENDER-INFO — pas utilisé ;
laisser vierge.
- DTAQ-LENGTH-OF-DATA — longueur
des données reçues de la file
d’attente de données. Le champ est
renvoyé à partir de l’API QRCVDTAQ
et il est de valeur zéro quand la file
d’attente de données est vide.
- DTAQ-KEY-FIELD — champ clé qui
est transmis à l’API QSNDDTAQ. Les
champs Level-88 sont utilisés pour
traiter des champs numériques. Ce
point sera expliqué davantage quand
nous examinerons le code.
Téléchargez cette ressource
SMART DSI – N°36
La Revue SMART DSI, analyses et dossiers pour tous les acteurs de la transformation numérique de l'entreprise, met sa nouvelle édition en accès sur demande, gagnez en compétences et expertise IT Professionnelle, découvrez les dossiers experts.