Aller au contenu

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é avec AND, OR, NOT et 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.