Aller au contenu

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 *ENTRY dans le programme appelé pour recevoir ses paramètres.
PARM qui suivent
Chaque PARM écrit sous le PLIST ajoute un paramètre à la liste ; la liste se termine à la première ligne qui n'est pas un PARM.
CALL (zone résultat)
Avec un CALL, le nom de la liste va en zone résultat, colonnes 43-48.
Effet
PLIST ne s'exécute pas : elle déclare une liste. Un même PLIST peut servir à plusieurs CALL ; les valeurs des paramètres sont celles des zones au moment de chaque appel. Dans l'appelé, *ENTRY PLIST rattache 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;