Search
🫡

7. ABAP 반복문 & COLLECT & SORT

ABAP 반복문

구글에 abap multiplication table example 라고 치고 첫번째 페이지에 해당 링크로 진입.
위에서 4번째에 있는 걸로 복사
*&---------------------------------------------------------------------* *& Report Z7WEEK_ALV00 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT Z7WEEK_ALV00. DATA : BEGIN OF ITAB OCCURS 0, NUM1 TYPE I , NUM2 TYPE I , NUM3 TYPE I , END OF ITAB . DO 10 TIMES . ITAB-NUM1 = ITAB-NUM1 + 1 . clear itab-num2. DO 10 TIMES . ITAB-NUM2 = ITAB-NUM2 + 1 . ITAB-NUM3 = ITAB-NUM1 * ITAB-NUM2 . append itab. ENDDO . ENDDO . LOOP AT ITAB . WRITE : / ITAB-NUM1, '*' , ITAB-NUM2 , '=' , ITAB-NUM3 . ENDLOOP .
ABAP
복사

1. DO문과 LOOP문 사용법

DO문LOOP문은 ABAP에서 반복 작업을 처리할 때 주로 사용됨.
DO문: 특정 작업을 지정된 횟수만큼 반복.
DO 10 TIMES. WRITE / 'This is iteration: ', SY-INDEX. ENDDO.
ABAP
복사
여기서 SY-INDEX는 현재 몇 번째 반복 중인지를 나타냄.
LOOP문: 테이블의 데이터를 한 줄씩 읽어와 작업을 수행.
LOOP AT itab(테이블) (INTO wa_itab()). WRITE: / wa_itab-num1, wa_itab-num2. ENDLOOP..
ABAP
복사
SY-TABIXLOOP가 진행될 때마다 자동으로 몇 번째 행을 읽고 있는지 반영된다.
WRITE: / 구문은 결과를 출력할 때 한 줄씩 내려가도록 한다.

SY-TABIX의 역할

APPEND가 실행될 때: SY-TABIX는 테이블의 마지막 행의 위치를 가리킨다.
LOOP가 실행될 때: SY-TABIX는 현재 읽고 있는 행의 위치를 나타낸다.
NUM1 TYPE I 여기서 TYPE I로 선언하면 초기값이 0 이다.
해당 부분에 디버깅 포인트 찍고 봐보자.
ITAB 더블클릭해놓고 이제 싱클스탭을 2번정도 해주고
ITAB행에 들어가보면
NUM1이 1로 바뀐걸 볼 수 있다.
NUM1 NUM2 NUM3 --------------------------------- ITAB 행 1 0 0 ---------------------------------- ITAB 테이블
Plain Text
복사
이 상태이고
우측에 이제 sy-index를 써주고 엔터치면 1이라고 찍혀서 나온다.
DO문이 중첩되어있으면 DO문마다 SY-INDEX를 다시 계산해서 찍어준다.
이제 응용한다면
DO문이 돌아갈때마다 SY-INDEX가 1부터 차례대로 찍히는데
이 부분을
clear도 빼면 된다.
로 변경해줘도 같은 값을 출력해준다.

2. 테이블 선언 및 APPEND 예시

테이블을 선언하고 데이터를 반복해서 쌓는 과정은 APPEND를 통해 처리함.
테이블 선언 및 데이터 추가 예시
DATA: BEGIN OF itab OCCURS 0, num1 TYPE I, num2 TYPE I, num3 TYPE I, END OF itab. DO 10 TIMES. itab-num1 = SY-INDEX. DO 10 TIMES. itab-num2 = SY-INDEX. itab-num3 = itab-num1 * itab-num2. APPEND itab. ENDDO. ENDDO. LOOP AT itab. WRITE: / itab-num1, '*', itab-num2, '=', itab-num3. ENDLOOP.
ABAP
복사

3. IF문과 ELSEIF 문법

