ALV 리포트

ALV란?

ALV(ABAP List Viewer)는 SAP에서 데이터를 표, 그리드 형태로 출력하는 표준 도구입니다. 정렬, 필터, 합계, 엑셀 다운로드 등 풍부한 기능을 기본 제공하여, 실무에서 가장 많이 사용하는 출력 방식입니다.

ALV Grid vs ALV List 비교

구분CL_GUI_ALV_GRIDREUSE_ALV_GRID_DISPLAYREUSE_ALV_LIST_DISPLAY
방식OOP (클래스)함수 모듈함수 모듈
화면Grid (스프레드시트)GridClassic List
편집가능제한적불가
이벤트풍부기본 제공기본 제공
유연성높음중간낮음
권장신규 개발 시간단한 리포트레거시 호환

이 포스트에서는 실무에서 가장 많이 사용하는 REUSE_ALV_GRID_DISPLAY 함수 모듈을 중심으로 설명합니다.

Field Catalog

Field Catalog은 ALV 각 컬럼의 속성(이름, 길이, 정렬, 편집 가능 여부 등)을 정의합니다.

자동 생성 (DDIC 참조)

DDIC 구조체를 참조하면 Field Catalog을 자동으로 생성할 수 있습니다.

1DATA: lt_fieldcat TYPE slis_t_fieldcat_alv.
2
3" DDIC 구조체 참조로 자동 생성
4CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
5  EXPORTING
6    i_structure_name = 'MARA'   " DDIC 테이블/구조체명
7  CHANGING
8    ct_fieldcat      = lt_fieldcat
9  EXCEPTIONS
10    OTHERS           = 1.

수동 생성

실무에서는 필요한 컬럼만 선택적으로 수동 생성하는 경우가 많습니다.

1DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
2      ls_fieldcat TYPE slis_fieldcat_alv.
3
4" 자재번호 컬럼
5CLEAR ls_fieldcat.
6ls_fieldcat-fieldname = 'MATNR'.
7ls_fieldcat-seltext_l = '자재번호'.
8ls_fieldcat-col_pos   = 1.
9ls_fieldcat-outputlen = 18.
10ls_fieldcat-key       = 'X'.       " 키 컬럼 (고정)
11APPEND ls_fieldcat TO lt_fieldcat.
12
13" 자재내역 컬럼
14CLEAR ls_fieldcat.
15ls_fieldcat-fieldname = 'MAKTX'.
16ls_fieldcat-seltext_l = '자재내역'.
17ls_fieldcat-col_pos   = 2.
18ls_fieldcat-outputlen = 30.
19APPEND ls_fieldcat TO lt_fieldcat.
20
21" 수량 컬럼
22CLEAR ls_fieldcat.
23ls_fieldcat-fieldname = 'MENGE'.
24ls_fieldcat-seltext_l = '수량'.
25ls_fieldcat-col_pos   = 3.
26ls_fieldcat-outputlen = 15.
27ls_fieldcat-do_sum    = 'X'.       " 합계 표시
28APPEND ls_fieldcat TO lt_fieldcat.
29
30" 금액 컬럼 (편집 가능 + 핫스팟)
31CLEAR ls_fieldcat.
32ls_fieldcat-fieldname = 'NETPR'.
33ls_fieldcat-seltext_l = '단가'.
34ls_fieldcat-col_pos   = 4.
35ls_fieldcat-edit      = 'X'.       " 편집 가능
36ls_fieldcat-hotspot   = 'X'.       " 클릭 가능
37ls_fieldcat-emphasize = 'C500'.    " 강조 색상
38APPEND ls_fieldcat TO lt_fieldcat.

주요 Field Catalog 속성

속성설명값 예시
FIELDNAME내부 테이블 필드명'MATNR'
SELTEXT_L컬럼 헤더 (긴 텍스트)'자재번호'
SELTEXT_M컬럼 헤더 (중간 텍스트)'자재No'
SELTEXT_S컬럼 헤더 (짧은 텍스트)'No'
COL_POS컬럼 위치 순서1, 2, 3
OUTPUTLEN출력 길이18
KEY키 컬럼 여부 (고정)'X'
EDIT편집 가능 여부'X'
CHECKBOX체크박스 표시'X'
HOTSPOT클릭 가능 링크'X'
NO_OUT숨김 컬럼'X'
DO_SUM합계 표시'X'
EMPHASIZE컬럼 색상 강조'C500'
JUST정렬 (L/R/C)'R' (우측)
REF_TABLEDDIC 참조 테이블'MARA'
REF_FIELDDDIC 참조 필드'MATNR'

