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 ).