ABAP의 조건문 사용 방법도 중요함. 여러 조건을 체크하고 그에 따라 다른 작업을 수행할 수 있음.
abap if example 구글에 쳐서 첫번째 링크로 들어가준다.
Data Title_1(20) TYPE C. Title_1 = 'Tutorials'. IF Title_1 = 'Tutorial'. write 'This is IF Statement'. ELSE. write 'This is ELSE Statement'. ENDIF.
ABAP
복사
응용해서 찍어보자
Data Title_1(20) TYPE C. Title_1 = 'Tutorials'. Data Title_2(20) TYPE C. Title_2 = 'Tutorials'. IF Title_1 = 'Tutorials'. write 'This is IF Statement'. ELSEIF Title_2 = 'Tutorials'. write 'This is ELSEIF Statement'. ELSE. write 'This is ELSE Statement'. ENDIF.
ABAP
복사
if~else 구문은 참인 조건 하나만 타게 되어있어서 Title_1이랑 Title_2랑 차라리 조건을 나눠서 태우는게 맞다.
Data Title_1(20) TYPE C. Title_1 = 'Tutorial'. Data Title_2(20) TYPE C. Title_2 = 'Tutorials'. IF Title_1 = 'Tutorial'. write 'This is IF Statement'. ELSEIF Title_2 = 'Tutorials'. write 'This is ELSEIF Statement'. ELSE. write 'This is ELSE Statement'. ENDIF. IF Title_2 = 'Tutorial'. write 'This is IF Statement'. ELSEIF Title_2 = 'Tutorials'. write 'This is ELSEIF Statement'. ELSE. write 'This is ELSE Statement'. ENDIF.
ABAP
복사

4. 집계 함수: COLLECT와 SUM

데이터 집계에는 COLLECTSUM을 사용할 수 있음.
COLLECT: 동일한 키 값을 가진 항목들의 숫자 필드를 자동으로 집계함.
COLLECT wa_itab INTO itab.
ABAP
복사
COLLECT는 테이블을 미리 정렬(SORT)해 두면 더 빠르게 처리됨.
SUM: 루프 내에서 같은 그룹의 숫자 필드 값을 합산할 때 사용됨.
LOOP AT itab INTO wa_itab. AT END OF carrid. SUM. APPEND wa_itab TO it_collect. ENDAT. ENDLOOP.
ABAP
복사

COLLECT 예시

* internal table Structure creation TYPES: BEGIN OF t_product, pid(10) TYPE C, pname(40) TYPE C, pamount(10) TYPE P, END OF t_product. * Data & internal table declaration DATA: wa TYPE t_product, it TYPE TABLE OF t_product. * inserting data to the internal table of INDEX 1 wa-pid = 'IFB1'. wa-pname = 'IFB WASHING MACHINE'. wa-pamount = 31000. COLLECT wa INTO it. * inserting data to the internal table of INDEX 1 wa-pid = 'IFB1'. wa-pname = 'IFB WASHING MACHINE'. wa-pamount = 30000. COLLECT wa INTO it. * inserting data to the internal table of INDEX 2 wa-pid = 'IFB2'. wa-pname = 'IFB SPLIT AC'. wa-pamount = 38000. COLLECT wa INTO it. * inserting data to the internal table of INDEX 2 wa-pid = 'IFB2'. wa-pname = 'IFB SPLIT AC'. wa-pamount = 32000. COLLECT wa INTO it. * Reading internal table for all the records LOOP AT it INTO wa. IF sy-subrc = 0. WRITE :/ wa-pid, wa-pname, wa-pamount. ELSE. WRITE 'No Record Found'. ENDIF. ENDLOOP.
ABAP
복사
디버깅을 걸고
wa에 이제 하나씩 넣어주고
COLLECT가 쌓아주면서 IT에 넣어주다
1번째 행이 쌓임.
그리고 두번째 행으로 싱글 스탭으로 넘기면
같은거끼리 값이 쌓여서 들어간다

SBOOK 데이터 집계 및 ALV 출력 정리

