Instruction RPG full free · IBM i (AS/400) · Structures de contrôle
DOW
Répéter tant que la condition est vraie
Répète un bloc d'instructions tant qu'une condition est vraie, la condition étant testée avant chaque passage.
Syntaxe
DOW condition;
instructions;
ENDDO;
condition- Expression logique évaluée avant chaque passage. Tant qu'elle est vraie, le bloc s'exécute ; dès qu'elle est fausse, le programme reprend après
ENDDO. - Effet
- Aucun indicateur n'est positionné. Le bloc peut s'exécuter zéro fois, une fois ou plusieurs. On en sort par la condition, ou plus tôt avec
LEAVE.
À quoi ça sert
DOW (« do while ») est la boucle de lecture classique des fichiers : on lit un premier enregistrement avant la boucle, on boucle tant que ce n'est pas la fin du fichier, et on relit en fin de bloc. Elle sert aussi à tout traitement dont le nombre de passages dépend d'un état et non d'un compteur.
En colonnes, c'était DOWxx (par exemple DOWEQ) avec ENDDO.
Exemple 1 : Totaliser les soldes de CLIENT
**free
// DOW : parcourir CLIENT jusqu'a la fin du fichier et totaliser les soldes.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
dcl-s total packed(11:2);
dcl-s nb int(5);
read client;
dow not %eof(client);
nb += 1;
total += solde;
read client;
enddo;
snd-msg 'Clients lus : ' + %char(nb);
snd-msg 'Total soldes : ' + %char(total);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Clients lus : 5
Total soldes : 98975.60
Un premier read avant la boucle, puis la boucle tourne tant que %eof est faux, avec un second read en dernière ligne. On obtient 5 clients et un total de 98 975,60.
Exemple 2 : Zéro passage possible
**free
// DOW teste la condition AVANT : si elle est fausse d'entree, le corps ne s'execute jamais.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s reste packed(7:2) inz(0);
dcl-s passes int(5) inz(0);
dow reste > 0;
passes += 1;
reste -= 100;
enddo;
snd-msg 'DOW, reste = 0 : ' + %char(passes) + ' passage';
reste = 250;
passes = 0;
dow reste > 0;
passes += 1;
reste -= 100;
enddo;
snd-msg 'DOW, reste = 250 : ' + %char(passes) + ' passages, reste = ' + %char(reste);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
DOW, reste = 0 : 0 passage
DOW, reste = 250 : 3 passages, reste = -50.00
Avec un reste de 0, la condition est fausse dès le départ : le corps ne s'exécute jamais. Avec 250, il s'exécute 3 fois et le reste finit à -50,00 : la condition est vérifiée avant chaque passage, pas pendant.
Le piège
La condition est testée avant, donc le corps peut ne jamais s'exécuter. Avec un reste de 0, le compteur de passages reste à 0 (deuxième exemple). Ne comptez pas sur un traitement de début de boucle s'il doit toujours avoir lieu : c'est le rôle de DOU. Et dans une boucle de lecture, il faut penser au read final, sinon la condition ne change jamais.