Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle

IFxx

Exécuter un bloc si une comparaison est vraie

Compare le facteur 1 et le facteur 2 et exécute le bloc qui suit, jusqu'au ELSE ou au END, seulement si la comparaison est vraie ; la page couvre aussi ANDxx, ORxx, ELSE et END.

Syntaxe

     C           zone1     IFEQ zone2
     C           zone1     ANDGTzone3
     C           zone1     ORLT zone4
     C                     ELSE
     C                     END
Code opération (28-32)
IF suivi du code de comparaison : EQ égal, NE différent, GT plus grand, LT plus petit, GE plus grand ou égal, LE plus petit ou égal. ANDxx et ORxx, placés juste après, ajoutent une comparaison au même test.
Facteur 1 (18-27)
Premier terme : zone, constante ou littéral. Obligatoire.
Facteur 2 (33-42)
Second terme, du même type que le facteur 1 (numérique avec numérique, alphanumérique avec alphanumérique).
Effet
Aucun indicateur n'est positionné : la comparaison décide seulement quelles lignes s'exécutent. Si elle est vraie, le bloc entre IFxx et ELSE (ou END) s'exécute ; sinon l'exécution reprend après le ELSE, ou après le END s'il n'y a pas de ELSE.

À quoi ça sert

IFxx est le test de base du RPG III : tout programme qui contrôle une valeur avant d'agir l'utilise. Le bloc se termine par un END, ce qui remplace les anciens sauts par indicateurs.

Le suffixe xx donne la comparaison. Avec ANDxx, toutes les comparaisons doivent être vraies ; avec ORxx, une seule suffit. Les blocs peuvent s'imbriquer (deuxième exemple), chacun ayant son propre END.

Exemple 1 : Les six comparaisons, ELSE, ANDxx et ORxx

     H*  IFxx : les six comparaisons, ELSE, ANDxx et ORxx
     C                     Z-ADD100       QTE     30
     C                     Z-ADD100       SEUIL   30
     C           QTE       IFEQ SEUIL
     C           'EQ vrai' DSPLY
     C                     END
     C           QTE       IFNE SEUIL
     C           'NE vrai' DSPLY
     C                     ELSE
     C           'NE faux' DSPLY
     C                     END
     C           QTE       IFGT SEUIL
     C           'GT vrai' DSPLY
     C                     ELSE
     C           'GT faux' DSPLY
     C                     END
     C           QTE       IFLT SEUIL
     C           'LT vrai' DSPLY
     C                     ELSE
     C           'LT faux' DSPLY
     C                     END
     C           QTE       IFGE SEUIL
     C           'GE vrai' DSPLY
     C                     END
     C           QTE       IFLE SEUIL
     C           'LE vrai' DSPLY
     C                     END
     C*
     C*  ANDxx : les deux conditions doivent etre vraies
     C           QTE       IFGE 50
     C           QTE       ANDLE200
     C           'Plage OK'DSPLY
     C                     END
     C*  ORxx : une seule suffit
     C           QTE       IFLT 10
     C           QTE       ORGT 90
     C           'Hors'    DSPLY
     C                     END
     C                     SETON                     LR

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

EQ vrai
NE faux
GT faux
LT faux
GE vrai
LE vrai
Plage OK
Hors

Avec QTE et SEUIL égaux à 100, EQ, GE et LE sont vrais ; NE, GT et LT sont faux et leur ELSE s'exécute. Le test QTE GE 50 AND QTE LE 200 est vrai ; QTE LT 10 OR QTE GT 90 l'est aussi, car la seconde partie suffit.

Exemple 2 : Alphanumérique de longueurs différentes, blocs imbriqués

     H*  IFxx : comparaison alpha de longueurs differentes, blocs imbriques
     C                     MOVEL'LYON'    VILLE  10
     C                     MOVEL'LYON'    CODE    4
     C                     MOVEL'LYONNAIS'LONG   10
     C*  La zone la plus courte est completee de blancs : egalite vraie
     C           VILLE     IFEQ CODE
     C           'Egal'    DSPLY
     C                     END
     C*  'LYON      ' contre 'LYONNAIS  ' : le premier ecart decide
     C           VILLE     IFLT LONG
     C           'Avant'   DSPLY
     C                     END
     C*  Le blanc est plus petit que toute lettre
     C           CODE      IFNE 'LYON'
     C           'Diff'    DSPLY
     C                     ELSE
     C           'Meme'    DSPLY
     C                     END
     C*  Blocs imbriques
     C                     Z-ADD150       MNT     50
     C           MNT       IFGT 0
     C           MNT       IFGT 100
     C           'Gros'    DSPLY
     C                     ELSE
     C           'Petit'   DSPLY
     C                     END
     C                     ELSE
     C           'Nul'     DSPLY
     C                     END
     C                     SETON                     LR

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

Egal
Avant
Meme
Gros

La zone la plus courte est complétée de blancs avant la comparaison : VILLE (10 caractères, « LYON » suivi de blancs) et CODE (4 caractères, « LYON ») sont égales, donc « Egal » s'affiche. « LYON » suivi de blancs est plus petit que « LYONNAIS » : le premier écart est un blanc contre un N, d'où « Avant ». Le dernier test imbrique un IFGT dans un autre IFGT, chacun avec son END.

Le piège

Les deux termes doivent être du même type. Comparer une zone alphanumérique à une zone numérique est refusé à la compilation : QRG7052, gravité 30, « Les entrées en facteurs 1 et 2 sont de types différents. La spécification n'est pas prise en compte. » (obtenu en comparant deux zones dont l'une avait été déclarée numérique par erreur).

La comparaison alphanumérique complète par des blancs : deux zones de longueurs différentes sont égales si la plus longue n'a que des blancs en plus (deuxième exemple).

Un littéral en facteur 1 est limité à 8 caractères utiles. 'Hors zone' (9) est rejeté avec QRG5150, « Le littéral entré en Facteur 1 est incorrect. », alors que 'Plage OK' (8) passe. La limite vaut aussi pour le libellé d'un DSPLY.

En RPG ILE full free

En RPG ILE full free, le test devient une expression booléenne. ELSEIF remplace un ELSE suivi d'un IF, et la fin est ENDIF.

if qte >= 50 and qte <= 200;
  dsply 'Plage OK';
elseif qte < 10 or qte > 90;
  dsply 'Hors';
else;
  dsply 'Autre';
endif;