SAP ABAP 新语法(笔记)

记录下学习到的新语法(可以直接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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花鸟風月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值