ABAP COND et SWITCH : Expressions conditionnelles inline

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

Les expressions COND et SWITCH permettent des affectations de valeurs conditionnelles inline, sans blocs IF ou CASE séparés. Elles retournent une valeur et peuvent être utilisées partout où une valeur est attendue.

COND – Expressions conditionnelles (comme IF)

L’expression COND vérifie des conditions et retourne la valeur correspondante.

Syntaxe

COND <type>(
WHEN <condition1> THEN <valeur1>
[ WHEN <condition2> THEN <valeur2> ]
[ ELSE <valeur_defaut> ]
)

Exemples pour COND

1. Condition simple

DATA: lv_age TYPE i VALUE 25.
" Classique avec IF
DATA: lv_status TYPE string.
IF lv_age >= 18.
lv_status = 'Adulte'.
ELSE.
lv_status = 'Mineur'.
ENDIF.
" Moderne avec COND
DATA(lv_status2) = COND string(
WHEN lv_age >= 18 THEN 'Adulte"
ELSE 'Mineur"
).

2. Conditions multiples

DATA: lv_score TYPE i VALUE 75.
DATA(lv_grade) = COND string(
WHEN lv_score >= 90 THEN 'Très bien"
WHEN lv_score >= 80 THEN 'Bien"
WHEN lv_score >= 70 THEN 'Satisfaisant"
WHEN lv_score >= 60 THEN 'Passable"
ELSE 'Non admis"
).
WRITE: / 'Note:', lv_grade. " Satisfaisant

3. COND dans les calculs

DATA: lv_quantity TYPE i VALUE 150.
" Grille de remise
DATA(lv_discount) = COND decfloat16(
WHEN lv_quantity >= 100 THEN '0.15' " 15%
WHEN lv_quantity >= 50 THEN '0.10' " 10%
WHEN lv_quantity >= 10 THEN '0.05' " 5%
ELSE '0.00"
).
DATA(lv_price) = 100 * ( 1 - lv_discount ).

4. COND avec conditions complexes

DATA: lv_age TYPE i VALUE 25,
lv_member TYPE abap_bool VALUE abap_true.
DATA(lv_ticket_price) = COND i(
WHEN lv_age < 6 THEN 0 " Enfants gratuits
WHEN lv_age < 18 OR lv_age >= 65 THEN 10 " Tarif réduit
WHEN lv_member = abap_true THEN 15 " Membres
ELSE 20 " Plein tarif
).

5. COND pour les champs de structure

TYPES: BEGIN OF ty_result,
status TYPE string,
message TYPE string,
END OF ty_result.
DATA: lv_code TYPE i VALUE 200.
DATA(ls_result) = COND ty_result(
WHEN lv_code = 200 THEN VALUE #( status = 'OK' message = 'Succès' )
WHEN lv_code = 404 THEN VALUE #( status = 'ERROR' message = 'Non trouvé' )
WHEN lv_code = 500 THEN VALUE #( status = 'ERROR' message = 'Erreur serveur' )
ELSE VALUE #( status = 'UNKNOWN' message = 'Code inconnu' )
).

6. COND avec LET (variables locales)

DATA(lv_message) = COND string(
LET today = sy-datum
age = 30
IN
WHEN today+4(2) = '12' THEN |Décembre, { age } ans|
ELSE |Mois normal, { age } ans|
).

7. COND avec THROW (déclencher une exception)

DATA: lv_divisor TYPE i VALUE 0.
DATA(lv_result) = COND i(
WHEN lv_divisor <> 0 THEN 100 / lv_divisor
ELSE THROW cx_sy_zerodivide( )
).

SWITCH – Branchement basé sur les valeurs (comme CASE)

L’expression SWITCH compare une valeur avec plusieurs possibilités.

Syntaxe

SWITCH <type>( <operande>
WHEN <valeur1> THEN <resultat1>
[ WHEN <valeur2> THEN <resultat2> ]
[ ELSE <valeur_defaut> ]
)

Exemples pour SWITCH

1. SWITCH simple

DATA: lv_day TYPE i VALUE 3.
" Classique avec CASE
DATA: lv_name TYPE string.
CASE lv_day.
WHEN 1. lv_name = 'Lundi'.
WHEN 2. lv_name = 'Mardi'.
WHEN 3. lv_name = 'Mercredi'.
WHEN OTHERS. lv_name = 'Inconnu'.
ENDCASE.
" Moderne avec SWITCH
DATA(lv_name2) = SWITCH string( lv_day
WHEN 1 THEN 'Lundi"
WHEN 2 THEN 'Mardi"
WHEN 3 THEN 'Mercredi"
WHEN 4 THEN 'Jeudi"
WHEN 5 THEN 'Vendredi"
WHEN 6 THEN 'Samedi"
WHEN 7 THEN 'Dimanche"
ELSE 'Invalide"
).

2. SWITCH avec plusieurs valeurs par WHEN

