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)
IFsuivi du code de comparaison :EQégal,NEdifférent,GTplus grand,LTplus petit,GEplus grand ou égal,LEplus petit ou égal.ANDxxetORxx, 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
IFxxetELSE(ouEND) s'exécute ; sinon l'exécution reprend après leELSE, ou après leENDs'il n'y a pas deELSE.
À 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;