Code opération RPG III / RPG/400 · IBM i (AS/400) · Sous-programmes et appels
RETRN
Rendre la main à l'appelant
Termine immédiatement l'exécution du programme et rend la main à l'appelant, sans mettre LR : le programme garde ses zones et ses fichiers ouverts pour l'appel suivant.
Syntaxe
C RETRN
- Facteurs et zone résultat
- Vides. Pour que le programme se termine pour de bon, il faut allumer
LRavant leRETRN. - Effet
- L'exécution s'arrête à la ligne du
RETRNet le contrôle revient à l'appelant. Si l'indicateurLRest éteint, le programme reste en mémoire : au prochainCALL, il reprend avec les valeurs de ses zones et ses fichiers déjà ouverts. SiLRest allumé, les fichiers sont fermés et la mémoire libérée : l'appel suivant repart de zéro.
À quoi ça sert
Un programme appelé dix mille fois par un traitement de masse ne doit pas rouvrir ses fichiers à chaque appel. Il se termine par RETRN sans LR : la première fois il initialise, les fois suivantes il va droit au travail. L'appelant, lui, positionne LR au dernier appel pour tout fermer.
Exemple 1 : Le programme appelé
H* RETRN : programme APPELE (a compiler sous le nom Z3RETRN1)
IPSDS SDS
I *PARMS NBPARM
C *ENTRY PLIST
C PARM FIN 1
C ADD 1 CPT 30
C CPT DSPLY
C NBPARM IFGE 1
C FIN IFEQ '1'
C SETON LR
C END
C END
C RETRN
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
Le compteur CPT augmente de 1 à chaque appel et s'affiche. Le paramètre FIN à '1' allume LR. Lancé seul, il affiche 1. À compiler sous le nom Z3RETRN1.
Exemple 2 : Les valeurs survivent aux appels
H* RETRN : le compteur survit aux appels tant que LR n'est pas mis
C MOVE '0' NON 1
C MOVE '1' OUI 1
C CALL 'Z3RETRN1'
C PARM NON
C CALL 'Z3RETRN1'
C PARM NON
C CALL 'Z3RETRN1'
C PARM OUI
C CALL 'Z3RETRN1'
C PARM NON
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
2
3
1
Trois premiers appels : 1, 2, 3 (le troisième demande la fin avec LR). Le quatrième appel repart de zéro : le compteur vaut de nouveau 1. Sans le LR du troisième appel, il aurait affiché 4.
Le piège
Sans LR, rien n'est remis à zéro. Un programme appelé qui se termine par RETRN garde ses compteurs, ses totaux et sa position dans les fichiers : au second appel, le compteur du deuxième exemple affiche 2, pas 1. Un programme écrit « pour un seul passage » mais appelé en boucle cumule alors les résultats. Initialisez les zones au début de chaque appel (ou allumez LR), ou utilisez FREE côté appelant.
En RPG ILE full free
L'instruction s'appelle return en RPG ILE. La mise de l'indicateur de fin se fait toujours sur *inlr ; sans lui, le programme garde son état tant que le groupe d'activation vit.
// fin definitive
*inlr = *on;
return;
// retour, programme conserve
return;