Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle
DOUxx
Répéter un groupe jusqu'à ce qu'une condition soit vraie
Exécute le groupe puis teste la comparaison au END : il s'exécute donc au moins une fois et s'arrête dès que la condition est vraie.
Syntaxe
C zone1 DOUEQzone2
C zone1 ANDGEzone3
C zone1 OREQ zone4
C END
- Code opération (28-32)
DOUsuivi deEQ,NE,GT,LT,GEouLE.ANDxxetORxxpeuvent compléter la condition.- Facteur 1 (18-27)
- Premier terme de la comparaison. Il est obligatoire, même pour tester un indicateur (
*IN99). - Facteur 2 (33-42)
- Second terme, de même type.
- Effet
- Aucun indicateur positionné. Le test se fait au
END, après chaque passage : si la condition est vraie la boucle s'arrête et l'exécution reprend après leEND, sinon le groupe recommence.
À quoi ça sert
DOUxx est la boucle « jusqu'à ». Elle convient quand le test dépend de ce que le corps vient de faire : lire un enregistrement puis vérifier, chercher la première valeur qui convient (deuxième exemple), refaire une saisie jusqu'à ce qu'elle soit valide.
La différence avec DOWxx tient à l'ordre : DOWxx teste puis exécute, DOUxx exécute puis teste. Avec le même état de départ, l'un n'exécute rien et l'autre passe une fois.
Exemple 1 : Au moins un passage
H* DOUxx : le corps passe au moins une fois, le test est en fin de boucle
C Z-ADD10 STOCK 30
C Z-ADD0 PASSES 30
C STOCK DOUGE5
C ADD 1 PASSES
C 'Corps' DSPLY
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 :
Corps
1
Avec STOCK à 10, la condition d'arrêt STOCK GE 5 est déjà vraie avant la boucle, mais le corps s'exécute quand même : « Corps » s'affiche et le compteur vaut 1. Le même départ avec DOWLT 5 ne donne aucun passage (voir DOWxx).
Exemple 2 : Chercher le premier client existant
H* DOUxx : chercher le premier client existant, le test suit le CHAIN
FCLIENT3 IF E K DISK
C Z-ADD0 ESSAIS 30
C Z-ADD50 NUMERO 50
C *IN99 DOUEQ'0'
C ADD 1 ESSAIS
C NUMERO CHAINCLIENT3 99
C *IN99 IFEQ '1'
C ADD 25 NUMERO
C END
C END
C NUMERO DSPLY
C NOM DSPLY
C ESSAIS DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
100
Dupont SA
3
Le CHAIN est dans le corps et le test *IN99 DOUEQ '0' le suit. Les clés 50 et 75 n'existent pas, 100 existe : trois passages, et NOM contient Dupont SA.
Le piège
Le facteur 1 est obligatoire. Un DOUGE sans zone en facteur 1 est refusé : QRG5009, gravité 30, « Le facteur 1 est obligatoire pour l'opération définie. » Pour tester un indicateur, écrivez *IN99 en facteur 1 et '0' en facteur 2.
La condition est celle d'arrêt, pas de continuation : premier exemple, STOCK DOUGE 5 s'arrête dès que STOCK atteint 5. Un DOWGE continuerait tant que c'est vrai : les confondre inverse la boucle.
En RPG ILE full free
En RPG ILE full free, DOU garde le même sens : on exécute puis on teste, et la condition est celle d'arrêt.
numero = 50;
dou %found(client3);
essais += 1;
chain numero client3;
if not %found(client3);
numero += 25;
endif;
enddo;