SAP ABAP 新语法(三)- 新条件语句【SWITCH】


SWITCH语法简介

SWITCH 是一种条件运算符,用于根据给定的条件返回不同的结果。与传统的 CASEIF-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关键字可以在CONDSWITCHVALUE等语句中使用,将在后续文章中单独讲解。

假设我们需要判断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,

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThundersArk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值