SBOOK 테이블을 조회하고, CARRID를 기준으로 특정 데이터를 집계하여 ALV로 출력하는 프로그램을 작성.
1.
조회 화면에서 SELECT-OPTIONSCARRID 필드를 기준으로 조회 조건을 설정할 수 있어야 합니다.
2.
SBOOK 테이블에서 CARRID, CONNID, LUGGWEIGHT, WUNIT, LOCCURAM, LOCCURKEY 필드를 조회하여 ALV로 출력.
3.
ALV 출력 이후, COLLECT 명령어를 사용하여 집계.
4.
집계된 결과를 별도의 내부 테이블에 저장하고, 이를 다시 ALV로 출력해야 한다.
*&---------------------------------------------------------------------* *& Report Z7WEEK_ALV03_SBOOK_COLLECT *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT Z7WEEK_ALV03_SBOOK_COLLECT. * 테이블 선언 TABLES: sbook. TYPE-POOLS: slis. * 데이터 구조 정의 TYPES: BEGIN OF t_sbook, carrid TYPE sbook-carrid, connid TYPE sbook-connid, luggweight TYPE sbook-luggweight, wunit TYPE sbook-wunit, loccuram TYPE sbook-loccuram, loccurkey TYPE sbook-loccurkey, END OF t_sbook. DATA :it_sbook TYPE STANDARD TABLE OF t_sbook INITIAL SIZE 0, wa_sbook TYPE t_sbook. DATA :it_collect TYPE STANDARD TABLE OF t_sbook INITIAL SIZE 0, wa_collect TYPE t_sbook. DATA : fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid. DATA : t TYPE slis_t_sp_group_alv. * Selection-Screen (조회 화면) SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE text-001. SELECT-OPTIONS s_carrid FOR sbook-carrid. SELECTION-SCREEN END OF BLOCK part1. * 메인 로직 (START-OF-SELECTION) START-OF-SELECTION. PERFORM data_retrieval. PERFORM build_fieldcatalog. PERFORM build_layout. PERFORM display_alv_report. FORM build_fieldcatalog. fieldcatalog-fieldname = 'CARRID'. fieldcatalog-seltext_m = 'CARRID'. fieldcatalog-col_pos = 0. fieldcatalog-outputlen = 10. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. fieldcatalog-fieldname = 'CONNID'. fieldcatalog-seltext_m = 'CONNID'. fieldcatalog-col_pos = 1. fieldcatalog-lzero = 'X'. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. fieldcatalog-fieldname = 'LUGGWEIGHT'. fieldcatalog-seltext_m = 'LUGGWEIGHT'. fieldcatalog-col_pos = 2. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. fieldcatalog-fieldname = 'WUNIT'. fieldcatalog-seltext_m = 'WUNIT'. fieldcatalog-col_pos = 3. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. fieldcatalog-fieldname = 'LOCCURAM'. fieldcatalog-seltext_l = 'LOCCURAM'. fieldcatalog-col_pos = 4. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. fieldcatalog-fieldname = 'LOCCUKEY'. fieldcatalog-seltext_m = 'LOCCUKEY'. fieldcatalog-col_pos = 5. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. ENDFORM. " BUILD_FIELDCATALOG *&---------------------------------------------------------------------* *& Form BUILD_LAYOUT *&---------------------------------------------------------------------* * Build layout for ALV grid report *----------------------------------------------------------------------* FORM build_layout. gd_layout-no_input = 'X'. gd_layout-colwidth_optimize = 'X'. gd_layout-zebra = 'X'. * gd_layout-info_fieldname = 'LINE_COLOR'. * gd_layout-def_status = 'A'. ENDFORM. " BUILD_LAYOUT *&---------------------------------------------------------------------* *& Form DISPLAY_ALV_REPORT *&---------------------------------------------------------------------* * Display report using ALV grid *----------------------------------------------------------------------* FORM display_alv_report. gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid is_layout = gd_layout it_fieldcat = fieldcatalog[] i_save = 'X' * i_save = 'A' * i_save = 'U' TABLES t_outtab = it_collect EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " DISPLAY_ALV_REPORT *&---------------------------------------------------------------------* *& Form DATA_RETRIEVAL *&---------------------------------------------------------------------* * Retrieve data form EKPO table and populate itab it_ekko *----------------------------------------------------------------------* FORM data_retrieval. SELECT CARRID, CONNID, LUGGWEIGHT, WUNIT, LOCCURAM, LOCCURKEY FROM SBOOK INTO TABLE @it_sbook WHERE CARRID IN @s_carrid. LOOP AT it_sbook INTO wa_sbook. COLLECT wa_sbook INTO it_collect. ENDLOOP. ENDFORM. " DATA_RETRIEVAL
ABAP
복사
이 같은 AA의 데이터의 대한 집계가 돌아가면서 정리될거다
그리고 새로운 it_collect에 데이터를 넣어줘야한다.
처음에 돌면서 이렇게 넣어진다.
만약 it_sbook에 넣어주면 한 행에 쌓이고 또 돌고 ..무한 루프…
근데 출력이 뒤죽박죽 인채로 나열하면 너무 느려진다.
그래서 정렬된 상태에서 집계해주면 더 빨리진다.

sort 방식

