ABAP 新语法

ABAP 新语法

概述

SAP S/4HANA 引入了一系列 ABAP 新语法特性,使代码更加简洁、可读和现代化。本文档详细介绍这些新语法及其与传统语法的对比。

ℹ️版本要求
部分新语法功能需要 NetWeaver 7.40+7.54+ 版本支持。

2.1 Variable in-line declaration

内联变量声明,无需预先使用 DATA 语句声明变量。

1
2
3
4
5
6
" 新语法 (NW 7.40+)
DATA(variable) = 'A'.

" 传统语法
DATA variable TYPE string.
MOVE 'A' TO variable.
💡优势
  • 减少代码行数
  • 变量类型自动推断
  • 提高代码可读性

2.2 Use build-in function

使用内置函数替代语句操作。

1
2
3
4
5
6
" 新语法 - 使用内置函数
DATA(uppercase) = to_upper( lowercase ).

" 传统语法
DATA uppercase TYPE string.
TRANSLATE lowercase TO UPPER CASE.

常用内置函数

函数 说明 示例
to_upper() 转大写 to_upper( text )
to_lower() 转小写 to_lower( text )
strlen() 字符串长度 strlen( text )
substring() 截取子串 substring( val = text off = 1 len = 2 )

2.3 += operation

简化的复合赋值运算符(>= NW 7.54 支持)。

1
2
3
4
5
6
7
8
9
10
11
" 新语法 (>= NW 7.54)
index += 1.
count -= 1.
total *= 2.

" 传统语法
index = index + 1.
" 或
ADD 1 TO index.
SUBTRACT 1 FROM count.
MULTIPLY total BY 2.
⚠️版本注意
+=-=*=/= 等复合运算符需要 NetWeaver 7.54 或更高版本。

2.4 Key word NEW to instantiate object

使用 NEW 关键字实例化对象,替代 CREATE OBJECT

1
2
3
4
5
6
7
8
9
10
11
12
" 新语法
DATA(object) = NEW /clean/my_class( ).
DATA(lo_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>default_screen ).

" 传统语法
DATA object TYPE REF TO /dirty/my_class.
CREATE OBJECT object TYPE /dirty/my_class.

DATA lo_alv TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT lo_alv
EXPORTING
i_parent = cl_gui_container=>default_screen.

NEW 语法优势

  • 代码更简洁
  • 类型推断更准确
  • 支持链式调用
  • 支持内联声明

2.5 Key word FOR

使用 FOR 迭代表达式替代循环,实现函数式风格的表操作。

1
2
3
4
5
6
7
" 新语法 - FOR 表达式
result = VALUE #( FOR row IN input ( row-text ) ).

" 传统语法 - LOOP 循环
LOOP AT input INTO DATA(row).
INSERT row-text INTO TABLE result.
ENDLOOP.

更多示例

1
2
3
4
5
6
7
" 带条件的 FOR 表达式
result = VALUE #( FOR row IN input WHERE ( type = 'A' ) ( row-text ) ).

" 嵌套 FOR 表达式
result = VALUE #( FOR wa_1 IN tab1
FOR wa_2 IN tab2 WHERE ( key = wa_1-key )
( value = wa_1-val + wa_2-val ) ).
💥使用场景
  • 数据转换
  • 内表过滤
  • 批量数据处理
  • 生成测试数据

2.6 READ TABLE

使用表表达式(方括号)替代 READ TABLE 语句。

1
2
3
4
5
6
7
8
" 新语法 - 表表达式
DATA(line) = value_pairs[ name = 'A' ].

" 传统语法
READ TABLE value_pairs INTO DATA(line) WITH KEY name = 'A'.
IF sy-subrc = 0.
" 处理数据
ENDIF.

处理不存在的行

1
2
3
4
5
6
7
" 使用 OPTIONAL 避免异常
DATA(line) = VALUE #( value_pairs[ name = 'A' ] OPTIONAL ).

" 或使用 line_exists 检查
IF line_exists( value_pairs[ name = 'A' ] ).
DATA(line) = value_pairs[ name = 'A' ].
ENDIF.

读取指定行

1
2
3
4
5
" 读取第5行
DATA(line) = internal_table[ 5 ].

" 使用默认值
DATA(line) = VALUE #( internal_table[ key = 'X' ] OPTIONAL ).

