ABAP ALV에서 소계(Sub Total) 및 합계(Total Sum)를 표시하는 방법(소스설명)


SAP에서 ABAP으로 프로그램을 개발할 때 ALV 리포트를 개발하는 경우가 많이 있습니다.

ALV는 ABAP List Viewer의 약자로 Report 프로그램에서 데이터를 조회하거나 조회한 데이트를 다양한 형태로 가공해서 사용하기 위해 많이 사용됩니다.
특별한 프로그램 소스 코딩 없이 ALV 기능을 사용하면 데이터를 정렬하거나, 레이아웃을 변경하거나, 다양한 확장자로 파일 내려받기를 하거나, 더블 클릭 이벤트로 추가 작업을 진행할 수 있습니다.

ALV로 Report 프로그램을 개발할 때 그룹 별 소계(Sub Total)와 전체 합계(Total Sum)를 표시해야 할 때가 있습니다.

이번 글에서는 간단하게 ABAP ALV에서 소계(Sub Total) 및 합계(Total Sum)를 표시하는 방법(소스설명)에 대해 알아보겠습니다.

ABAP ALV에서 소계(Sub Total) 및 합계(Total Sum)를 표시 실행 화면

▼ 아래 화면은 ALV로 구현된 소계와 합계가 표시되는 ABAP 프로그램 실행 결과 화면입니다.

  • 팀별 소계, 월별 소계, 전체 합계가 모두 표시되고 있습니다.
ABAP ALV에서 소계(Sub Total) 및 합계(Total Sum)를 표시하는 방법(소스설명)

ALV에서 소계(Sub Total)과 총합계(Total Sum)을 표시하는 ABAP Source

▼ 실제 ABAP 프로그램 Source 입니다.

  • 월(月), 팀(Team), 성별(F,M), 금액으로 구성된 간단한 리포트를 출력하는 프로그램입니다.
  • 1차로 성별 소계, 2차로 팀별 소계, 최종 월별 소계를 표시합니다.
  • 마지막에 전체 합계를 표기합니다.
  • 프로그램 소스에 빨간색으로 강조한 부분을 잘 확인해서 작업하시면 됩니다.
*- ALV SubTotal 표시하기 —————————————-*
REPORT  YMM0001.
TABLES SYST.
 
* ALV GRID ——————————————————
TYPE-POOLS : SLIS.
 
DATA: FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      FIELDCAT_LN LIKE LINE OF FIELDCAT.
 
DATA: SORTCAT TYPE SLIS_T_SORTINFO_ALV,
      SORTCAT_LN LIKE LINE OF SORTCAT.
 
DATA: EVENTCAT TYPE SLIS_T_EVENT,
      EVENTCAT_LN LIKE LINE OF EVENTCAT.
 
DATA : ALV_VARIANT   LIKE DISVARIANT,
       GS_VARIANT   LIKE DISVARIANT,
       GS_CS_VARIANT   LIKE DISVARIANT.
 
DATA: BEGIN OF IT_LIST OCCURS 0,
              MONTH(10),
              TEAM(10),
              SEX(10),
              AMOUNT TYPE I,
          END OF IT_LIST.
 
*——- SELECTION-SCREEN —————————————
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-T01.
SELECT-OPTIONS: SO_DATE FOR SYST-DATUM.
SELECTION-SCREEN END OF BLOCK B1.
 
*——- INITIALIZATION —————————————–
INITIALIZATION.
  SO_DATE-LOW = SY-DATUM.
  APPEND SO_DATE.
 
*—————————————————————-*
*     END-OF-SELECTION 
*—————————————————————-*
END-OF-SELECTION.
 
  PERFORM P100_SELECT_PART.      ” 출력할 자료를 만들기
  PERFORM P200_BUILD_FIELDCAT.   ” ALV 필드에 대한 정의
  PERFORM P300_BUILD_SORTCAT.    ” 정렬할 순서, 방식 및 소계 정의
  PERFORM P500_ALV_WRITE.        ” ALV 레포트를 화면에 출력
 
*&—————————————————————*
*&      Form  P100_SELECT_PART
*&—————————————————————*
FORM P100_SELECT_PART .
 
  CLEAR IT_LIST. REFRESH IT_LIST.
 
   SELECT month team sex amount
        INTO TABLE it_list
        FROM ztest
        WHERE zdate IN so_date.
 
ENDFORM.                    ” P100_SELECT_PART
 