FORM data_retrieval. SELECT CARRID, CONNID, LUGGWEIGHT, WUNIT, LOCCURAM, LOCCURKEY FROM SBOOK INTO TABLE @it_sbook WHERE CARRID IN @s_carrid. SORT it_sbook BY carrid connid. LOOP AT it_sbook INTO wa_sbook. COLLECT wa_sbook INTO it_collect. ENDLOOP. ENDFORM. " DATA_RETRIEVAL
ABAP
복사
컬럼별로 정렬도 바꿀 수 있다.
SORT it_sbook BY carrid ASCENDING connid DESCENDING.
ABAP
복사
오름차순(ASCENDING) - 생략 가능, 기본 정렬
데이터가 작은 값에서 큰 값 순서로 정렬
예: A, B, C 또는 1, 2, 3
내림차순(DESCENDING)
데이터가 큰 값에서 작은 값 순서로 정렬
예: Z, Y, X 또는 3, 2, 1

ORDER BY 방식

SELECT CARRID, CONNID, LUGGWEIGHT, WUNIT, LOCCURAM, LOCCURKEY FROM SBOOK INTO TABLE @it_sbook WHERE CARRID IN @s_carrid ORDER BY CARRID, CONNID.
ABAP
복사
셀렉트할 때 정렬이 되니까 sort보다 빠르다고 보면 된다.

SORTED TABLE OF 방식

DATA :it_sbook TYPE SORTED TABLE OF t_sbook WITH UNIQUE KEY CARRID CONNID, wa_sbook TYPE t_sbook.
ABAP
복사
테이블에 데이터를 저장할 때, 지정된 키에 따라 자동으로 정렬된다. 대신 키값을 선택해줘야 한다
UNIQUE KEY: 키 값이 고유해야 함을 의미. 고유하지 않은 값이 들어갈 경우 오류가 발생.
예를 들어, WITH UNIQUE KEY carrid connid로 선언된 경우, 동일한 carridconnid의 조합이 두 번 이상 들어갈 수 없다.
NON-UNIQUE KEY: 키 값이 중복될 수 있음을 의미. 동일한 키 값이 여러 번 들어갈 수 있다.
DATA : it_sbook TYPE SORTED TABLE OF t_sbook WITH NON-UNIQUE KEY carrid, wa_sbook TYPE t_sbook.
ABAP
복사
디버깅해주고
해당 SBOOK 테이블 가서 보면
키가 4개나 있어서 고유하지 않을 수 있다
그리고 심지어 돌리면 이미 AA 0017이 여러개의 데이터를 가지고 있음.
싱글 스탭으로 계속 넘기면
오류 발생
DATA :it_sbook TYPE SORTED TABLE OF t_sbook WITH NON-UNIQUE KEY CARRID CONNID, wa_sbook TYPE t_sbook.
ABAP
복사
NON-UNIQUE KEY로 바꿔주고 이제 잘 작동한다
속도는
SORT < ORDER BY < SORTED TABLE
순으로 성능이 좋다

SUM

COLLECT보다 더 빨리 집계하는 방법이 있다.
SUM을 사용하면 된다.
LOOP AT it_sbook INTO wa_sbook. AT END OF CONNID. SUM. APPEND wa_sbook TO it_collect. ENDAT. ENDLOOP.
ABAP
복사
continue 눌러주고
1835번으로 가보자
여기가 CONNID가 마지막으로 바뀌는 끝에서 멈춘거다.
그러고 WA_SBOOK을 보고 싱글스탭 한번 더 눌러주면

1. SUM이 더 빠른 이유

SUM은 수치형 필드만 다루며, 특정 조건이 만족되면 해당 필드를 집계한다. 반면, COLLECT는 동일한 조건을 만족하는 모든 필드를 기반으로 데이터를 집계하는 명령어로, 비교 대상이 되는 문자형 필드가 중요하다. 그리고 SUM은 정렬이 되어 있어야 한다.
예시: SUM은 END OF 이후의 필드를 마스킹 처리하기 때문에, 수치형 필드가 아닌 필드들은 집계에 포함되지 않음.

2. COLLECT의 필드 배치 고려

COLLECT는 내부 테이블에서 첫 번째부터 지정된 필드를 비교한 뒤, 동일한 필드의 수치형 값을 합산한다. 따라서, 필드 배치를 잘못하면 COLLECT가 제대로 작동하지 않을 수 있다. 비교가 필요한 문자형 필드가 뒤쪽에 있을 경우, COLLECT는 이를 무시하고 수치형 필드만 집계할 수 있기 때문.
필드 배치 예시
필드1
필드2
필드3(숫자)
A
B
10
A
B
5
A
C
15
이 경우, 필드1과 필드2가 동일하면 COLLECT는 필드3의 값을 더해 최종 결과로 15를 반환합니다. 하지만 필드1과 필드2가 뒤쪽에 위치한다면, COLLECT가 올바르게 작동하지 않을 수 있다.

