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

posted @ 2022-04-05 18:03  ultraluck  阅读(183)  评论(0)    收藏  举报