Aller au contenu

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

READ

Lire l'enregistrement suivant

Lit l'enregistrement suivant d'un fichier, dans l'ordre de sa clé.

Syntaxe

READ fichier;
READ format;
fichier ou format
Le fichier déclaré par dcl-f (ou un de ses formats d'enregistrement). Pour un fichier avec keyed, l'ordre est celui de la clé.
Effet
Positionne %EOF(fichier) à vrai quand il n'y a plus d'enregistrement à lire, à faux sinon. Tant que la lecture réussit, les zones du format sont chargées.

À quoi ça sert

READ parcourt un fichier du début à la fin : traitement de masse, calcul de totaux, édition d'un état. Le schéma classique est une lecture avant la boucle, un test %EOF dans la condition et une lecture en fin de boucle.

Le RPG IV en colonnes donnait la fin de fichier par un indicateur en colonnes 75-76 ; en full free on utilise %EOF. SETLL ou SETGT permettent de choisir un autre point de départ que le début.

Exemple 1 : Lire tout le fichier et totaliser

**free
// READ : lecture sequentielle jusqu a la fin du fichier.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

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

dcl-s total packed(11:2);

read client;
dow not %eof(client);
  snd-msg '[' + %char(numcli) + '] [' + %trim(nom) + '] [' + %char(solde) + ']';
  total += solde;
  read client;
enddo;
snd-msg 'Total des soldes : [' + %char(total) + ']';

*inlr = *on;

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

[100] [Dupont SA] [1250.50]
[200] [Martin et fils] [.00]
[300] [Leroy SARL] [-320.00]
[400] [Bernard Transports] [98000.00]
[500] [Petit Atelier] [45.10]
Total des soldes : [98975.60]

La boucle dow not %eof(client) s'arrête dès que READ ne trouve plus rien. Les clients sortent dans l'ordre de leur numéro. Le total est cumulé dans la boucle, et le dernier message est envoyé après la fin du fichier.

Exemple 2 : Après la fin de fichier

**free
// READ : apres la fin de fichier, une nouvelle lecture sans repositionnement echoue.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

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

setll *hival client;
read client;
snd-msg 'Apres *HIVAL : eof=' + %char(%eof(client));

// On se repositionne au debut, on lit tout, puis on relit
setll *loval client;
read client;
dow not %eof(client);
  read client;
enddo;
snd-msg 'Fin atteinte : eof=' + %char(%eof(client));

read client;
snd-msg 'Relecture sans SETLL : [' + %char(numcli) + '] eof=' + %char(%eof(client));

setll *loval client;
read client;
snd-msg 'Apres SETLL *LOVAL : [' + %char(numcli) + '] eof=' + %char(%eof(client));

*inlr = *on;

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

Apres *HIVAL : eof=1
Fin atteinte : eof=1
Relecture sans SETLL : [500] eof=1
Apres SETLL *LOVAL : [100] eof=0

Après SETLL *HIVAL, on est au-delà du dernier enregistrement : READ met %EOF à 1. Après un parcours complet, une lecture de plus, sans repositionnement, laisse %EOF à 1 et NUMCLI garde la valeur du dernier client lu (500). SETLL *LOVAL permet de repartir du début.

Le piège

En fin de fichier, les zones gardent le dernier enregistrement. Après le READ qui met %EOF à 1, NUMCLI vaut toujours 500 (deuxième exemple). Si le traitement n'est pas protégé par le test %EOF, le dernier client est traité deux fois. Et relire sans repositionner ne redémarre pas le fichier : %EOF reste à 1 tant qu'on ne fait pas de SETLL.