3. 필드 배치 권장 사항

COLLECT를 사용할 때는 비교에 사용될 문자 필드를 테이블의 앞쪽에 배치해야 한다. 수치형 필드는 비교 대상이 아닌 집계의 대상이기 때문에, 문자형 필드가 앞에 와야 조건을 정확히 비교할 수 있다.
성능을 고려할 때는 SUM을 사용하는 것이 빠르다. 하지만 SUM은 특정 필드 조건만 집계하므로 모든 케이스에 적합하지는 않다.
COLLECT는 수치형 필드 집계를 위한 강력한 도구지만, 필드 배치가 올바르지 않으면 원하는 결과를 얻기 어려울 수 있다.
비교에 사용될 문자형 필드는 테이블의 앞쪽에 배치해야 한다.
이러한 내용을 토대로 SUMCOLLECT를 적절히 사용하고, 필드 배치에 신경을 써야 한다.
LOOP AT it_sbook INTO wa_sbook. AT END OF CARRID. SUM. APPEND wa_sbook TO it_collect. ENDAT. ENDLOOP.
ABAP
복사
CARRID로 바꾸고 디버깅을 진행해보면
오류가 발생한다
보면은 정수 5자리 소수4자리가 정해져 있는데 여길 넘는 값어가서 오류가 발생한거다.
그래서 이 필드를 넓게 설정해주면 된다
TYPES: BEGIN OF t_sbook, carrid TYPE sbook-carrid, connid TYPE sbook-connid, * luggweight TYPE sbook-luggweight, luggweight(6) TYPE P DECIMALS 4, wunit TYPE sbook-wunit, loccuram TYPE sbook-loccuram, loccurkey TYPE sbook-loccurkey, END OF t_sbook.
ABAP
복사
이제 LH 넘어가고 다른값 까지 잘 진행된다
luggweight(6) TYPE P DECIMALS 4
ABAP
복사
만약 6자리로 설정안하고 그냥 진행하면
luggweight TYPE P DECIMALS 4
ABAP
복사
어떻게 될까?
정수자릿수를 정하지 않으면 기본으로 8자리로 선언된다

테이블 읽기: READ TABLE

테이블에서 특정 조건에 맞는 행을 읽어오고 싶을 때는 READ TABLE을 사용함.
구글에서 abap read table example 라고 검색하고 첫번째 링크로 접속
PARAMETERS: p_carrid TYPE sflight-carrid, p_connid TYPE sflight-connid, p_fldate TYPE sflight-fldate. DATA sflight_tab TYPE SORTED TABLE OF sflight WITH UNIQUE KEY carrid connid fldate. SELECT * FROM sflight WHERE carrid = @p_carrid AND connid = @p_connid INTO TABLE @sflight_tab. IF sy-subrc = 0. READ TABLE sflight_tab WITH TABLE KEY carrid = p_carrid connid = p_connid fldate = p_fldate INTO DATA(sflight_wa). IF sy-subrc = 0. sflight_wa-price = sflight_wa-price * '0.9'. MODIFY sflight_tab FROM sflight_wa INDEX sy-tabix. ENDIF. ENDIF. cl_demo_output=>display( sflight_tab ).
ABAP
복사
디버깅 찍어보고
그러고 다시 싱글스탭 한번 눌러주면
IF sy-subrc = 0. READ TABLE sflight_tab WITH TABLE KEY carrid = p_carrid connid = p_connid fldate = p_fldate INTO DATA(sflight_wa). IF sy-subrc = 0. sflight_wa-price = sflight_wa-price * '0.9'. MODIFY sflight_tab FROM sflight_wa INDEX sy-tabix. ENDIF. ENDIF.
ABAP
복사
READ TABLE 구문은 내가 선언한 내부 테이블에서 데이터를 한 행씩 읽어올 때 사용된다. 주로 데이터베이스에서 데이터를 불러와서 특정 조건에 맞는 행을 찾고 작업할 때 활용한다.

구문 설명

READ TABLE 테이블명 WITH TABLE KEY 조건 INTO 변수명.
ABAP
복사
READ TABLE: 내부 테이블에서 데이터를 읽기 위한 구문이다.
테이블명: 읽고자 하는 내부 테이블의 이름을 지정한다.
WITH TABLE KEY: 테이블에서 키를 기준으로 특정 행을 찾는다.
조건: 읽고자 하는 데이터를 찾기 위해 설정하는 조건이다.
INTO: 찾은 데이터를 저장할 작업 영역 또는 변수를 지정한다.

