Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Lecture de fichiers

CHAIN

Lire un enregistrement par sa clé

Cherche dans un fichier indexé l'enregistrement dont la clé vaut le facteur 1 et le lit ; l'indicateur de la colonne 54-55 s'allume s'il n'existe pas.

Syntaxe

     C           clé       CHAINfichier              NR
     C           clé       CHAINformat               NR
Facteur 1 (18-27)
La clé cherchée : une zone, une constante nommée, une liste de clés KLIST ou un littéral. Sa longueur et son type doivent être ceux de la clé du fichier.
Facteur 2 (33-42)
Le fichier (spécification F avec K en colonne 31) ou l'un de ses formats d'enregistrement.
Indicateurs (54-55)
Obligatoire en RPG/400 (sans lui, le compilateur rejette la ligne : QRG5127, « Aucun indicateur résultant n'est défini pour l'opération »). Il s'allume quand aucun enregistrement n'a cette clé.
Indicateurs (56-57)
Facultatif : s'allume en cas d'erreur d'entrée-sortie (enregistrement verrouillé, fichier fermé…). Sans lui, une erreur arrête le programme.
Effet
Quand la clé existe, l'indicateur 54-55 est éteint et les zones du format sont chargées ; l'enregistrement devient la position courante du fichier (un READ qui suit lit le suivant). Sur un fichier en mise à jour (U en colonne 15), l'enregistrement est aussi verrouillé jusqu'au UPDAT, au DELET ou à la lecture suivante, sauf avec N en colonne 53.

À quoi ça sert

CHAIN est l'accès direct : on connaît le numéro du client, on veut sa fiche, sans parcourir le fichier. C'est l'opération la plus fréquente des programmes RPG III de gestion : afficher un client, contrôler qu'un article existe, retrouver une commande avant de la modifier.

Le fichier doit être déclaré indexé : K en colonne 31 de la spécification F pour un fichier décrit en externe (E en colonne 19).

Exemple 1 : Client trouvé, client absent

     H*  CHAIN : lire un client par sa cle, indicateur 99 = non trouve
     FCLIENT3 IF  E           K        DISK
     C*
     C*  Cle donnee par une zone
     C                     Z-ADD200       NUMERO  50
     C           NUMERO    CHAINCLIENT3              99
     C           *IN99     IFEQ '0'
     C           NOM       DSPLY
     C           VILLE     DSPLY
     C                     END
     C*
     C*  Client absent
     C                     Z-ADD999       NUMERO
     C           NUMERO    CHAINCLIENT3              99
     C           *IN99     IFEQ '1'
     C           'Absent'  DSPLY
     C                     END
     C*
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Martin et fils
Lyon
Absent

L'indicateur 99 en colonnes 54-55 donne le résultat : éteint, le client 200 est trouvé et ses zones NOM et VILLE sont chargées ; allumé, le client 999 n'existe pas. Le test *IN99 IFEQ '0' se fait juste après le CHAIN.

Exemple 2 : Après un échec, les zones ne bougent pas

     H*  CHAIN rate : les zones gardent l'enregistrement precedent
     FCLIENT3 IF  E           K        DISK
     C*
     C                     Z-ADD100       NUMERO  50
     C           NUMERO    CHAINCLIENT3              99
     C           NOM       DSPLY
     C*
     C*  Le client 999 n'existe pas : 99 s'allume...
     C                     Z-ADD999       NUMERO
     C           NUMERO    CHAINCLIENT3              99
     C           *IN99     IFEQ '1'
     C           'Absent'  DSPLY
     C                     END
     C*  ... mais NOM contient toujours le client 100
     C           NOM       DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Dupont SA
Absent
Dupont SA

Le second CHAIN échoue (99 allumé), mais NOM contient toujours « Dupont SA », le client lu avant. Un programme qui afficherait la zone sans tester l'indicateur montrerait le mauvais client.

Le piège

Un CHAIN raté ne vide pas les zones : elles gardent les valeurs de la dernière lecture réussie (deuxième exemple). Testez toujours l'indicateur avant d'utiliser les zones.

La clé littérale doit avoir la longueur de la clé du fichier. Avec 999 CHAIN CLIENT3, le compilateur refuse la ligne : QRG7078, « Longueur en Facteur 1 différente de celle de la 1ère zone clé du fichier », car le littéral fait 3 chiffres et NUMCLI 5. Passez par une zone de la bonne longueur (NUMERO 50 dans les exemples) ou une constante nommée.

En RPG ILE full free

En RPG ILE full free, l'indicateur disparaît : la clé est dans l'instruction et le résultat se teste avec %FOUND. Un littéral entre parenthèses est accepté quelle que soit sa longueur.

chain numero client3;
if %found(client3);
  dsply nom;
endif;
chain (999) client3;