ABAP--新语法--New Keyword in ABAP--第二天--REF VALUE BASE FOR

CL_DEMO_OUTPUT=>DISPLAY
PS:自己测试是DISPLAY后的内表不能带表头。

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

*---------------------------------------------------------------------*
*    在使用 REF时,不需要提前声明变量,也不用指定类型,
*      类型默认会与被指向的变量保持一致
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_MARA,
         MATNR TYPE MARA-MATNR,
         MTART TYPE MARA-MTART,
         MATKL TYPE MARA-MATKL,
         TEXT1 TYPE CHAR50,
       END OF TY_MARA.

DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001'
                               MTART = 'FOOD'
                               MATKL = '1010'
                               TEXT1 = 'FIRST' ).

CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).

DATA(LV_REF) = REF #( LW_MARA ).

CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).

LV_REF->* = VALUE #( MATNR = 'MATERIAL-002'
                     MTART = 'WATR'
                     MATKL = '1020' ).

CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).

LV_REF->TEXT1 = 'SECONDE'.

CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).

在这里插入图片描述

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

*---------------------------------------------------------------------*
*    参数类型引用同NEW关键字,在VALUE子句中,字段可以分开赋值,
*      也可以使用结构整体赋值,为内表赋值时,
*      需要用小括号将一行的数据包在一起
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_MARA,
  MATNR TYPE MARA-MATNR,
  MTART TYPE MARA-MTART,
  MATKL TYPE MARA-MATKL,
  TEXT1 TYPE CHAR50,
  END OF TY_MARA.

DATA: LT_MARA TYPE TABLE OF TY_MARA.
DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001'
                               MTART = 'FOOD'
                               MATKL = '1020'
                               TEXT1 = 'FIRST material').
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).
LT_MARA = VALUE #( ( LW_MARA )
                   ( MATNR = 'MATERIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1020'
                     TEXT1 = 'SECOND material')
                    ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).

在这里插入图片描述

*---------------------------------------------------------------------*
*    此外,VALUE语句作为结构时,可以直接在特定语句中使用
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_DATA,
  CHECKBOX TYPE C,
  VALUE(4) TYPE C,
  END OF TY_DATA.
DATA LT_DATA TYPE TABLE OF TY_DATA.
APPEND VALUE #( VALUE = 'TEST' ) TO LT_DATA.

MODIFY LT_DATA FROM VALUE #( CHECKBOX = 'X' ) TRANSPORTING CHECKBOX WHERE CHECKBOX IS INITIAL.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).

在这里插入图片描述

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

*---------------------------------------------------------------------*
*    在结构赋值语句中使用 BASE 时,原有字段的数据会被保留,
*     但是当在VALUE语句中对同一字段再次赋值时,该字段数据会被覆盖
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_MARA,
  MATNR TYPE MARA-MATNR,
  MTART TYPE MARA-MTART,
  MATKL TYPE MARA-MATKL,
  TEXT1 TYPE CHAR50,
  END OF TY_MARA.

DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001'
                               MTART = 'FOOD' ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).
LW_MARA = VALUE #( BASE LW_MARA
                   MTART = 'WATR'
                   MATKL = '1020'
                   TEXT1 = 'FIRST material').
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).

在这里插入图片描述

*---------------------------------------------------------------------*
*    在内表赋值语句中使用 BASE 时,内表原有的数据会被保留,
*       新增条目会被追加到内表中,效果同 Append Line
*---------------------------------------------------------------------*
DATA LT_MARA TYPE TABLE OF TY_MARA.
LT_MARA = VALUE #( ( LW_MARA ) ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).
LT_MARA = VALUE #( BASE LT_MARA
                   ( MATNR = 'MATERIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1030'
                     TEXT1 = 'SECOND material' )
                  ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).

在这里插入图片描述

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

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

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

TYPES: TY_TABLE TYPE TABLE OF TY_DATA WITH DEFAULT KEY.

LT_DATA = VALUE #(
                   ( MATNR = 'MATRIAL-001'
                     MTART = 'WATR'
                     MATKL = '1020'
                     TEXT1 = 'FIRST material' )
                   ( MATNR = 'MATRIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1030'
                     TEXT1 = 'SECOND material' )
                   ( MATNR = 'MATRIAL-003'
                     MTART = 'WATR'
                     MATKL = '1040'
                     TEXT1 = 'THIRD material' )
                  ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).

