Aller au contenu

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

DO

Répéter un groupe un nombre de fois

Fait varier une zone indice de la valeur de départ à la limite et exécute le groupe jusqu'au END à chaque valeur ; sans facteurs, c'est un simple groupe d'opérations conditionné par indicateurs.

Syntaxe

     C           depart    DO   limite    indice  20
     C                     END  pas
     C   10                DO
Facteur 1 (18-27)
Valeur de départ de l'indice, entier. Vaut 1 si on ne l'écrit pas.
Facteur 2 (33-42)
Limite : le groupe s'exécute tant que l'indice ne la dépasse pas. Vaut 1 si on ne l'écrit pas.
Zone résultat (43-48)
L'indice, une zone numérique entière. Facultative.
Longueur (49-51)
Nombre de chiffres de l'indice, à prévoir assez grand pour la limite et l'incrément.
Facteur 2 du END (33-42)
L'incrément ajouté à l'indice à chaque tour, sur la ligne END qui ferme le groupe. Vaut 1 si on ne l'écrit pas.
Indicateurs de conditionnement (9-17)
Sur un DO sans facteurs, ils décident si le groupe s'exécute : c'est le moyen de conditionner plusieurs lignes d'un coup (troisième exemple).
Effet
Aucun indicateur positionné. L'indice reçoit le départ, le groupe s'exécute tant que l'indice ne dépasse pas la limite, et le END ajoute l'incrément. À la sortie, l'indice a dépassé la limite (premier exemple : 5 pour une limite de 4).

À quoi ça sert

DO est la boucle à compteur, l'équivalent du FOR des autres langages : parcourir les éléments d'un tableau, répéter une action n fois, remplir un sous-fichier. L'indice sert directement d'indice de tableau.

Sans facteur ni zone résultat, DO ne répète rien : c'est un bloc qu'on conditionne par des indicateurs en colonnes 9-17, très répandu dans les anciens programmes.

Exemple 1 : Compteur de 1 à 4

     H*  DO : repeter un groupe un nombre de fois, indice et valeur finale
     C                     Z-ADD0         TOTAL   50
     C                     DO   4         I       20
     C                     ADD  I         TOTAL
     C           I         DSPLY
     C                     END
     C*  Somme de 1+2+3+4
     C           TOTAL     DSPLY
     C*  Apres la boucle, l'indice a depasse la limite
     C           I         DSPLY
     C                     SETON                     LR

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

 1
 2
 3
 4
   10
 5

DO 4 I fait prendre à I les valeurs 1, 2, 3, 4 ; TOTAL cumule 10. Après la boucle, I vaut 5 : l'indice a dépassé la limite.

Exemple 2 : Départ, limite et incrément

     H*  DO : valeur de depart, limite et increment porte par END
     C                     Z-ADD0         NBPAS   30
     C           10        DO   50        QTE     30
     C                     ADD  1         NBPAS
     C           QTE       DSPLY
     C                     END  20
     C           NBPAS     DSPLY
     C*  Depart superieur a la limite : le groupe n'est jamais execute
     C                     Z-ADD0         NBPAS
     C           9         DO   3         J       30
     C                     ADD  1         NBPAS
     C                     END
     C           NBPAS     DSPLY
     C                     SETON                     LR

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

 10
 30
 50
  3
  0

10 DO 50 QTE avec END 20 donne 10, 30, 50 (trois tours). Quand le départ dépasse la limite (9 DO 3), le groupe ne s'exécute pas : le compteur reste à 0.

Exemple 3 : DO sans facteurs, conditionné par un indicateur

     H*  DO : sans facteurs, groupe conditionne par un indicateur
     C                     SETOF                     10
     C                     SETON                     11
     C   10                DO
     C           'Oui 10'  DSPLY
     C                     END
     C  N10                DO
     C           'Pas 10'  DSPLY
     C           'Suite'   DSPLY
     C                     END
     C   11                DO
     C           'Oui 11'  DSPLY
     C                     END
     C                     SETON                     LR

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

Pas 10
Suite
Oui 11

L'indicateur 10 est éteint, le 11 allumé. Le groupe conditionné par 10 est sauté, celui conditionné par N10 (indicateur éteint) s'exécute et affiche deux lignes, celui de 11 s'exécute.

Le piège

L'incrément se donne sur le END, pas sur le DO. C'est END 20 (facteur 2 du END) qui fait avancer l'indice de 20 en 20 (deuxième exemple).

L'indice dépasse la limite après la boucle (5 après un DO 4, premier exemple) : ne vous en servez pas comme du dernier indice traité.

Départ supérieur à la limite : le groupe n'est pas exécuté du tout (deuxième exemple).

En RPG ILE full free

En RPG ILE full free, la boucle à compteur est FOR avec TO et BY ; l'indice est déclaré à part. Le DO sans facteurs se remplace par un IF.

for qte = 10 to 50 by 20;
  nbpas += 1;
  dsply qte;
endfor;