Aller au contenu

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 : READ ne prend pas de clé (voir READE).
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;