Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels

CALL

Appeler un programme

Appelle un autre programme avec ses paramètres (PARM ou PLIST) et reprend à la ligne suivante quand il rend la main ; l'indicateur 56-57 s'allume si l'appel est impossible.

Syntaxe

     C                     CALL 'PROG'                 5658
     C                     CALL 'PROG'    LISTE        5658
     C                     PARM           zone1
     C                     PARM           zone2
Facteur 2 (33-42)
Le nom du programme appelé : un littéral entre apostrophes (8 caractères utiles au plus, comme tout littéral en facteur 2) ou une zone alphanumérique qui contient le nom.
Zone résultat (43-48)
Facultatif : le nom d'une PLIST qui décrit les paramètres. Sans lui, ce sont les PARM écrits juste sous le CALL qui les décrivent.
Indicateurs (56-57)
Erreur : s'allume quand l'appel n'a pas pu avoir lieu (programme introuvable). Sans lui, une erreur d'appel arrête le programme appelant.
Indicateurs (58-59)
S'allume au retour quand le programme appelé est un programme RPG qui a mis son indicateur LR (il s'est terminé). Éteint s'il a fini par RETRN sans LR.
Effet
Le programme appelé s'exécute, puis l'appelant reprend après le CALL et ses PARM. Les paramètres sont passés par référence : ce que l'appelé écrit dans un paramètre, l'appelant le retrouve (ici NOMCLI). Au retour, l'indicateur 56 est éteint si l'appel a eu lieu, allumé sinon ; l'indicateur 58 est allumé quand l'appelé s'est terminé avec LR.

À quoi ça sert

CALL relie les programmes d'une application RPG III : un programme d'écran qui appelle un programme de calcul, un traitement de nuit qui enchaîne des sous-traitements. Le programme appelé est cherché à l'exécution dans la liste de bibliothèques : il n'a pas besoin d'exister à la compilation de l'appelant.

Exemple 1 : Le programme appelé

     H*  CALL : programme APPELE (a compiler sous le nom Z3CALL1)
     FCLIENT3 IF  E           K        DISK
     IPSDS       SDS
     I                                     *PARMS   NBPARM
     I              'Sans parametre'      C         MSGSEU
     C           *ENTRY    PLIST
     C                     PARM           NUMERO  50
     C                     PARM           NOMCLI 30
     C           NBPARM    IFLT 2
     C           MSGSEU    DSPLY
     C                     ELSE
     C           NUMERO    CHAINCLIENT3              99
     C           *IN99     IFEQ '1'
     C                     MOVEL'Inconnu' NOMCLI
     C                     ELSE
     C                     MOVELNOM       NOMCLI
     C                     END
     C                     END
     C                     SETON                     LR

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

Sans parametre

Il reçoit un numéro de client et rend son nom, ou Inconnu. Lancé seul, il ne reçoit aucun paramètre (zone NBPARM, mot réservé *PARMS de la structure d'état du programme) et le dit. À compiler sous le nom Z3CALL1 avant l'exemple suivant.

Exemple 2 : Appel, indicateurs 56 et 58

     H*  CALL : appel de Z3CALL1 (exemple 1), erreur 56, retour LR 58
     C                     Z-ADD200       NUMCLI  50
     C                     CALL 'Z3CALL1'              5658
     C                     PARM           NUMCLI
     C                     PARM           NOMCLI 30
     C           NOMCLI    DSPLY
     C           *IN56     DSPLY
     C           *IN58     DSPLY
     C                     CALL 'ABSENT1'              56
     C           *IN56     DSPLY
     C                     SETON                     LR

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

Martin et fils
0
1
1

L'appel de Z3CALL1 pour le client 200 rend Martin et fils dans NOMCLI. Les trois DSPLY suivants montrent les indicateurs : 56 éteint (0 : l'appel a eu lieu), 58 allumé (1 : l'appelé a mis LR) puis, après l'appel d'un programme inexistant, 56 allumé (1) : le programme continue au lieu de s'arrêter.

Exemple 3 : Programme absent, sans indicateur d'erreur

     H*  CALL : programme absent et pas d'indicateur d'erreur
     C           'Avant'   DSPLY
     C                     CALL 'ABSENT1'
     C           'Apres'   DSPLY
     C                     SETON                     LR

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

Avant
Erreur : RPG0211 - Erreur lors de l'appel du programme ABSENT1 (C G S D F).
Erreur : MCH3401 - Impossible d'adresser objet ABSENT1 type et sous-type X'0201' droit X'0000'.

Sans indicateur en colonnes 56-57, l'appel d'un programme introuvable arrête le programme appelant : « Apres » n'est jamais affiché et le travail reçoit trois messages (MCH3401, RPG0211, puis RPG9001).

Le piège

Mettez un indicateur en 56-57 dès que le programme appelé peut manquer (bibliothèque absente de la liste, programme non livré). Sans lui, l'erreur arrête l'appelant : MCH3401, « Impossible d'adresser objet ABSENT1 type et sous-type X'0201' droit X'0000' », puis RPG0211, « Erreur lors de l'appel du programme ABSENT1 », puis RPG9001.

L'indicateur 56 est éteint ou allumé à chaque CALL : testez-le tout de suite, il est réécrit par l'appel suivant.

En RPG ILE full free

En RPG ILE, on déclare le programme par un prototype (dcl-pr ... extpgm) et on l'appelle comme une procédure, avec ses paramètres entre parenthèses. L'erreur d'appel se capture par monitor ou par l'extension (e) et %error. CALL et PARM restent acceptés en format fixe (CALL n'existe pas en full free).

dcl-pr clientnom extpgm('Z3CALL1');
  numero packed(5);
  nom char(30);
end-pr;

monitor;
  clientnom(200 : nomcli);
on-error;
  dsply 'Appel impossible';
endmon;