Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle
DOWxx
Répéter un groupe tant qu'une condition est vraie
Teste la comparaison avant chaque tour et répète les lignes jusqu'au END tant qu'elle est vraie ; si elle est fausse dès le départ, le groupe ne s'exécute pas.
Syntaxe
C zone1 DOWEQzone2
C zone1 ANDGEzone3
C zone1 ORLT zone4
C END
- Code opération (28-32)
DOWsuivi deEQ,NE,GT,LT,GEouLE.ANDxxetORxxpeuvent compléter la condition.- Facteur 1 (18-27)
- Premier terme de la comparaison. Obligatoire.
- Facteur 2 (33-42)
- Second terme, de même type.
- Effet
- Aucun indicateur positionné. La condition est évaluée à l'entrée de la boucle puis à chaque retour du
END: tant qu'elle est vraie le groupe recommence, dès qu'elle est fausse l'exécution reprend après leEND.
À quoi ça sert
DOWxx est la boucle « tant que ». Dans les programmes de gestion, c'est la forme classique de la lecture d'un fichier : une lecture d'amorce avant la boucle, puis le traitement et la relecture dans la boucle, jusqu'à l'indicateur de fin de fichier (premier exemple).
Comme le test est fait en tête, le corps peut ne jamais s'exécuter (deuxième exemple), ce qui est le bon comportement pour un fichier vide ou une liste sans élément.
Exemple 1 : Lire tout un fichier
H* DOWxx : lire tout un fichier tant que la fin n'est pas atteinte
FCLIENT3 IF E K DISK
C Z-ADD0 NBCLI 30
C READ CLIENT3 90
C *IN90 DOWEQ'0'
C ADD 1 NBCLI
C NOM DSPLY
C READ CLIENT3 90
C END
C NBCLI DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Dupont SA
Martin et fils
Leroy SARL
Bernard Transports
Petit Atelier
5
Le READ d'amorce positionne l'indicateur 90 (fin de fichier). Le DOWEQ continue tant que *IN90 vaut '0', et le dernier READ du corps prépare le test suivant. Les cinq clients sont affichés puis leur nombre.
Exemple 2 : Condition fausse dès le départ
H* DOWxx : condition fausse au depart, le corps ne s'execute jamais
C Z-ADD10 STOCK 30
C Z-ADD0 PASSES 30
C STOCK DOWLT5
C ADD 1 PASSES
C 'Corps' DSPLY
C ADD 1 STOCK
C END
C PASSES DSPLY
C* Avec STOCK = 2 : trois passages (2, 3, 4), arret a 5
C Z-ADD2 STOCK
C STOCK DOWLT5
C ADD 1 PASSES
C ADD 1 STOCK
C END
C PASSES DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
3
Avec STOCK à 10, STOCK DOWLT 5 est faux : « Corps » ne s'affiche pas et le compteur reste à 0. Avec STOCK à 2, le corps s'exécute pour 2, 3 et 4 : le compteur passe à 3.
Le piège
Le corps peut ne jamais s'exécuter. Si vous avez besoin d'un premier passage, utilisez DOUxx (deuxième exemple : aucun « Corps » affiché alors que DOUxx en affiche un dans la même situation).
Il faut modifier la condition dans la boucle. Dans le premier exemple, c'est le READ placé en fin de corps qui fait avancer le fichier jusqu'à l'allumage de l'indicateur 90 ; la condition doit toujours dépendre de quelque chose que le corps change.
En RPG ILE full free
En RPG ILE full free : DOW avec une expression, ENDDO. La lecture d'un fichier se teste de préférence avec %EOF à la place d'un indicateur.
read client3;
dow not %eof(client3);
dsply nom;
read client3;
enddo;