Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels
PLIST
Définir une liste de paramètres (dont *ENTRY)
Nomme une liste de paramètres décrits par les PARM qui suivent ; la liste spéciale *ENTRY reçoit les paramètres d'un programme appelé.
Syntaxe
C liste PLIST
C PARM param1
C PARM param2
C CALL 'PROG' liste
C *ENTRY PLIST
- Facteur 1 (18-27)
- Le nom de la liste (6 caractères au plus), à reprendre en zone résultat d'un
CALL; ou*ENTRYdans le programme appelé pour recevoir ses paramètres. - PARM qui suivent
- Chaque
PARMécrit sous lePLISTajoute un paramètre à la liste ; la liste se termine à la première ligne qui n'est pas unPARM. - CALL (zone résultat)
- Avec un
CALL, le nom de la liste va en zone résultat, colonnes 43-48. - Effet
PLISTne s'exécute pas : elle déclare une liste. Un mêmePLISTpeut servir à plusieursCALL; les valeurs des paramètres sont celles des zones au moment de chaque appel. Dans l'appelé,*ENTRY PLISTrattache les paramètres reçus à des zones locales du programme.
À quoi ça sert
Quand plusieurs programmes appellent le même sous-traitement, ou quand un appelant le fait plusieurs fois, on écrit la liste une seule fois dans un PLIST nommé, et on la déclare une fois. C'est aussi la seule façon de recevoir des paramètres (*ENTRY).
Exemple 1 : Le programme appelé (*ENTRY)
H* PLIST : programme APPELE (a compiler sous le nom Z3PLIST1)
IPSDS SDS
I *PARMS NBPARM
C *ENTRY PLIST
C PARM PA 5
C PARM PB 7
C NBPARM IFEQ 0
C 'Seul' DSPLY
C ELSE
C PA IFEQ '00100'
C MOVEL'ACTIF' PB
C ELSE
C MOVEL'INCONNU' PB
C END
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Seul
Le programme reçoit un code client (5 caractères) et rend un statut (7 caractères). Lancé seul, il constate l'absence de paramètre grâce à la zone NBPARM (mot réservé *PARMS de la structure d'état du programme) et affiche Seul. À compiler sous le nom Z3PLIST1.
Exemple 2 : Liste nommée pour deux appels
H* PLIST : liste de parametres nommee, utilisee pour deux appels
C LISTE PLIST
C PARM CODE 5
C PARM STAT 7
C MOVEL'00100' CODE
C CALL 'Z3PLIST1'LISTE
C STAT DSPLY
C MOVEL'00999' CODE
C CALL 'Z3PLIST1'LISTE
C STAT DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
ACTIF
INCONNU
La liste LISTE est écrite une fois et passée aux deux CALL : CODE prend successivement les valeurs 00100 puis 00999, et STAT revient avec ACTIF, puis INCONNU.
Exemple 3 : Paramètre manquant
H* PLIST : un seul parametre transmis, l'appele en attend deux
C MOVEL'00100' CODE 5
C 'Avant' DSPLY
C CALL 'Z3PLIST1'
C PARM CODE
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Avant
Erreur : RPG0221 - Référence dans Z3PLIST1 1100 à un paramètre non transmis (C G S D F).
Erreur : RPG0202 - L'appel du programme Z3PLIST1 n'a pas abouti (C G S D F).
Ce deuxième appelant ne transmet qu'un paramètre alors que l'appelé en attend deux. Dès que l'appelé touche au deuxième, le travail s'arrête.
Le piège
Un paramètre non transmis plante l'appelé, pas l'appelant. Dans le troisième exemple, le programme appelé fait référence à un paramètre que personne n'a envoyé : MCH0801, « Argument associé à un paramètre interne ou externe non transmis », puis RPG0221, « Référence dans Z3PLIST1 1100 à un paramètre non transmis », puis, côté appelant, RPG0202, « L'appel du programme Z3PLIST1 n'a pas abouti ». Le message « Apres » n'est jamais affiché.
L'inverse est refusé aussi : un appelant qui envoie trois paramètres à un appelé qui en attend deux provoque MCH0802, « Nombre total de paramètres transmis différent du nombre requis », dès l'appel, puis RPG0202 côté appelant. Pour un appelé que plusieurs programmes utilisent avec des listes différentes, testez *PARMS avant de toucher aux derniers paramètres.
En RPG ILE full free
En RPG ILE, dcl-pi (interface de procédure ou de programme) remplace *ENTRY PLIST et dcl-pr remplace la liste nommée ; les paramètres facultatifs se déclarent avec options(*nopass) et se testent avec %parms.
dcl-pi *n;
pa char(5);
pb char(7) options(*nopass);
end-pi;
if %parms >= 2;
pb = 'ACTIF';
endif;