New Keyword in ABAP--REF VALUE BASE FOR
转自 (10条消息) ABAP--新语法--New Keyword in ABAP--第二天--REF VALUE BASE FOR_尤其是十月的风的博客-CSDN博客
CL_DEMO_OUTPUT=>DISPLAY
PS:自己测试是DISPLAY后的内表不能带表头。
REF 使用 REF 定义引用变量,用来代替 CREATE DATA
1 *---------------------------------------------------------------------* 2 * 在使用 REF时,不需要提前声明变量,也不用指定类型, 3 * 类型默认会与被指向的变量保持一致 4 *---------------------------------------------------------------------* 5 TYPES: BEGIN OF TY_MARA, 6 MATNR TYPE MARA-MATNR, 7 MTART TYPE MARA-MTART, 8 MATKL TYPE MARA-MATKL, 9 TEXT1 TYPE CHAR50, 10 END OF TY_MARA. 11 12 DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001' 13 MTART = 'FOOD' 14 MATKL = '1010' 15 TEXT1 = 'FIRST' ). 16 17 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ). 18 DATA(LV_REF) = REF #( LW_MARA ). 19 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ). 20 LV_REF->* = VALUE #( MATNR = 'MATERIAL-002' 21 MTART = 'WATR' 22 MATKL = '1020' ). 23 24 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ). 25 LV_REF->TEXT1 = 'SECONDE'. 26 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).
VALUE
新语法中,可以使用 VALUE 作为赋值语句,主要用来为内表、结构、变量等对象赋值
1 *---------------------------------------------------------------------* 2 * 参数类型引用同NEW关键字,在VALUE子句中,字段可以分开赋值, 3 * 也可以使用结构整体赋值,为内表赋值时, 4 * 需要用小括号将一行的数据包在一起 5 *---------------------------------------------------------------------* 6 TYPES: BEGIN OF TY_MARA, 7 MATNR TYPE MARA-MATNR, 8 MTART TYPE MARA-MTART, 9 MATKL TYPE MARA-MATKL, 10 TEXT1 TYPE CHAR50, 11 END OF TY_MARA. 12 13 DATA: LT_MARA TYPE TABLE OF TY_MARA. 14 DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001' 15 MTART = 'FOOD' 16 MATKL = '1020' 17 TEXT1 = 'FIRST material'). 18 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ). 19 LT_MARA = VALUE #( ( LW_MARA ) 20 ( MATNR = 'MATERIAL-002' 21 MTART = 'FOOD' 22 MATKL = '1020' 23 TEXT1 = 'SECOND material') 24 ). 25 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).
1 *---------------------------------------------------------------------* 2 * 此外,VALUE语句作为结构时,可以直接在特定语句中使用 3 *---------------------------------------------------------------------* 4 TYPES: BEGIN OF TY_DATA, 5 CHECKBOX TYPE C, 6 VALUE(4) TYPE C, 7 END OF TY_DATA. 8 DATA LT_DATA TYPE TABLE OF TY_DATA. 9 APPEND VALUE #( VALUE = 'TEST' ) TO LT_DATA. 10 11 MODIFY LT_DATA FROM VALUE #( CHECKBOX = 'X' ) TRANSPORTING CHECKBOX WHERE CHECKBOX IS INITIAL. 12 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
1 *---------------------------------------------------------------------* 2 * 在内表赋值语句中使用 BASE 时,内表原有的数据会被保留, 3 * 新增条目会被追加到内表中,效果同 Append Line 4 *---------------------------------------------------------------------* 5 DATA LT_MARA TYPE TABLE OF TY_MARA. 6 LT_MARA = VALUE #( ( LW_MARA ) ). 7 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ). 8 LT_MARA = VALUE #( BASE LT_MARA 9 ( MATNR = 'MATERIAL-002' 10 MTART = 'FOOD' 11 MATKL = '1030' 12 TEXT1 = 'SECOND material' ) 13 ). 14 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).
BASE
在使用 VALUE 作为赋值语句时,默认会覆盖原有的数据,通过BASE子句基于原有数据进行赋值
1 *---------------------------------------------------------------------* 2 * 在结构赋值语句中使用 BASE 时,原有字段的数据会被保留, 3 * 但是当在VALUE语句中对同一字段再次赋值时,该字段数据会被覆盖 4 *---------------------------------------------------------------------* 5 TYPES: BEGIN OF TY_MARA, 6 MATNR TYPE MARA-MATNR, 7 MTART TYPE MARA-MTART, 8 MATKL TYPE MARA-MATKL, 9 TEXT1 TYPE CHAR50, 10 END OF TY_MARA. 11 12 DATA(LW_MARA) = VALUE TY_MARA( MATNR = 'MATERIAL-001' 13 MTART = 'FOOD' ). 14 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ). 15 LW_MARA = VALUE #( BASE LW_MARA 16 MTART = 'WATR' 17 MATKL = '1020' 18 TEXT1 = 'FIRST material'). 19 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_MARA ).
1 *---------------------------------------------------------------------* 2 * 在内表赋值语句中使用 BASE 时,内表原有的数据会被保留, 3 * 新增条目会被追加到内表中,效果同 Append Line 4 *---------------------------------------------------------------------* 5 DATA LT_MARA TYPE TABLE OF TY_MARA. 6 LT_MARA = VALUE #( ( LW_MARA ) ). 7 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ). 8 LT_MARA = VALUE #( BASE LT_MARA 9 ( MATNR = 'MATERIAL-002' 10 MTART = 'FOOD' 11 MATKL = '1030' 12 TEXT1 = 'SECOND material' ) 13 ). 14 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_MARA ).
*---------------------------------------------------------------------* * 使用 BASE 语句时,尽量保持前后结构一致, * 在使用不同的结构时,可能不报错但数据会错位 *---------------------------------------------------------------------*
FOR 在内表赋值语句中,可以使用FOR语句从其他内表中批量引入数据并处理
1 *---------------------------------------------------------------------* 2 * 在FOR语句中允许将结构作为整体直接进行赋值,但是结构必须与表行兼容, 3 * 可以用于从内表中获取特定条件的数据 4 *---------------------------------------------------------------------* 5 TYPES: BEGIN OF TY_DATA, 6 MATNR TYPE MARA-MATNR, 7 MTART TYPE MARA-MTART, 8 MATKL TYPE MARA-MATKL, 9 TEXT1 TYPE CHAR50, 10 END OF TY_DATA. 11 12 DATA LT_DATA TYPE TABLE OF TY_DATA. 13 14 TYPES: TY_TABLE TYPE TABLE OF TY_DATA WITH DEFAULT KEY. 15 16 LT_DATA = VALUE #( 17 ( MATNR = 'MATRIAL-001' 18 MTART = 'WATR' 19 MATKL = '1020' 20 TEXT1 = 'FIRST material' ) 21 ( MATNR = 'MATRIAL-002' 22 MTART = 'FOOD' 23 MATKL = '1030' 24 TEXT1 = 'SECOND material' ) 25 ( MATNR = 'MATRIAL-003' 26 MTART = 'WATR' 27 MATKL = '1040' 28 TEXT1 = 'THIRD material' ) 29 ). 30 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ). 31 32 DATA(LT_FOR) = VALUE TY_TABLE( 33 FOR LW_DATA IN LT_DATA 34 WHERE ( MTART = 'WATR' ) 35 ( LW_DATA ) 36 ). 37 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).
1 *---------------------------------------------------------------------* 2 * 如果结构与表行不兼容,可以嵌套使用CORRESPONDING语句进行赋值, 3 * 如下例( CORRESPONDING具体用法可参考后续示例 ) 4 *---------------------------------------------------------------------* 5 TYPES: BEGIN OF TY_DATA, 6 MATNR TYPE MARA-MATNR, 7 MTART TYPE MARA-MTART, 8 MATKL TYPE MARA-MATKL, 9 TEXT1 TYPE CHAR50, 10 END OF TY_DATA. 11 12 DATA LT_DATA TYPE TABLE OF TY_DATA. 13 14 LT_DATA = VALUE #( 15 ( MATNR = 'MATRIAL-001' 16 MTART = 'WATR' 17 MATKL = '1020' 18 TEXT1 = 'FIRST material' ) 19 ( MATNR = 'MATRIAL-002' 20 MTART = 'FOOD' 21 MATKL = '1030' 22 TEXT1 = 'SECOND material' ) 23 ( MATNR = 'MATRIAL-003' 24 MTART = 'WATR' 25 MATKL = '1040' 26 TEXT1 = 'THIRD material' ) 27 ). 28 29 TYPES: BEGIN OF TY_DATA_NEW, 30 MATNR TYPE MARA-MATNR, 31 MATKL TYPE MARA-MATKL, 32 END OF TY_DATA_NEW. 33 34 TYPES: TY_TABLE_NEW TYPE TABLE OF TY_DATA_NEW WITH DEFAULT KEY. 35 36 DATA(LT_FOR) = VALUE TY_TABLE_NEW( 37 FOR LW_DATA IN LT_DATA 38 WHERE ( MTART = 'WATR' ) 39 ( CORRESPONDING #( LW_DATA ) ) 40 ). 41 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).
1 *---------------------------------------------------------------------* 2 * 结构字段过多时,一般建议使用整体赋值,如果少部分字段存在特殊的赋值逻辑 3 * 可嵌套使用VALUE以及BASE语句进行处理,将例1的逻辑转换如下: 4 *---------------------------------------------------------------------* 5 TYPES: BEGIN OF TY_DATA, 6 MATNR TYPE MARA-MATNR, 7 MTART TYPE MARA-MTART, 8 MATKL TYPE MARA-MATKL, 9 TEXT1 TYPE CHAR50, 10 END OF TY_DATA. 11 12 DATA LT_DATA TYPE TABLE OF TY_DATA. 13 14 TYPES: TY_TABLE TYPE TABLE OF TY_DATA WITH DEFAULT KEY. 15 16 LT_DATA = VALUE #( 17 ( MATNR = 'MATRIAL-001' 18 MTART = 'WATR' 19 MATKL = '1020' 20 TEXT1 = 'FIRST material' ) 21 ( MATNR = 'MATRIAL-002' 22 MTART = 'FOOD' 23 MATKL = '1030' 24 TEXT1 = 'SECOND material' ) 25 ( MATNR = 'MATRIAL-003' 26 MTART = 'WATR' 27 MATKL = '1040' 28 TEXT1 = 'THIRD material' ) 29 ). 30 31 DATA(LT_FOR) = VALUE TY_TABLE( 32 FOR LW_DATA IN LT_DATA 33 INDEX INTO LV_INDEX 34 WHERE ( MTART = 'WATR' ) 35 ( VALUE #( BASE LW_DATA 36 MATKL = CONV #( LV_INDEX ) ) ) 37 ). 38 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FOR ).
CL_DEMO_OUTPUT=>DISPLAY
PS:自己测试是DISPLAY后的内表不能带表头。
REF
使用 REF 定义引用变量,用来代替 CREATE DATA
post SAP-Garson
原文链接:https://www.cnblogs.com/ultraluck/p/16103187.html文章来自于网络,如果侵犯了您的权益,请联系站长删除!