MOVE-CORRESPONDING for Internal Tables

引用发布的文章

* 在ABAP 7.40之前,主要通过 MOVE-CORRESPONDING 来传递结构化数据,
* 但需要保持结构内部组件名称一致,否则数据将不会被传递,
* 而使用 CORRESPONDING 后,该语句在保持同名组件自动进行数据传递的基础上,
* MAPPING 可以允许我们将不同名称的组件映射到一起,
* EXCEPT 可以规避掉我们不需要传值的一些字段

Example #1

旧语法实现

 

 1 TYPES: BEGIN OF TY_DATA,
 2 MATNR TYPE MARA-MATNR,
 3 MTART TYPE MARA-MTART,
 4 MATKL TYPE MARA-MATKL,
 5 TEXT1 TYPE CHAR50,
 6 END OF TY_DATA.
 7 
 8 TYPES: BEGIN OF LTY_TABLE,
 9 MATNR_C TYPE MARA-MATNR,
10 MTART TYPE MARA-MTART,
11 MATKL TYPE MARA-MATKL,
12 TEXT1 TYPE CHAR50,
13 END OF LTY_TABLE.
14 
15 DATA LT_DATA TYPE TABLE OF TY_DATA.
16 DATA LT_TABLE TYPE TABLE OF LTY_TABLE.
17 
18 DATA: LS_DATA LIKE LINES OF LT_DATA,
19 
20    LS_TABLE LIKE LINES OF LT_TABLE.
21 
22 LT_DATA = VALUE #( ( MATNR = 'Material-001'
23 MTART = 'WATR'
24 MATKL = '1020'
25 TEXT1 = 'First Material' )
26 ( MATNR = 'Material-002'
27 MTART = 'WATR'
28 MATKL = '1030'
29 TEXT1 = 'Second Material' ) ).
30 
31 LOOP AT LT_DATA INTO LS_DATA.
32   MOVE-CORRESPONDING LS_DATA TO LS_TABLE.
33      CLEAR:LS_TABLE-TEXT1.
34 
35       APPEND LS_TABLE TO LT_TABLE.
36 ENDLOOP.
37 
38 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
39 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).

 

 

新语法实现 

 1 TYPES: BEGIN OF TY_DATA,
 2 MATNR TYPE MARA-MATNR,
 3 MTART TYPE MARA-MTART,
 4 MATKL TYPE MARA-MATKL,
 5 TEXT1 TYPE CHAR50,
 6 END OF TY_DATA.
 7 
 8 TYPES: BEGIN OF LTY_TABLE,
 9 MATNR_C TYPE MARA-MATNR,
10 MTART TYPE MARA-MTART,
11 MATKL TYPE MARA-MATKL,
12 TEXT1 TYPE CHAR50,
13 END OF LTY_TABLE.
14 
15 DATA LT_DATA TYPE TABLE OF TY_DATA.
16 DATA LT_TABLE TYPE TABLE OF LTY_TABLE.
17 
18 
19 LT_DATA = VALUE #( ( MATNR = 'Material-001'
20 MTART = 'WATR'
21 MATKL = '1020'
22 TEXT1 = 'First Material' )
23 ( MATNR = 'Material-002'
24 MTART = 'WATR'
25 MATKL = '1030'
26 TEXT1 = 'Second Material' ) ).
27 
28 LT_TABLE = CORRESPONDING #( LT_DATA
29 MAPPING MATNR_C = MATNR
30 EXCEPT MATKL ).
31 
32 
33 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
34 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).

 

 

 

 

 

 1 *---------------------------------------------------------------------*
 2 * 在 MAPPING 语句中,需要注意两边的字段类型,以免类型不兼容而导致程序 dump
 3 * 使用DEEP处理深层结构数据,相当于MOVE CORRESPONDING [ EXPANDING NESTED TABLES ]
 4 *---------------------------------------------------------------------*
 5 TYPES: BEGIN OF LTY_PROD_MAT,
 6          MATNR TYPE MATNR,
 7          MTART TYPE MTART,
 8          MATKL TYPE MATKL,
 9          BISMT TYPE BISMT,
