CS Student’s SAP&Tech Journey✨

[SAP] ALV (1) 기본 개념 / 객체지향 ALV(CL_GUI_ALV_GRID)로 화면 구성하기 본문

SAP/ALV

[SAP] ALV (1) 기본 개념 / 객체지향 ALV(CL_GUI_ALV_GRID)로 화면 구성하기

인포마틱 2025. 3. 21. 21:48

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.

 

✔️ 줄 맞춤 최종 확인해보기