Aller au contenu

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

ITER

Passer au tour suivant d'une boucle

Saute le reste du corps de la boucle DO, DOWxx ou DOUxx la plus interne et reprend au END, pour le prochain tour.

Syntaxe

     C                     ITER
Indicateurs de conditionnement (9-17)
Permettent de ne sauter que dans certains cas, 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 au END de la boucle la plus interne qui contient l'ITER : un DO ajoute son incrément à l'indice, un DOWxx ou un DOUxx teste sa condition.

À quoi ça sert

ITER évite de multiplier les niveaux d'IFxx : on écarte tout de suite les cas à ignorer (client d'une autre ville, ligne vide) et le traitement normal reste au premier niveau.

Exemple 1 : Ignorer les clients d'une autre ville

     H*  ITER : passer au tour suivant sans finir le corps de la boucle
     FCLIENT3 IF  E           K        DISK
     C                     Z-ADD0         NBVIL   30
     C                     READ CLIENT3                  90
     C           *IN90     DOWEQ'0'
     C           VILLE     IFNE 'Lyon'
     C                     READ CLIENT3                  90
     C                     ITER
     C                     END
     C                     ADD  1         NBVIL
     C           NOM       DSPLY
     C                     READ CLIENT3                  90
     C                     END
     C           NBVIL     DSPLY
     C                     SETON                     LR

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

Martin et fils
Petit Atelier
  2

Pour les clients hors de Lyon, le corps relit l'enregistrement suivant puis fait ITER. Seuls Martin et fils et Petit Atelier sont affichés, puis le compteur : 2.

Exemple 2 : L'indice avance malgré ITER

     H*  ITER : dans un DO, l'indice avance quand meme au tour suivant
     C                     Z-ADD0         SOMME   30
     C                     DO   6         I       20
     C           I         IFEQ 3
     C                     ITER
     C                     END
     C                     ADD  I         SOMME
     C           I         DSPLY
     C                     END
     C           SOMME     DSPLY
     C                     SETON                     LR

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

 1
 2
 4
 5
 6
 18

Dans DO 6, l'ITER du tour 3 saute l'addition et l'affichage : on voit 1, 2, 4, 5, 6 et la somme 18 (21 moins 3).

Le piège

ITER saute le reste du corps, y compris le READ de fin. C'est pourquoi le premier exemple relit l'enregistrement juste avant l'ITER : le READ placé en fin de corps n'est pas atteint pour les clients ignorés.

Il lui faut une boucle. Hors de toute boucle, la compilation échoue : QRG5232, gravité 20, « Aucune opération DO, DOUxx ou DOWxx associée à l'opération LEAVE ou ITER. » (message obtenu avec un LEAVE isolé, c'est le même texte pour les deux opérations).

En RPG ILE full free

L'instruction ITER existe à l'identique en RPG ILE full free, dans DOW, DOU et FOR.

for i = 1 to 6;
  if i = 3;
    iter;
  endif;
  somme += i;
endfor;