Code opération RPG III / RPG/400 · IBM i (AS/400) · Lecture de fichiers
SETLL
Se positionner avant une clé, sans lire
Place le fichier sur le premier enregistrement dont la clé est supérieure ou égale au facteur 1, sans rien lire ; l'indicateur de la colonne 58-59 dit si la clé existe.
Syntaxe
C cle SETLLfichier HI EQ
C *LOVAL SETLLfichier
C *HIVAL SETLLformat HI EQ
- Facteur 1 (18-27)
- La clé : une zone, une liste
KLISTou une constante figurative.*LOVALdésigne la plus petite clé possible (début de fichier),*HIVALla plus grande. - Facteur 2 (33-42)
- Le fichier (indexé,
Ken colonne 31) ou l'un de ses formats. - Indicateurs (54-55)
- Facultatif : s'allume quand la clé est supérieure à toutes les clés du fichier (aucun enregistrement à cette clé ou après).
- Indicateurs (58-59)
- Facultatif : s'allume quand un enregistrement a exactement cette clé. C'est le test d'existence sans lecture.
- Effet
- Le fichier est positionné avant le premier enregistrement de clé supérieure ou égale ; le prochain
READle lit. Aucune zone n'est chargée. 58-59 s'allume si la clé existe, 54-55 si la clé dépasse la dernière du fichier ; dans les autres cas (clé absente mais inférieure à une clé existante) les deux restent éteints.
À quoi ça sert
SETLL est l'opération de positionnement. Elle sert à deux choses : choisir le point de départ d'une lecture séquentielle (SETLL puis READ ou READE), et tester qu'une clé existe sans lire l'enregistrement, ce qui évite un CHAIN quand on n'a pas besoin des zones.
Exemple 1 : Tester l'existence avec EQ
H* SETLL : tester l'existence d'un client sans le lire (EQ)
FCLIENT3 IF E K DISK
C Z-ADD200 NUMERO 50
C NUMERO SETLLCLIENT3 90
C *IN90 IFEQ '1'
C 'Existe' DSPLY
C ELSE
C 'Absent' DSPLY
C END
C Z-ADD250 NUMERO
C NUMERO SETLLCLIENT3 90
C *IN90 IFEQ '1'
C 'Existe' DSPLY
C ELSE
C 'Absent' DSPLY
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Existe
Absent
Le client 200 existe : l'indicateur 90 en colonnes 58-59 s'allume. Le client 250 n'existe pas : 90 reste éteint. Aucune zone du fichier n'a été lue.
Exemple 2 : Clé absente, clé après la fin
H* SETLL : se positionner sur la cle ou sur la suivante, puis READ
FCLIENT3 IF E K DISK
C Z-ADD250 NUMERO 50
C NUMERO SETLLCLIENT3 90
C READ CLIENT3 99
C NOM DSPLY
C* Une cle apres la derniere : 54-55 s'allume, READ trouve la fin
C Z-ADD999 NUMERO
C NUMERO SETLLCLIENT3 89
C READ CLIENT3 99
C *IN89 IFEQ '1'
C *IN99 IFEQ '1'
C 'Fin' DSPLY
C END
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Leroy SARL
Fin
La clé 250 n'existe pas : le fichier se place sur l'enregistrement suivant et le READ lit Leroy SARL (300). Avec 999, plus grande que toutes les clés, l'indicateur 89 des colonnes 54-55 s'allume et le READ trouve la fin de fichier.
Exemple 3 : Revenir au début avec *LOVAL
H* SETLL : *LOVAL pour recommencer la lecture au debut
FCLIENT3 IF E K DISK
C READ CLIENT3 99
C READ CLIENT3 99
C NOM DSPLY
C *LOVAL SETLLCLIENT3
C READ CLIENT3 99
C NOM DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Martin et fils
Dupont SA
Deux lectures conduisent à Martin et fils ; SETLL *LOVAL ramène le fichier au début, et le READ suivant relit Dupont SA.
Le piège
Une clé inexistante ne signifie pas « fin de fichier ». Pour 250, les indicateurs 54-55 et 58-59 sont tous deux éteints : le fichier est simplement placé sur le client 300. Pour savoir si la clé existe, testez 58-59 et rien d'autre.
Un littéral doit avoir la longueur de la clé (QRG7078, « Longueur en Facteur 1 différente de celle de la 1ère zone clé du fichier ou de l'enreg. », avec 'Lyon' SETLL CLIENT3V). Passez par une zone de la bonne longueur.
En RPG ILE full free
En RPG ILE full free : SETLL sans indicateur, le résultat se lit avec %EQUAL (clé trouvée) et %FOUND.
setll numero client3;
if %equal(client3);
dsply 'Existe';
endif;
setll *loval client3;