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