Instruction CASE en ABAP : Branchements multiples pour un code clair

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction CASE est une structure de contrôle pour les branchements multiples en ABAP. Elle offre souvent une alternative plus claire à une longue chaîne d’instructions IF...ELSEIF...ELSE...ENDIF, notamment lorsque le flux du programme dépend de plusieurs valeurs spécifiques et discrètes d’une seule variable (ou expression).

On vérifie donc la valeur d’un opérande et on exécute ensuite le bloc de code correspondant à cette valeur.

Syntaxe

CASE <operand>.
WHEN <valeur1> [OR <valeur1a> OR <valeur1b> ...].
" Bloc d'instructions 1
" Exécuté si <operand> = <valeur1> OU <valeur1a> OU <valeur1b> ... .
[Instructions...]
WHEN <valeur2> [OR <valeur2a> ...].
" Bloc d'instructions 2
" Exécuté si <operand> = <valeur2> OU <valeur2a> ...
" ET qu'aucune condition WHEN précédente n'a été remplie.
[Instructions...]
" ... autres branches WHEN ...
[WHEN OTHERS. " Branche optionnelle pour tous les autres cas
" Bloc d'instructions 'Autres"
" Exécuté si <operand> ne correspond à AUCUNE des valeurs dans les
" branches WHEN précédentes.
[Instructions...]]
ENDCASE.
  • CASE <operand> : Introduit la structure. <operand> est la variable ou l’expression dont la valeur est vérifiée.
  • WHEN <valeur> : Définit un cas possible (une branche). <valeur> est une valeur constante (par exemple un littéral comme 'A', 123 ou une constante) avec laquelle l’<operand> est comparé.
  • OR <valeurX> : Optionnel. Permet de spécifier plusieurs valeurs pour lesquelles le même bloc d’instructions sera exécuté.
  • Bloc d'instructions : Le bloc de code ABAP exécuté lorsque la valeur de l’<operand> correspond à l’une des valeurs de la branche WHEN.
  • WHEN OTHERS : Une branche optionnelle qui capture toutes les valeurs non couvertes par les branches WHEN précédentes. C’est une bonne pratique d’inclure souvent cette branche pour gérer les valeurs inattendues.
  • ENDCASE : Termine obligatoirement la structure CASE.

Fonctionnement et déroulement

  1. La valeur de l’<operand> est déterminée une seule fois.
  2. Cette valeur est comparée séquentiellement (de haut en bas) avec les valeurs des branches WHEN.
  3. Dès que la valeur de l’opérande correspond à une valeur d’une branche WHEN, le bloc d’instructions correspondant est exécuté.
  4. Important : Après l’exécution de ce bloc, le contrôle passe immédiatement à l’instruction après ENDCASE. Aucune autre branche WHEN de la même structure CASE n’est plus vérifiée ou exécutée – c’est le “premier WHEN correspondant qui gagne”.
  5. Si aucune des branches WHEN ne correspond, le bloc WHEN OTHERS est exécuté (s’il existe).
  6. Si aucune des branches WHEN ne correspond et qu’il n’y a pas de bloc WHEN OTHERS, aucun bloc de la structure CASE n’est exécuté, et le programme continue après ENDCASE.

Distinction avec IF...ELSEIF...

  • CASE : Idéal lorsqu’une valeur est vérifiée contre plusieurs valeurs individuelles fixes. Souvent plus lisible et plus court.
  • IF...ELSEIF... : Plus flexible pour les conditions complexes, les vérifications de plage (>, <), les combinaisons (AND, OR) ou lorsque différentes variables doivent être vérifiées dans les conditions.

Alternative moderne : L’opérateur SWITCH (à partir de ABAP 7.40)

Pour les affectations basées sur la valeur d’une variable, il existe l’opérateur SWITCH, qui offre une syntaxe en ligne plus compacte :

DATA(description) = SWITCH zusatztyp( transportmittel
WHEN 'F' THEN 'Vélo"
WHEN 'A' THEN 'Voiture"
WHEN 'B' THEN 'Bus"
ELSE 'Inconnu' ).

CASE reste cependant l’instruction standard pour contrôler les blocs d’instructions.

Exemples

1. CASE pour un code de statut (caractère)

DATA document_status TYPE c LENGTH 1.
document_status = 'R'. " R=Released, B=Blocked, N=New
CASE document_status.
WHEN 'N'.
WRITE / 'Le document est nouveau et pas encore traité.'.
WHEN 'R'.
WRITE / 'Le document est validé.'. " Ce bloc est exécuté
WHEN 'B'.
WRITE / 'Le document est bloqué.'.
WHEN OTHERS.
WRITE / 'Attention : Statut de document inconnu:', document_status.
ENDCASE.

2. CASE pour les numéros de mois avec OR

DATA current_month TYPE i.
current_month = sy-datum+4(2). " Extrait le mois de la date système
CASE current_month.
WHEN 1 OR 2 OR 3.
WRITE / 'Premier trimestre'.
WHEN 4 OR 5 OR 6.
WRITE / 'Deuxième trimestre'. " Ce bloc est exécuté en avril
WHEN 7 OR 8 OR 9.
WRITE / 'Troisième trimestre'.
WHEN 10 OR 11 OR 12.
WRITE / 'Quatrième trimestre'.
WHEN OTHERS.
WRITE / 'Mois extrait invalide !'. " Ne devrait pas se produire
ENDCASE.

3. CASE pour la saisie utilisateur

DATA user_command TYPE sy-ucomm. " Champ système pour les codes OK
user_command = 'SAVE'.
CASE user_command.
WHEN 'SAVE'.
WRITE / 'Action : Enregistrement en cours.'.
" ... Code pour enregistrer ...
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
WRITE / 'Action : Retour ou Annuler.'.
LEAVE TO SCREEN 0. " Action exemple
WHEN OTHERS.
WRITE / 'Action : Commande inconnue ou non gérée.'.
ENDCASE.

4. CASE sans WHEN OTHERS

DATA flag TYPE c LENGTH 1 VALUE 'X'.
CASE flag.
WHEN 'A'.
WRITE / 'Flag est A'.
WHEN 'B'.
WRITE / 'Flag est B'.
ENDCASE.
" Comme flag = 'X' et qu'il n'y a pas de WHEN OTHERS, aucun bloc n'est exécuté.
WRITE / 'Après le bloc CASE.'.

Remarques importantes / Bonnes pratiques

  • CASE est très utile pour améliorer la lisibilité lors de comparaisons d’un opérande avec de nombreuses valeurs fixes.
  • Utilisez la branche WHEN OTHERS pour vous assurer que votre programme réagit de manière robuste aux valeurs inattendues ou non explicitement gérées.
  • Pensez à la logique “Le premier match gagne” : seule la première branche WHEN correspondante est exécutée.
  • N’oubliez pas le ENDCASE final.