10        END OF LTY_PROD_MAT.
11 
12 DATA: BEGIN OF LS_PROD_MATS,
13         SECTION     TYPE CHAR10,
14         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
15       END OF LS_PROD_MATS.
16 
17 TYPES: BEGIN OF LTY_SALES_MAT,
18          MATNR TYPE MATNR,
19          BISMT TYPE BISMT,
20          MTART TYPE MTART,
21          MATKL TYPE MATKL,
22        END OF LTY_SALES_MAT.
23 
24 DATA: BEGIN OF LS_SALES_MATS,
25         SECTION     TYPE CHAR10,
26         T_MATERIALS TYPE TABLE OF LTY_SALES_MAT,
27       END OF LS_SALES_MATS.
28 
29 SELECT MATNR MTART MATKL BISMT FROM MARA
30   INTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALS
31  UP TO 3 ROWS.
32 
33 LS_PROD_MATS = CORRESPONDING #( DEEP LS_SALES_MATS ).
34 
35 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_SALES_MATS-T_MATERIALS ).
36 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

 

 

 

 

 1 *---------------------------------------------------------------------*
 2 *  使用BASE保留初始数据,为内表赋值时相当于
 3 *  MOVE CORRESPONDING [ KEEPING TARGET LINES ],
 4 *  为结构赋值时类似于VALUE [ BASE ]
 5 *---------------------------------------------------------------------*
 6 TYPES: BEGIN OF TY_DATA,
 7          MATNR TYPE MARA-MATNR,
 8          MTART TYPE MARA-MTART,
 9          MATKL TYPE MARA-MATKL,
10          TEXT1 TYPE CHAR50,
11        END OF TY_DATA.
12 
13 DATA LT_DATA TYPE TABLE OF TY_DATA.
14 DATA LT_TABLE TYPE TABLE OF TY_DATA.
15 
16 LT_DATA = VALUE #( ( MATNR = 'Material-001'
17                      MTART = 'WATR'
18                      MATKL = '1020'
19                      TEXT1 = 'First Material' )
20                    ( MATNR = 'Material-002'
21                      MTART = 'WATR'
22                      MATKL = '1030'
23                      TEXT1 = 'Second Material' ) ).
24 
25 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
26 
27 LT_TABLE = VALUE #( ( MATNR = 'Material-001'
28                       MTART = 'FOOD' )
29                     ( MATNR = 'Material-002'
30                       MTART = 'WATR') ).
31 
32 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).
33 
34 LT_TABLE = CORRESPONDING #( BASE ( LT_TABLE ) LT_DATA EXCEPT MATKL ).
35 
36 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).

 

 

 

 1 *---------------------------------------------------------------------*
 2 * CORRESPONDING中可以从两个内表中引入数据,FORM子句后的内表结构需要定义为排序表或哈希表
 3 * 该语法不能与DEEP/BASE关键字同时使用,但是可以使用MAPPING/EXCEPT
 4 * 如下例所示,以表1为基表,根据USING定义的关联条件去表2查找数据,如果查找到,
 5 * 则将表2的该条数据复写到表1对应的记录上并返回,否则直接返回表1的数据
 6 * MAPPING/EXCEPT作用于表2数据复写到表1对应记录的过程中,特定条件下可以用来实现读取数据
 7 * 并更新内表的操作,但是需要定义非标准表,有一定的局限性
 8 *---------------------------------------------------------------------*
 9 TYPES:BEGIN OF LTY_DATA,