Layout 설정

Layout은 ALV 전체의 표시 옵션을 설정합니다.

1DATA: ls_layout TYPE slis_layout_alv.
2
3ls_layout-zebra      = 'X'.         " 줄무늬 배경
4ls_layout-colwidth_optimize = 'X'.  " 컬럼 너비 자동 최적화
5ls_layout-grid_title = '자재 목록 리포트'. " ALV 제목
6ls_layout-sel_mode   = 'A'.         " 선택 모드

주요 Layout 속성

속성설명
ZEBRA줄무늬 배경'X'
COLWIDTH_OPTIMIZE컬럼 너비 자동 조정'X'
SEL_MODE행 선택 모드'A', 'B', 'C', 'D'
GRID_TITLEALV 상단 제목'리포트 제목'
NO_TOOLBAR툴바 숨김'X'
EDIT전체 편집 모드'X'

SEL_MODE (선택 모드) 옵션

모드설명
A행 + 컬럼 + 셀 단위 선택 가능
B단일 행 선택
C복수 행 선택
D셀 단위 선택

Event 처리

ALV에서 사용자 액션(더블클릭, 핫스팟 클릭 등)을 처리하려면 이벤트를 등록해야 합니다.

주요 이벤트 목록

이벤트설명발생 시점
USER_COMMAND사용자 액션 (더블클릭 포함)행 더블클릭, 버튼 클릭
TOP_OF_PAGE헤더 출력ALV 상단에 정보 표시
PF_STATUS_SET상태바 설정ALV 표시 전
DATA_CHANGED데이터 변경편집 모드에서 셀 값 변경 시

DOUBLE_CLICK / USER_COMMAND 이벤트

1" ── 이벤트 테이블 설정 ──
2DATA: lt_events TYPE slis_t_event,
3      ls_event  TYPE slis_alv_event.
4
5ls_event-name = 'USER_COMMAND'.
6ls_event-form = 'ON_USER_COMMAND'.
7APPEND ls_event TO lt_events.
8
9ls_event-name = 'TOP_OF_PAGE'.
10ls_event-form = 'ON_TOP_OF_PAGE'.
11APPEND ls_event TO lt_events.
12
13" ── ALV 호출 시 이벤트 전달 ──
14CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
15  EXPORTING
16    it_fieldcat   = lt_fieldcat
17    is_layout     = ls_layout
18    it_events     = lt_events
19    i_callback_program = sy-repid
20  TABLES
21    t_outtab      = lt_materials
22  EXCEPTIONS
23    OTHERS        = 1.
24
25" ── USER_COMMAND 핸들러 (더블클릭 처리) ──
26FORM on_user_command USING uv_ucomm    TYPE sy-ucomm
27                           ls_selfield TYPE slis_selfield.
28  CASE uv_ucomm.
29    WHEN '&IC1'.  " 더블클릭 코드
30      " 클릭한 행의 데이터 읽기
31      READ TABLE lt_materials INTO ls_material INDEX ls_selfield-tabindex.
32      IF sy-subrc = 0.
33        " 자재 상세 화면으로 이동
34        SET PARAMETER ID 'MAT' FIELD ls_material-matnr.
35        CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
36      ENDIF.
37  ENDCASE.
38ENDFORM.
39
40" ── TOP_OF_PAGE 핸들러 ──
41FORM on_top_of_page.
42  DATA: lt_header TYPE slis_t_listheader,
43        ls_header TYPE slis_listheader.
44
45  " 제목
46  ls_header-typ  = 'H'.  " H=Header, S=Selection, A=Action
47  ls_header-info = '자재 목록 리포트'.
48  APPEND ls_header TO lt_header.
49
50  " 실행 정보
51  CLEAR ls_header.
52  ls_header-typ  = 'S'.
53  ls_header-key  = '실행일'.
54  ls_header-info = sy-datum.
55  APPEND ls_header TO lt_header.
56
57  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
58    EXPORTING
59      it_list_commentary = lt_header.
60ENDFORM.

Toolbar 커스터마이징

커스텀 버튼 추가

PF_STATUS_SET 이벤트를 통해 커스텀 GUI Status를 설정하거나, REUSE_ALV_GRID_DISPLAYI_CALLBACK_PF_STATUS_SET 파라미터를 사용합니다.