주요 포인트

READ TABLE도 내부적으로는 SY-TABIX라는 시스템 변수를 사용한다. SY-TABIX는 읽어오고 있는 행의 번호를 나타내며, 몇 번째 행을 읽고 있는지 확인할 때 유용하다.
키가 없는 STANDARD TABLE에서는 READ TABLE 테이블 WITH KEY를 사용할 수 있다. 여기서 "키"란, 내부 테이블의 특정 필드 조합을 기준으로 데이터를 찾는 조건을 의미한다. WITH KEY 구문을 사용하여 조건을 지정해야 특정 행을 찾을 수 있다.
READ TABLE 문법은 내부 테이블에서 특정 조건에 맞는 한 행을 찾는 데 사용된다. WITH TABLE KEY는 키를 설정해서 특정 조건에 맞는 데이터를 가져오도록 한다. 예를 들어, 아래 코드는 carrid, connid, fldate를 조건으로 sflight_tab에서 데이터를 읽어온다
READ TABLE sflight_tab WITH TABLE KEY carrid = p_carrid connid = p_connid fldate = p_fldate INTO DATA(sflight_wa).
ABAP
복사
READ TABLE 구문 다음에 WITH TABLE KEY를 사용하면 여러 개의 조건을 묶어서 데이터를 찾을 수 있다.
INTO DATA()를 통해 찾은 데이터를 저장할 작업 공간을 지정한다. 여기서 sflight_wa는 로컬 변수로 선언된 것이며, 내부에서만 사용할 수 있다. 전역 변수와 달리 로컬 변수는 함수나 메소드 내부에서만 인식된다.

MOVE-CORRESPONDING

다른 구조에서 다른 구조로 옮겨 줄때 같은 필드 이름인거 끼리 옮겨준다.
구글에 abap move-corresponding example 치고
젤 하단에 두번째 링크에 들어가서 있는 예제 소스를 가져온다.
TYPES: BEGIN OF flight, carrid TYPE spfli-carrid, connid TYPE spfli-connid, cityfrom TYPE spfli-cityfrom, cityto TYPE spfli-cityto, END OF flight. DATA flights TYPE SORTED TABLE OF flight WITH UNIQUE KEY carrid connid. SELECT * FROM spfli INTO TABLE @DATA(spfli_tab). MOVE-CORRESPONDING spfli_tab TO flights. cl_demo_output=>display( flights ).
ABAP
복사

MOVE-CORRESPONDING의 사용

MOVE-CORRESPONDING은 구조가 다른 두 테이블 간에 같은 이름을 가진 필드끼리 데이터를 옮길 때 유용하다. 예를 들어, 아래 코드에서 spflitab에 있는 데이터를 flights에 같은 필드명으로 옮긴다
MOVE-CORRESPONDING spfli_tab TO flights.
ABAP
복사
이제 같은 구조에서 같은 구조로 옮겨줘보자
싱글스탭을 누르면
여기서 중요한 점은, 같은 필드명만 자동으로 옮겨지기 때문에 두 테이블 구조에 같은 이름의 필드가 있어야 한다.
다시 설명하자면 MOVE-CORRESPONDING은 두 개의 다른 구조 또는 테이블 간에 필드 이름이 같은 경우, 해당 필드끼리의 데이터를 옮길 때 사용된다. 반면, MOVE 구문은 동일한 구조 간에 전체 데이터를 옮기며, 필드의 이름과 상관없이 모든 데이터를 그대로 복사한다.

MOVE-CORRESPONDING

다른 구조에서 필드 이름이 같은 경우, 자동으로 해당 필드만 옮겨준다.
MOVE-CORRESPONDING A TO B.
ABAP
복사
이 구문은 AB가 서로 다른 구조라 하더라도, 같은 필드명을 가지는 필드의 값만 A에서 B로 이동시킨다. 이 방법은 행 단위로 이동할 때도, 테이블끼리 이동할 때도 사용할 수 있다.

MOVE

같은 구조에서 모든 필드를 동일하게 복사한다. MOVE 구문은 구조가 동일한 두 테이블이나 변수를 대상으로 한다.
MOVE A TO B.
ABAP
복사
여기서 B = A와 같은 개념으로, 모든 필드를 동일하게 복사한다. 필드, 행, 테이블을 모두 이 구문을 통해 이동시킬 수 있다.