Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle
SELEC
Choisir un bloc parmi plusieurs cas
Ouvre un groupe de cas WHxx : seul le bloc du premier cas vrai s'exécute, sinon celui de OTHER ; la page couvre aussi WHxx, ANDxx, ORxx, OTHER et ENDSL.
Syntaxe
C SELEC
C zone1 WHEQ zone2
C zone1 ANDLEzone3
C zone1 WHLT zone4
C zone1 ORGT zone5
C OTHER
C ENDSL
- Code opération (28-32)
SELECouvre le groupe, sans zone.WHsuivi deEQ,NE,GT,LT,GEouLEintroduit un cas ;ANDxxetORxxle complètent.OTHERtraite tous les autres cas.- Facteur 1 (18-27)
- Premier terme de la comparaison d'un
WHxx, obligatoire. - Facteur 2 (33-42)
- Second terme, de même type.
- Effet
- Aucun indicateur positionné. Les
WHxxsont évalués dans l'ordre ; le bloc du premier qui est vrai s'exécute, puis l'exécution reprend après leENDSL. Sans cas vrai, c'est le bloc d'OTHER, ou rien s'il n'y en a pas.
À quoi ça sert
SELEC remplace une cascade de IFxx/ELSE/IFxx : classer un solde, traduire un code, choisir un traitement selon un type d'opération. Chaque cas se lit à plat, au même niveau.
Il se ferme par END ou ENDSL. OTHER joue le rôle du cas par défaut ; il est facultatif mais conseillé pour ne pas ignorer silencieusement une valeur imprévue.
Exemple 1 : Classer le solde de chaque client
H* SELEC : classer le solde de chaque client, OTHER pour le reste
FCLIENT3 IF E K DISK
C READ CLIENT3 90
C *IN90 DOWEQ'0'
C MOVE *BLANK CLASSE 8
C SELEC
C SOLDE WHLT 0
C MOVEL'debiteur'CLASSE
C SOLDE WHEQ 0
C MOVEL'a zero' CLASSE
C SOLDE WHGT 10000
C MOVEL'gros' CLASSE
C OTHER
C MOVEL'normal' CLASSE
C ENDSL
C NOM DSPLY
C CLASSE DSPLY
C READ CLIENT3 90
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Dupont SA
normal
Martin et fils
a zero
Leroy SARL
debiteur
Bernard Transports
gros
Petit Atelier
normal
Pour chaque client, CLASSE est remise à blanc puis le SELEC choisit : « debiteur » pour un solde négatif, « a zero », « gros » au-delà de 10000, « normal » pour le reste (OTHER).
Exemple 2 : Un seul cas exécuté, ANDxx et ORxx
H* SELEC : seul le premier WHxx vrai est execute, ANDxx et ORxx
C Z-ADD75 NOTE 30
C SELEC
C NOTE WHGE 50
C 'Admis' DSPLY
C NOTE WHGE 10
C 'Present' DSPLY
C ENDSL
C* Sans OTHER, aucun WHxx vrai : rien ne se passe
C Z-ADD5 NOTE
C SELEC
C NOTE WHGE 50
C 'Admis' DSPLY
C NOTE WHGE 10
C 'Present' DSPLY
C ENDSL
C 'Suite' DSPLY
C* WHxx avec ANDxx et ORxx
C Z-ADD12 NOTE
C SELEC
C NOTE WHLT 10
C NOTE ORGT 90
C 'Extreme' DSPLY
C NOTE WHGE 10
C NOTE ANDLE20
C 'Faible' DSPLY
C OTHER
C 'Autre' DSPLY
C ENDSL
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Admis
Suite
Faible
Avec NOTE à 75, les deux WHGE sont vrais mais seul « Admis » s'affiche : le premier cas vrai gagne. Avec 5 et sans OTHER, rien ne s'affiche (seul « Suite » suit). Avec 12, le premier cas (WHLT 10 ORGT 90) est faux, le second (WHGE 10 ANDLE 20) est vrai : « Faible ».
Le piège
Un seul cas est exécuté : dès qu'un WHxx est vrai, les suivants ne sont plus évalués, même s'ils sont vrais aussi (deuxième exemple avec 75). Classez donc du plus restrictif au plus large.
Sans OTHER, une valeur imprévue passe sous silence (deuxième exemple avec 5).
En RPG ILE full free
En RPG ILE full free, SELECT / WHEN / OTHER / ENDSL ont le même sens, avec des expressions complètes dans les WHEN.
select;
when solde < 0;
classe = 'debiteur';
when solde = 0;
classe = 'a zero';
when solde > 10000;
classe = 'gros';
other;
classe = 'normal';
endsl;