*&—————————————————————*
*&      Form  P200_BUILD_FIELDCAT
*&—————————————————————*
FORM P200_BUILD_FIELDCAT .
  DATA: L_POS TYPE I VALUE 0.
 
  L_POS = L_POS + 1.
  CLEAR FIELDCAT_LN.
  FIELDCAT_LN-COL_POS = L_POS.
  FIELDCAT_LN-FIELDNAME = ‘MONTH’.
  FIELDCAT_LN-REPTEXT_DDIC = ‘Month’.
  FIELDCAT_LN-KEY = ‘X’.
  FIELDCAT_LN-OUTPUTLEN = 10.
  APPEND FIELDCAT_LN TO FIELDCAT.
 
  L_POS = L_POS + 1.
  CLEAR FIELDCAT_LN.
  FIELDCAT_LN-COL_POS = L_POS.
  FIELDCAT_LN-FIELDNAME = ‘TEAM’.
  FIELDCAT_LN-REPTEXT_DDIC = ‘Team’.
  FIELDCAT_LN-KEY = ‘X’.
  FIELDCAT_LN-OUTPUTLEN = 10.
  APPEND FIELDCAT_LN TO FIELDCAT.
 
  L_POS = L_POS + 1.
  CLEAR FIELDCAT_LN.
  FIELDCAT_LN-COL_POS = L_POS.
  FIELDCAT_LN-FIELDNAME = ‘SEX’.
  FIELDCAT_LN-REPTEXT_DDIC = ‘Sex’.
  FIELDCAT_LN-KEY = ‘X’.
  FIELDCAT_LN-OUTPUTLEN = 10.
  APPEND FIELDCAT_LN TO FIELDCAT.
 
  L_POS = L_POS + 1.
  CLEAR FIELDCAT_LN.
  FIELDCAT_LN-COL_POS = L_POS.
  FIELDCAT_LN-FIELDNAME = ‘AMOUNT’.
  FIELDCAT_LN-REPTEXT_DDIC = ‘Amount’.
  FIELDCAT_LN-OUTPUTLEN = 15.
  FIELDCAT_LN-DO_SUM = ‘X’.      ” 합계를 표시함
                                 ” DO_SUM = ‘X’로 설정해야 소계도 표시됨
  APPEND FIELDCAT_LN TO FIELDCAT.
 
ENDFORM.                    ” P200_BUILD_FIELDCAT
 
*&—————————————————————*
*&      Form  P300_BUILD_SORTCAT
*&—————————————————————*
FORM P300_BUILD_SORTCAT .
 
  SORTCAT_LN-SPOS = ‘1’.           ” 정렬한 순서
  SORTCAT_LN-FIELDNAME = ‘MONTH’.  ” 정렬할 필드
  SORTCAT_LN-UP = ‘X’.             “오름차순 정렬
  SORTCAT_LN-DOWN = SPACE.
  SORTCAT_LN-SUBTOT = ‘X’.         ” 소계를 표시함
  APPEND SORTCAT_LN TO SORTCAT.
 
  SORTCAT_LN-SPOS = ‘2’.
  SORTCAT_LN-FIELDNAME = ‘TEAM’.
  SORTCAT_LN-UP = ‘X’.
  SORTCAT_LN-DOWN = SPACE.
  SORTCAT_LN-SUBTOT = ‘X’.
  APPEND SORTCAT_LN TO SORTCAT.
 
ENDFORM.                    ” P300_BUILD_SORTCAT
 
*&—————————————————————*
*&      Form  P500_ALV_WRITE
*&—————————————————————*
FORM P500_ALV_WRITE .
 
  DATA: PGM LIKE SY-REPID.
  PGM = SY-REPID.
  ALV_VARIANT-VARIANT = PGM.
 
  CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
    EXPORTING
      I_CALLBACK_PROGRAM      = PGM
      I_CALLBACK_USER_COMMAND = ‘USER_COMMAND’
      IT_FIELDCAT             = FIELDCAT
      IT_SORT                 = SORTCAT
      I_SAVE                  = ‘U’
      IT_EVENTS               = EVENTCAT
      IS_VARIANT              = ALV_VARIANT
    TABLES
      T_OUTTAB                = IT_LIST
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.
 
ENDFORM.                    ” P500_ALV_WRITE
 
*&—————————————————————*
*&      Form  USER_COMMAND (ALV에서 적용될 명령어를 정의할 수 있다)
*&—————————————————————*
FORM USER_COMMAND USING R_UCOMM TYPE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.
 
  CASE R_UCOMM.
    WHEN ‘&IC1’.    “Double Click EVENT
  ENDCASE.
 
ENDFORM.                    “USER_COMMAND

마무리

ABAP ALV 리포트에서 Sub Total 및 Total Sum을 기본적으로 표시해 주어야 할 내용입니다.
앞의 예제 프로그램 소스를 통해 정말 쉽게 Total을 표현할 수 있음을 알 수 있습니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기