본문 바로가기
ABAP/Syntax

[Syntax] LOOP AT itab - GROUP BY

by name_text 2023. 10. 16.

LOOP AT itab - GROUP BY

 

ABAP New syntax 인 Loop at Group by는 SQL의 Group by처럼 그룹단위로 데이터를 처리할 수 있습니다.

기존에 Internal Table에서 특정 필드를 기준으로 Group 처리를 위해 AT New와 같은 구문을 사용하였는데, Group by를 통해 이해하기 쉽고 간단하게 처리할 수 있습니다.

 

# 사용 예시

DATA LT_T001 TYPE STANDARD TABLE OF T001.
DATA(LO_DEMO_OUTPUT) = CL_DEMO_OUTPUT=>NEW( ).
DATA(LO_RANDOM) = CL_ABAP_RANDOM_INT=>CREATE( SEED = CONV I( SY-UZEIT ) MIN = 1000 MAX = 9999 ).

LT_T001 = VALUE #( FOR I = 0 UNTIL I > 1000000
                   ( BUKRS = LO_RANDOM->GET_NEXT( ) ) ).

DATA: LV_TIME1 TYPE I,
      LV_TIME2 TYPE I.

SELECT BUKRS, BUTXT
FROM T001
INTO TABLE @DATA(LT_TMP).
IF SY-SUBRC EQ 0.
  SORT LT_TMP BY BUKRS.
ENDIF.

DATA: LT_TMP_SORT1 TYPE STANDARD TABLE OF T001 WITH UNIQUE SORTED KEY KEY1 COMPONENTS BUKRS,
      LT_TMP_SORT2 TYPE SORTED TABLE OF T001 WITH UNIQUE KEY BUKRS.DATA: LT_BSEG TYPE STANDARD TABLE OF BSEG.

LT_BSEG = VALUE #(
                  ( BUKRS = '1000' GJAHR = '2023'  BELNR = '11111' BUZEI = '001' )
                  ( BUKRS = '1000' GJAHR = '2023'  BELNR = '11111' BUZEI = '002' )
                  ( BUKRS = '1000' GJAHR = '2023'  BELNR = '11111' BUZEI = '003' )
                  ( BUKRS = '1000' GJAHR = '2023'  BELNR = '11122' BUZEI = '001' )
                  ( BUKRS = '1100' GJAHR = '2023'  BELNR = '11022' BUZEI = '001' )
                  ( BUKRS = '1100' GJAHR = '2023'  BELNR = '11022' BUZEI = '002' )
                  ( BUKRS = '1100' GJAHR = '2023'  BELNR = '11022' BUZEI = '003' )
                  ).

LOOP AT LT_BSEG INTO DATA(LS_BSEG) GROUP BY ( BUKRS = LS_BSEG-BUKRS
                                              GJAHR = LS_BSEG-GJAHR
                                              BELNR = LS_BSEG-BELNR
                                              SIZE  = GROUP SIZE
                                              INDEX = GROUP INDEX ) ASCENDING
                                             ASSIGNING FIELD-SYMBOL(<LFS_GROUP>).

  WRITE:/ 'HEADING', <LFS_GROUP>-SIZE, <LFS_GROUP>-BUKRS, <LFS_GROUP>-BELNR, <LFS_GROUP>-GJAHR.

  LOOP AT GROUP <LFS_GROUP> ASSIGNING FIELD-SYMBOL(<LFS_ITEMS>).
    WRITE:/ 'ITEM', SPACE, SPACE, SPACE, <LFS_ITEMS>-BUZEI.
  ENDLOOP.
ENDLOOP.

댓글