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',123ou 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 brancheWHEN.WHEN OTHERS: Une branche optionnelle qui capture toutes les valeurs non couvertes par les branchesWHENprécédentes. C’est une bonne pratique d’inclure souvent cette branche pour gérer les valeurs inattendues.ENDCASE: Termine obligatoirement la structureCASE.
Fonctionnement et déroulement
- La valeur de l’
<operand>est déterminée une seule fois. - Cette valeur est comparée séquentiellement (de haut en bas) avec les valeurs des branches
WHEN. - Dès que la valeur de l’opérande correspond à une valeur d’une branche
WHEN, le bloc d’instructions correspondant est exécuté. - Important : Après l’exécution de ce bloc, le contrôle passe immédiatement à l’instruction après
ENDCASE. Aucune autre brancheWHENde la même structureCASEn’est plus vérifiée ou exécutée – c’est le “premier WHEN correspondant qui gagne”. - Si aucune des branches
WHENne correspond, le blocWHEN OTHERSest exécuté (s’il existe). - Si aucune des branches
WHENne correspond et qu’il n’y a pas de blocWHEN OTHERS, aucun bloc de la structureCASEn’est exécuté, et le programme continue aprèsENDCASE.
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 produireENDCASE.3. CASE pour la saisie utilisateur
DATA user_command TYPE sy-ucomm. " Champ système pour les codes OKuser_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
CASEest très utile pour améliorer la lisibilité lors de comparaisons d’un opérande avec de nombreuses valeurs fixes.- Utilisez la branche
WHEN OTHERSpour 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
WHENcorrespondante est exécutée. - N’oubliez pas le
ENDCASEfinal.