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(), @
更强大的查询能力
在新项目中优先使用新语法
重构现有代码时逐步采用新语法
注意版本兼容性要求
性能敏感场景需充分测试