SAP·ABAP/ABAP

ABAP 신문법 - Move

SEO_Joon 2025. 11. 5. 10:00

*&---------------------------------------------------------------------*
*& MOVE-CORRESPONDING 표현
*&
*& DEEP STRUCTURE 구조를 가지는 인터널 테이블을 한번에 복사 할 수 있습니다.
*& DEEP STRUCTURE : STRUCTUE 안에 STRUCTUE 추가
*&                 SE11 에서 .INCLUDE
*&---------------------------------------------------------------------*

DATA : BEGIN OF LS_STRUCTURE1,
         COL11(10) TYPE C VALUE '1_1',
         COL12(10) TYPE C VALUE '1_2',
       END OF LS_STRUCTURE1.

DATA : BEGIN OF LS_STRUCTURE2,
         COL12(10) TYPE C VALUE '2_1',
         COL13(10) TYPE C VALUE '2_2',
       END OF LS_STRUCTURE2.

"기존 문법
*      MOVE-CORRESPONDING LS_STRUCTURE1 TO LS_STRUCTURE2.

"신규 문법
" 1. LS_STRUCTURE1과 일치하는 값은 넣어주고, 나머지는 초기화
LS_STRUCTURE2 = CORRESPONDING #( LS_STRUCTURE1 ).


" 2. 기존값을 기초로해서 넣어줌
"즉, 일치하는 필드에는 값을 넣어주고, 아닌것은 기존값을 그대로 둠
LS_STRUCTURE2 = CORRESPONDING #( BASE ( LS_STRUCTURE2 ) LS_STRUCTURE1 ).


**********************************************************************
*-- loop 를 돌리지 않고 인터널 테이블을 복사하는 문법
**********************************************************************

TYPES : BEGIN OF TY_S_TEMP,
          EBELN    TYPE BSEG-EBELN,
          EBELP    TYPE EKPO-EBELP,
          MATNR    TYPE BSEG-MATNR,
          TEXT(40) TYPE C,
        END OF TY_S_TEMP,

        TY_T_TEMP TYPE TABLE OF TY_S_TEMP WITH EMPTY KEY.

SELECT *
  INTO TABLE @DATA(LT_EKPO)
  FROM EKPO
  UP TO 100 ROWS.

DATA : LS_EKPO LIKE LINE OF LT_EKPO.


"신규 문법1
"이 두개 테이블에서(TY_T_TEMP / LT_EKPO ) 같은 필드의 값을
" 여기에(LT_TEMP) 넣어줘.

*DATA(LT_TEMP) = CORRESPONDING TY_T_TEMP( LT_EKPO ).
*DATA : LS_TEMP LIKE LINE OF LT_TEMP.


"기존 문법1  < LS_EKPO -> LS_TEMP -> LT_TEMP >

*LOOP AT LT_EKPO INTO LS_EKPO.
*
*  CLEAR LS_TEMP.
*  MOVE-CORRESPONDING LS_EKPO TO LS_TEMP.
*  APPEND LS_TEMP TO LT_TEMP.
*ENDLOOP.



"신규 문법2
"mapping 에 명시하지 않은 필드는 같은 이름의 필드로 자동 복사
"EXCEPT 제외

DATA(LT_TEMP2) = CORRESPONDING TY_T_TEMP(
                                          LT_EKPO
                                          MAPPING TEXT = TXZ01
                                          EXCEPT MATNR ).
DATA : LS_TEMP2 LIKE LINE OF LT_TEMP2.


"기존 문법2 < LS_EKPO -> LS_TEMP2 -> LT_TEMP2 >

LOOP AT LT_EKPO INTO LS_EKPO.

  CLEAR LS_TEMP2.
  MOVE-CORRESPONDING LS_EKPO TO LS_TEMP2.
  LS_TEMP2-TEXT  = LS_EKPO-TXZ01.
  LS_TEMP2-MATNR = ' '.
  APPEND LS_TEMP2 TO LT_TEMP2.

ENDLOOP.



**********************************************************************
*-- DEEP STRUCTURE 구조를 가지는 인터널 테이블을 한번에 복사
**********************************************************************

