Aller au contenu

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.