Aller au contenu

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)
DOU 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. 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 le END, 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;