DATA: lv_month TYPE i VALUE 7.
DATA(lv_season) = SWITCH string( lv_month
WHEN 3 OR 4 OR 5 THEN 'Printemps"
WHEN 6 OR 7 OR 8 THEN 'Été"
WHEN 9 OR 10 OR 11 THEN 'Automne"
WHEN 12 OR 1 OR 2 THEN 'Hiver"
ELSE 'Mois invalide"
).

3. SWITCH pour les codes de statut

DATA: lv_status TYPE c LENGTH 1 VALUE 'A'.
DATA(lv_description) = SWITCH string( lv_status
WHEN 'A' THEN 'Actif"
WHEN 'I' THEN 'Inactif"
WHEN 'P' THEN 'En attente"
WHEN 'C' THEN 'Terminé"
WHEN 'X' THEN 'Annulé"
ELSE 'Inconnu"
).

4. SWITCH avec structures

TYPES: BEGIN OF ty_config,
color TYPE string,
size TYPE i,
enabled TYPE abap_bool,
END OF ty_config.
DATA: lv_mode TYPE string VALUE 'DARK'.
DATA(ls_config) = SWITCH ty_config( lv_mode
WHEN 'LIGHT' THEN VALUE #( color = 'white' size = 12 enabled = abap_true )
WHEN 'DARK' THEN VALUE #( color = 'black' size = 14 enabled = abap_true )
WHEN 'HIGH_CONTRAST' THEN VALUE #( color = 'yellow' size = 16 enabled = abap_true )
ELSE VALUE #( color = 'gray' size = 12 enabled = abap_false )
).

5. SWITCH pour les énumérations

TYPES: BEGIN OF ENUM ty_order_status,
new,
processing,
shipped,
delivered,
cancelled,
END OF ENUM ty_order_status.
DATA: lv_status TYPE ty_order_status VALUE ty_order_status-shipped.
DATA(lv_icon) = SWITCH string( lv_status
WHEN ty_order_status-new THEN '📝"
WHEN ty_order_status-processing THEN '⚙️"
WHEN ty_order_status-shipped THEN '📦"
WHEN ty_order_status-delivered THEN '"
WHEN ty_order_status-cancelled THEN '❌"
).

6. SWITCH avec THROW

DATA: lv_action TYPE string VALUE 'INVALID'.
DATA(lv_result) = SWITCH string( lv_action
WHEN 'CREATE' THEN 'Créer"
WHEN 'UPDATE' THEN 'Mettre à jour"
WHEN 'DELETE' THEN 'Supprimer"
ELSE THROW cx_parameter_invalid( parameter = 'ACTION' )
).

COND vs. SWITCH

AspectCONDSWITCH
ComparaisonConditions arbitrairesUn opérande contre des valeurs
Équivalent àIF…ELSEIF…ELSECASE…WHEN…ENDCASE
FlexibilitéPlus élevée (conditions complexes)Plus simple pour comparaison de valeurs
LisibilitéPour conditions complexesPour de nombreuses valeurs individuelles
" COND : Pour les plages et conditions complexes
DATA(lv_category) = COND string(
WHEN lv_age < 18 THEN 'Enfant"
WHEN lv_age < 65 THEN 'Adulte"
ELSE 'Senior"
).
" SWITCH : Pour les valeurs discrètes
DATA(lv_day_name) = SWITCH string( lv_day_number
WHEN 1 THEN 'Lundi"
WHEN 2 THEN 'Mardi"
" ...
).

Imbrication

DATA: lv_type TYPE string VALUE 'CUSTOMER',
lv_active TYPE abap_bool VALUE abap_true.
DATA(lv_label) = SWITCH string( lv_type
WHEN 'CUSTOMER' THEN COND #(
WHEN lv_active = abap_true THEN 'Client actif"
ELSE 'Client inactif"
)
WHEN 'SUPPLIER' THEN COND #(
WHEN lv_active = abap_true THEN 'Fournisseur actif"
ELSE 'Fournisseur inactif"
)
ELSE 'Inconnu"
).

Dans les appels de méthodes

" Directement comme paramètre
CALL METHOD lo_logger->log(
iv_level = COND #( WHEN lv_error = abap_true THEN 'ERROR' ELSE 'INFO' )
iv_message = |Statut : { lv_status }|
).
" Comme valeur de retour
METHODS get_status_text
RETURNING VALUE(rv_text) TYPE string.
METHOD get_status_text.
rv_text = SWITCH #( mv_status
WHEN 'A' THEN 'Actif"
WHEN 'I' THEN 'Inactif"
ELSE 'Inconnu"
).
ENDMETHOD.

Notes importantes / Bonnes pratiques

  • Utilisez COND pour les vérifications de plages et les conditions complexes.
  • Utilisez SWITCH pour les comparaisons de valeurs discrètes (comme les enums, codes de statut).
  • ELSE est optionnel – sans ELSE, la valeur initiale est retournée si aucune correspondance.
  • THROW permet de déclencher des exceptions comme résultat.
  • Combinez avec VALUE pour les structures et tables.
  • Évitez une imbrication trop profonde – utilisez des méthodes pour la complexité.
  • # déduit le type du contexte (ex. lors des affectations).
  • Utilisez LET pour les variables d’aide locales au sein de l’expression.