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 IFDATA: lv_status TYPE string.IF lv_age >= 18. lv_status = 'Adulte'.ELSE. lv_status = 'Mineur'.ENDIF.
" Moderne avec CONDDATA(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. " Satisfaisant3. COND dans les calculs
DATA: lv_quantity TYPE i VALUE 150.
" Grille de remiseDATA(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 CASEDATA: 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 SWITCHDATA(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
| Aspect | COND | SWITCH |
|---|---|---|
| Comparaison | Conditions arbitraires | Un opérande contre des valeurs |
| Équivalent à | IF…ELSEIF…ELSE | CASE…WHEN…ENDCASE |
| Flexibilité | Plus élevée (conditions complexes) | Plus simple pour comparaison de valeurs |
| Lisibilité | Pour conditions complexes | Pour de nombreuses valeurs individuelles |
" COND : Pour les plages et conditions complexesDATA(lv_category) = COND string( WHEN lv_age < 18 THEN 'Enfant" WHEN lv_age < 65 THEN 'Adulte" ELSE 'Senior").
" SWITCH : Pour les valeurs discrètesDATA(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ètreCALL METHOD lo_logger->log( iv_level = COND #( WHEN lv_error = abap_true THEN 'ERROR' ELSE 'INFO' ) iv_message = |Statut : { lv_status }|).
" Comme valeur de retourMETHODS 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
CONDpour les vérifications de plages et les conditions complexes. - Utilisez
SWITCHpour les comparaisons de valeurs discrètes (comme les enums, codes de statut). ELSEest optionnel – sans ELSE, la valeur initiale est retournée si aucune correspondance.THROWpermet de déclencher des exceptions comme résultat.- Combinez avec
VALUEpour 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
LETpour les variables d’aide locales au sein de l’expression.