Aller au contenu

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 KLIST ou une constante figurative. *LOVAL désigne la plus petite clé possible (début de fichier), *HIVAL la plus grande.
Facteur 2 (33-42)
Le fichier (indexé, K en 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 READ le 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;