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
ENDqui ferme le groupe. Vaut 1 si on ne l'écrit pas. - Indicateurs de conditionnement (9-17)
- Sur un
DOsans 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
ENDajoute 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;