Instruction RPG full free · IBM i (AS/400) · Lecture de fichiers
READE
Lire le suivant à clé égale
Lit l'enregistrement suivant seulement s'il a la même clé que celle donnée, et signale la fin du groupe dans le cas contraire.
Syntaxe
READE clé fichier;
READE clé format;
clé- La clé à comparer : une zone ou un littéral entre parenthèses. Elle peut être partielle : la ville seule suffit quand l'index est sur ville puis numéro.
fichier ou format- Le fichier ou le format d'enregistrement lu.
- Effet
- Positionne
%EOF(fichier)à vrai quand l'enregistrement suivant n'a pas cette clé, ou en fin de fichier ; à faux quand la lecture réussit et que les zones sont chargées.
À quoi ça sert
READE sert à lire tout un groupe : les lignes d'une commande, les clients d'une ville, les échéances d'un contrat. Après un SETLL sur la clé, on boucle jusqu'à ce que %EOF vaille 1.
On l'utilise avec un index (ici CLIENTV, trié sur ville puis numéro) pour retrouver tous les enregistrements d'une valeur sans comparer soi-même la zone à chaque lecture.
Exemple 1 : Les clients d'une ville
**free
// READE : lire tous les clients d une ville (cle partielle) avec l index CLIENTV.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);
dcl-f clientv keyed extdesc('JOBIRPG/CLIENTV') extfile(*extdesc);
dcl-s cible char(20) inz('Lyon');
setll cible clientv;
reade cible clientv;
dow not %eof(clientv);
snd-msg '[' + %char(numcli) + '] [' + %trim(nom) + '] [' + %trim(ville) + ']';
reade cible clientv;
enddo;
snd-msg 'Fin des clients de [' + %trim(cible) + '] : eof=' + %char(%eof(clientv));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
[200] [Martin et fils] [Lyon]
[500] [Petit Atelier] [Lyon]
Fin des clients de [Lyon] : eof=1
L'index CLIENTV est trié sur ville puis numéro. SETLL se place avant les clients de Lyon, puis READE en rend deux, dans l'ordre des numéros, et s'arrête au premier client d'une autre ville. La clé est partielle : la ville seule suffit.
Exemple 2 : Oublier le SETLL
**free
// READE sans SETLL : lit a partir de la position courante, pas du debut de la cle.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);
dcl-f clientv keyed extdesc('JOBIRPG/CLIENTV') extfile(*extdesc);
// Fichier tout juste ouvert : on est au debut de l index
reade ('Lyon') clientv;
snd-msg 'Sans SETLL : eof=' + %char(%eof(clientv)) + ' [' + %trim(nom) + ']';
// Avec SETLL, on est bien au debut des clients de Lyon
setll ('Lyon') clientv;
reade ('Lyon') clientv;
snd-msg 'Avec SETLL : eof=' + %char(%eof(clientv)) + ' [' + %trim(nom) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Sans SETLL : eof=1 []
Avec SETLL : eof=0 [Martin et fils]
Fichier tout juste ouvert, on est au début de l'index : READE lit un enregistrement qui n'est pas de Lyon et met %EOF à 1 ; le nom reste vide. Avec un SETLL préalable, le premier client de Lyon est bien lu.
Le piège
READE ne se positionne pas lui-même. Il lit à partir de la position courante et compare. Sans SETLL avant (deuxième exemple), il ne va pas chercher le début du groupe : %EOF vaut 1 dès la première lecture et la boucle ne tourne jamais. Faites toujours SETLL clé fichier; avant la première lecture.