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 ).
文章来自于网络,如果侵犯了您的权益,请联系站长删除!