Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Structures de contrôle

LEAVE

Sortir d'une boucle

Quitte immédiatement la boucle (DOW, DOU, FOR, FOR-EACH) qui la contient et reprend après sa fin.

Syntaxe

LEAVE;
(aucun)
LEAVE s'écrit seule, dans une boucle, souvent sous un IF.
Effet
Aucun indicateur n'est positionné. Le programme continue à l'instruction qui suit l'ENDDO ou l'ENDFOR de la boucle la plus interne.

À quoi ça sert

Elle sert à arrêter un parcours dès que l'on a ce que l'on cherche (un client, une erreur) sans attendre la condition normale de fin. En colonnes, c'était l'opération LEAVE, également sans opérande.

Exemple 1 : Arrêter la lecture au client cherché

**free
// LEAVE : sortir de la boucle des qu'on a trouve le client cherche.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);

dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);

dcl-s lus int(5);

read client;
dow not %eof(client);
  lus += 1;
  if %trim(nom) = 'Leroy SARL';
    snd-msg 'Trouve : ' + %trim(nom) + ' (' + %trim(ville) + ')';
    leave;
  endif;
  read client;
enddo;

snd-msg 'Enregistrements lus : ' + %char(lus);

*inlr = *on;

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

Trouve : Leroy SARL (Montpellier)
Enregistrements lus : 3

Le fichier est lu jusqu'à Leroy SARL. Au troisième enregistrement, leave interrompt la boucle : 3 enregistrements lus au lieu de 5.

Exemple 2 : Boucles imbriquées

**free
// LEAVE ne quitte que la boucle la plus interne.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s i int(5);
dcl-s j int(5);
dcl-s trouve ind inz(*off);

for i = 1 to 3;
  for j = 1 to 3;
    if j = 2;
      leave;
    endif;
    snd-msg 'i = ' + %char(i) + ', j = ' + %char(j);
  endfor;
endfor;
snd-msg 'Apres les boucles : i = ' + %char(i) + ', j = ' + %char(j);

// Pour sortir des deux boucles : un indicateur teste par la boucle externe.
for i = 1 to 3;
  for j = 1 to 3;
    if i * j = 4;
      trouve = *on;
      leave;
    endif;
  endfor;
  if trouve;
    leave;
  endif;
endfor;
snd-msg 'i * j = 4 pour i = ' + %char(i) + ', j = ' + %char(j);

*inlr = *on;

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

i = 1, j = 1
i = 2, j = 1
i = 3, j = 1
Apres les boucles : i = 4, j = 2
i * j = 4 pour i = 2, j = 2

Dans le premier couple de boucles, leave n'arrête que la boucle sur j : la boucle sur i continue (i = 1, 2, 3). Pour sortir des deux, un indicateur trouve est testé après la boucle interne.

Le piège

LEAVE ne sort que de la boucle la plus interne. Dans deux boucles imbriquées, la boucle externe continue : dans le premier couple de boucles du deuxième exemple, on n'affiche que j = 1 pour chaque i, et on termine avec i = 4, j = 2. Pour sortir des deux, posez un indicateur avant le leave et testez-le dans la boucle externe (deuxième partie du programme).