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
KLISTou 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
Ken 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
READqui suit lit le suivant). Sur un fichier en mise à jour (Uen colonne 15), l'enregistrement est aussi verrouillé jusqu'auUPDAT, auDELETou à la lecture suivante, sauf avecNen 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;