Aller au contenu

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)
SELEC ouvre le groupe, sans zone. WH suivi de EQ, NE, GT, LT, GE ou LE introduit un cas ; ANDxx et ORxx le complètent. OTHER traite 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 WHxx sont évalués dans l'ordre ; le bloc du premier qui est vrai s'exécute, puis l'exécution reprend après le ENDSL. 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;