ABAP 语句与控制流 (★★★★)

ABAP 语句与控制流 (★★★★)

#abap #abap-syntax

概览表

类别 语句 要点
赋值 MOVE, =, MOVE-CORRESPONDING 值传递
输出 WRITE 列表输出
计算 COMPUTE, +, -, *, / 算术运算
条件 IF/ELSEIF, CASE 分支逻辑
循环 DO, WHILE 迭代
消息 MESSAGE 用户反馈

赋值语句

1
2
3
4
5
6
7
8
9
" 简单赋值
MOVE gv_a TO gv_b.
gv_b = gv_a. " 等效写法

" 结构赋值
MOVE-CORRESPONDING gs_src TO gs_dest. " 复制匹配的字段名

" 清除数据对象
CLEAR gv_var.
📌MOVE-CORRESPONDING 规则
只有在两个结构中名称相同的字段才会被复制。仅存在于一个结构中的字段将被忽略。

计算运算

1
2
3
4
5
6
COMPUTE gv_result = gv_a + gv_b.   " COMPUTE 是可选的
gv_result = gv_a + gv_b. " 与上面等效
gv_result = gv_a * gv_b / gv_c.

" 内置函数
gv_len = STRLEN( gv_text ). " 字符串长度

类型转换规则

在不同类型之间赋值时,ABAP 会执行自动转换:

  • C → N:仅保留数字字符
  • N → I/N:字符串被解释为数字
  • P → I:截断小数位
⚠️类型冲突
类型冲突可能导致运行时错误或意外结果。在不同数据类型之间赋值时,务必确保类型兼容。

控制结构

条件分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
" IF 语句
IF gv_num > 0.
WRITE 'Positive'.
ELSEIF gv_num = 0.
WRITE 'Zero'.
ELSE.
WRITE 'Negative'.
ENDIF.

" CASE 语句
CASE gv_op.
WHEN '+'. gv_result = gv_a + gv_b.
WHEN '-'. gv_result = gv_a - gv_b.
WHEN OTHERS. WRITE 'Invalid'.
ENDCASE.

循环

1
2
3
4
5
6
7
8
9
" DO 循环(固定次数)
DO 5 TIMES.
WRITE: / 'Iteration', sy-index.
ENDDO.

" WHILE 循环(条件控制)
WHILE gv_num < 100.
gv_num = gv_num + 1.
ENDWHILE.
📌循环计数器
DO 和 WHILE 都使用 sy-index 作为循环计数器(不是 sy-tabix)。

系统字段

字段 用途 设置者
sy-subrc 返回代码(0 = 成功) 大多数语句
sy-index 循环计数器 DO, WHILE
sy-tabix 表行索引 LOOP, READ TABLE
sy-dbcnt 处理的数据库行数 SELECT
sy-ucomm 功能代码 屏幕 PAI

消息

1
2
3
4
5
6
7
8
MESSAGE e001(bc400).    " 错误消息 (E)
MESSAGE s001(bc400). " 成功消息 (S)
MESSAGE i001(bc400). " 信息消息 (I)
MESSAGE a001(bc400). " 终止消息 (A)
MESSAGE w001(bc400). " 警告消息 (W)

" 带变量
MESSAGE e001(bc400) WITH gv_val1 gv_val2.

链式语句

1
2
3
WRITE: 'Hello', 'World', gv_name.
" 等效于:
WRITE 'Hello'. WRITE 'World'. WRITE gv_name.

文本元素

类型 用途 维护方式
文本符号 运行时被 text-001 替换 文本元素 → 文本符号
选择文本 PARAMETERS 字段的标签 文本元素 → 选择文本
列表标题 列表标题/列标题 文本元素 → 列表标题

考试/测试模式

场景/关键词 答案
“DO/WHILE 的循环计数器?” sy-index
“MOVE-CORRESPONDING 复制哪些字段?” 两个结构中同名的字段
“链式语句是什么?” 多条语句共享相同开头,用逗号分隔
“如何定义带值的常量?” CONSTANTS gc_name TYPE type VALUE val.

相关笔记