Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Lecture de fichiers

KLIST

Définir une clé composée de plusieurs zones

Déclare une liste de clés : KLIST donne le nom de la liste, chaque KFLD qui le suit ajoute une zone, dans l'ordre de la clé du fichier. La page couvre aussi KFLD.

Syntaxe

     C           nomlst    KLIST
     C                     KFLD           zone1
     C                     KFLD           zone2
Facteur 1 (18-27) de KLIST
Le nom de la liste de clés (6 caractères au plus). On l'écrit ensuite en facteur 1 de CHAIN, SETLL, SETGT, READE ou REDPE.
Zone résultat (43-48) de KFLD
La zone qui fait partie de la clé. L'ordre des KFLD doit être celui des zones de clé du fichier, et chaque zone doit avoir le même type que la zone correspondante. Une liste plus courte que la clé du fichier est une clé partielle.
Effet
KLIST et KFLD ne s'exécutent pas : ce sont des déclarations. Les opérations de fichier qui utilisent la liste lisent la valeur actuelle des zones au moment de l'appel.

À quoi ça sert

Dès qu'un fichier est indexé sur plusieurs zones, on ne peut plus donner la clé dans une seule zone. KLIST assemble les zones : ici la clé de CLIENT3V est la ville puis le numéro du client.

Une liste plus courte que la clé complète sert à lire un groupe : SETLL avec la clé complète pour se placer, READE avec la ville seule pour rester dans la ville.

Exemple 1 : CHAIN sur ville + numéro

     H*  KLIST : cle composee VILLE + NUMCLI sur CLIENT3V
     FCLIENT3VIF  E           K        DISK
     C           CLEVN     KLIST
     C                     KFLD           CHERCH
     C                     KFLD           NUMERO
     C                     MOVEL'Lyon'    CHERCH 20
     C                     Z-ADD500       NUMERO  50
     C           CLEVN     CHAINCLIENT3V             99
     C           *IN99     IFEQ '0'
     C           NOM       DSPLY
     C                     END
     C*  Le client 300 existe, mais pas a Lyon
     C                     Z-ADD300       NUMERO
     C           CLEVN     CHAINCLIENT3V             99
     C           *IN99     IFEQ '1'
     C           'Absent'  DSPLY
     C                     END
     C                     SETON                     LR

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

Petit Atelier
Absent

La liste CLEVN rassemble CHERCH (ville) et NUMERO. Lyon + 500 existe : Petit Atelier. Lyon + 300 n'existe pas, car le client 300 est à Montpellier : le CHAIN échoue (« Absent »).

Exemple 2 : Clé complète, clé partielle

     H*  KLIST : cle complete pour SETLL, cle partielle pour READE
     FCLIENT3VIF  E           K        DISK
     C           CLEVN     KLIST
     C                     KFLD           CHERCH
     C                     KFLD           NUMERO
     C           CLEV      KLIST
     C                     KFLD           CHERCH
     C                     MOVEL'Lyon'    CHERCH 20
     C                     Z-ADD500       NUMERO  50
     C*  On se place sur Lyon 500 : Lyon 200 est saute
     C           CLEVN     SETLLCLIENT3V
     C           CLEV      READECLIENT3V                 99
     C           *IN99     DOWEQ'0'
     C           NUMCLI    DSPLY
     C           CLEV      READECLIENT3V                 99
     C                     END
     C                     SETON                     LR

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

  500

SETLL avec CLEVN (Lyon + 500) se place dans Lyon à partir du client 500 ; READE avec CLEV, qui ne contient que la ville, lit ce client et s'arrête ensuite. Le client 200, de Lyon aussi, est sauté.

Le piège

Les types doivent correspondre à ceux de la clé du fichier. En inversant les deux KFLD (numéro d'abord, ville ensuite), le compilateur répond QRG7072 : « Le type de KFLD diffère de celui de la zone-clé correspondante dans le fichier. La spécification n'est pas prise en compte. ». L'ordre des KFLD est l'ordre de la clé du fichier.

En RPG ILE full free

En RPG ILE full free, la liste de clés est écrite directement dans l'instruction, entre parenthèses : plus de KLIST ni de KFLD.

chain (chercher: numero) client3v;
setll (chercher: numero) client3v;
reade (chercher) client3v;