记录下学习到的新语法(可以直接Copy到程序中,打断点一步步运行看效果)
REPORT ztest_abap.
*定义物料结构
TYPES:BEGIN OF ty_data,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
text1 TYPE char50,
END OF ty_data.
"方法赋值结构,不需要提前声明类型(但需要定义好参照类型)
DATA(gw_data) = VALUE ty_data( matnr = '1024'
mtart = '101'
matkl = '10'
text1 = '洗发套装' ).
WRITE : gw_data.
"赋值结构,提前声明类型
DATA gw_data2 TYPE ty_data.
gw_data2 = VALUE #(
matnr = '1008'
mtart = '102'
matkl = '10'
text1 = '护发套装').
WRITE : gw_data2.
"方法赋值内表
DATA gt_data TYPE TABLE OF ty_data.
DATA lt_data TYPE TABLE OF ty_data.
APPEND gw_data TO gt_data.
gt_data = VALUE #( ( gw_data )
( matnr = '1025'
mtart = '105'
matkl = '20'
text1 = '洗手液') ).
"使用value # 作为结构赋值内表
APPEND VALUE #( matnr = 'TEST' ) TO gt_data.
MODIFY gt_data FROM VALUE #( text1 = '测试化妆品' ) TRANSPORTING text1 WHERE matnr IS NOT INITIAL.
CLEAR: gw_data,gw_data2,gt_data[].
gw_data-text1 = '面膜'.
gw_data2-matnr = '1111'.
gw_data = VALUE #(
matnr = '2222'
mtart = 'D'
matkl = '10').
gw_data2-text1 = '面泥'.
gw_data2-matnr = '3333'.
gw_data2 = VALUE #(
* BASE gw_data2
matnr = '4444'
mtart = 'FOOD'
matkl = '10').
"不使用BASE 的输出结果是:444 FOOD 10 ''
"使用BASE 的输出结果是:4444 FOOD 10 面泥
"*未改动的数据不变,改动的数据被覆盖
CLEAR: gw_data,gw_data2,gt_data[].
"DATA(gw_data) 声明并赋值
DATA(gw_data1) = VALUE ty_data(
matnr = '1111'
mtart = 'FODD'
matkl = '10'
text1 = '西瓜' ).
APPEND VALUE #( matnr = '2222' mtart = 'FODC' matkl = '20' text1 = '苹果') TO gt_data.
"不使用BASE 内表将清空后再追加数据
gt_data = VALUE #(
( gw_data1 )
).
"使用BASE 之后将在表尾追加数据,不清空内表
gt_data = VALUE #( BASE gt_data
* ( gw_data )
( matnr = '333'
mtart = 'FODF'
matkl = '30'
text1 = '西红柿')
).
"在内表赋值语句中,可以使用FOR语句从其他内表中批量引入数据并处理
CLEAR: gt_data[].
TYPES: tt_data TYPE TABLE OF ty_data WITH DEFAULT KEY. "使用FOR语句时声明类型
gt_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(gt_for) = VALUE tt_data( FOR lw_data IN gt_data
INDEX INTO lv_index
WHERE ( mtart = 'WATR')
( matnr = lw_data-matnr
mtart = lw_data-mtart
matkl = CONV #( lv_index )
text1 = lw_data-text1 )
).
"在FOR语句中允许将结构作为整体直接进行赋值,但是结构必须与表行兼容
"可以用于从内表中获取特定条件的数据 效果与上面相同
DATA(lt_for) = VALUE tt_data( FOR lwa_data IN gt_data
WHERE ( mtart = 'WATR' )
( lwa_data ) ).
"如果结构与表行不兼容,可以嵌套使用CORRESPONDING语句进行赋值,
"如下例( CORRESPONDING具体用法可参考后续示例 )
TYPES:BEGIN OF ty_data_new,
matnr TYPE mara-matnr,
matkl TYPE mara-matkl,
END OF ty_data_new.
TYPES: tt_data_new TYPE TABLE OF ty_data_new WITH DEFAULT KEY.
DATA: gt_for1 TYPE tt_data_new,
gw_for1 LIKE LINE OF gt_for1.
CLEAR: gt_data[].
gt_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(gt_for_new) = VALUE tt_data_new( FOR lw_data IN gt_data
WHERE ( mtart = 'WATR')
( CORRESPONDING #( lw_data ) ) ).
"旧方法类似
LOOP AT gt_data INTO DATA(lw_data1) WHERE mtart = 'WATR' .
MOVE-CORRESPONDING lw_data1 TO gw_for1.
APPEND gw_for1 TO gt_for1.
ENDLOOP.
"将内表中所有内容追加到另一个内表中(在尾部追加)
DATA gt_data2 TYPE TABLE OF ty_data.
FIELD-SYMBOLS: <fs_data> TYPE ty_data. "声明工作区
gt_data2 = VALUE #( FOR lw_data IN gt_data
( lw_data ) ).
APPEND LINES OF gt_data2 TO gt_data.
"使用append initial line to gt_data2 assigning<fs_data>.
"使用<fs_data> 向内表 gt_data2,与原来的将字段赋值之后,再进行APPEND同理
"不同的是,这里会直接在字段赋值的时候就添加进内表中去
CLEAR gt_data2[].
LOOP AT gt_data INTO gw_data.
APPEND INITIAL LINE TO gt_data2 ASSIGNING <fs_data>.
<fs_data>-matnr = gw_data-matnr.
<fs_data>-mtart = gw_data-mtart.
<fs_data>-matkl = gw_data-matkl.
<fs_data>-text1 = gw_data-text1.
ENDLOOP.
LOOP AT gt_data INTO DATA(wa).
WRITE: wa-matnr.
ENDLOOP.