Code opération RPG III / RPG/400 · IBM i (AS/400) · Lecture de fichiers
READE
Lire l'enregistrement suivant s'il a la même clé
Lit l'enregistrement suivant, mais seulement si sa clé égale le facteur 1 ; sinon l'indicateur de la colonne 58-59 s'allume.
Syntaxe
C cle READEfichier EF
C cle READEformat EF
- Facteur 1 (18-27)
- La clé de comparaison : une zone, une liste
KLISTou un littéral. Elle peut être partielle sur un fichier à clé composée (la ville seule pour une clé VILLE + NUMCLI). Sa longueur et son type doivent être ceux de la clé du fichier. - Facteur 2 (33-42)
- Le fichier ou l'un de ses formats d'enregistrement.
- Colonne 53
N: lecture sans verrouillage.- Indicateurs (56-57)
- Facultatif : s'allume en cas d'erreur d'entrée-sortie.
- Indicateurs (58-59)
- Obligatoire : s'allume quand il n'y a plus d'enregistrement de même clé, ou plus d'enregistrement du tout.
- Effet
- Si l'enregistrement suivant porte la clé du facteur 1, l'indicateur 58-59 est éteint et les zones sont chargées. Sinon il s'allume et les zones ne changent pas. Dans tous les cas la lecture part de la position courante : c'est un
SETLLqui l'a placée sur le premier enregistrement de la clé.
À quoi ça sert
READE sert à lire un groupe d'enregistrements qui partagent une clé : toutes les lignes d'une commande, tous les clients d'une ville. On se place avec SETLL sur la clé, puis on lit avec READE jusqu'à ce que l'indicateur s'allume.
C'est le couple classique SETLL + READE des programmes de gestion RPG III, sur un fichier logique trié par la zone voulue (ici CLIENT3V, clé VILLE puis NUMCLI).
Exemple 1 : Tous les clients d'une ville
H* READE : tous les clients d'une ville (SETLL puis READE)
FCLIENT3VIF E K DISK
C MOVEL'Lyon' CHERCH 20
C CHERCH SETLLCLIENT3V
C CHERCH READECLIENT3V 99
C *IN99 DOWEQ'0'
C NOM DSPLY
C CHERCH READECLIENT3V 99
C END
C 'Fini' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Martin et fils
Petit Atelier
Fini
SETLL place le fichier sur Lyon, puis READE lit Martin et fils et Petit Atelier. À la troisième lecture, l'enregistrement suivant est Montpellier : 99 s'allume et la boucle s'arrête. Les clients sortent dans l'ordre de leur numéro, deuxième zone de la clé.
Exemple 2 : Sans SETLL, la lecture part du début
H* READE : sans SETLL, la lecture part du debut du fichier
FCLIENT3VIF E K DISK
C MOVEL'Lyon' CHERCH 20
C* Premier enregistrement du fichier : Brest, pas Lyon
C CHERCH READECLIENT3V 99
C *IN99 IFEQ '1'
C 'Aucun' DSPLY
C END
C* Apres SETLL, les deux clients de Lyon sont lus
C CHERCH SETLLCLIENT3V
C CHERCH READECLIENT3V 99
C *IN99 IFEQ '0'
C NOM DSPLY
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Aucun
Martin et fils
Le fichier vient d'être ouvert : le premier enregistrement est un client de Brest, donc READE 'Lyon' allume 99 tout de suite (« Aucun »). Après le SETLL, le client de Lyon est lu.
Le piège
READE ne cherche pas, il compare l'enregistrement suivant. Sans SETLL préalable (deuxième exemple), le premier enregistrement du fichier n'a presque jamais la clé voulue et la fin de fichier arrive tout de suite.
Un littéral de longueur différente est refusé : 'Lyon' READE CLIENT3V donne QRG7078, « Longueur en Facteur 1 différente de celle de la 1ère zone clé du fichier ou de l'enreg. La spécification n'est pas prise en compte. », car VILLE fait 20 caractères. Utilisez une zone de 20 caractères alimentée par MOVEL.
En RPG ILE full free
En RPG ILE full free : READE avec la clé dans l'instruction, la fin de groupe se teste avec %EOF.
setll chercher client3v;
reade chercher client3v;
dow not %eof(client3v);
dsply nom;
reade chercher client3v;
enddo;