Instruction RPG full free · IBM i (AS/400) · Structures de contrôle
IF
Exécuter selon une condition
Exécute un bloc d'instructions seulement si une condition est vraie, avec en option des conditions de repli (ELSEIF) et un cas par défaut (ELSE).
Syntaxe
IF condition;
instructions;
ELSEIF condition;
instructions;
ELSE;
instructions;
ENDIF;
condition- Une expression logique : comparaison (
=,<>,>,<=…), indicateur, fonction renvoyant un indicateur comme%FOUND, le tout combiné avecAND,OR,NOTet des parenthèses. ELSEIF- Condition de repli, testée seulement si les précédentes sont fausses. On peut en enchaîner autant qu'on veut.
ELSE- Bloc exécuté quand aucune condition n'est vraie. Facultatif.
ENDIF- Ferme la structure. Obligatoire.
- Effet
- Aucun indicateur n'est positionné : l'instruction oriente seulement le déroulement du programme. Un seul bloc est exécuté, le premier dont la condition est vraie, puis le programme reprend après
ENDIF.
À quoi ça sert
C'est la structure de décision de base. En format colonnes, on écrivait C SOLDE IFGT 0 ; en full free la condition s'écrit comme une expression, avec des opérateurs lisibles et des parenthèses, et les structures peuvent s'imbriquer.
Quand on a plus de deux ou trois branches sur des valeurs différentes, SELECT est souvent plus lisible qu'une longue suite de ELSEIF.
Exemple 1 : Classer un client selon son solde
**free
// IF / ELSEIF / ELSE : classer un client selon son solde.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed extdesc('JOBIRPG/CLIENT') extfile(*extdesc);
dcl-s statut char(12);
chain (100) client;
if %found(client);
if solde > 10000;
statut = 'Gros compte';
elseif solde > 0;
statut = 'Debiteur';
elseif solde = 0;
statut = 'A zero';
else;
statut = 'Crediteur';
endif;
snd-msg 'Client ' + %char(numcli) + ' ' + %trim(nom) + ' : [' + %trim(statut) + ']';
else;
snd-msg 'Client 100 introuvable';
endif;
chain (300) client;
if %found(client) and solde < 0;
snd-msg 'Client ' + %char(numcli) + ' : solde negatif ' + %char(solde);
endif;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Client 100 Dupont SA : [Debiteur]
Client 300 : solde negatif -320.00
Le client 100 a un solde de 1250,50 : le premier test (supérieur à 10 000) est faux, le deuxième (positif) est vrai, donc le statut est « Debiteur » et les branches suivantes sont ignorées. Le second bloc, %found(client) and solde < 0, vérifie la présence du client puis le signe du solde : le client 300 doit 320,00.
Le mot-clé alwnull(*usrctl) est là parce que le client 300 a une date de création à NULL : sans lui, la lecture échoue.
Exemple 2 : Priorité des opérateurs
**free
// Priorite des operateurs : AND passe avant OR.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ville char(15) inz('Montpellier');
dcl-s montant packed(7:2) inz(500);
dcl-s urgent ind inz(*on);
// Lecture naive : on croit "(Montpellier ou Lyon) et montant > 1000"
if ville = 'Montpellier' or ville = 'Lyon' and montant > 1000;
snd-msg 'Sans parentheses : accepte';
else;
snd-msg 'Sans parentheses : refuse';
endif;
if (ville = 'Montpellier' or ville = 'Lyon') and montant > 1000;
snd-msg 'Avec parentheses : accepte';
else;
snd-msg 'Avec parentheses : refuse';
endif;
// Un indicateur s'utilise directement, et not l'inverse.
if urgent and not (montant > 1000);
snd-msg 'Urgent et petit montant';
endif;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Sans parentheses : accepte
Avec parentheses : refuse
Urgent et petit montant
Ville Montpellier, montant 500. Sans parenthèses, le test est accepté alors qu'on voulait « Montpellier ou Lyon, et montant supérieur à 1000 ». Avec les parenthèses, il est refusé comme prévu. La dernière condition montre qu'un indicateur s'utilise tel quel, avec not pour l'inverse.
Le piège
AND est prioritaire sur OR. Écrit sans parenthèses, ville = 'Montpellier' or ville = 'Lyon' and montant > 1000 se lit « Montpellier, ou (Lyon et montant > 1000) ». Avec une ville Montpellier et un montant de 500, le test passe, ce qui n'est pas ce que voulait l'auteur (deuxième exemple). Dès qu'on mélange AND et OR, mettez des parenthèses.