SWITCH语法简介
SWITCH
是一种条件运算符,用于根据给定的条件返回不同的结果。与传统的 CASE
和 IF-ELSE
语法不同,SWITCH
是一种表达式,可以直接嵌入赋值或操作中。
SWITCH的基本用法
SWITCH
表达式的基本形式如下:
SWITCH type(
[let_exp]
operand
WHEN const1 THEN [let_exp] result1
[WHEN const2 THEN [let_exp] result2]
...
[ELSE [let_exp] resultn]
)
在这里,type
代表数据类型;let_exp
是LET语句,可以定义临时变量;WHEN
后面的条件用于判断,THEN
后面的值是在条件为真时返回的值。ELSE
部分是默认值,当所有条件都不成立时返回。
PS:·LET关键字可以在
COND
,SWITCH
,VALUE
等语句中使用,将在后续文章中单独讲解。
假设我们需要判断DO循环的索引是否是第5行,使用传统的IF-ELSE语句和CASE语句实现如下:
PS:在传统
CASE
条件语句中,我们需要指定每个条件中将被填充的变量,如下图所示的lv_output
。
DATA: lv_output TYPE c LENGTH 20.
*IF-ELSE语句
DO 10 TIMES.
IF sy-index = '5'.
lv_output = '这是第五行'.
ELSE.
lv_output = '这不是第五行'.
ENDIF.
WRITE:/ lv_output.
ENDDO.
*CASE语句
DO 10 TIMES.
CASE sy-index .
WHEN '5'.
lv_output = '这是第五行'.
WHEN OTHERS.
lv_output = '这不是第五行'.
ENDCASE.
WRITE:/ lv_output.
ENDDO.
使用SWITCH
语法后,可以简化为如下所示:
*SWITCH语句
DO 10 TIMES.
DATA(lv_output) = SWITCH char20( sy-index
WHEN '5' THEN '这是第五行'
ELSE '这不是第五行'
).
WRITE: / lv_output.
ENDDO.
PS:
SWITCH
会根据sy-index
的值自动返回相应的字符串,不需要在每个WHEN
后再指定lv_output =
。
SWITCH与COND的对比
SWITCH
的效果与 COND
非常相似。它们都是根据给定的条件来决定返回结果的,只是写法有所不同。在功能上,COND
语句可以处理复杂条件;SWITCH
语句只能处理操作数,且WHEN
后仅能跟常量,不能使用表达式。
下面我们来探讨下,SWITCH
语句和COND
语句在实际使用过程中的异同之处。
二者均能使用LET关键字
SWITCH
语句和COND
语句均能使用LET
关键字,可以在语句中定义临时变量,用来简化部分冗余代码。
与 FOR 语句类似,LET 语句中定义的临时变量同样只能在当前语句中使用, 在其他语句中使用时会检查出语法错误。
PS:
LET
关键字在后续文章中进行详细讲解。
二者在某些场景下可以相互替代
当WHEN
后仅跟常量
的情景下,COND
语句与SWITCH
语句可以相互替代,如下所示:
COND type( WHEN operand = const1 THEN result1
WHEN operand = const2 THEN result2
...
ELSE resultn )
SWITCH type( operand
WHEN const1 THEN result1
WHEN const2 THEN result2
...
ELSE resultn )
但是涉及到复杂表达式的情景,则不能使用SWITCH
语句,只能使用COND
语句处理。
COND type( WHEN log_exp1 THEN result1
WHEN log_exp2 THEN result2
...
ELSE resultn )
二者均可以进行嵌套使用
假设这个场景中,同一个客户分组中具有两套编码,我们需要根据客户的分组 CUSTOMER_GROUP
以及客户编码 CUSTOMER_ID
的长度来判断该客户是否为关联方客户
。当客户分组为ZZ06
并且客户编码为4位
时,输出对应描述。
使用COND语法嵌套如下:
DATA(lv_customer_group) = 'ZZ06'. " 假设客户分组是 ZZ06
DATA(lv_customer_id) = '1234'. " 假设客户编码是 1234
DATA(lv_result) = SWITCH string(
lv_customer_group
WHEN 'ZZ06' THEN
SWITCH string(
strlen( lv_customer_id )
WHEN 4 THEN '该客户是关联方客户'
ELSE '该客户是非关联方客户'
)
ELSE '该客户不是关联方客户'
).
WRITE: / lv_result.
使用COND语法嵌套如下:
DATA(lv_customer_group) = 'ZZ06'. " 假设客户分组是 ZZ06
DATA(lv_customer_id) = '1234'. " 假设客户编码是 1234
DATA(lv_result) = COND string(
WHEN lv_customer_group = 'ZZ06' THEN
COND string(
WHEN strlen( lv_customer_id ) = 4 THEN '该客户是关联方客户'
ELSE '该客户是非关联方客户'
)
ELSE '该客户不是关联方客户'
).
WRITE: / lv_result.
尾声
总的来说,在ABAP 7.4/7.5之后, SAP推荐使用SWITCH
语句作为旧版语法CASE
的替代,并且在某些简单场景下可以与COND
语句的实现进行相互转换。
通过使用SWITCH
语句,可以减少代码冗余,并且提升运行效率。由于笔者能力有限,在此仅抛砖引玉
,如果有更多内容,也欢迎各位朋友在评论区中进行补充!
这里是ThundersArk,
以上。