ABAP Collect 사용법 및 예제

ABAP에서 COLLECT 구문은 인터널 테이블 내의 동일한 키 값을 기준으로 모든 숫자 필드 값을 SUM하는 기능을 하는데요, ABAP Collect 사용법 및 예제 등을 정리해 보도록 하겠습니다.

ABAP Collect는 각 필드 키 값을 기준으로 Sum을 아주 쉽게 구할 수 있어서 다른 언어(Language) 거의 없는 매우 편리한 기능이라 많이 자주 사용됩니다.

SAP ABAP Collect 사용법 및 예제

ABAP Collect 예제 – 기본 사용법

ABAP의 Collect 는 인터널 테이블의 숫자 필드(f, i, p)를 제외한 나머지 문자열 필드의 동일한 값을 기준으로 숫자 필드의 값을 SUM 해주는 기능을 합니다.

" ## ABAP Collect 예시
DATA LT_COLLECT TYPE STANDARD TABLE OF SFLIGHT.
DATA : LS_COLLECT TYPE SFLIGHT.

DATA : LT_APPEND TYPE STANDARD TABLE OF SFLIGHT.
DATA : LS_APPEND TYPE SFLIGHT.

SELECT *
  FROM SFLIGHT
  INTO TABLE @DATA(LT_SFLIGHT).

LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT).
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_APPEND.
    APPEND LS_APPEND TO LT_APPEND.
ENDLOOP.

LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_COLLECT.
    COLLECT LS_COLLECT INTO LT_COLLECT.
    CLEAR LS_COLLECT.
ENDLOOP.

ABAP Collect 에서 SUM이 되는 숫자 필드란?

스트럭처에 속한 필드의 자료형이 숫자 유형(f, i, p) 인 경우를 말합니다. 즉 f, i, p 자료형을 제외한 필드는 모두 키 필드로 사용됩니다.

F : Float(실수) 자료형 8Byte의 길이
I: Integer(정수) 자료형 4Byte의 길이
P: Packed Num 소수점의 갖을 수 있는 자료형 8Byte의 길이

 

ABAP Collect 와 Append 와 차이는

ABAP 에서의  APPEND와 유사한 방식이지만, APPEND는 단순히 ‘추가’이고 COLLECT 는 동일한 키를 기준으로 숫자 필드는 모두 SUM 하게 됩니다.

APPEND의 경우에는 삽입하는 인터널 테이블이 어떤 값을 갖고 있던지 상관없이 인터널 테이블 마지막에 추가하게 됩니다.

하지만, COLLECT는 단순히 탭 끝에 추가하는 대신, 먼저 인터널 테이블 내의 데이터를 체크하게 됩니다.

이후 동일한 키를 가진 항목을 기준으로 해당 열에 속한 숫자 필드 값을 SUM 하게 됩니다.

// Append
LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT).
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_APPEND.
    APPEND LS_APPEND TO LT_APPEND.
  ENDLOOP.

// Collect
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_COLLECT.
    COLLECT LS_COLLECT INTO LT_COLLECT.
    CLEAR LS_COLLECT.
ENDLOOP.

즉, 아무 행이 없거나 키필드를 기준으로 동일한 값이 없다면  COLLECT 역시 APPEND처럼 동작하지만,  키필드 기준으로 동일한 값이 이미 있으면 숫자 필드를 기준으로 SUM 되게 됩니다.

ABAP Collect 사용법 – 사용시 주의사항

Collect를 하여 담을 인터널 테이블은 키로 사용될 문자 키와 Collect가 될 숫자 필드 단일 필드 형태로 이루어져야 합니다.

예를 들면 인터널 테이블에 구조 필드(Nested Structure) 등이 있을 때에는 오류가 발생합니다.

DATA : BEGIN OF LS_DATA.
    INCLUDE STRUCTURE SFLIGHT. " It's Okay!
DATA :   F_COL TYPE LVC_T_SCOL. " ★★← 구조체가 들어 있으므로 Collect 키로 사용될 수 없음
DATA : END OF LS_DATA.
DATA : LT_DATA LIKE TABLE OF LS_DATA.
LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_DATA.
    COLLECT LS_DATA INTO LT_DATA.
ENDLOOP.

COLLECT 의 키값이 되기 위해서는 STRUCTURE 형태는 오류가 난다

 

또 빈 인터널 테이블에 넣을 때에는 상관없지만, 이미 데이터가 들어가 있는 테이블에 추가로 ABAP Collect를 할 때에는 먼저 키를 기준으로 Sort하는 것이 좋습니다.

ABAP Collect 시 기준 키 값의 선정

어떤 문자 키값을 기준으로 Collect 할 지를 결정하는 것이 중요하기 때문에, 만약 3개의 필드 중 2개의 기준으로만 Collect 하고자 한다면 빼고자 하는 키에는 initial 값을 넣어주는 것으로 간단히 해결할 수 있습니다.

LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
    MOVE-CORRESPONDING LS_SFLIGHT TO LS_COLLECT.
    " CONNID나 FLDATE 기준은 제외하고 CARRID 키 값만을 기준으로 COLLECT 하도록 할 때
    "PAYMENTSUM 등을 COLLECT로 SUM
    LS_COLLECT-CONNID = ''.
    CLEAR : LS_COLLECT-FLDATE.
    COLLECT LS_COLLECT INTO LT_COLLECT.
    CLEAR LS_COLLECT.
ENDLOOP.

아래의 경우는 문자열 형태의 키이므로 SPACE나 CLEAR 모두 처리가 가능합니다.

" CONNID나 FLDATE 기준은 제외하고 CARRID 키 값만을 기준으로 COLLECT 하도록 할 때
"PAYMENTSUM 등을 COLLECT로 SUM
LS_COLLECT-CONNID = ''.
CLEAR : LS_COLLECT-FLDATE.

Collect 할 키 값으로 이루어진 인터널 테이블을 만드는 것도 좋습니다.

하지만 이미 사용한 구조의 인터널 테이블을 활용하여 Collect를 해야 한다면 위와 같은 방법이 유용하리라 생각됩니다.

 

이상으로 SAP ABAP Collect 에 대해서 알아보았습니다. ABAP Collect 명령어는 잘 쓰면 매우 유용한 키워드이니 잘 활용해 보시기 바랍니다.

더 자세한 사항은 SAP 공식 Document를 ABAP Collect 문서를 참고해 보시기 바랍니다.

함께 보면 좋은 글

ABAP READ TABLE 사용법 및 예제 정리