ABAP新语法
2026/8/22 13:13:46 网站建设 项目流程

1.New Keyword in ABAP

DATA

新语法允许在语句内部动态声明变量,该作用域与普通定义的变量范围一致

ABAP、ICON 这些类型池语句不再需要通过TYPE-POOL声明

DATA(lv_true_false) = abap_false. DATA(lv_icon) = icon_material.

通过赋值的方式来动态声明变量,系统会根据所赋的值来确定变量类型(虽然可以用,但是不建议使用,因为到后面你自己都会忘记是什么类型

其中,字符类型会参照数据长度来指定(其中,此方法不通用,无法通过赋值动态声明浮点数)

DATA(lv_char) = 'This is a sentence'. DATA(lv_integer) = 15.

动态声明内表/结构,字段类型与SELECT LIST对应的字段一致,在包含常量字段时,需要赋别名,以指定内表/结构中的字段名(常用)

SELECT matnr, maktx FROM makt INTO TABLE @DATA(lt_data). SELECT SINGLE matnr, 'Constant' AS field FROM makt INTO @DATA(lwa_data).

LOOP内表时动态声明结构,可以避免使用带表头的内表(常用)

LOOP AT gt_data INTO DATA(lwa_data). ... ENDLOOP.

在常见的操作语句中动态声明变量,多数情况下可以在 INTO 语句后使用,如下为连接/拆分字符串示例

CONCATENATE 'Text' '-' '01' INTO DATA(lv_concat). SPLIT lv_concat AT '-' INTO DATA(lv_part1) DATA(lv_part2). SPLIT lv_concat AT '-' INTO TABLE DATA(lt_data).

在调用方法时动态声明变量来接收传出参数,可以避免因类型不一致而导致的dump。

go_splitter_row->get_container( EXPORTING row = 1 column = 1 RECEIVING container = DATA(go_cont) ).

注释:Data动态声明的内表无法接受crossponding传递的数据。动态声明不是万能的,谨慎使用。使用最好加注释备注声明的结构

FIELD-SYMBOL

与DATA关键字类似,FIELD-SYMBOL允许在语句内部动态声明字段符号

在 LOOP 时动态声明字段符号,需要区分的是,普通定义使用的是 FIELD-SYMBOLS

LOOP AT gt_data ASSIGNING (<fs_data>). ... ENDLOOP.

在 ASSIGN 时动态声明字段符号并分配

ASSIGN (lv_fieldname) TO FIELD-SYMBOL(<fs_field>).

NEW

使用 NEW 创建(实例化)引用对象,用来代替CREATE OBJECT

使用 NEW 关键字时,如果等号左侧的对象还没有确定类型,则必须在 NEW 关键字后指定类型,如 GO_GRID_NEW;如果是已经预定义的对象,则可以用 # 代替,如 GO_GRID

例:注释:测试未成功。i_parent 是类方法,go_con不知道如何定义。 DATA(go_grid_new) = NEW cl_gui_alv_grid( i_parent = go_con ). DATA: go_grid TYPE REF TO cl_gui_alv_grid. go_grid = NEW #( i_parent = go_con ).

REF

使用 REF 定义引用变量,用来代替 CREATE DATA

在使用 REF时,不需要提前声明变量,也不用指定类型,类型默认会与被指向的变量保持一致

TYPES:BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA(lwa_data) = VALUE lty_data( matnr = 'MATERIAL-001' mtart = 'FOOD' matkl = '1010' text1 = 'FIRST' ). DATA(lv_ref) = REF #( lwa_data ). lv_ref->* = VALUE #( matnr = 'MATERIAL-002' mtart = 'WATR' matkl = '1020’ ). lv_ref->text1 = 'SECOND'.

注释:注意,使用了REF定义引用变量,则引用变量无法通过工作区-字段访问,只能通过引用变量—>字段访问。
下段注释为错误写法
WRITE:/ LV_REF-MATNR,LV_REF-MTART,LV_REF-MATKL,LV_REF-TEXT1.

测试结果:

VALUE

新语法中,可以使用 VALUE 作为赋值语句,主要用来为内表、结构、变量等对象赋值

参数类型引用同NEW关键字,在VALUE子句中,字段可以分开赋值,也可以使用结构整体赋值,为内表赋值时,需要用小括号将一行的数据包在一起

例:注意:value会默认覆盖原来的数据。经过测试,觉得覆盖一词并不准确,可以认为是重新赋值。原来有的不同的数据会被删除。

参考

TYPES:BEGIN OF lty_data, matnr TYPE mara-matnr, mtart TYPE mara-mtart, matkl TYPE mara-matkl, text1 TYPE char50, END OF lty_data. DATA: lt_data TYPE TABLE OF lty_data. DATA(lwa_data) = VALUE lty_data( matnr = mtart = 'FOOD' matkl = '1020' text1 = 'FIRST material' ). lt_data = VALUE #( ( lwa_data )“预定义的数据类型可以用#代替 ( matnr = 'MATERIAL-002' mtart = 'FOOD' matkl = '1020' text1 = 'SECOND material' ) ).

此外,VALUE语句作为结构时,可以直接在特定语句中使用

APPEND VALUE #( value = 'TEST' ) TO lt_data. MODIFY lt_data FROM VALUE #( checkbox = 'X' ) TRANSPORTING checkbox WHERE checkbox IS INITIAL.

BASE

在使用 VALUE 作为赋值语句时,默认会覆盖原有的数据,通过BASE子句基于原有数据进行赋值

在结构赋值语句中使用 BASE 时,原有字段的数据会被保留,但是当在VALUE语句中对同一字段再次赋值时,该字段数据会被覆盖

DATA(lwa_data) = VALUE gty_data( matnr = 'MATERIAL-001' mtart = 'FOOD' ). lwa_data = VALUE #( BASE lwa_data mtart = 'WATR' matkl = '1020' text1 = 'FIRST material' ).

在内表赋值语句中使用 BASE 时,内表原有的数据会被保留,新增条目会被追加到内表中,效果同 Append Line

lt_data = VALUE #( ( lwa_data ) ). lt_data = VALUE #( BASE lt_data ( matnr = 'MATERIAL-002' mtart = 'FOOD' matkl = '1030' text1 = 'SECOND material' ) ).

注意:使用 BASE语句时,尽量保持前后结构一致,在使用不同的结构时,可能不报错但数据会错位

FOR

在内表赋值语句中,可以使用FOR语句从其他内表中批量引入数据并处理

注意:建议理清楚逻辑再尝试使用for语句。其实就是表的loop遍历,对每一层loop的工作区进行修改然后传值。重点是where后面的条件语句。

使用FOR语句时,需要为内表定义临时工作区,如LWA_DATA,仅允许在当前语句中使用,赋值过程中会使用到该工作区,但在WHERE条件里,只能直接使用内表的字段名,需要注意的是,WHERE后面接的条件语句必须使用小括号包起来,INDEX INTO 定义的临时变量可用来记录当前操作行的序列,作用与LOOP语句中的系统变量 SY-TABIX 类似

TYPES:lty_tableTYPE TABLE OFlty_dataWITH DEFAULT KEY.

lt_data=VALUE#( (matnr='MATERIAL-001'
mtart='WATR'
matkl='1020'
text1='FIRST material')
(matnr='MATERIAL-002'
mtart='FOOD'
matkl='1030'
text1='SECOND material')
(matnr='MATERIAL-003'
mtart='WATR'
matkl='1040'
text1='THIRD material') ).