10         INDEX TYPE CHAR4,
11         TEXT1 TYPE CHAR10,
12         TEXT2 TYPE CHAR10,
13       END OF LTY_DATA.
14 
15 DATA: LT_TMP1 TYPE SORTED TABLE OF LTY_DATA WITH UNIQUE KEY INDEX,
16       LT_TMP2 TYPE SORTED TABLE OF LTY_DATA WITH UNIQUE KEY INDEX,
17       LT_DATA TYPE TABLE OF LTY_DATA.
18 
19 LT_TMP1 = VALUE #( ( INDEX = '0001' TEXT1 = 'X' )
20                    ( INDEX = '0004' TEXT1 = 'X' )
21                    ( INDEX = '0009' TEXT1 = 'X' )
22                    ( INDEX = '0021' TEXT1 = 'X' ) ).
23 
24 LT_TMP2 = VALUE #( ( INDEX = '0001' TEXT2 = 'Y' )
25                    ( INDEX = '0002' TEXT2 = 'Y' )
26                    ( INDEX = '0003' TEXT2 = 'Y' )
27                    ( INDEX = '0004' TEXT2 = 'Y' ) ).
28 
29 LT_DATA = CORRESPONDING #( LT_TMP1 FROM LT_TMP2 USING INDEX = INDEX )."from后表的数据传递给前表,按照using后条件操作”
30 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
31 
32 LT_DATA = CORRESPONDING #( LT_TMP1 FROM LT_TMP2 USING INDEX = INDEX EXCEPT TEXT1 )."可以使用mapping和except”
33 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).
 1 不同字段做复制
 2 TYPES : BEGIN OF lty_demo1,
 3           col1 TYPE c,
 4           col2 TYPE c,
 5         END OF lty_demo1,
 6 
 7         BEGIN OF lty_demo2,
 8           col1 TYPE c,
 9           col2 TYPE c,
10           col3 TYPE c,
11         END OF lty_demo2.
12 
13 DATA: itab1 TYPE STANDARD TABLE OF lty_demo1,
14       itab2 TYPE STANDARD TABLE OF lty_demo2.
15 
16 itab1 = VALUE #( ( col1 = 'A' col2 = 'B' )
17                  ( col1 = 'P' col2 = 'Q' )
18                  ( col1 = 'N' col2 = 'P' )
19                ).
20 itab2 = CORRESPONDING #( itab1 MAPPING COL3 = COL2 EXCEPT COL2 ).
21 
22 cl_demo_output=>write_data( itab1 ).
23 cl_demo_output=>write_data( itab2 ).
24 cl_demo_output=>display( ).

 

 

 

MOVE-CORRESPONDING(DEEP)

在 ABAP 7.40 后,MOVE-CORRESPONDING语句针对深层结构赋值进行了扩展,并且允许保留结构在被赋值前的数据

 1 *---------------------------------------------------------------------*
 2 * 在深层结构中使用 MOVE-CORRESPONDING传递数据时,需要保持嵌套的深层次结构一致,
 3 * 包括字段名以及顺序等,否则数据会错位
 4 *---------------------------------------------------------------------*
 5 TYPES: BEGIN OF LTY_PROD_MAT,
 6          MATNR TYPE MATNR,
 7          MTART TYPE MTART,
 8          MATKL TYPE MATKL,
 9          BISMT TYPE BISMT,
10        END OF LTY_PROD_MAT.
11 
12 DATA: BEGIN OF LS_PROD_MATS,
13         SECTION     TYPE CHAR10,
14         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
15       END OF LS_PROD_MATS.
16 
17 DATA: BEGIN OF LS_SALES_MATS,
18         SECTION     TYPE CHAR10,
19         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
20       END OF LS_SALES_MATS.
21 
22 SELECT MATNR MTART MATKL BISMT FROM MARA
23   INTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALS
24  UP TO 3 ROWS.
25 
26 MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS.
27 
28 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_SALES_MATS-T_MATERIALS ).
29 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

 

 

 

 1 *---------------------------------------------------------------------*
 2 * 使用 EXPANDING NESTED TABLES 避免因结构不一致而导致的数据异常,
 3 * 对于深层结构,只有相同名称的字段被复制,且不需要它们顺序相同,
 4 * 但是该语句只考虑第一级的深层次结构,不适用于更深层次的数据
 5 *---------------------------------------------------------------------*
 6 TYPES: BEGIN OF LTY_PROD_MAT,
 7          MATNR TYPE MATNR,
 8          MTART TYPE MTART,
 9          MATKL TYPE MATKL,