DATA(LT_FOR) = VALUE TY_TABLE(
                               FOR LW_DATA IN LT_DATA
                               INDEX INTO LV_INDEX
                               WHERE ( MTART = 'WATR' )
                               ( MATNR = LW_DATA-MATNR
                                 MTART = LW_DATA-MTART
                                 MATKL = CONV #( LV_INDEX )
                                 TEXT1 = LW_DATA-TEXT1 )
                                ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).

在这里插入图片描述

*---------------------------------------------------------------------*
*  在FOR语句中允许将结构作为整体直接进行赋值,但是结构必须与表行兼容,
*  可以用于从内表中获取特定条件的数据
*---------------------------------------------------------------------*
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 LT_DATA TYPE TABLE OF TY_DATA.

TYPES: TY_TABLE TYPE TABLE OF TY_DATA WITH DEFAULT KEY.

LT_DATA = VALUE #(
                   ( MATNR = 'MATRIAL-001'
                     MTART = 'WATR'
                     MATKL = '1020'
                     TEXT1 = 'FIRST material' )
                   ( MATNR = 'MATRIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1030'
                     TEXT1 = 'SECOND material' )
                   ( MATNR = 'MATRIAL-003'
                     MTART = 'WATR'
                     MATKL = '1040'
                     TEXT1 = 'THIRD material' )
                  ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).

DATA(LT_FOR) = VALUE TY_TABLE(
                               FOR LW_DATA IN LT_DATA
                               WHERE ( MTART = 'WATR' )
                               ( LW_DATA )
                              ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).

在这里插入图片描述

*---------------------------------------------------------------------*
*    如果结构与表行不兼容,可以嵌套使用CORRESPONDING语句进行赋值,
*       如下例( CORRESPONDING具体用法可参考后续示例 )
*---------------------------------------------------------------------*
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 LT_DATA TYPE TABLE OF TY_DATA.

LT_DATA = VALUE #(
                   ( MATNR = 'MATRIAL-001'
                     MTART = 'WATR'
                     MATKL = '1020'
                     TEXT1 = 'FIRST material' )
                   ( MATNR = 'MATRIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1030'
                     TEXT1 = 'SECOND material' )
                   ( MATNR = 'MATRIAL-003'
                     MTART = 'WATR'
                     MATKL = '1040'
                     TEXT1 = 'THIRD material' )
                  ).

TYPES: BEGIN OF TY_DATA_NEW,
  MATNR TYPE MARA-MATNR,
  MATKL TYPE MARA-MATKL,
  END OF TY_DATA_NEW.

TYPES: TY_TABLE_NEW TYPE TABLE OF TY_DATA_NEW WITH DEFAULT KEY.

DATA(LT_FOR) = VALUE TY_TABLE_NEW(
                                    FOR LW_DATA IN LT_DATA
                                    WHERE ( MTART = 'WATR' )
                                    ( CORRESPONDING #( LW_DATA ) )
                                    ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).

在这里插入图片描述

*---------------------------------------------------------------------*
* 结构字段过多时,一般建议使用整体赋值,如果少部分字段存在特殊的赋值逻辑
* 可嵌套使用VALUE以及BASE语句进行处理,将例1的逻辑转换如下:
*---------------------------------------------------------------------*
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 LT_DATA TYPE TABLE OF TY_DATA.

TYPES: TY_TABLE TYPE TABLE OF TY_DATA WITH DEFAULT KEY.

LT_DATA = VALUE #(
                   ( MATNR = 'MATRIAL-001'
                     MTART = 'WATR'
                     MATKL = '1020'
                     TEXT1 = 'FIRST material' )
                   ( MATNR = 'MATRIAL-002'
                     MTART = 'FOOD'
                     MATKL = '1030'
                     TEXT1 = 'SECOND material' )
                   ( MATNR = 'MATRIAL-003'
                     MTART = 'WATR'
                     MATKL = '1040'
                     TEXT1 = 'THIRD material' )
                  ).

DATA(LT_FOR) = VALUE TY_TABLE(
                                FOR LW_DATA IN LT_DATA
                                INDEX INTO LV_INDEX
                                WHERE ( MTART = 'WATR' )
                                ( VALUE #( BASE LW_DATA
                                           MATKL = CONV #( LV_INDEX ) ) )
                              ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值