Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Indicateurs et branchements

CABxx

Comparer et brancher

Compare le facteur 1 au facteur 2 et, si la relation xx est vraie, saute au TAG nommé dans la zone résultat.

Syntaxe

     C           zone1     CABGTzone2     ETIQ
     C           zone1     CABEQzone2     ETIQ       102030
     C           ETIQ      TAG
Opération (28-32)
CAB suivi de la relation : EQ, NE, GT, LT, GE, LE.
Facteur 1 (18-27)
Première valeur à comparer.
Facteur 2 (33-42)
Seconde valeur, de même type.
Zone résultat (43-48)
Nom de l'étiquette : l'instruction TAG vers laquelle on saute.
Indicateurs (54-55)
Facultatif, HI : allumé si facteur 1 > facteur 2.
(56-57)
Facultatif, LO : allumé si facteur 1 < facteur 2.
(58-59)
Facultatif, EQ : allumé si les deux sont égaux.
Effet
Si la relation est vraie, l'exécution continue à la ligne qui suit le TAG. Sinon elle poursuit à la ligne suivante. Les indicateurs HI, LO, EQ éventuels sont positionnés dans les deux cas, comme avec COMP.

À quoi ça sert

CABxx est un COMP suivi d'un GOTO en une seule ligne. Il sert à sauter un morceau de traitement quand une condition est vraie, ou à revenir en arrière pour former une boucle.

Le TAG peut être après (saut en avant, premier exemple) ou avant (boucle, deuxième exemple) le CABxx.

Exemple 1 : Sauter un traitement

     H*  CABxx : sauter un traitement si la condition est vraie
     C                     Z-ADD500       SOLDE   72
     C           SOLDE     CABGT1000      GROS
     C           'Normal'  DSPLY
     C           GROS      TAG
     C           'Fin 1'   DSPLY
     C                     Z-ADD98000     SOLDE   72
     C           SOLDE     CABGT1000      GROS2
     C           'Normal'  DSPLY
     C           GROS2     TAG
     C           'Fin 2'   DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Normal
Fin 1
Fin 2

Avec un solde de 500, CABGT 1000 est faux : « Normal » s'affiche. Avec 98000, il est vrai : on saute à GROS2 et « Normal » n'est pas affiché. Les deux tours affichent leur « Fin ».

Exemple 2 : Boucle en arrière avec CABLE

     H*  CABxx : boucle en arriere avec CABLE
     C                     Z-ADD1         I       20
     C                     Z-ADD0         TOTAL   40
     C           BOUCLE    TAG
     C                     ADD  I         TOTAL
     C                     ADD  1         I
     C           I         CABLE4         BOUCLE
     C*  1 + 2 + 3 + 4 = 10
     C           TOTAL     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

  10

Le TAG BOUCLE est au-dessus du CABLE. Tant que I est inférieur ou égal à 4, on revient en arrière : la somme 1 + 2 + 3 + 4 vaut 10.

Exemple 3 : Les indicateurs sont positionnés même sans saut

     H*  CABxx : les indicateurs HI LO EQ sont positionnes meme sans saut
     C                     Z-ADD5         MONTA   50
     C                     Z-ADD9         MONTB   50
     C           MONTA     CABGTMONTB     SUITE      102030
     C           'Pas saut'DSPLY
     C           SUITE     TAG
     C           *IN10     DSPLY
     C           *IN20     DSPLY
     C           *IN30     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Pas saut
0
1
0

5 n'est pas supérieur à 9 : pas de saut, « Pas saut » s'affiche. Mais les indicateurs de la ligne ont été mis à jour : HI (10) éteint, LO (20) allumé, EQ (30) éteint.

Le piège

L'étiquette doit exister : un CABEQ vers une étiquette sans TAG est refusé : QRG7043, « La destination de GOTO ou CABxx n'a pas d'instruction TAG ou ENDSR correspondante. La spécification n'est pas prise en compte. » (avec un QRG7030 sur le nom).

Les indicateurs ne dépendent pas du xx : avec CABGT et des indicateurs HI, LO, EQ, les trois sont mis à jour même si la relation du code opération est fausse (troisième exemple). Ne les prenez pas pour des indicateurs de « saut ».

Comme avec COMP, les deux facteurs doivent avoir le même type : sinon QRG7052.

En RPG ILE full free

Le branchement n'existe pas en format libre : on écrit un IF pour sauter un bloc, et une boucle DOW, DOU ou FOR pour revenir en arrière.

if solde <= 1000;
  dsply 'Normal';
endif;

i = 1;
dow i <= 4;
  total += i;
  i += 1;
enddo;