CS Student’s SAP&Tech Journey✨
[SAP] ALV (1) 기본 개념 / 객체지향 ALV(CL_GUI_ALV_GRID)로 화면 구성하기 본문
SAP 화면 개발을 하다 보면, 단순한 WRITE 출력만으로는 복잡한 데이터를 사용자에게 명확히 보여주기 어려울 때가 많습니다. 이럴 때 가장 많이 사용되는 도구가 바로 ALV (ABAP List Viewer)입니다. ALV는 데이터를 표 형태로 깔끔하게 표현할 수 있을 뿐만 아니라, 정렬, 필터링, 합계, 그룹핑, 엑셀 다운로드 등 다양한 기능을 기본으로 제공하여 사용자 친화적인 SAP 화면을 구성하는 핵심 요소로 자리 잡고 있습니다.
SAP에서 ALV는 다양한 방식으로 구현할 수 있지만, 그중에서도 가장 실무적으로 사용되는 방식은 CL_GUI_ALV_GRID를 이용한 객체지향 ALV입니다. 이 방식은 화면 안에 컨트롤 박스를 만들고, 그 안에 그리드(Grid)를 직접 넣는 방식으로 구조적으로 명확하며 재사용성도 높아 표준 트랜잭션에서도 널리 사용됩니다.
이번 포스팅에서는 ALV의 핵심 구조를 “박스 안에 박스” 개념으로 하나씩 쌓아가며, CL_GUI_ALV_GRID 기반의 ALV를 SAP 화면에 출력하는 전 과정을 함께 구현해보겠습니다.
❓ ALV란?
ALV (ABAP List Viewer)는 SAP에서 데이터를 표 형태로 시각적으로 표현할 수 있도록 제공하는 강력한 UI 도구입니다.
특히 SAP GUI 환경에서는 단순한 리스트 출력보다는 ALV를 통해 정렬, 필터, 컬럼 조정, 엑셀 다운로드 등 다양한 기능을 사용자에게 제공할 수 있습니다.
✅ ALV 사용 이유
- 데이터를 테이블 형태로 보기 좋게 보여줌
- 컬럼 정렬, 필터, 합계, 그룹핑 등 기본 기능 제공
- 사용자 경험 향상 (엑셀 다운로드, 컬럼 너비 조절 등)
- 표준 SAP 트랜잭션 대부분이 ALV를 활용
- 화면 개발 시 실무에서 가장 많이 사용되는 출력 방식
🧩 ALV의 주요 구현 방식
방식 | 설명 |
REUSE_ALV_LIST_DISPLAY | Function Module 기반 ALV, 구조는 단순하나 유연성 낮음 |
CL_GUI_ALV_GRID | 객체지향 ALV. 컨트롤을 이용해 다이얼로그 화면에 삽입 가능 |
SALV Model | 최신 SAP 권장 방식. ALV 기능을 더 간편하게 구현 가능 |
이번 포스팅에서는 CL_GUI_ALV_GRID 방식을 사용하며, Custom Container를 통해 ALV를 다이얼로그 화면에 직접 출력하는 방법을 다룹니다.
🎯 CL_GUI_ALV_GRID 방식
SAP에서는 대량의 데이터를 그리드 형태로 보여주기 위해 ALV (ABAP List Viewer)를 자주 사용합니다.
그중에서도 CL_GUI_ALV_GRID를 활용한 방식은 객체지향 기반의 컨트롤 기술을 사용하며, 다이얼로그 화면(Screen) 안에서 데이터를 보기 좋게 출력할 수 있는 강력한 도구입니다.
📌 ALV 화면 구성 3단계
단계 | 구성요소 | 설명 |
1️⃣ | Control Area | 화면에 보일 박스 (Container)를 구성 |
2️⃣ | Container Control | 그 박스 안에 데이터를 담을 그릇 생성 |
3️⃣ | SAPEnjoy Control | 실제 ALV 데이터를 뿌릴 Grid 객체 연결 |
1️⃣ Control Area 만들기 – 화면 구조 준비
▶ REPORT 프로그램 생성
✅ Report 프로그램임에도 TOP Include를 생성해서 변수를 분리합니다.
▶ 데이터 가져오기 - SPFLI 데이터 조회
XXXXXTOP
REPORT ZALV_BASIC1_07.
" Selection Screen 1000
PARAMETERS PA_CAR TYPE SCARR-CARRID.
" 데이터 가지고 오기 - ALV는 리스트 정보
" Connection List - IT
DATA GT_CONN TYPE TABLE OF SDYN_CONN. " IT
DATA GS_CONN LIKE LINE OF GT_CONN. " GW
📌 화면 1000은 Selection Screen이 자동 생성되므로 수정하지 않습니다.
START-OF-SELECTION.
SELECT *
FROM SPFLI
INTO CORRESPONDING FIELDS OF TABLE GT_CONN
WHERE CARRID = PA_CAR.
▶ 화면에 ALV 띄우기 – CALL SCREEN
SCREEN 100
화면 설정 - CALL SCREEN
START-OF-SELECTION.
SELECT *
FROM SPFLI
INTO CORRESPONDING FIELDS OF TABLE GT_CONN
WHERE CARRID = PA_CAR.
CALL SCREEN 0100. " 화면 띄우기
✅ SCREEN 100을 통해 ALV 데이터를 출력할 공간을 만듭니다.
▶ 화면 구성 PBO - SET PF-STATUS / TITLEBAR
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE status_0100 OUTPUT.
SET PF-STATUS 'S100'. "BACK 버튼 설정
SET TITLEBAR 'T100'. "타이틀바
ENDMODULE.
▶ 화면 구성 로직 PAI
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
MODULE user_command_0100 INPUT.
CASE SY-UCOMM.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
▶Custom Control 배치 (Layout)
화면에 Custom Control을 배치하고, 이름을 MY_CON으로 설정합니다.
✔️ Customer Control - Name 설정
2️⃣ Container Control 만들기 – 박스 안의 박스 (위의 MY_CON 안 박스)
▶ 변수 설정
XXXXXTOP
" ALV 관련한 변수
DATA GO_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
✅ TYPE REF TO <클래스>
▶ Control Area와 관련성있게 PBO 로직 설계 (PATTEN 사용)
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE INIT_CONTROL.
MODULE init_control OUTPUT.
CREATE OBJECT go_con
EXPORTING
container_name = 'MY_CON'.
ENDMODULE.
3️⃣ ALV Grid 생성 – SAPEnjoy Control (박스안에 그리드 객체 생성)
▶ 변수 설정
XXXXXTOP
DATA GO_ALV TYPE REF TO CL_GUI_ALV_GRID.
✅ TYPE REF TO <클래스>
▶Container Control 와 관련성있게 PBO 로직 설계 (PATTEN 사용)
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE INIT_CONTROL.
CREATE OBJECT go_alv
EXPORTING
i_parent = go_con.
4️⃣ ALV 데이터 출력 set_table_for_first_display
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE INIT_CONTROL.
MODULE DISPLAY_CONTROL.
MODULE display_control OUTPUT.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SPFLI'
CHANGING
it_outtab = gt_conn.
ENDMODULE.
🧩 TIP. 화면 BACK 시 객체 중복 생성 방지
ALV 출력 화면(100번)에서 BACK을 눌렀다가 다시 들어오면, init_control이 다시 호출되어 컨테이너와 ALV 객체가 중복 생성되는 문제가 발생할 수 있습니다.
이를 방지하려면, GO_CON IS INITIAL 조건을 추가하여 객체가 없을 때만 생성되도록 해야 합니다.
MODULE init_control OUTPUT.
IF GO_CON IS INITIAL. " 추가
" 기존 init_control 모듈 "
CREATE OBJECT go_con
EXPORTING
container_name = 'MY_CON'.
CREATE OBJECT go_alv
EXPORTING
i_parent = go_con.
" display_control 모듈 옮긴 것 "
GS_LAYOUT-CWIDTH_OPT ='X'.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SPFLI'
is_layout = GS_LAYOUT
CHANGING
it_outtab = gt_conn.
ENDIF. " 추가
ENDMODULE.
✅ SET_TABLE_FOR_FIRST_DISPLAY는 ALV가 처음 그려질 때 한 번만 호출해야 하며, 재실행 시 오류가 발생할 수 있으므로 객체 존재 여부 체크는 필수입니다.
⭐ ALV 생성 구조 정리
- ALV를 사용할 때는 보통 1000번 Selection 화면 → 100번 ALV 출력 화면 순서로 구성됩니다.
- ALV를 구성하기 위해선 컨테이너 객체와 ALV 그리드 객체를 생성해야 하며, 화면 복귀 시 중복 생성되지 않도록 반드시 IS INITIAL 체크를 넣는 것이 중요합니다.
5️⃣ 최종 ALV 데이터 출력 확인하기
*️⃣ 컬럼 자동 너비 맞춤 설정
XXXXXTOP
DATA GS_LAYOUT TYPE LVC_s_LAYO.
XXXXXO01 (PBO)
MODULE display_control OUTPUT.
GS_LAYOUT-CWIDTH_OPT ='X'. " 이 줄 추가 "
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SPFLI'
is_layout = GS_LAYOUT " 이 줄 추가 "
CHANGING
it_outtab = gt_conn.
ENDMODULE.
✔️ 줄 맞춤 최종 확인해보기
'SAP > ALV' 카테고리의 다른 글
[SAP] ALV (5) 사용자 정의 컬럼 구성 - Field Catalog 설정 및 아이콘 출력하기 (0) | 2025.03.28 |
---|---|
[SAP] ALV (4) 시각적 제어 기능 - 신호등, 컬러 강조, FREE 함수 / 코드 리펙토링 (0) | 2025.03.28 |
[SAP] ALV (3) 사용자별 레이아웃 저장 / Layout Variant 설정 (IS_VARIANT, I_SAVE) (0) | 2025.03.28 |
[SAP] ALV (2) 화면 갱신 / refresh_table_display 메서드로 데이터 반영하기 (0) | 2025.03.25 |