Aller au contenu

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;