"신규 문법3
TYPES: BEGIN OF T_S_DEEP1,
         ID        TYPE CHAR10,
         PROPERTY1 TYPE CHAR10,
         VALUE1    TYPE STRING,
       END OF T_S_DEEP1,
       T_T_DEEP1 TYPE TABLE OF T_S_DEEP1 WITH KEY ID.



TYPES: BEGIN OF T_S_DEEP2,
         ID        TYPE CHAR10,
         PROPERTY2 TYPE CHAR10,
         VALUE2    TYPE STRING,
       END OF T_S_DEEP2,
       T_T_DEEP2 TYPE TABLE OF T_S_DEEP2 WITH KEY ID.

*TYPES: BEGIN OF T_S_DEEP2,
*         ID        TYPE CHAR10,
*         PROPERTY1 TYPE CHAR10,
*         VALUE1    TYPE STRING,
*       END OF T_S_DEEP2,
*       T_T_DEEP2 TYPE TABLE OF T_S_DEEP2 WITH KEY ID.

TYPES: BEGIN OF T_S_1,
         ID       TYPE CHAR10,
         NAME     TYPE STRING,
         PROPERTY TYPE T_T_DEEP1,
       END OF T_S_1,
       T_T_1 TYPE TABLE OF T_S_1 WITH KEY ID.

TYPES: BEGIN OF T_S_2,
         ID       TYPE CHAR10,
         NAME     TYPE STRING,
         PROPERTY TYPE T_T_DEEP2,
       END OF T_S_2,
       T_T_2 TYPE TABLE OF T_S_2 WITH KEY ID.

" DEEP STRUCTURE
" DATA(LT_2) = VALUE T_T_1  <= lt_2는 t_t1 의 구조를 가진다.

DATA(LT_1) = VALUE T_T_1(
( ID = '0000000001'
  NAME = 'Car'
  PROPERTY = VALUE #(
                ( ID = '0000000001' PROPERTY1 = 'Color' VALUE1 = 'Red' )
                ( ID = '0000000001' PROPERTY1 = 'Size' VALUE1 = 'Small' )
                ( ID = '0000000001' PROPERTY1 = 'Speed' VALUE1 = '100' ) )
)
( ID = '0000000002'
NAME = 'Boat'
PROPERTY = VALUE #(
                ( ID = '0000000002' PROPERTY1 = 'Color' VALUE1 = 'White' )
                ( ID = '0000000002' PROPERTY1 = 'Size' VALUE1 = 'Big' )
                ( ID = '0000000002' PROPERTY1 = 'Speed' VALUE1 = '30' ) )
)
).

DATA(LT_2) = VALUE T_T_2( ).
*
*DATA(LT_2) = VALUE T_T_1(
*( ID   = '0000000001'
*NAME = 'BYCLE'
*PROPERTY = VALUE #( ( ID = '0000000011' PROPERTY1 = 'COLOR' VALUE1 = 'RED2'   )
*                    ( ID = '0000000011' PROPERTY1 = 'SIZE'  VALUE1 = 'SMALL2' )
*                    ( ID = '0000000011' PROPERTY1 = 'SPEED' VALUE1 = '1002'   ) )
*)
*( ID   = '0000000002'
*NAME = 'AIRPLANE'
*PROPERTY = VALUE #( ( ID = '0000000012' PROPERTY1 = 'COLOR' VALUE1 = 'WHITE2' )
*                    ( ID = '0000000012' PROPERTY1 = 'SIZE'  VALUE1 = 'BIG2'   )
*                    ( ID = '0000000012' PROPERTY1 = 'SPEED' VALUE1 = '302'    ) )
* )
*).





* 구문법
* lt_2 = lt_1.

* 신문법
MOVE-CORRESPONDING LT_1 TO LT_2 .

" deep structure field 명이 같은것만 들어감
*MOVE-CORRESPONDING LT_1 TO LT_2 EXPANDING NESTED TABLES.

"기존에 data가 있으면 append 됨
MOVE-CORRESPONDING LT_1 TO LT_2 EXPANDING NESTED TABLES KEEPING TARGET LINES.

BREAK-POINT.