Code opération RPG III / RPG/400 · IBM i (AS/400) · Indicateurs et branchements
COMP
Comparer deux valeurs
Compare le facteur 1 au facteur 2 et allume l'indicateur HI (54-55), LO (56-57) ou EQ (58-59) selon le résultat.
Syntaxe
C zone1 COMP zone2 102030
- Facteur 1 (18-27)
- Première valeur : zone ou littéral. Même type que le facteur 2 (deux numériques ou deux alphanumériques).
- Facteur 2 (33-42)
- Seconde valeur.
- Indicateurs (54-55)
- HI : s'allume si le facteur 1 est plus grand que le facteur 2.
- (56-57)
- LO : s'allume si le facteur 1 est plus petit que le facteur 2.
- (58-59)
- EQ : s'allume si les deux sont égaux. Au moins un des trois indicateurs est obligatoire.
- Effet
- Pour chaque indicateur nommé, il est allumé si la relation est vraie et éteint sinon, à chaque exécution. Un indicateur qu'on ne nomme pas n'est pas touché. Les zones comparées ne changent pas.
À quoi ça sert
Dans les programmes RPG III historiques, COMP est le test de base : on compare, on récupère le résultat dans un indicateur et on conditionne les lignes suivantes par cet indicateur (colonnes 9-17).
Les trois indicateurs répondent à la même comparaison, ce qui permet de distinguer trois cas en une ligne : trop petit, trop grand, juste ce qu'il faut.
En alphanumérique, la comparaison se fait caractère par caractère, de gauche à droite. La zone la plus courte est complétée par des blancs : deux zones qui ne diffèrent que par des blancs de fin sont égales.
Exemple 1 : HI, LO et EQ
H* COMP : HI en 54-55, LO en 56-57, EQ en 58-59
C Z-ADD150 MONTA 50
C Z-ADD200 MONTB 50
C* 150 compare a 200 : bas
C MONTA COMP MONTB 102030
C 10 MOVEL'HAUT' RESULT 5
C 20 MOVEL'BAS' RESULT
C 30 MOVEL'EGAL' RESULT
C RESULT DSPLY
C* 200 compare a 150 : haut
C MONTB COMP MONTA 102030
C 10 MOVEL'HAUT' RESULT 5
C 20 MOVEL'BAS' RESULT
C 30 MOVEL'EGAL' RESULT
C RESULT DSPLY
C* 150 compare a 150 : egal
C Z-ADD150 MONTB
C MONTA COMP MONTB 102030
C 10 MOVEL'HAUT' RESULT 5
C 20 MOVEL'BAS' RESULT
C 30 MOVEL'EGAL' RESULT
C RESULT DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
BAS
HAUT
EGAL
Trois comparaisons de montants : 150 comparé à 200 allume LO (« BAS »), 200 comparé à 150 allume HI (« HAUT »), 150 comparé à 150 allume EQ (« EGAL »). Chaque indicateur conditionne un MOVEL.
Exemple 2 : Les indicateurs nommés sont recalculés
H* COMP : les indicateurs sont remis a jour a chaque comparaison
C Z-ADD5 MONTA 50
C Z-ADD9 MONTB 50
C* Les trois sont allumes avant la comparaison
C SETON 102030
C MONTA COMP MONTB 102030
C *IN10 DSPLY
C *IN20 DSPLY
C *IN30 DSPLY
C* Sans indicateur LO (56-57) : le 20 reste tel quel
C SETON 102030
C MONTA COMP MONTB 10 30
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 :
0
1
0
0
1
0
On allume 10, 20 et 30 avant de comparer 5 à 9. Les trois indicateurs sont nommés : 10 (HI) et 30 (EQ) s'éteignent, 20 (LO) reste allumé. Dans la seconde comparaison, 20 n'est pas nommé : il reste à 1 quoi qu'il arrive, et 10 et 30 sont éteints.
Exemple 3 : Zones alphanumériques
H* COMP : zones alphanumeriques, blancs de fin et ordre des lettres
C MOVEL'Dupont' NOM1 10
C MOVEL'Durand' NOM2 10
C MOVEL'Dupont' NOM3 6
C* Dupont / Durand : p est avant r, donc bas
C NOM1 COMP NOM2 102030
C *IN20 DSPLY
C* NOM1 fait 10 caracteres, NOM3 en fait 6 : egal quand meme
C NOM1 COMP NOM3 102030
C *IN30 DSPLY
C* Comparaison a un litteral
C NOM1 COMP 'Dupond' 102030
C *IN10 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
1
1
« Dupont » est avant « Durand » (le p précède le r) : LO. Une zone de 10 caractères contenant « Dupont » et une zone de 6 contenant « Dupont » sont égales : EQ. « Dupont » comparé à « Dupond » donne HI (t après d).
Le piège
Il faut au moins un indicateur : sans indicateur en colonnes 54-59, le compilateur refuse : QRG5053, « La zone Indicateurs résultants est à blanc pour l'opération définie ».
Les deux facteurs doivent être du même type : comparer une zone numérique à une zone alphanumérique donne QRG7052, « Les entrées en facteurs 1 et 2 sont de types différents. La spécification n'est pas prise en compte. » Convertissez d'abord (MOVE).
Un indicateur non nommé garde sa valeur : si seuls le HI et l'EQ sont écrits, un LO allumé plus haut le reste (deuxième exemple). Nommez les trois, ou éteignez-les avant.
En RPG ILE full free
En RPG ILE on n'a plus besoin d'indicateur : on écrit la comparaison dans le IF (ou dans une expression booléenne).
if montA > montB;
dsply 'HAUT';
elseif montA < montB;
dsply 'BAS';
else;
dsply 'EGAL';
endif;