> Tech > Trier un sous-fichier avec une file d’attente de données indexées : la version Cobol

Trier un sous-fichier avec une file d’attente de données indexées : la version Cobol

Tech - Par iTPro.fr - Publié le 24 juin 2010
email

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 gratuitement cette ressource

IBMi et Cloud : Table ronde Digitale

IBMi et Cloud : Table ronde Digitale

Comment faire évoluer son patrimoine IBMi en le rendant Cloud compatible ? Comment capitaliser sur des bases saines pour un avenir serein ? Faites le point et partagez l'expertise Hardis Group et IBM aux côtés de Florence Devambez, DSI d'Albingia.

Tech - Par iTPro.fr - Publié le 24 juin 2010