조회용 1회성 리포트를 만들 때 매번 CL_GUI_ALV_GRID 인스턴스 + Container + 이벤트 핸들러 클래스를 풀로 짜는 건 과합니다. 단순히 “테이블 데이터를 그리드로 한 번 보여주고 끝” 인 케이스라면 SAP 표준 FM 한 줄 호출만으로 충분 — 그게 REUSE_ALV_GRID_DISPLAY.
이 FM 의 진짜 가치는 헤더 영역(TOP-OF-PAGE) 을 간단히 붙일 수 있다는 점. 리포트 상단에 “회사명 · 조회 조건 · 사용자 · 조회 시각” 같은 정보를 출력하고 싶은데 PBO 모듈/컨테이너 분할까지 가는 건 무거우니, slis_t_listheader 테이블 + slis_t_event 등록 + REUSE_ALV_COMMENTARY_WRITE 한 FORM 으로 깔끔하게 해결.
이 글에서는 REUSE_ALV_GRID_DISPLAY 의 가장 기본적인 호출 흐름과, 그 위에 TOP-OF-PAGE 헤더(H/S/A 3종 라인) 를 얹는 5단계 패턴을 정리합니다. 데이터는 SAP 표준 비행기 예제 테이블 SFLIGHT 를 사용 — 회사 도메인에 영향 없이 그대로 복붙해 SE38 에서 동작 확인 가능.
핵심 — 간단 ALV + TOP-OF-PAGE 5단계
| 단계 | 작업 | 핵심 키워드 |
|---|---|---|
| 1 | 변수 선언 — header / event / 데이터 테이블 | slis_t_listheader + slis_t_event |
| 2 | it_header 채우기 — H/S/A 3종 라인 | typ = 'H'/'S'/'A' + key / info |
| 3 | it_event 에 TOP_OF_PAGE → FORM 매핑 | name = 'TOP_OF_PAGE' + form = 'TOP_LINE' |
| 4 | REUSE_ALV_GRID_DISPLAY 호출 | i_structure_name + i_callback_program = sy-repid + it_events |
| 5 | FORM TOP_LINE 정의 + COMMENTARY_WRITE | REUSE_ALV_COMMENTARY_WRITE + it_list_commentary = it_header |
기본 그림은 단순 — “TOP-OF-PAGE 헤더 텍스트 3종을 테이블에 미리 채워두고, 이벤트로 FORM 한 번 등록한 뒤, 데이터 ALV 표시 호출 한 줄”. 객체 ALV 의 PBO/Container 복잡함 없이 5분 안에 끝납니다.
1단계 — 변수 선언
REUSE_ALV_GRID_DISPLAY 가 받는 표준 타입 두 개 + 데이터 테이블.
DATA: it_header TYPE slis_t_listheader, " TOP-OF-PAGE 헤더 라인 테이블
lv_comment LIKE LINE OF it_header, " 헤더 라인 한 줄 (작업용)
it_flight LIKE TABLE OF sflight, " 출력 데이터 테이블
it_event TYPE slis_t_event, " 이벤트 등록 테이블
lv_event LIKE LINE OF it_event. " 이벤트 한 줄 (작업용)
| 타입 | 의미 |
|---|---|
slis_t_listheader |
헤더 라인 테이블. 한 라인 = typ(H/S/A) + key + info |
slis_t_event |
ALV 이벤트 등록 테이블. name(예: TOP_OF_PAGE) → form(호출할 FORM 이름) |
2단계 — it_header 채우기 (H/S/A 3종 라인)
리스트 헤더 라인은 3가지 타입이 있고, 각 타입별로 화면에 표시되는 스타일이 다릅니다.
| typ | 의미 | 화면 스타일 |
|---|---|---|
| H | Header — 큰 제목 | 굵은 큰 글씨 (보고서 메인 제목용) |
| S | Selection — 라벨 + 값 | 두 칸 형태 (왼쪽 라벨 굵게 + 오른쪽 값) — 조회 조건 표시용 |
| A | Action — 일반 텍스트 | 일반 한 줄 텍스트 (이탤릭 / 작은 글씨) — 부가 설명용 |
코드:
START-OF-SELECTION.
* H — HEADER: 큰 제목
lv_comment-typ = 'H'.
lv_comment-key = 'COM_KEY1'.
lv_comment-info = 'Header text'.
APPEND lv_comment TO it_header.
* S — SELECTION: 라벨 + 값
lv_comment-typ = 'S'.
lv_comment-key = 'COM_KEY2'.
lv_comment-info = 'SELECT TEXT'.
APPEND lv_comment TO it_header.
* A — ACTION: 부가 설명
lv_comment-typ = 'A'.
lv_comment-key = 'COM_KEY3'.
lv_comment-info = 'Action text'.
APPEND lv_comment TO it_header.
핵심 — key 는 S(Selection) 타입에서 라벨로 표시되고, info 가 값. H/A 는 key 가 표시 안 되고 info 만 보임.
실전에서 자주 쓰는 헤더 패턴
" 회사명 + 리포트 제목
lv_comment-typ = 'H'.
lv_comment-info = '구매오더 미입고 현황'.
APPEND lv_comment TO it_header.
" 조회 조건 (S 타입)
lv_comment-typ = 'S'.
lv_comment-key = '회사코드'.
lv_comment-info = '1000'.
APPEND lv_comment TO it_header.
lv_comment-typ = 'S'.
lv_comment-key = '조회기간'.
lv_comment-info = |{ p_dat_fr DATE = USER } ~ { p_dat_to DATE = USER }|.
APPEND lv_comment TO it_header.
" 사용자 / 출력 시각
lv_comment-typ = 'A'.
lv_comment-info = |출력자 { sy-uname } { sy-datum DATE = USER } { sy-uzeit TIME = USER }|.
APPEND lv_comment TO it_header.
회사명·조회조건·출력 메타정보 셋을 H → S → A 순서로 쌓으면 표준 리포트 헤더 모양이 그대로 나옵니다.
3단계 — TOP_OF_PAGE 이벤트 등록
ALV 가 화면을 그릴 때 TOP_OF_PAGE 이벤트가 발생합니다. 그 이벤트를 어떤 FORM 으로 받을지 미리 등록.
lv_event-name = 'TOP_OF_PAGE'. " ALV 표준 이벤트 이름
lv_event-form = 'TOP_LINE'. " 호출할 FORM 이름 (자유 명명)
APPEND lv_event TO it_event.
CLEAR lv_event.
name 은 SAP 표준 이벤트 이름이라 정확히 'TOP_OF_PAGE' 로 적어야 합니다(오타 시 호출 X). form 은 우리가 정의할 FORM 이름이라 자유로 — 다만 5단계에서 동일한 이름으로 FORM 을 만들어야 함.
자주 쓰는 다른 이벤트도 같은 방식.
| 이벤트 이름 | 시점 |
|---|---|
TOP_OF_PAGE |
ALV 그리드 상단 영역을 그릴 때 |
USER_COMMAND |
사용자가 도구 모음 버튼 클릭 시 |
END_OF_LIST |
ALV 그리드 하단 영역을 그릴 때 |
PF_STATUS_SET |
PF-Status 변경 시점에 호출 — 사용자 정의 메뉴 추가용 |
4단계 — REUSE_ALV_GRID_DISPLAY 호출
ALV 표시 메인 FM. 핵심 파라미터 4개만 채우면 끝.
SELECT *
INTO TABLE it_flight
FROM sflight
UP TO 50 ROWS.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_structure_name = 'SFLIGHT' " 출력 테이블의 구조체 이름 (DDIC)
i_callback_program = sy-repid " FORM 이 정의된 프로그램 (자기 자신)
it_events = it_event " 이벤트 등록 테이블
TABLES
t_outtab = it_flight " 실제 출력 데이터
EXCEPTIONS
program_error = 1
OTHERS = 2.
핵심 파라미터:
| 파라미터 | 역할 |
|---|---|
i_structure_name |
DDIC 구조체 이름. ALV 가 컬럼/라벨/타입을 자동 인식. CBO 구조체도 OK |
i_callback_program |
FORM TOP_LINE 이 정의된 프로그램 이름. 자기 자신이면 sy-repid |
it_events |
3단계에서 만든 이벤트 등록 테이블 |
t_outtab |
실제 출력 데이터 (TABLES 파라미터) |
i_structure_name 만 넘기면 Field Catalog 가 자동 생성됩니다. 컬럼 라벨/위치/타입 커스터마이징이 필요하면 별도로 it_fieldcat 을 채워 넘기면 됨.
5단계 — FORM TOP_LINE 정의 + COMMENTARY_WRITE
ALV 가 TOP_OF_PAGE 이벤트 시점에 호출하는 FORM. 그 안에서 REUSE_ALV_COMMENTARY_WRITE 가 헤더 영역을 실제로 그립니다.
FORM top_line.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = it_header " 2단계에서 채운 헤더 라인 테이블
i_logo = 'WRITE_TOP_OF_PAGE' " 로고 이미지 (OAOR 에 등록된 이름)
i_end_of_list_grid = it_flight. " 끝줄에 그리드 합계 보여줄 데이터
ENDFORM.
핵심 파라미터:
| 파라미터 | 의미 |
|---|---|
it_list_commentary |
2단계의 it_header 그대로 |
i_logo |
OAOR 에 등록된 로고 이미지 이름 (선택). 없으면 생략 가능 |
i_end_of_list_grid |
출력 데이터 (선택). 일부 환경에서 합계 표시용 |
i_logo 는 회사 로고 이미지를 OAOR(또는 SE78) 에 미리 등록해두고 그 이름을 적어주면 헤더 우측에 표시됩니다. 운영기에 로고가 없거나 그냥 텍스트만 깔끔히 보여주고 싶으면 i_logo 파라미터를 통째 생략.
결과 화면 예시
위 5단계를 마치면 ALV 가 다음과 같은 모양으로 화면에 표시됩니다.
┌─────────────────────────────────────────────────────────────┐
│ Header text │ ← H 타입 (큰 제목)
│ │
│ COM_KEY2 SELECT TEXT │ ← S 타입 (라벨 + 값)
│ │
│ Action text │ ← A 타입 (일반 텍스트)
├─────────────────────────────────────────────────────────────┤
│ ID │ No. │ Flight Date │ 가격 │ 통화 │ Plane Type │ ... │ ← Field Catalog 자동 인식
│ AA │ 17 │ 2024.01.25 │ 422.94 │ USD │ 747-400 │ ... │
│ AA │ 17 │ 2024.02.26 │ 422.94 │ USD │ 747-400 │ ... │
│ AA │ 17 │ 2024.03.29 │ 422.94 │ USD │ 747-400 │ ... │
│ ... │
└─────────────────────────────────────────────────────────────┘
표준 ALV 도구 모음(필터·정렬·합계·엑셀 다운로드) 도 자동으로 같이 표시되므로, 사용자는 별도 조작 없이 모든 기본 기능을 사용 가능. 회사 리포트의 90% 시나리오가 이 패턴 한 번이면 끝납니다.
REUSE_ALV_GRID_DISPLAY vs 다른 ALV
ALV 종류별 사용 시점 비교.
| 방식 | 난이도 | 적합한 시나리오 |
|---|---|---|
| REUSE_ALV_GRID_DISPLAY (FM) | 매우 쉬움 | 조회 전용 1회성 리포트 · TOP-OF-PAGE 헤더만 필요 · 빠른 프로토타입 |
| CL_SALV_TABLE (객체) | 쉬움 | 현대 표준. 헤더 영역도 GET_HEADER 로 깔끔. 신규 리포트 우선 |
| CL_GUI_ALV_GRID (전통적 객체) | 어려움 | 편집 가능 그리드 · 다중 그리드 · 복잡한 이벤트 처리 |
신규 개발에서는 CL_SALV_TABLE 우선, 빠르게 한 번 보여주는 정도라면 REUSE_ALV_GRID_DISPLAY. 편집 ALV 필요한 경우만 CL_GUI_ALV_GRID 로 가는 게 일반적인 선택 흐름.
자주 빠뜨리는 함정
- i_callback_program 누락 — FORM TOP_LINE 이 같은 프로그램에 있는데 i_callback_program 을 안 넘기면 ALV 가 FORM 을 못 찾아서 헤더 자체가 안 보임. 거의 항상
sy-repid로 설정 - 이벤트 이름 오타 — 'TOP_OF_PAGE' 가 표준이고 다른 변형(TOPOFPAGE / TOP_PAGE 등) 은 안 먹힘. 대소문자도 정확히
- FORM 이름 불일치 — it_event 의 form 필드와 실제 FORM 정의 이름이 정확히 일치해야 함. 대소문자는 ABAP 자체가 대소문자 무시지만 오타에는 민감
- i_structure_name 없이 it_fieldcat 만 — DDIC 구조체가 없는 임시 구조체(BEGIN OF lt_data ... END OF) 면 i_structure_name 못 쓰고 Field Catalog 를 직접 채워야 함
- TOP_OF_PAGE 외 다른 이벤트 추가 — 같은 it_event 에 USER_COMMAND·END_OF_LIST 등을 같이 APPEND 한 뒤 각각 FORM 정의하면 됨. it_event 는 누적
- 로고 이미지 미등록 — i_logo 에 OAOR 에 없는 이름 넣으면 그 부분만 빈 자리로 보임. 로고 안 쓸 거면 파라미터 통째 생략
- 헤더 라인 너무 많음 — H/S/A 라인 30개 넣으면 화면이 헤더로만 도배됨. 보통 H 1개 + S 3~5개 + A 1개 정도가 적당
요약
| 단계 | 코드 | 결과 |
|---|---|---|
| 1 | DATA: it_header TYPE slis_t_listheader, it_event TYPE slis_t_event ... | 필요한 표준 타입 변수 준비 |
| 2 | it_header 에 H/S/A 3종 라인 APPEND | 제목 · 조건 · 부가설명 헤더 텍스트 준비 |
| 3 | it_event 에 name='TOP_OF_PAGE' form='TOP_LINE' APPEND | ALV 가 호출할 FORM 이름 등록 |
| 4 | CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' ... | i_structure_name + i_callback_program + it_events + t_outtab |
| 5 | FORM TOP_LINE. ... CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' ... | it_list_commentary = it_header → 헤더 영역 실제 그리기 |
REUSE_ALV_GRID_DISPLAY + TOP-OF-PAGE 패턴의 본질은 “헤더 텍스트 3종(H/S/A) 을 테이블에 채워두고 → 이벤트로 FORM 한 번 등록하고 → ALV 표시 FM 한 번 호출” 단 3개 작업. 객체 ALV 의 PBO/Container 복잡함 없이 한 화면에 깔끔한 보고서 헤더가 붙은 ALV 가 나오므로, 조회 전용 리포트나 빠른 프로토타입에는 이 패턴이 가장 효율적입니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
REUSE_ALV_GRID_DISPLAY 와 REUSE_ALV_COMMENTARY_WRITE 의 파라미터는 NetWeaver 버전(ECC 6.0 / S/4HANA on-premise · Cloud) 에 따라 일부 차이가 있을 수 있고, 일부 신규 환경에서는 CL_SALV_TABLE 사용이 권장됩니다. 실제 적용 시 SE37 에서 시그니처를 확인하시기 바랍니다.