ABAP ALV의 헤더 제목을 여러 줄(Multi Line)로 출력하는 방법


SAP에서 ABAP 리포트를 개발할 때 ALV 리포트를 많이 만들게 됩니다.

ALV 리포트를 만들 때 헤더(Header)의 필드 제목은 한 줄로 표시되는 것이 일반적입니다.
하지만 표시해야 할 필드의 제목이 길거나 그룹으로 나누어 대분류, 소분류 형식으로 출력해야 하는 경우 필드 제목을 두 줄 이상 출력해야 하는 상황이 생기게 됩니다.

ALV Layout의 기본 Heading 출력을 사용하지 않고, TOP_OF_PAGE에서 WRITE문으로 Heading 부분을 만들어 주는 방식으로 구현할 수 있습니다.

단, 이렇게 했을때는 ALV 기본 기능중에 열(Column)로 처리하는 작업을 할 수 없게 됩니다. (예, 열(Column)의 정렬, 합계 표시하기 등)

이번 글에서는 ABAP ALV의 헤더 제목을 여러 줄(Multi Line)로 출력하는 방법에 대해 알아보겠습니다.

ALV 리포트의 헤더 제목이 여러 라인으로 출력 된 결과 미리보기

▼ 아래 화면은 ‘연도’라는 대분류에 ‘월’이라는 소분류로 나누고, 각 월마다 ‘수량’과 ‘금액’을 출력하는 리포트 입니다.
‘수량’과 ‘금액’의 필드 제목도 두 줄로 출력 되도록 하였습니다.

ABAP ALV의 헤더 제목을 여러 줄(Multi Line)로 출력하는 방법

ALV Grid에서 제목 타이틀을 여러 줄로 출력하는 ABAP Source

▼ ALV Grid의 헤더 타이틀을 여러 라인으로 출력하는 ABAP의 예제 소스입니다.

PROGRAM ymm0001.
 
TYPE-POOLS: slis, icon.
 
DATA: ld_fieldcat  TYPE  slis_fieldcat_alv.
DATA: t_alv_fieldcat      TYPE slis_t_fieldcat_alv WITH HEADER LINE,
          alv_layout TYPE slis_layout_alv .
DATA : it_fld TYPE slis_t_fieldcat_alv ,
       it_evt TYPE slis_t_event ,
       wa_fld TYPE slis_fieldcat_alv ,
       wa_evt TYPE slis_alv_event ,
       wa_lay TYPE slis_layout_alv .
 
DATA: BEGIN OF itab OCCURS 0,
             b1qty(10) TYPE p DECIMALS 0,
             b1amt(10) TYPE p DECIMALS 0,
             b2qty(10) TYPE p DECIMALS 0,
             b2amt(10) TYPE p DECIMALS 0,
             b3qty(10) TYPE p DECIMALS 0,
             b3amt(10) TYPE p DECIMALS 0,
             c1qty(10) TYPE p DECIMALS 0,
             c1amt(10) TYPE p DECIMALS 0,
             c2qty(10) TYPE p DECIMALS 0,
             c2amt(10) TYPE p DECIMALS 0,
             c3qty(10) TYPE p DECIMALS 0,
             c3amt(10) TYPE p DECIMALS 0,
      END OF itab.
 
START-OF-SELECTION.
 
 
 
* 예제로 사용하기 위해 인터널테이블 채움
  itab-b1qty = 40.
  itab-b1amt = 3900.
  itab-b2qty = 43.
  itab-b2amt = 3200.
  itab-b3qty = 12.
  itab-b3amt = 1300.
  itab-c1qty = 23.
  itab-c1amt = 2830.
  itab-c2qty = 42.
  itab-c2amt = 3600.
  itab-c3qty = 64.
  itab-c3amt = 7900.
  APPEND itab. CLEAR itab.
 
  itab-b1qty = 44.
  itab-b1amt = 4900.
  itab-b2qty = 33.
  itab-b2amt = 3000.
  itab-b3qty = 25.
  itab-b3amt = 2300.
  itab-c1qty = 52.
  itab-c1amt = 8530.
  itab-c2qty = 42.
  itab-c2amt = 3600.
  itab-c3qty = 34.
  itab-c3amt = 2450.
  APPEND itab. CLEAR itab.
 
  itab-b1qty = 20.
  itab-b1amt = 3000.
  itab-b2qty = 61.
  itab-b2amt = 7500.
  itab-b3qty = 32.
  itab-b3amt = 4300.
  itab-c1qty = 23.
  itab-c1amt = 2830.
  itab-c2qty = 52.
  itab-c2amt = 5600.
  itab-c3qty = 44.
  itab-c3amt = 5900.
  APPEND itab. CLEAR itab.
 
 
  CALL FUNCTION ‘REUSE_ALV_EVENTS_GET’
    IMPORTING
      et_events = it_evt.
 
  READ TABLE it_evt INTO wa_evt
       WITH KEY name = slis_ev_after_line_output .
 
  wa_evt-form = slis_ev_after_line_output .
  MODIFY it_evt FROM wa_evt INDEX sy-tabix .
 
  READ TABLE it_evt INTO wa_evt
       WITH KEY name = slis_ev_top_of_page .
 
  wa_evt-form = slis_ev_top_of_page .
  MODIFY it_evt FROM wa_evt INDEX sy-tabix .
 
