Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle

LEAVE

Sortir d'une boucle

Quitte immédiatement la boucle DO, DOWxx ou DOUxx la plus interne et reprend après son END.

Syntaxe

     C                     LEAVE
Indicateurs de conditionnement (9-17)
Permettent de sortir sous condition, sans IFxx autour.
Facteurs et zone résultat
Aucun : l'opération s'écrit seule sur sa ligne.
Effet
Aucun indicateur positionné. L'exécution reprend à la ligne qui suit le END de la boucle la plus interne ; les zones gardent leur valeur du moment.

À quoi ça sert

LEAVE sert à arrêter une recherche dès que la réponse est connue : premier client débiteur, première ligne qui ne convient pas, erreur à signaler. La boucle garde une condition simple et la sortie anticipée se lit sur une ligne.

Exemple 1 : Arrêter la lecture au premier débiteur

     H*  LEAVE : sortir d'une boucle de lecture des qu'on a trouve
     FCLIENT3 IF  E           K        DISK
     C                     READ CLIENT3                  90
     C           *IN90     DOWEQ'0'
     C           SOLDE     IFLT 0
     C           NOM       DSPLY
     C                     LEAVE
     C                     END
     C           'Suivant' DSPLY
     C                     READ CLIENT3                  90
     C                     END
     C*  Le programme continue ici, le fichier n'est pas arrive a la fin
     C           *IN90     DSPLY
     C                     SETON                     LR

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

Suivant
Suivant
Leroy SARL
0

Le programme affiche « Suivant » pour Dupont SA et Martin et fils, puis Leroy SARL (solde négatif) déclenche le LEAVE. Le fichier n'est pas à la fin : *IN90 vaut 0.

Exemple 2 : Boucles imbriquées

     H*  LEAVE : boucles imbriquees, seule la boucle interne est quittee
     C                     DO   3         I       10
     C           I         DSPLY
     C                     DO   3         J       10
     C           J         IFEQ 2
     C                     LEAVE
     C                     END
     C           J         DSPLY
     C                     END
     C                     END
     C                     SETON                     LR

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

1
1
2
1
3
1

Pour chaque valeur de I, la boucle interne affiche J = 1 puis fait LEAVE à J = 2. La boucle externe continue : on voit 1, 1, 2, 1, 3, 1 (I puis J).

Le piège

LEAVE ne quitte que la boucle la plus interne : dans le deuxième exemple, la boucle externe ne s'arrête pas. Pour tout quitter, positionnez un indicateur et testez-le après la boucle interne.

Il lui faut une boucle. Un LEAVE hors de toute boucle est refusé : QRG5232, gravité 20, « Aucune opération DO, DOUxx ou DOWxx associée à l'opération LEAVE ou ITER. »

En RPG ILE full free

L'instruction LEAVE existe à l'identique en RPG ILE full free, avec la même portée (boucle la plus interne).

dow not %eof(client3);
  if solde < 0;
    dsply nom;
    leave;
  endif;
  read client3;
enddo;