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)
CASsuivi deEQ,NE,GT,LT,GEouLE. UnCASseul, sans facteurs, est toujours vrai.- Facteur 1 (18-27)
- Premier terme de la comparaison. Vide pour le
CASpar défaut. - Facteur 2 (33-42)
- Second terme, de même type. Vide pour le
CASpar 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
CASxxsont 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 leENDCS(et non à la ligneCASsuivante).
À 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;