Instruction RPG full free · IBM i (AS/400) · Lecture de fichiers
SETGT
Se placer après une clé
Positionne le fichier sur le premier enregistrement dont la clé est strictement supérieure à celle donnée, sans lire d'enregistrement.
Syntaxe
SETGT clé fichier;
SETGT clé format;
SETGT *LOVAL fichier;
SETGT *HIVAL fichier;
clé- La valeur de référence : une zone, un littéral entre parenthèses, ou une clé partielle.
fichier ou format- Le fichier déclaré avec
keyed, ou un de ses formats. - Effet
- Ne lit aucun enregistrement. La position est placée juste après la clé donnée :
READlit l'enregistrement suivant,READPlit le dernier enregistrement dont la clé est inférieure ou égale.
À quoi ça sert
SETGT saute une clé. On l'emploie pour lire « tout ce qui est après le client 300 », pour reprendre une lecture après le dernier enregistrement traité, ou, avec READP ou READPE, pour parcourir un groupe à rebours depuis sa fin.
C'est le pendant de SETLL : avec la même clé, SETLL se place avant elle et SETGT après.
Exemple 1 : Tout ce qui suit le client 300
**free
// SETGT : se placer apres une cle, puis lire les enregistrements suivants.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);
dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
// Clients dont le numero est superieur a 300
setgt (300) client;
read client;
dow not %eof(client);
snd-msg '[' + %char(numcli) + '] [' + %trim(nom) + ']';
read client;
enddo;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
[400] [Bernard Transports]
[500] [Petit Atelier]
Après SETGT (300), le premier READ rend le 400, puis le 500. Le client 300 lui-même est sauté.
Exemple 2 : SETLL, SETGT et READP
**free
// SETGT et SETLL avec la meme cle : SETLL donne la cle, SETGT la saute.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*inputonly);
dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
setll (300) client;
read client;
snd-msg 'SETLL 300 puis READ : [' + %char(numcli) + ']';
setgt (300) client;
read client;
snd-msg 'SETGT 300 puis READ : [' + %char(numcli) + ']';
// SETGT puis READP : dernier enregistrement dont la cle est <= 300
setgt (300) client;
readp client;
snd-msg 'SETGT 300 puis READP : [' + %char(numcli) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
SETLL 300 puis READ : [300]
SETGT 300 puis READ : [400]
SETGT 300 puis READP : [300]
Même clé, trois positions. SETLL (300) puis READ rend le 300. SETGT (300) puis READ rend le 400. SETGT (300) puis READP revient sur le 300.
Le piège
Après SETGT, READ ne rend jamais la clé donnée. Avec SETGT (300), on obtient le 400 (deuxième exemple). Pour relire cette clé vers l'avant, il faut SETLL. Réciproquement, SETGT suivi d'un READP est la bonne façon d'obtenir le dernier enregistrement d'une clé, alors que SETLL suivi de READP rend celui d'avant.