DATA(lt_for) =VALUElty_table(FORlwa_dataINlt_data

INDEX INTOlv_index

WHERE(mtart='WATR')
(matnr=lwa_data-matnr
mtart
=lwa_data-mtart
matkl
=CONV#(lv_index)
text1=lwa_data-text1)).

在FOR语句中允许将结构作为整体直接进行赋值,但是结构必须与表行兼容,可以用于从内表中获取特定条件的数据

DATA(lt_for) =VALUElty_table(FORlwa_dataINlt_data
WHERE(mtart='WATR')
(lwa_data) ).

如果结构与表行不兼容,可以嵌套使用CORRESPONDING语句进行赋值,如下例( CORRESPONDING具体用法可参考后续示例 )

TYPES:BEGIN OFlty_data_new,
matnrTYPEmara-matnr,
matklTYPEmara-matkl,
END OFlty_data_new.

TYPES:lty_table_newTYPE TABLE OFlty_data_newWITH DEFAULT KEY.

DATA(lt_for) =VALUElty_table_new(FORlwa_dataINlt_data
WHERE(mtart='WATR')
(CORRESPONDING#(lwa_data) ) ).

结构字段过多时,一般建议使用整体赋值,如果少部分字段存在特殊的赋值逻辑,可嵌套使用VALUE以及BASE语句进行处理,将例1的逻辑转换如下:

DATA(lt_for) =VALUElty_table(FORlwa_dataINlt_data
INDEX INTOlv_index
WHERE(mtart='WATR')
(VALUE#(BASElwa_data
matkl
=CONV#(lv_index)) ) ).

LET

使用 LET 引入短生命周期变量,可以用来简化部分冗余代码

LET关键字可以使用在VALUE,SWITCH,COND等语句中;与 FOR 语句类似,LET 语句中定义的临时变量同样只能在当前语句中使用,在其他语句中使用时会检查出语法错误

lwa_line=VALUE#(LET
lwa_data=VALUE#(lt_data[ matnr='MATERIAL-001']OPTIONAL)
lv_string='Date:'&&sy-datum
IN
matnr=lwa_data-matnr
mtart
=lwa_data-mtart
matkl
=lwa_data-matkl
text1
=lv_string).

剩下的慢慢更新。。。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询