Aller au contenu

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)
DOW suivi de EQ, NE, GT, LT, GE ou LE. ANDxx et ORxx peuvent 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 le END.

À 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;