ABAP 判断
决策结构具有要由程序评估或测试的一个或多个条件,以及如果条件被确定为真则要执行的一个或多个语句,以及可选地,如果条件被确定为假。
📐 判断结构流程
graph TD
A[开始判断] --> B{条件评估}
B -->|条件为真| C[执行真分支]
B -->|条件为假| D[执行假分支]
C --> E[结束判断]
D --> E
E --> F[继续执行]
🎯 ABAP判断语句类型
ABAP编程语言提供以下类型的决策语句:
| 序号 |
语句类型 |
描述 |
| 1 |
IF语句 |
IF语句由逻辑表达式后跟一个或多个语句组成。 |
| 2 |
IF..ELSE语句 |
IF语句后面可以是一个可选的ELSE语句,当表达式为false时执行。 |
| 3 |
嵌套IF语句 |
你可以在另一个IF或ELSEIF语句中使用一个IF或ELSEIF语句。 |
| 4 |
CASE控制语句 |
当我们需要比较两个或多个字段或变量时,使用CASE语句。 |
🔧 IF语句
基本语法
1 2 3
| IF <condition>. " 条件为真时执行的代码 ENDIF.
|
示例
1 2 3 4 5
| DATA: lv_age TYPE I VALUE 25.
IF lv_age >= 18. WRITE: / '成年人'. ENDIF.
|
🔀 IF..ELSE语句
基本语法
1 2 3 4 5
| IF <condition>. " 条件为真时执行的代码 ELSE. " 条件为假时执行的代码 ENDIF.
|
示例
1 2 3 4 5 6 7
| DATA: lv_score TYPE I VALUE 75.
IF lv_score >= 60. WRITE: / '及格'. ELSE. WRITE: / '不及格'. ENDIF.
|
🏗️ 嵌套IF语句
基本语法
1 2 3 4 5 6 7 8 9 10
| IF <condition1>. " 条件1为真时执行的代码 IF <condition2>. " 条件1和条件2都为真时执行的代码 ENDIF. ELSEIF <condition3>. " 条件1为假且条件3为真时执行的代码 ELSE. " 所有条件都为假时执行的代码 ENDIF.
|
示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| DATA: lv_age TYPE I VALUE 25, lv_status TYPE C.
IF lv_age < 18. lv_status = '未成年'. ELSEIF lv_age >= 18 AND lv_age < 65. lv_status = '成年'. ELSE. lv_status = '老年'. ENDIF.
WRITE: / '状态:', lv_status.
|
🎭 CASE语句
基本语法
1 2 3 4 5 6 7 8
| CASE <variable>. WHEN <value1>. " 变量等于value1时执行的代码 WHEN <value2>. " 变量等于value2时执行的代码 WHEN OTHERS. " 变量不等于任何指定值时执行的代码 ENDCASE.
|
示例
1 2 3 4 5 6 7 8 9 10 11 12
| DATA: lv_grade TYPE CHAR1 VALUE 'B'.
CASE lv_grade. WHEN 'A'. WRITE: / '优秀'. WHEN 'B'. WRITE: / '良好'. WHEN 'C'. WRITE: / '及格'. WHEN OTHERS. WRITE: / '不及格'. ENDCASE.
|
🔍 条件表达式
比较运算符
| 运算符 |
描述 |
替代形式 |
| = |
等于 |
EQ |
| <> |
不等于 |
NE |
| > |
大于 |
GT |
| < |
小于 |
LT |
| >= |
大于等于 |
GE |
| <= |
小于等于 |
LE |
逻辑运算符
| 运算符 |
描述 |
示例 |
| AND |
逻辑与 |
condition1 AND condition2 |
| OR |
逻辑或 |
condition1 OR condition2 |
| NOT |
逻辑非 |
NOT condition |
示例
1 2 3 4 5 6 7 8 9 10 11
| DATA: lv_age TYPE I VALUE 25, lv_score TYPE I VALUE 80.
IF lv_age >= 18 AND lv_score >= 60. WRITE: / '条件满足'. ELSEIF lv_age < 18 OR lv_score < 60. WRITE: / '条件不满足'. ELSE. WRITE: / '其他情况'. ENDIF.
|
💡 判断语句选择指南
何时使用IF语句
graph LR
A[选择判断语句] --> B{简单条件判断}
B -->|是| C[使用IF语句]
B -->|否| D{多值比较?}
D -->|是| E[使用CASE语句]
D -->|否| F{复杂条件组合?}
F -->|是| G[使用嵌套IF]
F -->|否| H[使用简单IF]
使用场景对比
| 语句类型 |
适用场景 |
优点 |
缺点 |
| IF |
简单条件判断 |
灵活 |
条件多时复杂 |
| IF-ELSE |
二选一判断 |
清晰 |
只能两个分支 |
| 嵌套IF |
多重条件判断 |
功能强大 |
可读性差 |
| CASE |
多值比较 |
简洁直观 |
只能单值比较 |
⚠️ 注意事项
1. 条件顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| " ❌ 错误:顺序导致逻辑错误 IF lv_score >= 90. WRITE: / '优秀'. ELSEIF lv_score >= 80. WRITE: / '良好'. ELSEIF lv_score >= 70. WRITE: / '一般'. ELSE. WRITE: / '不及格'. ENDIF.
" ✅ 正确:顺序正确 IF lv_score >= 90. WRITE: / '优秀'. ELSEIF lv_score >= 80. WRITE: / '良好'. ELSEIF lv_score >= 70. WRITE: / '一般'. ELSEIF lv_score >= 60. WRITE: / '及格'. ELSE. WRITE: / '不及格'. ENDIF.
|
2. 条件覆盖
确保所有可能的情况都被覆盖:
1 2 3 4 5 6 7 8 9 10 11 12 13
| " ✅ 完整的条件覆盖 DATA: lv_status TYPE C VALUE 'X'.
CASE lv_status. WHEN 'A'. WRITE: / '状态A'. WHEN 'B'. WRITE: / '状态B'. WHEN 'C'. WRITE: / '状态C'. WHEN OTHERS. WRITE: / '未知状态'. ENDCASE.
|
3. 可读性
- 使用有意义的变量名
- 添加注释说明复杂逻辑
- 避免过深的嵌套
💡 最佳实践
1. 代码设计原则
- 使用最简单的判断结构满足需求
- 保持条件逻辑清晰易懂
- 避免过深的嵌套层次
2. 条件编写
- 使用有意义的变量名
- 避免复杂的条件表达式
- 考虑条件的可读性
3. 错误处理
- 使用OTHERS子句处理未知情况
- 添加适当的错误处理逻辑
- 考虑边界条件
4. 性能考虑
- 将最可能的条件放在前面
- 避免重复计算
- 注意条件判断的执行顺序