07. [SAP ABAP] CASE控制语句
在 ABAP 中,CASE 是一种多分支条件控制语句 ,用于根据一个变量或表达式的值执行不同的代码块。它比多个 IF...ELSEIF 更清晰、高效(尤其当判断的是同一个变量的多个可能值时)。
一、基本语法
ABAP
CASE <field>.
WHEN <abc>.
<statement block>.
WHEN <pqr>.
<statement block>.
...
...
...
WHEN <xyz>.
<statement block>.
WHEN OTHERS.
<statement block>.
ENDCASE.
- : 必须是可比较的数据类型(如字符型、数值型、枚举等),不能是结构体或内表。
WHEN后面可以是一个常量、字面量、常量表达式 ,也可以是多个值(用OR连接)。WHEN OTHERS是可选的,用于处理所有未明确列出的情况(类似于其他语言中的default)。
二、示例
示例1:简单CASE
ABAP
REPORT ZGOYEER001.
DATA: lv_grade TYPE c VALUE 'B'.
CASE lv_grade.
WHEN 'A'.
WRITE: / '优秀'.
WHEN 'B'.
WRITE: / '良好'.
WHEN 'C'.
WRITE: / '及格'.
WHEN OTHERS.
WRITE: / '无效成绩'.
ENDCASE.
输出结果:

示例2:WHEN多个值
ABAP
REPORT ZGOYEER001.
DATA: lv_status TYPE c VALUE 'X'.
CASE lv_status.
WHEN 'A' OR 'B' OR 'C'.
WRITE: / '状态正常'.
WHEN 'X' OR 'Y'.
WRITE: / '状态异常'.
WHEN OTHERS.
WRITE: / '未知状态'.
ENDCASE.
输出结果:


示例3:使用常量
ABAP
REPORT ZGOYEER001.
CONSTANTS BEGIN OF c_status.
active TYPE c VALUE 'A',
inactive TYPE c VALUE 'I',
END OF c_status.
DATA: lv_st TYPE c VALUE 'A'.
CASE lv_st.
WHEN c_status-active.
WRITE: / '激活'.
WHEN c_status-inactive.
WRITE: / '未激活'.
WHEN OTHERS.
WRITE: / '状态错误'.
ENDCASE.
输出结果:

origin_url=D%3A%5CGoyeerDoc%5C010.SAP%5C04.ABAP%5Cimage%5C07%5C03.png&pos_id=img-4nn7aUKp-1765201457117)
三、注意事项
类型一致性
- 类型一致性
CASE表达式与WHEN值的类型必须兼容。ABAP 会尝试自动转换,但不匹配可能导致运行时错误或意外结果。
不能使用比较运算符
字符串比较区分大小写
a 和A被视为不同值
*
WHEN后不能是变量(动态值)
WHEN必须是编译时常量 (literal或constant),不能时普通变量.
*
性能优势
对于大量离散值判断,CASE通常比IF...ELSEIF更高效,因此内部可能使用跳转表(jump table)。
四、注意事项
| 序号 | 场景 | 推荐语句 |
|---|---|---|
| 1 | 判断同一变量的多个确切值 | CASE |
| 2 | 需要范围判断 (如 > 10) |
IF |
| 3 | 条件涉及多个不同变量 | IF |
| 4 | 需要复杂逻辑组合(AND/OR) | IF |
CASE可以使用嵌套,但是不推荐使用,尽量避免深度嵌套,可封装为子程序或方法提高可读性。