* 필드 정의
  CLEAR: ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B1QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B1AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B2QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B2AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B3QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘B3AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR: ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C1QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C1AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C2QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C2AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C3QTY’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
  ld_fieldcat-tabname       = ‘ITAB’.
  ld_fieldcat-fieldname     = ‘C3AMT’.
  ld_fieldcat-outputlen     = ’10’.
  APPEND ld_fieldcat TO t_alv_fieldcat.
  CLEAR ld_fieldcat.
 
 
  alv_layout-no_colhead = ‘X’ .   ” ALV 기본 Heading을 출력하지 않음
 
  CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’
    EXPORTING
      is_layout          = alv_layout
      i_bypassing_buffer = ‘X’
      i_callback_program = sy-repid
      it_fieldcat        = t_alv_fieldcat[]
      it_events          = it_evt
      i_save             = ‘A’
    TABLES
      t_outtab           = itab. “internal table
 
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
*&———————————————————————*
*&      Form  top_of_page
*&———————————————————————*
*       ALV의 Heading 부분을 직접 WRITE문으로 만들어 줌
*———————————————————————-*
FORM top_of_page .
 
  “Uline for creating a horizontal line
  ULINE AT 1(133) .
 
  “Format color for header background
  FORMAT COLOR 7 .
 
  WRITE: / sy-vline , 32 ‘2021년’.
  WRITE: 67 sy-vline, 98 ‘2022년’, 133 sy-vline.
 
  WRITE: / sy-vline , 11 ‘1월’ ,23 sy-vline, 33 ‘2월’,45 sy-vline, 55 ‘3월’,
           67 sy-vline, 77 ‘1월 ‘, 89 sy-vline, 99 ‘2월’, 111 sy-vline, 121 ‘3월’, 133 sy-vline.
  ULINE.
 
  FORMAT COLOR 3 .
 
  WRITE: / sy-vline , 5 ‘집계’ ,12 sy-vline, 17 ‘집계’,23 sy-vline, 27 ‘집계’, 34 sy-vline ,
           38 ‘집계’ ,45 sy-vline, 49 ‘집계’,56 sy-vline, 60 ‘집계’, 67 sy-vline,
           71 ‘집계 ‘, 78 sy-vline, 82 ‘집계’, 89 sy-vline, 93 ‘집계’, 100 sy-vline,
           104 ‘집계 ‘, 111 sy-vline, 115 ‘집계’, 122 sy-vline, 126 ‘집계’, 133 sy-vline.
  WRITE: / sy-vline , 5 ‘수량’ ,12 sy-vline, 17 ‘금액’,23 sy-vline, 27 ‘수량’, 34 sy-vline ,
           38 ‘금액’ ,45 sy-vline, 49 ‘수량’,56 sy-vline, 60 ‘금액’, 67 sy-vline,
           71 ‘수량 ‘, 78 sy-vline, 82 ‘금액’, 89 sy-vline, 93 ‘수량’, 100 sy-vline,
           104 ‘금액 ‘, 111 sy-vline, 115 ‘수량’, 122 sy-vline, 126 ‘금액’, 133 sy-vline.
 
 
ENDFORM.                    “top_of_page
 
 

※ ALV 기본 Heading을 출력하지 않게 설정(alv_layout-no_colhead = ‘X’.)함으로 해서 TOP_OF_PAGE 이벤트의 실행이 이루어 집니다.





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


답글 남기기