ASAP

[ABAP] LOOP AT GROUP BY 사용법 + 예제 본문

SAP(ABAP)/문법

[ABAP] LOOP AT GROUP BY 사용법 + 예제

에이SAP 2023. 3. 7. 17:52
728x90

loop at group by는 인터널 테이블의 특정 키필드를 기준으로 그룹화하여 loop를 실행하는 기능입니다. loop는 두 단계로 실행됩니다.

  • Group: group by 조건에 의해 생성된 그룹에 대해 loop를 실행합니다.
  • Group Loop: 각 그룹의 행에 접근하기 위해 그룹 내에서 loop를 실행합니다.

예를 들어, 다음과 같은 인터널 테이블이 있다고 가정해 보겠습니다.

TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
         fldate TYPE sflight-fldate,
       END OF ty_sflight.

DATA: it_sflight TYPE STANDARD TABLE OF ty_sflight WITH EMPTY KEY.

SELECT carrid, connid, fldate FROM sflight INTO TABLE @it_sflight UP TO 100 ROWS.

이 인터널 테이블을 carrid 필드로 그룹화하고 각 그룹의 행 수와 첫 번째 행의 날짜를 출력하려면 다음과 같은 코드를 사용할 수 있습니다.

 

LOOP AT it_sflight INTO DATA(wa) GROUP BY wa-carrid ASCENDING ASSIGNING FIELD-SYMBOL(<group>).
  WRITE / |Group { <group>-key } has { lines( <group>-table ) } rows|.
  LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<row>).
    WRITE / |First row date is { <row>-fldate }|.
    EXIT. "only print first row
  ENDLOOP.
ENDLOOP.

결과는 다음과 같습니다.

Group AA has 12 rows
First row date is 1997-01-03
Group AB has 11 rows
First row date is 1997-01-03
Group AZ has 11 rows
First row date is 1997-01-03
...

loop at group by는 reduce 연산자와 함께 사용하여 인터널 테이블의 집계나 변환을 쉽게 할 수 있습니다. 예를 들어, 위의 예제에서 각 그룹의 평균 날짜를 구하려면 다음과 같은 코드를 사용할 수 있습니다.

DATA(avg_dates) = VALUE string_table( ).

LOOP AT it_sflight INTO DATA(wa) GROUP BY wa-carrid ASCENDING ASSIGNING FIELD-SYMBOL(<group>).
  DATA(avg_date) = REDUCE dat( INIT x = sy-datum FOR <row> IN GROUP <group> NEXT x = x + <row>-fldate / lines( <group>-table ) ).
  avg_dates = VALUE #( BASE avg_dates ( |{ avg_date DATE = ENVIRONMENT }| ) ).
ENDLOOP.

WRITE / |Average dates per group: { avg_dates }|.

결과는 다음과 같습니다.

Average dates per group: [1997-01-04][1997-01-04][1997-01-04]...
728x90