SAP에서 ABAP 리포트를 개발할 때 ALV 리포트를 많이 만들게 됩니다.
ALV 리포트를 만들 때 헤더(Header)의 필드 제목은 한 줄로 표시되는 것이 일반적입니다.
하지만 표시해야 할 필드의 제목이 길거나 그룹으로 나누어 대분류, 소분류 형식으로 출력해야 하는 경우 필드 제목을 두 줄 이상 출력해야 하는 상황이 생기게 됩니다.
ALV Layout의 기본 Heading 출력을 사용하지 않고, TOP_OF_PAGE에서 WRITE문으로 Heading 부분을 만들어 주는 방식으로 구현할 수 있습니다.
단, 이렇게 했을때는 ALV 기본 기능중에 열(Column)로 처리하는 작업을 할 수 없게 됩니다. (예, 열(Column)의 정렬, 합계 표시하기 등)
이번 글에서는 ABAP ALV의 헤더 제목을 여러 줄(Multi Line)로 출력하는 방법에 대해 알아보겠습니다.
ALV 리포트의 헤더 제목이 여러 라인으로 출력 된 결과 미리보기
▼ 아래 화면은 ‘연도’라는 대분류에 ‘월’이라는 소분류로 나누고, 각 월마다 ‘수량’과 ‘금액’을 출력하는 리포트 입니다.
‘수량’과 ‘금액’의 필드 제목도 두 줄로 출력 되도록 하였습니다.

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 이벤트의 실행이 이루어 집니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^