Aller au contenu

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 LR avant le RETRN.
Effet
L'exécution s'arrête à la ligne du RETRN et le contrôle revient à l'appelant. Si l'indicateur LR est éteint, le programme reste en mémoire : au prochain CALL, il reprend avec les valeurs de ses zones et ses fichiers déjà ouverts. Si LR est 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;