Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Lecture de fichiers

READP

Lire l'enregistrement précédent

Lit l'enregistrement qui précède la position courante, pour parcourir un fichier à rebours.

Syntaxe

READP fichier;
READP format;
fichier ou format
Le fichier ou le format d'enregistrement lu.
Effet
Positionne %EOF(fichier) à vrai quand il n'y a plus d'enregistrement avant la position courante (début du fichier dépassé), à faux sinon. Les zones sont chargées si la lecture réussit.

À quoi ça sert

READP est l'inverse de READ : il recule d'un enregistrement. On l'utilise pour afficher un fichier du plus récent au plus ancien, retrouver le dernier enregistrement d'une plage, ou implémenter la touche « page précédente » d'un sous-fichier.

Pour commencer par la fin, on se place après le dernier enregistrement avec SETLL *HIVAL.

Exemple 1 : Du dernier au premier

**free
// READP : lire le fichier a rebours, du dernier enregistrement vers le premier.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);

setll *hival client;
readp client;
dow not %eof(client);
  snd-msg '[' + %char(numcli) + '] [' + %trim(nom) + ']';
  readp client;
enddo;
snd-msg 'Debut du fichier atteint : eof=' + %char(%eof(client));

*inlr = *on;

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

[500] [Petit Atelier]
[400] [Bernard Transports]
[300] [Leroy SARL]
[200] [Martin et fils]
[100] [Dupont SA]
Debut du fichier atteint : eof=1

SETLL *HIVAL met la position après le dernier enregistrement ; chaque READP recule. Les clients sortent du 500 au 100, puis %EOF passe à 1 au-delà du début.

Exemple 2 : Ce que précède READP

**free
// READP : l enregistrement precedent celui de la cle positionnee.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);

// SETLL place sur le 300 : READP donne donc le 200
setll (300) client;
readp client;
snd-msg 'Avant le 300 : [' + %char(numcli) + '] [' + %trim(nom) + ']';

// CHAIN lit le 300 : READP donne alors le 200 aussi
chain (300) client;
readp client;
snd-msg 'Apres CHAIN 300 : [' + %char(numcli) + ']';

// Avant le premier enregistrement
setll (100) client;
readp client;
snd-msg 'Avant le 100 : eof=' + %char(%eof(client));

*inlr = *on;

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

Avant le 300 : [200] [Martin et fils]
Apres CHAIN 300 : [200]
Avant le 100 : eof=1

Après SETLL (300), READP donne le 200, c'est-à-dire l'enregistrement placé avant la clé, pas la clé elle-même. Après un CHAIN (300), qui lit le 300, il donne aussi le 200. Avant le 100, il n'y a rien : %EOF vaut 1.

Le piège

Après un SETLL, READP ne rend pas la clé cherchée. Il rend celle d'avant (deuxième exemple : le 200 après SETLL (300)), alors que READ donnerait le 300. Pour obtenir le dernier enregistrement dont la clé est inférieure ou égale à une valeur, utilisez SETGT puis READP.