2.7 xsdbool to do boolean expression

使用 xsdbool 进行布尔表达式求值,简化条件判断。

1
2
3
4
5
6
7
8
9
10
11
12
" 新语法
DATA(exists) = xsdbool( line_exists( value_pairs[ name = 'A' ] ) ).
IF line_exists( value_pairs[ name = 'A' ] ).
" 处理存在的情况
ENDIF.

" 传统语法
READ TABLE value_pairs TRANSPORTING NO FIELDS WITH KEY name = 'A'.
DATA(exists) = xsdbool( sy-subrc = 0 ).
IF exists = abap_true.
" 处理存在的情况
ENDIF.

xsdbool 返回值

条件 返回值
'X' (abap_true)
'' (abap_false)

使用场景

1
2
3
4
5
6
7
8
" 在 SQL WHERE 条件中使用
SELECT * FROM mara
INTO TABLE @lt_mara
WHERE xsdbool( matnr IS NOT NULL ) = @abap_true.

" 在条件逻辑中使用
DATA: flag TYPE abap_bool.
flag = xsdbool( value > 0 ).

2.8 select BKPF-AWKEY

使用新语法进行 SQL 查询,包括 concat 函数和 @ 转义符处理复合字段。

场景说明

BKPF-AWKEY 是财务凭证表中的复合关键字段,由 BUKRS + BELNR + GJAHR 组成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TYPES: BEGIN OF ts_doc_key,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
END OF ts_doc_key,
BEGIN OF ts_doc_header,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
awtyp TYPE bkpf-awtyp,
awsys TYPE bkpf-awsys,
awkey TYPE bkpf-awkey,
END OF ts_doc_header.

DATA: lt_doc_key TYPE SORTED TABLE OF ts_doc_key
WITH UNIQUE KEY bukrs belnr gjahr.
DATA: lt_header1 TYPE STANDARD TABLE OF ts_doc_header
WITH EMPTY KEY,
lt_header2 TYPE STANDARD TABLE OF ts_doc_header
WITH EMPTY KEY.

方法1: 使用 concat 连接复合键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
" 准备10个凭证键
SELECT bukrs,
belnr,
gjahr
FROM bkpf
INTO TABLE @lt_doc_key
UP TO 10 ROWS
WHERE awtyp = 'BKPF'.

" 使用 concat 连接字段匹配 AWKEY
SELECT a~bukrs,
a~belnr,
a~gjahr,
a~awtyp,
a~awsys,
a~awkey
FROM bkpf AS a INNER JOIN @lt_doc_key AS b
ON a~awkey = concat( concat( b~belnr, b~bukrs ), b~gjahr )
WHERE a~awtyp = 'BKPF'
INTO TABLE @lt_header1.

方法2: 分别匹配字段(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
" 分别匹配各字段,性能更优
SELECT a~bukrs,
a~belnr,
a~gjahr,
a~awtyp,
a~awsys,
a~awkey
FROM bkpf AS a INNER JOIN @lt_doc_key AS b
ON a~bukrs = b~bukrs
AND a~belnr = b~belnr
AND a~gjahr = b~gjahr
WHERE a~awtyp = 'BKPF'
INTO TABLE @lt_header2.

WRITE: 'Done'.
💡性能对比
方法 优点 缺点
concat 代码简洁 可能无法使用索引,性能较差
分别匹配 可以利用数据库索引,性能更优 代码稍长

推荐:在性能敏感场景优先使用分别匹配的方法。


总结

ABAP 新语法是 SAP S/4HANA 平台的重要改进,主要包括:

特性 语法 优势
内联声明 DATA(var) = value 简化变量声明
内置函数 to_upper() 代码更简洁
复合运算符 index += 1 减少冗余代码
NEW 关键字 NEW class( ) 替代 CREATE OBJECT
FOR 迭代 FOR ... IN ... 函数式风格
表表达式 table[ key ] 替代 READ TABLE
布尔表达式 xsdbool() 简化条件判断
SQL 增强 concat(), @ 更强大的查询能力
💡最佳实践
  1. 在新项目中优先使用新语法
  2. 重构现有代码时逐步采用新语法
  3. 注意版本兼容性要求
  4. 性能敏感场景需充分测试