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)
CABsuivi 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
TAGvers 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 avecCOMP.
À 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;