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.