Code opération RPG III / RPG/400 · IBM i (AS/400) · Lecture de fichiers
READ
Lire l'enregistrement suivant
Lit l'enregistrement qui suit la position courante du fichier ; l'indicateur de la colonne 58-59 s'allume quand il n'y en a plus.
Syntaxe
C READ fichier EF
C READ format EF
- Facteur 2 (33-42)
- Le fichier ou l'un de ses formats d'enregistrement. Le facteur 1 reste vide :
READne prend pas de clé (voirREADE). - Colonne 53
N: lecture sans verrouillage, utile sur un fichier en mise à jour quand on ne réécrira pas l'enregistrement.- Indicateurs (56-57)
- Facultatif : s'allume en cas d'erreur d'entrée-sortie. Il ne remplace pas l'indicateur de fin de fichier.
- Indicateurs (58-59)
- Fin de fichier. Obligatoire : sans lui, le compilateur rejette la ligne (
QRG5134, « Aucun indicateur résultant n'est défini pour l'opération »). Avec seulement l'indicateur d'erreur en 56-57, le résultat est le même. - Effet
- S'il reste un enregistrement, l'indicateur 58-59 est éteint et les zones du format sont chargées ; cet enregistrement devient la position courante. Sinon l'indicateur s'allume, les zones ne changent pas et le fichier reste en fin de fichier. Sur un fichier à accès par clé, l'ordre de lecture est celui des clés.
À quoi ça sert
READ est la lecture séquentielle : on traite un fichier du premier au dernier enregistrement. La boucle classique des programmes RPG III lit une première fois, puis DOWEQ '0' sur l'indicateur de fin de fichier, et relit à la fin de chaque tour.
Avec un fichier ouvert et jamais positionné, la lecture part du début. Pour commencer ailleurs, on se place d'abord avec SETLL ou SETGT (voir le troisième exemple).
Exemple 1 : Lire tout le fichier
H* READ : lire tout le fichier, fin de fichier en 58-59
FCLIENT3 IF E K DISK
C READ CLIENT3 99
C *IN99 DOWEQ'0'
C NOM DSPLY
C READ CLIENT3 99
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Dupont SA
Martin et fils
Leroy SARL
Bernard Transports
Petit Atelier
Une première lecture avant la boucle, une lecture en fin de tour : c'est l'indicateur 99 en colonnes 58-59 qui arrête la boucle. Les cinq clients sortent dans l'ordre de leur numéro.
Exemple 2 : READ après la fin de fichier
H* READ : apres la fin de fichier, un nouveau READ echoue encore
FCLIENT3 IF E K DISK
C READ CLIENT3 99
C *IN99 DOWEQ'0'
C READ CLIENT3 99
C END
C 'Fin' DSPLY
C NOM DSPLY
C MOVE '0' *IN99
C READ CLIENT3 99
C *IN99 IFEQ '1'
C 'Encore' DSPLY
C END
C NOM DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Fin
Petit Atelier
Encore
Petit Atelier
Quand la boucle s'arrête, 99 est allumé et NOM contient encore le dernier client lu (« Petit Atelier »). On éteint 99 et on relit : le fichier est toujours en fin, 99 se rallume sans erreur et la zone ne bouge pas.
Exemple 3 : Partir d'un point choisi
H* READ : SETLL pour choisir le point de depart de la lecture
FCLIENT3 IF E K DISK
C* Les clients de numero 300 et plus
C Z-ADD300 NUMERO 50
C NUMERO SETLLCLIENT3
C READ CLIENT3 99
C *IN99 DOWEQ'0'
C NOM DSPLY
C READ CLIENT3 99
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Leroy SARL
Bernard Transports
Petit Atelier
SETLL place le fichier sur la clé 300 ; le premier READ lit donc Leroy SARL et la boucle continue jusqu'à la fin. Les clients 100 et 200 ne sont pas lus.
Le piège
Sans indicateur en 58-59, la ligne est refusée : QRG5134, « Aucun indicateur résultant n'est défini pour l'opération ». Ajouter seulement l'indicateur d'erreur en 56-57 ne suffit pas.
Un READ raté ne vide pas les zones : elles gardent le dernier enregistrement lu (deuxième exemple). Un programme qui traite la zone sans tester l'indicateur traite deux fois le dernier client.
Un READ après la fin de fichier ne plante pas : il rallume simplement l'indicateur (deuxième exemple).
En RPG ILE full free
En RPG ILE full free, la fin de fichier se teste avec %EOF et le fichier est déclaré par DCL-F : plus d'indicateur ni de colonne 58-59.
read client3;
dow not %eof(client3);
dsply nom;
read client3;
enddo;