1" ── ALV 호출 시 Status 콜백 지정 ──
2CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
3  EXPORTING
4    it_fieldcat              = lt_fieldcat
5    is_layout                = ls_layout
6    i_callback_program       = sy-repid
7    i_callback_pf_status_set = 'SET_PF_STATUS'
8    i_callback_user_command  = 'ON_USER_COMMAND'
9  TABLES
10    t_outtab                 = lt_materials
11  EXCEPTIONS
12    OTHERS                   = 1.
13
14" ── 커스텀 GUI Status 설정 ──
15FORM set_pf_status USING pt_extab TYPE slis_t_extab.
16  " 표준 ALV Status를 복사하여 커스텀 버튼 추가
17  SET PF-STATUS 'ZSTATUS' EXCLUDING pt_extab.
18ENDFORM.

기본 Toolbar 버튼 제거

특정 표준 버튼을 숨기려면 IT_EXCLUDING 파라미터를 사용합니다.

1DATA: lt_excluding TYPE slis_t_extab,
2      ls_excluding TYPE slis_extab.
3
4" 인쇄 버튼 제거
5ls_excluding-fcode = '&PRINT'.
6APPEND ls_excluding TO lt_excluding.
7
8" 엑셀 다운로드 제거
9ls_excluding-fcode = '&XXL'.
10APPEND ls_excluding TO lt_excluding.
11
12CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
13  EXPORTING
14    it_fieldcat  = lt_fieldcat
15    it_excluding = lt_excluding
16  TABLES
17    t_outtab     = lt_materials.

Variant 저장/불러오기

Variant는 사용자가 설정한 ALV 레이아웃(컬럼 순서, 필터, 정렬 등)을 저장하고 재사용할 수 있는 기능입니다.

Variant 설정

1DATA: ls_variant TYPE disvariant.
2
3ls_variant-report = sy-repid.  " 프로그램명
4ls_variant-username = sy-uname. " 사용자명
5
6CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
7  EXPORTING
8    it_fieldcat   = lt_fieldcat
9    is_layout     = ls_layout
10    is_variant    = ls_variant
11    i_save        = 'A'           " Variant 저장 옵션
12    i_default     = 'X'           " 기본 Variant 사용
13  TABLES
14    t_outtab      = lt_materials.

I_SAVE 옵션

옵션설명
'A'전체 허용 (사용자별 + 전체 공용)
'U'사용자별 Variant만 저장 허용
'X'전체 공용 Variant만 저장 허용
' '저장 불가 (빈 문자열)

실무 예제: 편집 가능한 ALV 구매오더 리포트

CL_GUI_ALV_GRID를 사용하여 편집 가능한 ALV를 구현하는 종합 예제입니다.