10          BISMT TYPE BISMT,
11        END OF LTY_PROD_MAT.
12 
13 DATA: BEGIN OF LS_PROD_MATS,
14         SECTION     TYPE CHAR10,
15         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
16       END OF LS_PROD_MATS.
17 
18 DATA: BEGIN OF LS_SALES_MATS,
19         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
20         SECTION     TYPE CHAR10,
21       END OF LS_SALES_MATS.
22 
23 SELECT MATNR MTART MATKL BISMT FROM MARA
24   INTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALS
25  UP TO 3 ROWS.
26 
27 
28 MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS.
29 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).
30 
31 MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS EXPANDING NESTED TABLES.
32 CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

 

 

 1 *---------------------------------------------------------------------*
 2 * 在使用 MOVE-CORRESPONDING 时,默认都会先清空目标结构的数据,
 3 * 再将数据填充到结构里面,当我们需要保留目标结构原有的数据时,
 4 * 可以使用 KEEPING TARGET LINES 语句,该语句适用于表结构赋值,
 5 * 且不会修改原有的记录,仅添加需要填充的数据
 6 *---------------------------------------------------------------------*
 7 TYPES: BEGIN OF LTY_PROD_MAT,
 8          MATNR TYPE MATNR,
 9          MTART TYPE MTART,
10          MATKL TYPE MATKL,
11          BISMT TYPE BISMT,
12        END OF LTY_PROD_MAT.
13 
14 DATA: BEGIN OF LS_PROD_MATS,
15         SECTION     TYPE CHAR10,
16         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
17       END OF LS_PROD_MATS.
18 
19 DATA: BEGIN OF LS_SALES_MATS,
20         SECTION     TYPE CHAR10,
21         T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,
22       END OF LS_SALES_MATS.
23 
24 
25 SELECT MATNR MTART MATKL BISMT
26   FROM MARA
27   INTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALS
28   UP TO 4 ROWS.
29 
30 SELECT MATNR MTART MATKL BISMT
31   FROM MARA
32   INTO CORRESPONDING FIELDS OF TABLE LS_PROD_MATS-T_MATERIALS
33   UP TO 1 ROWS.
34 
35 MOVE-CORRESPONDING LS_SALES_MATS-T_MATERIALS TO LS_PROD_MATS-T_MATERIALS KEEPING TARGET LINES.

 

 

 

 

*---------------------------------------------------------------------** 使用 EXPANDING NESTED TABLES 避免因结构不一致而导致的数据异常,* 对于深层结构,只有相同名称的字段被复制,且不需要它们顺序相同,* 但是该语句只考虑第一级的深层次结构,不适用于更深层次的数据*---------------------------------------------------------------------*TYPES: BEGIN OF LTY_PROD_MAT,         MATNR TYPE MATNR,         MTART TYPE MTART,         MATKL TYPE MATKL,         BISMT TYPE BISMT,       END OF LTY_PROD_MAT.
DATA: BEGIN OF LS_PROD_MATS,        SECTION     TYPE CHAR10,        T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,      END OF LS_PROD_MATS.
DATA: BEGIN OF LS_SALES_MATS,        T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,        SECTION     TYPE CHAR10,      END OF LS_SALES_MATS.
SELECT MATNR MTART MATKL BISMT FROM MARA  INTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALS UP TO 3 ROWS.

MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS.CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).
MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS EXPANDING NESTED TABLES.CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

 

posted @ 2022-04-05 14:42  ultraluck  阅读(604)  评论(0)    收藏  举报