Aller au contenu

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

READPE

Lire le précédent à clé égale

Lit l'enregistrement précédent seulement s'il a la même clé que celle donnée, pour relire un groupe du dernier au premier.

Syntaxe

READPE clé fichier;
READPE clé format;
clé
La clé à comparer : une zone ou un littéral entre parenthèses, entière ou partielle (la ville seule pour un index ville puis numéro).
fichier ou format
Le fichier ou le format d'enregistrement lu.
Effet
Positionne %EOF(fichier) à vrai quand l'enregistrement précédent n'a pas cette clé ou qu'on a dépassé le début du fichier ; à faux quand la lecture réussit et que les zones sont chargées.

À quoi ça sert

READPE est le miroir de READE : il parcourt un groupe à clé égale, mais en descendant. Par exemple, les clients d'une ville du plus grand numéro au plus petit, ou les derniers mouvements d'un compte en premier.

Le point de départ se prépare avec SETGT sur la clé du groupe, qui place la position juste après son dernier enregistrement.

Exemple 1 : Les clients de Montpellier à rebours

**free
// READPE : relire a rebours les clients d une ville, du plus grand numero au plus petit.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

dcl-f clientv keyed extdesc('JOBIRPG/CLIENTV') extfile(*extdesc);

dcl-s cible char(20) inz('Montpellier');

// SETGT place apres le dernier client de la ville
setgt cible clientv;
readpe cible clientv;
dow not %eof(clientv);
  snd-msg '[' + %char(numcli) + '] [' + %trim(nom) + '] [' + %trim(ville) + ']';
  readpe cible clientv;
enddo;
snd-msg 'Fin : eof=' + %char(%eof(clientv));

*inlr = *on;

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

[300] [Leroy SARL] [Montpellier]
[100] [Dupont SA] [Montpellier]
Fin : eof=1

SETGT se place après le dernier client de Montpellier. Chaque READPE recule : le 300, puis le 100, puis la boucle s'arrête, car l'enregistrement d'avant est un client de Lyon.

Exemple 2 : SETLL ou SETGT ?

**free
// READPE : avec SETLL, on se place avant la ville et READPE ne trouve rien.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);

dcl-f clientv keyed extdesc('JOBIRPG/CLIENTV') extfile(*extdesc);

setll ('Montpellier') clientv;
readpe ('Montpellier') clientv;
snd-msg 'Apres SETLL : eof=' + %char(%eof(clientv));

setgt ('Montpellier') clientv;
readpe ('Montpellier') clientv;
snd-msg 'Apres SETGT : eof=' + %char(%eof(clientv)) + ' [' + %char(numcli) + ']';

*inlr = *on;

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

Apres SETLL : eof=1
Apres SETGT : eof=0 [300]

Avec SETLL, on est avant le premier client de Montpellier : le précédent est un client de Lyon, READPE met %EOF à 1. Avec SETGT, la position est après le groupe et READPE lit le 300.

Le piège

Il faut SETGT, pas SETLL. Le réflexe SETLL avant le parcours, bon pour READE, donne ici un groupe vide (deuxième exemple : %EOF vaut 1 après SETLL, et la lecture réussit après SETGT). Pour lire un groupe à rebours, placez-vous toujours après lui.