1REPORT Z_ALV_PO_REPORT.
2
3" ==============================
4" 1. 타입 정의
5" ==============================
6TYPES: BEGIN OF ty_po_item,
7         sel      TYPE c LENGTH 1,   " 선택 체크박스
8         ebeln    TYPE ebeln,        " 구매오더 번호
9         ebelp    TYPE ebelp,        " 항목번호
10         matnr    TYPE matnr,        " 자재번호
11         maktx    TYPE maktx,        " 자재내역
12         menge    TYPE bstmg,        " 수량
13         meins    TYPE bstme,        " 단위
14         netpr    TYPE bprei,        " 단가
15         netwr    TYPE bwert,        " 금액
16         lifnr    TYPE elifn,        " 공급업체
17         status   TYPE c LENGTH 10,  " 상태 (커스텀)
18       END OF ty_po_item.
19
20" ==============================
21" 2. TABLES 선언 (SELECT-OPTIONS 참조용)
22" ==============================
23TABLES: ekko.
24
25" ==============================
26" 3. Selection Screen
27" ==============================
28SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
29  SELECT-OPTIONS: so_ebeln FOR ekko-ebeln,   " 구매오더 번호
30                  so_lifnr FOR ekko-lifnr.   " 공급업체
31  PARAMETERS: p_ekorg TYPE ekorg DEFAULT '1000'. " 구매조직
32SELECTION-SCREEN END OF BLOCK b1.
33
34" ==============================
35" 3. 데이터 선언
36" ==============================
37DATA: lt_po_items TYPE TABLE OF ty_po_item,
38      ls_po_item  TYPE ty_po_item.
39
40DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
41      ls_fieldcat TYPE slis_fieldcat_alv,
42      ls_layout   TYPE slis_layout_alv,
43      ls_variant  TYPE disvariant,
44      lt_events   TYPE slis_t_event,
45      ls_event    TYPE slis_alv_event.
46
47" ==============================
48" 4. 데이터 조회
49" ==============================
50START-OF-SELECTION.
51
52  SELECT a~ebeln b~ebelp b~matnr b~menge b~meins
53         b~netpr b~netwr a~lifnr
54    FROM ekko AS a
55    INNER JOIN ekpo AS b
56      ON a~ebeln = b~ebeln
57    INTO CORRESPONDING FIELDS OF TABLE lt_po_items
58    WHERE a~ebeln IN so_ebeln
59      AND a~lifnr IN so_lifnr
60      AND a~ekorg = p_ekorg
61      AND b~loekz = ' '.  " 삭제 플래그 제외
62
63  IF sy-subrc <> 0.
64    MESSAGE '조회된 데이터가 없습니다.' TYPE 'S' DISPLAY LIKE 'E'.
65    RETURN.
66  ENDIF.
67
68  " 자재내역 보강
69  DATA: lt_makt TYPE TABLE OF makt,
70        ls_makt TYPE makt.
71
72  IF lt_po_items IS NOT INITIAL.
73    SELECT matnr maktx
74      FROM makt
75      INTO TABLE lt_makt
76      FOR ALL ENTRIES IN lt_po_items
77      WHERE matnr = lt_po_items-matnr
78        AND spras = sy-langu.
79  ENDIF.
80
81  " 자재내역 매핑
82  FIELD-SYMBOLS: <ls_po> TYPE ty_po_item.
83  LOOP AT lt_po_items ASSIGNING <ls_po>.
84    READ TABLE lt_makt INTO ls_makt
85      WITH KEY matnr = <ls_po>-matnr.
86    IF sy-subrc = 0.
87      <ls_po>-maktx = ls_makt-maktx.
88    ENDIF.
89    <ls_po>-status = '정상'.
90  ENDLOOP.
91
92" ==============================
93" 5. Field Catalog 설정
94" ==============================
95  PERFORM set_fieldcat.
96
97" ==============================
98" 6. Layout 설정
99" ==============================
100  ls_layout-zebra             = 'X'.
101  ls_layout-colwidth_optimize = 'X'.
102  ls_layout-sel_mode          = 'A'.
103  ls_layout-box_fieldname     = 'SEL'. " 체크박스 필드
104
105" ==============================
106" 7. Variant 설정
107" ==============================
108  ls_variant-report   = sy-repid.
109  ls_variant-username = sy-uname.
110
111" ==============================
112" 8. 이벤트 설정
113" ==============================
114  ls_event-name = 'USER_COMMAND'.
115  ls_event-form = 'ON_USER_COMMAND'.
116  APPEND ls_event TO lt_events.
117
118  ls_event-name = 'TOP_OF_PAGE'.
119  ls_event-form = 'ON_TOP_OF_PAGE'.
120  APPEND ls_event TO lt_events.
121
122" ==============================
123" 9. ALV 출력
124" ==============================
125  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
126    EXPORTING
127      i_callback_program       = sy-repid
128      i_callback_pf_status_set = 'SET_PF_STATUS'
129      it_fieldcat              = lt_fieldcat
130      is_layout                = ls_layout
131      is_variant               = ls_variant
132      i_save                   = 'A'
133      it_events                = lt_events
134    TABLES
135      t_outtab                 = lt_po_items
136    EXCEPTIONS
137      OTHERS                   = 1.
138
139" ==============================
140" 서브루틴 정의
141" ==============================
142FORM set_fieldcat.
143  CLEAR ls_fieldcat.
144  ls_fieldcat-fieldname = 'EBELN'.
145  ls_fieldcat-seltext_l = '구매오더'.
146  ls_fieldcat-col_pos   = 1.
147  ls_fieldcat-key       = 'X'.
148  ls_fieldcat-hotspot   = 'X'.
149  APPEND ls_fieldcat TO lt_fieldcat.
150
151  CLEAR ls_fieldcat.
152  ls_fieldcat-fieldname = 'EBELP'.
153  ls_fieldcat-seltext_l = '항목'.
154  ls_fieldcat-col_pos   = 2.
155  APPEND ls_fieldcat TO lt_fieldcat.
156
157  CLEAR ls_fieldcat.
158  ls_fieldcat-fieldname = 'MATNR'.
159  ls_fieldcat-seltext_l = '자재번호'.
160  ls_fieldcat-col_pos   = 3.
161  APPEND ls_fieldcat TO lt_fieldcat.
162
163  CLEAR ls_fieldcat.
164  ls_fieldcat-fieldname = 'MAKTX'.
165  ls_fieldcat-seltext_l = '자재내역'.
166  ls_fieldcat-col_pos   = 4.
167  ls_fieldcat-outputlen = 25.
168  APPEND ls_fieldcat TO lt_fieldcat.
169
170  CLEAR ls_fieldcat.
171  ls_fieldcat-fieldname = 'MENGE'.
172  ls_fieldcat-seltext_l = '수량'.
173  ls_fieldcat-col_pos   = 5.
174  ls_fieldcat-do_sum    = 'X'.
175  APPEND ls_fieldcat TO lt_fieldcat.
176
177  CLEAR ls_fieldcat.
178  ls_fieldcat-fieldname = 'MEINS'.
179  ls_fieldcat-seltext_l = '단위'.
180  ls_fieldcat-col_pos   = 6.
181  APPEND ls_fieldcat TO lt_fieldcat.
182
183  CLEAR ls_fieldcat.
184  ls_fieldcat-fieldname = 'NETPR'.
185  ls_fieldcat-seltext_l = '단가'.
186  ls_fieldcat-col_pos   = 7.
187  ls_fieldcat-edit      = 'X'.  " 편집 가능
188  APPEND ls_fieldcat TO lt_fieldcat.
189
190  CLEAR ls_fieldcat.
191  ls_fieldcat-fieldname = 'NETWR'.
192  ls_fieldcat-seltext_l = '금액'.
193  ls_fieldcat-col_pos   = 8.
194  ls_fieldcat-do_sum    = 'X'.
195  ls_fieldcat-emphasize = 'C300'. " 노란색 강조
196  APPEND ls_fieldcat TO lt_fieldcat.
197
198  CLEAR ls_fieldcat.
199  ls_fieldcat-fieldname = 'LIFNR'.
200  ls_fieldcat-seltext_l = '공급업체'.
201  ls_fieldcat-col_pos   = 9.
202  APPEND ls_fieldcat TO lt_fieldcat.
203
204  CLEAR ls_fieldcat.
205  ls_fieldcat-fieldname = 'STATUS'.
206  ls_fieldcat-seltext_l = '상태'.
207  ls_fieldcat-col_pos   = 10.
208  APPEND ls_fieldcat TO lt_fieldcat.
209ENDFORM.
210
211FORM set_pf_status USING pt_extab TYPE slis_t_extab.
212  SET PF-STATUS 'ZSTATUS' EXCLUDING pt_extab.
213ENDFORM.
214
215FORM on_user_command USING uv_ucomm    TYPE sy-ucomm
216                           ls_selfield TYPE slis_selfield.
217  CASE uv_ucomm.
218    WHEN '&IC1'. " 더블클릭 (핫스팟 클릭 포함)
219      READ TABLE lt_po_items INTO ls_po_item
220        INDEX ls_selfield-tabindex.
221      IF sy-subrc = 0.
222        SET PARAMETER ID 'BES' FIELD ls_po_item-ebeln.
223        CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
224      ENDIF.
225    WHEN 'ZREFRESH'. " 커스텀 새로고침 버튼
226      PERFORM refresh_data.
227      ls_selfield-refresh = 'X'. " ALV 화면 갱신
228  ENDCASE.
229ENDFORM.
230
231FORM on_top_of_page.
232  DATA: lt_header TYPE slis_t_listheader,
233        ls_header TYPE slis_listheader.
234
235  ls_header-typ  = 'H'.
236  ls_header-info = '구매오더 리포트'.
237  APPEND ls_header TO lt_header.
238
239  CLEAR ls_header.
240  ls_header-typ  = 'S'.
241  ls_header-key  = '구매조직'.
242  ls_header-info = p_ekorg.
243  APPEND ls_header TO lt_header.
244
245  CLEAR ls_header.
246  ls_header-typ  = 'S'.
247  ls_header-key  = '실행일시'.
248  ls_header-info = |{ sy-datum DATE = USER } { sy-uzeit TIME = USER }|.
249  APPEND ls_header TO lt_header.
250
251  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
252    EXPORTING
253      it_list_commentary = lt_header.
254ENDFORM.
255
256FORM refresh_data.
257  " 데이터 재조회 로직
258  CLEAR lt_po_items.
259  " ... (START-OF-SELECTION과 동일한 SELECT 로직)
260ENDFORM.

이 예제에서는 Field Catalog 수동 설정, Layout(ZEBRA, 선택 모드, 체크박스), 이벤트(더블클릭, TOP_OF_PAGE), 커스텀 Toolbar, Variant 저장 등 ALV의 핵심 기능을 모두 활용했습니다.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.