Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Structures de contrôle

CASxx

Appeler un sous-programme selon une comparaison

Compare les deux facteurs et, si la comparaison est vraie, exécute le sous-programme nommé en zone résultat ; un CAS sans condition sert de cas par défaut, et le groupe se ferme par ENDCS.

Syntaxe

     C           zone1     CASEQzone2     SOUSPR
     C           zone1     CASGEzone3     AUTRE
     C                     CAS            DEFAUT
     C                     ENDCS
Code opération (28-32)
CAS suivi de EQ, NE, GT, LT, GE ou LE. Un CAS seul, sans facteurs, est toujours vrai.
Facteur 1 (18-27)
Premier terme de la comparaison. Vide pour le CAS par défaut.
Facteur 2 (33-42)
Second terme, de même type. Vide pour le CAS par défaut.
Zone résultat (43-48)
Le nom du sous-programme (BEGSR) à exécuter si la comparaison est vraie.
Effet
Aucun indicateur positionné. Les lignes CASxx sont examinées dans l'ordre ; pour la première dont la comparaison est vraie, le sous-programme est exécuté, puis l'exécution reprend après le ENDCS (et non à la ligne CAS suivante).

À quoi ça sert

CASxx est l'aiguillage des programmes à menu : selon l'option saisie (création, modification, suppression), on exécute le sous-programme correspondant. Il équivaut à une suite de IFxx/EXSR/END mais tient en une ligne par cas.

La dernière ligne, un CAS sans condition, joue le rôle de OTHER : elle récupère tous les codes inconnus (premier exemple avec le code X).

Exemple 1 : Option de menu vers un sous-programme

     H*  CASxx : aiguiller vers un sous-programme selon un code, CAS par defaut
     C                     MOVEL'C'       OPT     1
     C                     EXSR TEST
     C                     MOVEL'S'       OPT
     C                     EXSR TEST
     C                     MOVEL'X'       OPT
     C                     EXSR TEST
     C                     SETON                     LR
     C*
     C           TEST      BEGSR
     C           OPT       CASEQ'C'       CREER
     C           OPT       CASEQ'M'       MODIF
     C           OPT       CASEQ'S'       SUPPR
     C                     CAS            ERREUR
     C                     ENDCS
     C                     ENDSR
     C*
     C           CREER     BEGSR
     C           'Creation'DSPLY
     C                     ENDSR
     C           MODIF     BEGSR
     C           'Modif'   DSPLY
     C                     ENDSR
     C           SUPPR     BEGSR
     C           'Suppress'DSPLY
     C                     ENDSR
     C           ERREUR    BEGSR
     C           'Code inc'DSPLY
     C                     ENDSR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Creation
Suppress
Code inc

Le sous-programme TEST aiguille le code OPT : C exécute CREER, S exécute SUPPR, et X, qui ne correspond à aucun cas, tombe dans le CAS sans condition qui exécute ERREUR.

Exemple 2 : Le premier cas vrai gagne, END ferme le groupe

     H*  CASxx : le premier CAS vrai gagne, END ferme le groupe comme ENDCS
     C                     Z-ADD500       MNT     50
     C           MNT       CASGE1000      GROS
     C           MNT       CASGE100       MOYEN
     C           MNT       CASGE10        PETIT
     C                     END
     C           'Suite'   DSPLY
     C                     Z-ADD5         MNT
     C           MNT       CASGE1000      GROS
     C           MNT       CASGE100       MOYEN
     C           MNT       CASGE10        PETIT
     C                     END
     C           'Fin'     DSPLY
     C                     SETON                     LR
     C           GROS      BEGSR
     C           'Gros'    DSPLY
     C                     ENDSR
     C           MOYEN     BEGSR
     C           'Moyen'   DSPLY
     C                     ENDSR
     C           PETIT     BEGSR
     C           'Petit'   DSPLY
     C                     ENDSR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Moyen
Suite
Fin

Avec 500, GE 1000 est faux, GE 100 est vrai : seul « Moyen » s'affiche, bien que GE 10 soit vrai aussi. Avec 5, aucun cas n'est vrai et rien ne s'exécute. Un END simple ferme le groupe aussi bien que ENDCS.

Le piège

Le groupe doit être fermé. Sans END ni ENDCS, la compilation s'arrête : QRG5094, gravité 30, « Opération ENDxx non définie pour une opération CASxx. » (essai fait en retirant les END du deuxième exemple).

Un seul sous-programme est appelé, celui du premier cas vrai (deuxième exemple : 500 ne déclenche que « Moyen »). Rangez les cas du plus restrictif au plus large.

En RPG ILE full free

Il n'y a pas d'équivalent direct en RPG ILE full free : on utilise SELECT/WHEN avec EXSR ou un appel de procédure.

select;
  when opt = 'C';
    exsr creer;
  when opt = 'M';
    exsr modif;
  when opt = 'S';
    exsr suppr;
  other;
    exsr erreur;
endsl;