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
PLISTqui décrit les paramètres. Sans lui, ce sont lesPARMécrits juste sous leCALLqui 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 parRETRNsansLR. - Effet
- Le programme appelé s'exécute, puis l'appelant reprend après le
CALLet sesPARM. Les paramètres sont passés par référence : ce que l'appelé écrit dans un paramètre, l'appelant le retrouve (iciNOMCLI). 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é avecLR.
À 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;