Aller au contenu

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

READP

Lire l'enregistrement précédent

Lit l'enregistrement qui précède la position courante du fichier ; l'indicateur de la colonne 58-59 s'allume au début du fichier.

Syntaxe

     C                     READPfichier                  BF
     C                     READPformat                   BF
Facteur 2 (33-42)
Le fichier ou l'un de ses formats d'enregistrement. Le facteur 1 reste vide.
Colonne 53
N : lecture sans verrouillage.
Indicateurs (56-57)
Facultatif : s'allume en cas d'erreur d'entrée-sortie.
Indicateurs (58-59)
Obligatoire (QRG5134 sinon) : s'allume quand il n'y a plus d'enregistrement avant la position courante (début de fichier).
Effet
S'il existe un enregistrement avant la position courante, l'indicateur est éteint et les zones sont chargées ; sinon il s'allume et les zones ne changent pas.

À quoi ça sert

READP lit le fichier à l'envers : du dernier client au premier, ou le client qui précède celui qu'on vient de retrouver. Pour partir de la fin, on se place après le dernier enregistrement avec SETGT *HIVAL.

Exemple 1 : Le fichier à l'envers

     H*  READP : lire le fichier a l'envers apres SETGT *HIVAL
     FCLIENT3 IF  E           K        DISK
     C           *HIVAL    SETGTCLIENT3
     C                     READPCLIENT3                  99
     C           *IN99     DOWEQ'0'
     C           NOM       DSPLY
     C                     READPCLIENT3                  99
     C                     END
     C                     SETON                     LR

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

Petit Atelier
Bernard Transports
Leroy SARL
Martin et fils
Dupont SA

SETGT *HIVAL place le fichier après le dernier enregistrement. Chaque READP recule d'un client : les cinq clients sortent du numéro 500 au numéro 100, puis 99 s'allume.

Exemple 2 : Le client qui précède, début de fichier

     H*  READP : lire l'enregistrement qui precede le client 300
     FCLIENT3 IF  E           K        DISK
     C                     Z-ADD300       NUMERO  50
     C           NUMERO    CHAINCLIENT3              99
     C           NOM       DSPLY
     C                     READPCLIENT3                  98
     C           *IN98     IFEQ '0'
     C           NOM       DSPLY
     C                     END
     C*  Du debut du fichier, rien ne precede
     C           *LOVAL    SETLLCLIENT3
     C                     READ CLIENT3                  97
     C           NOM       DSPLY
     C                     READPCLIENT3                  98
     C           *IN98     IFEQ '1'
     C           'Debut'   DSPLY
     C                     END
     C                     SETON                     LR

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

Leroy SARL
Martin et fils
Dupont SA
Debut

Après le CHAIN sur le client 300 (Leroy SARL), READP lit le client 200. Plus loin, après la lecture du premier client avec SETLL *LOVAL et READ, un READP allume l'indicateur : « Debut ».

Exemple 3 : Sans positionnement

     H*  READP : sans positionnement, le fichier est deja au debut
     FCLIENT3 IF  E           K        DISK
     C                     READPCLIENT3                  99
     C           *IN99     IFEQ '1'
     C           'Debut'   DSPLY
     C                     END
     C*  Il faut se placer d'abord pour lire a l'envers
     C           *HIVAL    SETGTCLIENT3
     C                     READPCLIENT3                  99
     C           NOM       DSPLY
     C                     SETON                     LR

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

Debut
Petit Atelier

Sur un fichier qui vient d'être ouvert, READP allume tout de suite l'indicateur (« Debut ») : il n'y a rien avant le premier enregistrement. Après SETGT *HIVAL, le même READP lit le dernier client, Petit Atelier.

Le piège

Il faut d'abord se positionner. Sans cela, READP ne lit rien (troisième exemple). Placez-vous avec SETGT *HIVAL pour lire depuis la fin, ou avec CHAIN, READ ou SETLL.

L'indicateur 58-59 est obligatoire comme pour READ : sans lui, QRG5134, « Aucun indicateur résultant n'est défini pour l'opération ».

En RPG ILE full free

En RPG ILE full free : READP et %EOF, qui vaut aussi pour le début de fichier.

setgt *hival client3;
readp client3;
dow not %eof(client3);
  dsply nom;
  readp client3;
enddo;