The expressions COND and SWITCH enable conditional value assignments inline, without separate IF- or CASE blocks. They return a value and can be used anywhere a value is expected.
COND – Conditional Expressions (like IF)
The COND expression evaluates conditions and returns the corresponding value.
Syntax
COND <type>( WHEN <condition1> THEN <value1> [ WHEN <condition2> THEN <value2> ] [ ELSE <default_value> ])Examples for COND
1. Simple Condition
DATA: lv_age TYPE i VALUE 25.
" Classic with IFDATA: lv_status TYPE string.IF lv_age >= 18. lv_status = 'Adult'.ELSE. lv_status = 'Minor'.ENDIF.
" Modern with CONDDATA(lv_status2) = COND string( WHEN lv_age >= 18 THEN 'Adult' ELSE 'Minor').2. Multiple Conditions
DATA: lv_score TYPE i VALUE 75.
DATA(lv_grade) = COND string( WHEN lv_score >= 90 THEN 'Excellent' WHEN lv_score >= 80 THEN 'Good' WHEN lv_score >= 70 THEN 'Satisfactory' WHEN lv_score >= 60 THEN 'Adequate' ELSE 'Failed').
WRITE: / 'Grade:', lv_grade. " Satisfactory3. COND in Calculations
DATA: lv_quantity TYPE i VALUE 150.
" Discount tiersDATA(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 with Complex Conditions
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 " Children free WHEN lv_age < 18 OR lv_age >= 65 THEN 10 " Reduced WHEN lv_member = abap_true THEN 15 " Members ELSE 20 " Regular price).5. COND for Structure Fields
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 = 'Successful' ) WHEN lv_code = 404 THEN VALUE #( status = 'ERROR' message = 'Not found' ) WHEN lv_code = 500 THEN VALUE #( status = 'ERROR' message = 'Server error' ) ELSE VALUE #( status = 'UNKNOWN' message = 'Unknown code' )).6. COND with LET (Local Variables)
DATA(lv_message) = COND string( LET today = sy-datum age = 30 IN WHEN today+4(2) = '12' THEN |December, { age } years old| ELSE |Normal month, { age } years old|).7. COND with THROW (Raise 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 – Value-Based Branching (like CASE)
The SWITCH expression compares a value against multiple possibilities.
Syntax
SWITCH <type>( <operand> WHEN <value1> THEN <result1> [ WHEN <value2> THEN <result2> ] [ ELSE <default_value> ])Examples for SWITCH
1. Simple SWITCH
DATA: lv_day TYPE i VALUE 3.
" Classic with CASEDATA: lv_name TYPE string.CASE lv_day. WHEN 1. lv_name = 'Monday'. WHEN 2. lv_name = 'Tuesday'. WHEN 3. lv_name = 'Wednesday'. WHEN OTHERS. lv_name = 'Unknown'.ENDCASE.
" Modern with SWITCHDATA(lv_name2) = SWITCH string( lv_day WHEN 1 THEN 'Monday' WHEN 2 THEN 'Tuesday' WHEN 3 THEN 'Wednesday' WHEN 4 THEN 'Thursday' WHEN 5 THEN 'Friday' WHEN 6 THEN 'Saturday' WHEN 7 THEN 'Sunday' ELSE 'Invalid').2. SWITCH with Multiple Values per WHEN
DATA: lv_month TYPE i VALUE 7.
DATA(lv_season) = SWITCH string( lv_month WHEN 3 OR 4 OR 5 THEN 'Spring' WHEN 6 OR 7 OR 8 THEN 'Summer' WHEN 9 OR 10 OR 11 THEN 'Autumn' WHEN 12 OR 1 OR 2 THEN 'Winter' ELSE 'Invalid month').3. SWITCH for Status Codes
DATA: lv_status TYPE c LENGTH 1 VALUE 'A'.
DATA(lv_description) = SWITCH string( lv_status WHEN 'A' THEN 'Active' WHEN 'I' THEN 'Inactive' WHEN 'P' THEN 'Pending' WHEN 'C' THEN 'Completed' WHEN 'X' THEN 'Cancelled' ELSE 'Unknown').4. SWITCH with 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 for Enumerations
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 'NEW' WHEN ty_order_status-processing THEN 'PROCESSING' WHEN ty_order_status-shipped THEN 'SHIPPED' WHEN ty_order_status-delivered THEN 'DELIVERED' WHEN ty_order_status-cancelled THEN 'CANCELLED').6. SWITCH with THROW
DATA: lv_action TYPE string VALUE 'INVALID'.
DATA(lv_result) = SWITCH string( lv_action WHEN 'CREATE' THEN 'Create' WHEN 'UPDATE' THEN 'Update' WHEN 'DELETE' THEN 'Delete' ELSE THROW cx_parameter_invalid( parameter = 'ACTION' )).COND vs. SWITCH
| Aspect | COND | SWITCH |
|---|---|---|
| Comparison | Any conditions | One operand against values |
| Equivalent to | IF…ELSEIF…ELSE | CASE…WHEN…ENDCASE |
| Flexibility | Higher (complex conditions) | Simpler for value comparison |
| Readability | For complex conditions | For many individual values |
" COND: For ranges and complex conditionsDATA(lv_category) = COND string( WHEN lv_age < 18 THEN 'Child' WHEN lv_age < 65 THEN 'Adult' ELSE 'Senior').
" SWITCH: For discrete valuesDATA(lv_day_name) = SWITCH string( lv_day_number WHEN 1 THEN 'Monday' WHEN 2 THEN 'Tuesday' " ...).Nesting
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 'Active Customer' ELSE 'Inactive Customer' ) WHEN 'SUPPLIER' THEN COND #( WHEN lv_active = abap_true THEN 'Active Supplier' ELSE 'Inactive Supplier' ) ELSE 'Unknown').In Method Calls
" Directly as parameterCALL METHOD lo_logger->log( iv_level = COND #( WHEN lv_error = abap_true THEN 'ERROR' ELSE 'INFO' ) iv_message = |Status: { lv_status }|).
" As return valueMETHODS get_status_text RETURNING VALUE(rv_text) TYPE string.
METHOD get_status_text. rv_text = SWITCH #( mv_status WHEN 'A' THEN 'Active' WHEN 'I' THEN 'Inactive' ELSE 'Unknown' ).ENDMETHOD.Important Notes / Best Practice
- Use
CONDfor range checks and complex conditions. - Use
SWITCHfor discrete value comparisons (like enums, status codes). ELSEis optional – without ELSE, the initial value is returned when no match is found.THROWallows raising exceptions as a result.- Combine with
VALUEfor structures and tables. - Avoid too deep nesting – use methods for complex logic.
#derives the type from the context (e.g., in assignments).- Use
LETfor local helper variables within the expression.