ABAP 基础语法教程:运算、字符串、判断与循环

ABAP 基础语法教程:运算、字符串、判断与循环
ABAP 是 SAP 系统中最常见的开发语言之一。刚开始学习 ABAP 时,建议先掌握四类高频基础语法:数值运算、字符串处理、条件控制和循环控制。
本文按照博客教程的风格,把这些语法放在一起整理,并配上可以直接复制练习的示例代码。
一、加减乘除运算
ABAP 中常见的数学运算符如下:
| 运算 | 符号 | 示例 |
|---|---|---|
| 加法 | + | lv_a + lv_b |
| 减法 | - | lv_a - lv_b |
| 乘法 | * | lv_a * lv_b |
| 除法 | / | lv_a / lv_b |
| 整除 | DIV | lv_a DIV lv_b |
| 取余 | MOD | lv_a MOD lv_b |
示例代码:
DATA: lv_a TYPE i VALUE 10,
lv_b TYPE i VALUE 3,
lv_result TYPE i.
lv_result = lv_a + lv_b.
WRITE: / '加法:', lv_result.
lv_result = lv_a - lv_b.
WRITE: / '减法:', lv_result.
lv_result = lv_a * lv_b.
WRITE: / '乘法:', lv_result.
lv_result = lv_a / lv_b.
WRITE: / '除法:', lv_result.
lv_result = lv_a DIV lv_b.
WRITE: / '整除:', lv_result.
lv_result = lv_a MOD lv_b.
WRITE: / '取余:', lv_result.
早期 ABAP 代码中也会看到 COMPUTE 写法:
COMPUTE lv_result = lv_a + lv_b.
现在更常见的是直接使用赋值表达式:
lv_result = lv_a + lv_b.
二、字符串运算
ABAP 业务程序中经常需要处理字符串,例如拼接单号、拆分编码、判断文本中是否包含关键字,以及替换指定内容。
1. CONCATENATE:字符串拼接
CONCATENATE 用于把多个字符串拼接成一个字符串。
DATA: lv_first TYPE string VALUE 'SAP',
lv_second TYPE string VALUE 'ABAP',
lv_text TYPE string.
CONCATENATE lv_first lv_second INTO lv_text.
WRITE: / lv_text.
输出结果:
SAPABAP
如果希望中间带空格,可以使用 SEPARATED BY:
CONCATENATE lv_first lv_second INTO lv_text SEPARATED BY space.
WRITE: / lv_text.
输出结果:
SAP ABAP
也可以使用其他分隔符:
CONCATENATE lv_first lv_second INTO lv_text SEPARATED BY '-'.
2. SPLIT:字符串拆分
SPLIT 用于按照指定分隔符拆分字符串。
DATA: lv_fullname TYPE string VALUE 'SAP-ABAP-HANA',
lv_part1 TYPE string,
lv_part2 TYPE string,
lv_part3 TYPE string.
SPLIT lv_fullname AT '-' INTO lv_part1 lv_part2 lv_part3.
WRITE: / lv_part1.
WRITE: / lv_part2.
WRITE: / lv_part3.
输出结果:
SAP
ABAP
HANA
如果拆分后的数量不固定,可以拆分到内表:
DATA: lv_text TYPE string VALUE 'A,B,C,D',
lt_parts TYPE TABLE OF string.
SPLIT lv_text AT ',' INTO TABLE lt_parts.
3. SEARCH:字符串查找
SEARCH 用于查找字符串中是否包含某个内容。
DATA lv_text TYPE string VALUE 'Hello ABAP World'.
SEARCH lv_text FOR 'ABAP'.
IF sy-subrc = 0.
WRITE: / '找到了,位置:', sy-fdpos.
ELSE.
WRITE: / '没有找到'.
ENDIF.
常用系统字段说明:
| 系统字段 | 含义 |
|---|---|
sy-subrc = 0 | 找到内容 |
sy-subrc <> 0 | 未找到 |
sy-fdpos | 找到的位置 |
现代 ABAP 中也经常使用 FIND,但在很多历史代码和项目代码中,SEARCH 仍然很常见。
4. REPLACE:字符串替换
REPLACE 用于替换字符串中的内容。
DATA lv_text TYPE string VALUE 'Hello ABAP'.
REPLACE 'ABAP' IN lv_text WITH 'SAP'.
WRITE: / lv_text.
输出结果:
Hello SAP
如果要替换所有匹配项,可以使用 ALL OCCURRENCES OF:
DATA lv_text TYPE string VALUE 'ABAP is good. ABAP is powerful.'.
REPLACE ALL OCCURRENCES OF 'ABAP' IN lv_text WITH 'SAP'.
WRITE: / lv_text.
输出结果:
SAP is good. SAP is powerful.
三、控制语句
控制语句用于根据条件决定代码是否执行,常见的有 IF 和 CASE ... WHEN。
1. IF 判断
IF 是最常用的条件判断语句。
IF 条件.
" 条件成立时执行
ELSEIF 其他条件.
" 其他条件成立时执行
ELSE.
" 以上条件都不成立时执行
ENDIF.
示例代码:
DATA lv_score TYPE i VALUE 85.
IF lv_score >= 90.
WRITE: / '优秀'.
ELSEIF lv_score >= 60.
WRITE: / '及格'.
ELSE.
WRITE: / '不及格'.
ENDIF.
常见比较符:
| 符号 | 含义 |
|---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
也可以组合多个条件:
IF lv_score >= 60 AND lv_score < 90.
WRITE: / '成绩合格'.
ENDIF.
2. CASE WHEN 判断
ABAP 程序控制语句中常见写法是 CASE ... WHEN ... ENDCASE。
DATA lv_type TYPE c VALUE 'A'.
CASE lv_type.
WHEN 'A'.
WRITE: / '类型 A'.
WHEN 'B'.
WRITE: / '类型 B'.
WHEN 'C'.
WRITE: / '类型 C'.
WHEN OTHERS.
WRITE: / '其他类型'.
ENDCASE.
需要注意:很多人会习惯说“CASE WHEN”,但在普通 ABAP 控制流里,完整结构通常是:
CASE 变量.
WHEN 值.
" 执行逻辑
ENDCASE.
而 CASE WHEN 表达式更多出现在 Open SQL 或表达式场景中。
四、循环语句
循环语句用于重复执行一段逻辑。这里重点看 DO,以及循环中经常配合使用的 CONTINUE、CHECK、EXIT。
1. DO 循环
DO 可以按固定次数循环。
DO 5 TIMES.
WRITE: / '当前循环次数:', sy-index.
ENDDO.
sy-index 表示当前循环次数,从 1 开始。
也可以写不指定次数的循环,但通常要配合 EXIT,避免无限循环:
DATA lv_count TYPE i VALUE 0.
DO.
lv_count = lv_count + 1.
WRITE: / lv_count.
IF lv_count >= 5.
EXIT.
ENDIF.
ENDDO.
2. CONTINUE:跳过本次循环
CONTINUE 用于跳过当前循环,直接进入下一次循环。
DO 5 TIMES.
IF sy-index = 3.
CONTINUE.
ENDIF.
WRITE: / '当前次数:', sy-index.
ENDDO.
这段代码会跳过第 3 次输出。
3. CHECK:条件不满足时跳过
CHECK 可以理解为“条件检查”。在循环中,如果条件不成立,则跳过当前循环。
DO 5 TIMES.
CHECK sy-index >= 3.
WRITE: / '当前次数:', sy-index.
ENDDO.
输出结果:
当前次数: 3
当前次数: 4
当前次数: 5
在循环中:
CHECK 条件.
可以大致理解为:
IF 条件不成立.
CONTINUE.
ENDIF.
4. EXIT:退出循环
EXIT 用于直接结束当前循环。
DO 10 TIMES.
IF sy-index = 4.
EXIT.
ENDIF.
WRITE: / '当前次数:', sy-index.
ENDDO.
输出结果:
当前次数: 1
当前次数: 2
当前次数: 3
当 sy-index = 4 时,循环直接结束。
五、完整练习示例
下面把运算、字符串、判断和循环放到一个完整示例中,适合直接新建一个测试报表进行练习。
REPORT z_abap_basic_demo.
DATA: lv_a TYPE i VALUE 10,
lv_b TYPE i VALUE 2,
lv_result TYPE i,
lv_text TYPE string,
lv_name TYPE string VALUE 'SAP-ABAP-HANA',
lv_part1 TYPE string,
lv_part2 TYPE string,
lv_part3 TYPE string.
" 数值运算
lv_result = lv_a + lv_b.
WRITE: / '加法结果:', lv_result.
lv_result = lv_a * lv_b.
WRITE: / '乘法结果:', lv_result.
" 字符串拼接
CONCATENATE 'Hello' 'ABAP' INTO lv_text SEPARATED BY space.
WRITE: / lv_text.
" 字符串拆分
SPLIT lv_name AT '-' INTO lv_part1 lv_part2 lv_part3.
WRITE: / lv_part1, lv_part2, lv_part3.
" 字符串查找
SEARCH lv_text FOR 'ABAP'.
IF sy-subrc = 0.
WRITE: / '找到 ABAP,位置:', sy-fdpos.
ENDIF.
" 字符串替换
REPLACE 'ABAP' IN lv_text WITH 'SAP'.
WRITE: / lv_text.
" CASE 判断
CASE lv_part2.
WHEN 'ABAP'.
WRITE: / '这是 ABAP 内容'.
WHEN OTHERS.
WRITE: / '其他内容'.
ENDCASE.
" DO 循环
DO 5 TIMES.
IF sy-index = 2.
CONTINUE.
ENDIF.
IF sy-index = 5.
EXIT.
ENDIF.
WRITE: / '循环次数:', sy-index.
ENDDO.
六、小结
本文整理的内容可以作为 ABAP 入门阶段的基础语法清单:
| 类型 | 常用语法 |
|---|---|
| 运算 | +、-、*、/、DIV、MOD |
| 拼接 | CONCATENATE ... INTO ... |
| 拆分 | SPLIT ... AT ... INTO ... |
| 查找 | SEARCH ... FOR ... |
| 替换 | REPLACE ... IN ... WITH ... |
| 判断 | IF ... ELSEIF ... ELSE ... ENDIF |
| 分支 | CASE ... WHEN ... ENDCASE |
| 循环 | DO ... ENDDO |
| 跳过 | CONTINUE、CHECK |
| 退出 | EXIT |
这些语法是编写 ABAP 报表、增强、接口程序时最常用的基础能力。掌握之后,再继续学习内表、结构、SELECT 查询和 ALV 展示,会顺畅很多。
