본문 바로가기
ALV · 화면 · 리포트

[SAP ABAP] SALV 7가지 기능 setter 패턴 — 헤더·정렬·집계·선택·툴바·이벤트·컬럼 (CL_SALV_TABLE)

by Song.sh 2026. 6. 5.

SALV(CL_SALV_TABLE) 는 클래식 ALV(CL_GUI_ALV_GRID) 의 후속으로 SAP 가 권장하는 OO ALV 클래스입니다. factory 한 번 호출로 그리드 인스턴스가 만들어지고, 이후 모든 부가 기능(헤더·정렬·집계·선택·툴바·이벤트·컬럼 스타일) 은 get_* 메소드로 설정 객체를 꺼내 setter 를 호출하는 패턴입니다.

 

핵심은 두 가지입니다. (1) 각 기능마다 전용 설정 클래스가 분리 되어 있다는 것 (CL_SALV_DISPLAY_SETTINGS·CL_SALV_SORTS·CL_SALV_AGGREGATIONS·CL_SALV_SELECTIONS·CL_SALV_COLUMNS·CL_SALV_EVENTS_TABLE). (2) 이벤트는 added_function 한 개로 통합 — 표준 툴바 함수도, 추가한 함수도 모두 같은 이벤트로 받아 분기.

 

이 글에서는 SALV 의 7가지 기능 setter(헤더·정렬·집계·선택·툴바·이벤트·컬럼) 를 단계별로 정리합니다. 데이터는 SAP 스탠다드 학습 환경 SFLIGHT 기준.

핵심 — SALV 설정 객체 7가지

기능 getter 설정 클래스
헤더·줄무늬 get_display_settings( ) CL_SALV_DISPLAY_SETTINGS
정렬·소계 get_sorts( ) CL_SALV_SORTS
집계(합계/평균) get_aggregations( ) CL_SALV_AGGREGATIONS
행/셀 선택 get_selections( ) CL_SALV_SELECTIONS
컬럼 폭·색·강조 get_columns( ) CL_SALV_COLUMNS
툴바 함수 get_functions( ) / set_screen_status( ) CL_SALV_FUNCTIONS_LIST
이벤트 get_event( ) CL_SALV_EVENTS_TABLE

흐름은 단순합니다.

1) cl_salv_table=>factory → gr_table (메인 인스턴스)
2) gr_table->get_*( ) → 설정 객체 받기 (gr_display, gr_sort, gr_agg, gr_selection, gr_columns)
3) 설정 객체에 setter 호출 (set_list_header, add_sort, add_aggregation, set_selection_mode 등)
4) 툴바: set_screen_status( pfstatus, c_functions_all )
5) 이벤트: get_event + 핸들러 클래스 SET HANDLER
6) gr_table->display( ) → 화면 출력

기능마다 PERFORM 으로 분리해 두면 글로벌 변수 + 호출 흐름이 깔끔해집니다. 메인 PERFORM 순서: set_titleset_sortset_columnsset_toolbarset_eventsset_modedisplay_alv.


1단계 — 헤더 + 줄무늬 (DISPLAY_SETTINGS)

ALV 상단 제목 + 줄무늬 패턴.

DATA : gr_display TYPE REF TO cl_salv_display_settings.

gr_display = gr_table->get_display_settings( ).
gr_display->set_list_header( 'Flight Schedule' ).
gr_display->set_striped_pattern( abap_true ).

set_list_header 는 ALV 상단 헤더 텍스트. set_striped_pattern 은 짝수 행에 옅은 줄무늬 배경 — 가독성 ↑.


2단계 — 정렬 + 소계 (SORTS)

특정 컬럼으로 정렬하면서 그룹마다 소계를 자동 표시.

DATA : gr_sort TYPE REF TO cl_salv_sorts.

gr_sort = gr_table->get_sorts( ).
gr_sort->add_sort(
  columnname = 'CARRID'
  subtotal   = abap_true                            " 그룹 소계 표시
  sequence   = if_salv_c_sort=>sort_up ).

subtotal = abap_true 가 핵심 — 정렬한 컬럼이 바뀌는 지점마다 자동으로 소계 행이 추가됩니다. CARRID 별로 PRICE 합을 묶어 보고 싶을 때 정렬 + 집계 조합.

여러 단계로 정렬하려면 add_sort 를 컬럼별로 반복:

gr_sort->add_sort( 'CARRID' ).
gr_sort->add_sort( 'CONNID' ).

3단계 — 집계 (AGGREGATIONS)

지정 컬럼의 합계·평균·최대·최소를 ALV 하단(그리고 정렬 소계 위치) 에 자동 표시.

DATA : gr_agg TYPE REF TO cl_salv_aggregations.

gr_agg = gr_table->get_aggregations( ).
gr_agg->add_aggregation(
  columnname  = 'PRICE'
  aggregation = if_salv_c_aggregation=>total ).     " 합계
상수 집계 종류
if_salv_c_aggregation=>total 합계 (가장 많이 씀)
average 평균
minimum 최소
maximum 최대

정렬(subtotal=X) + 집계(total) 를 함께 걸면 ALV 가 CARRID 그룹마다 PRICE 합계를 노란색·빨간색 강조로 자동 표시. 결산 보고서 화면 만들 때 강력한 조합.


4단계 — 행 선택 모드 (SELECTIONS)

사용자가 ALV 에서 행을 선택할 수 있게 + 선택된 행을 ABAP 으로 받기.

DATA : gr_selections TYPE REF TO cl_salv_selections.

gr_selections = gr_table->get_selections( ).
gr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
상수 동작
row_column 셀(행+컬럼) 단위 선택 — 가장 자유로움
multiple 행 다중 선택 (Ctrl + 클릭)
single 행 단일 선택
cell 단일 셀만

선택된 행 받기

이벤트 핸들러 안에서 get_selected_rows 로 인덱스 테이블을 받습니다.

DATA : lt_rows TYPE salv_t_row,
       ls_row  TYPE string.

gr_selections = gr_table->get_selections( ).
lt_rows       = gr_selections->get_selected_rows( ).

LOOP AT lt_rows INTO ls_row.
  READ TABLE gt_data INTO gs_data INDEX ls_row.
  " 선택된 행 처리
ENDLOOP.

5단계 — 툴바 + 표준 함수 추가 (FUNCTIONS)

ALV 위 표준 툴바(검색·정렬·필터·엑셀·인쇄 등) 를 켜고, 추가 버튼을 GUI Status 에 박는 패턴.

표준 툴바 전체 켜기 (가장 간단)

FORM set_toolbar.
  gr_table->set_screen_status(
    EXPORTING
      report        = sy-repid
      pfstatus      = 'S100'
      set_functions = cl_salv_table=>c_functions_all ).
ENDFORM.

set_functions = cl_salv_table=>c_functions_all 한 줄이면 SALV 표준 툴바(필터·정렬·합계·엑셀 다운로드 등 30+ 기능) 가 전부 활성화. c_functions_default 면 기본 일부만, 공백이면 표시 안 함.

사용자 정의 버튼 추가

pfstatus = 'S100' 으로 가리킨 GUI Status 를 SE41 Menu Painter 에서 만듭니다. 절차는:

SE41 → Status 'S100' 생성 → Edit 모드
  → 메뉴 '추가(X)' → '템플레이트 조정(J)'
  → 팝업에서 '리스트뷰어' 선택 + 메뉴바/기능키세팅 체크
  → 표준 함수(&ALL·&AVE·&CRL 등) 전부 자동 입력됨
  → 그 위에 커스텀 함수 코드(예: 'DELETE') 추가

리스트뷰어 템플레이트를 선택하면 SAP 가 SALV 표준 함수 코드들을 한 번에 채워줍니다. 거기에 내가 만들 버튼만 덧붙이면 끝.


6단계 — 이벤트 (EVENTS) — added_function 한 개로 통합

SALV 의 사용자 액션은 모두 added_function 이벤트 하나 로 들어옵니다. 표준 버튼이든 커스텀 버튼이든 같은 핸들러에서 e_salv_function(함수 코드) 으로 분기.

핸들러 클래스

CLASS lcl_alv_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS user_command
      FOR EVENT added_function OF cl_salv_events_table
      IMPORTING e_salv_function.
ENDCLASS.

CLASS lcl_alv_handler IMPLEMENTATION.
  METHOD user_command.
    PERFORM uset_command USING e_salv_function.
  ENDMETHOD.
ENDCLASS.

DATA : gr_event TYPE REF TO lcl_alv_handler.

이벤트 등록

FORM set_events.
  DATA : events TYPE REF TO cl_salv_events_table.

  events = gr_table->get_event( ).
  CREATE OBJECT gr_event.
  SET HANDLER gr_event->user_command FOR events.
ENDFORM.

CLASS-METHODS (정적 메소드) 인 점이 SALV 의 특징. CREATE OBJECT 안 해도 되지만 핸들러 등록에는 CREATE OBJECT gr_event + SET HANDLER ... FOR events 가 표준 패턴.

함수 분기 — DELETE 예시

FORM uset_command USING i_ucomm TYPE salv_de_function.

  IF i_ucomm = 'DELETE'.
    DATA : lt_rows TYPE salv_t_row,
           ls_row  TYPE string.

    gr_selections = gr_table->get_selections( ).
    lt_rows       = gr_selections->get_selected_rows( ).

    LOOP AT lt_rows INTO ls_row.
      DELETE gt_data INDEX ls_row.
    ENDLOOP.

    gr_table->refresh( ).        " ★ 데이터 변경 후 화면 갱신
  ENDIF.
ENDFORM.

gr_table->refresh( ) 가 핵심 — ITAB 데이터 변경 후 호출 안 하면 화면이 그대로. 표준 ALV Grid 의 refresh_table_display 와 같은 역할.


7단계 — 컬럼 폭·색·강조 (COLUMNS)

개별 컬럼을 잡아 폭 조정·색 변경·강조 처리.

DATA : gr_columns TYPE REF TO cl_salv_columns,
       gr_column  TYPE REF TO cl_salv_column_table,
       g_color    TYPE lvc_s_colo.

gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( abap_true ).             " 전체 폭 자동

* 개별 컬럼 — PRICE 만 색 변경
gr_column ?= gr_columns->get_column( 'PRICE' ).
g_color-col = 3.                                   " 노란색
g_color-int = 0.
g_color-inv = 0.
gr_column->set_color( g_color ).

set_optimize( abap_true ) 면 전체 컬럼 폭이 데이터 길이에 맞춰 자동 조정. 개별 컬럼은 get_column(컬럼명) → CL_SALV_COLUMN_TABLE 다운캐스트 후 setter 호출. 색은 LVC_S_COLO 구조체(col·int·inv) 로.


자주 빠뜨리는 함정

t_table 타입 — STANDARD TABLE 필수

CL_SALV_TABLE=>FACTORYt_table 은 STANDARD TABLE 만 받습니다. SORTED·HASHED 는 런타임 덤프. SELECT ... INTO TABLE @DATA(it_xx) 기본 STANDARD 라 안전.

refresh 누락

데이터 변경 후 gr_table->refresh( ) 빠뜨리면 화면이 그대로. 행 삭제·추가 모두 마찬가지.

get_column 다운캐스트

get_column 의 반환 타입은 부모 CL_SALV_COLUMN 이라 자식 메소드(set_color·set_long_text 등) 호출하려면 CL_SALV_COLUMN_TABLE?= 다운캐스트 필요.

added_function — CLASS-METHODS

SALV 이벤트 핸들러 메소드는 CLASS-METHODS(정적). 인스턴스 메소드로 선언하면 SET HANDLER 시 컴파일 오류. 처음 SALV 만질 때 자주 헷갈리는 부분.

CREATE OBJECT vs CLASS-METHODS

이벤트 핸들러가 정적 메소드라도 CREATE OBJECT gr_event + SET HANDLER gr_event->user_command 처럼 인스턴스 참조로 등록. 이게 ABAP SET HANDLER 의 표준 문법.

subtotal + total 조합

add_sort(subtotal=X) 만 박으면 소계 행이 안 나옵니다. 반드시 add_aggregation 으로 어떤 컬럼을 집계할지 같이 박아야 소계가 표시.

화면 vs popup

factory 호출 시 list_display = if_salv_c_bool_sap=>false 면 풀스크린, true 면 클래식 리스트 출력. popup 으로 띄우려면 set_screen_popup( start_column · end_column · start_line · end_line ) 추가.


전체 코드 — 복사용 통합본

화면(CALL SCREEN) 이 있는 모듈풀 구조라 SAP 스탠다드 INCLUDE 6분할(T / C / SCR / O / I / F). SE51 에서 Screen 1000 은 비어있고(SALV 가 자체 화면 사용) Flow Logic 에 status_1000 · user_command_1000 만.

*&---------------------------------------------------------------------*
*& Report ZRXX_SALV_FUNCTIONS  (메인)
*&---------------------------------------------------------------------*
REPORT zrxx_salv_functions.

INCLUDE zrxx_salv_functions_t.     " TOP   - 전역 선언
INCLUDE zrxx_salv_functions_c.     " CLASS - 이벤트 핸들러
INCLUDE zrxx_salv_functions_scr.   " SCR   - 셀렉션 스크린 (사용 안 함)
INCLUDE zrxx_salv_functions_o.     " PBO   - OUTPUT 모듈
INCLUDE zrxx_salv_functions_i.     " PAI   - INPUT 모듈
INCLUDE zrxx_salv_functions_f.     " FORM  - 서브루틴

START-OF-SELECTION.

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    FROM sflight.

  cl_salv_table=>factory(
    IMPORTING r_salv_table = gr_table
    CHANGING  t_table      = gt_data ).

  PERFORM set_title.
  PERFORM set_sort.
  PERFORM set_columns.
  PERFORM set_toolbar.
  PERFORM set_events.
  PERFORM set_mode.
  PERFORM display_alv.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_T  (TOP)
*&---------------------------------------------------------------------*
* 데이터
DATA : gs_data TYPE sflight,
       gt_data LIKE TABLE OF gs_data.

DATA : gr_table TYPE REF TO cl_salv_table,
       gv_int   TYPE string.

* 설정 객체
DATA : gr_display    TYPE REF TO cl_salv_display_settings,
       gr_sort       TYPE REF TO cl_salv_sorts,
       gr_agg        TYPE REF TO cl_salv_aggregations,
       gr_selections TYPE REF TO cl_salv_selections,
       gr_columns    TYPE REF TO cl_salv_columns,
       gr_column     TYPE REF TO cl_salv_column_table,
       g_color       TYPE lvc_s_colo.

* 이벤트
DATA : events   TYPE REF TO cl_salv_events_table,
       gr_event TYPE REF TO lcl_alv_handler.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_C  (CLASS)
*&---------------------------------------------------------------------*
CLASS lcl_alv_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS user_command
      FOR EVENT added_function OF cl_salv_events_table
      IMPORTING e_salv_function.
ENDCLASS.

CLASS lcl_alv_handler IMPLEMENTATION.
  METHOD user_command.
    PERFORM uset_command USING e_salv_function.
  ENDMETHOD.
ENDCLASS.

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_SCR  (SCR)
*&---------------------------------------------------------------------*
* (이 글에서는 셀렉션 스크린 사용 안 함)

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_O  (PBO)
*&---------------------------------------------------------------------*
* (SALV 가 자체 화면을 사용하므로 모듈 거의 없음)

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_I  (PAI)
*&---------------------------------------------------------------------*
* (SALV 가 이벤트로 받음)

*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_SALV_FUNCTIONS_F  (FORM)
*&---------------------------------------------------------------------*
* 1) 헤더
FORM set_title.
  gr_display = gr_table->get_display_settings( ).
  gr_display->set_list_header( 'Flight Schedule' ).
  gr_display->set_striped_pattern( abap_true ).
ENDFORM.

* 2) 정렬 + 소계
FORM set_sort.
  gr_sort = gr_table->get_sorts( ).
  gr_sort->add_sort(
    columnname = 'CARRID'
    subtotal   = abap_true
    sequence   = if_salv_c_sort=>sort_up ).

* 집계 (정렬 소계와 짝)
  gr_agg = gr_table->get_aggregations( ).
  gr_agg->add_aggregation(
    columnname  = 'PRICE'
    aggregation = if_salv_c_aggregation=>total ).
ENDFORM.

* 3) 컬럼 폭·색
FORM set_columns.
  gr_columns = gr_table->get_columns( ).
  gr_columns->set_optimize( abap_true ).

  gr_column ?= gr_columns->get_column( 'PRICE' ).
  g_color-col = 3.
  g_color-int = 0.
  g_color-inv = 0.
  gr_column->set_color( g_color ).
ENDFORM.

* 4) 툴바 — 표준 함수 전부 켜기
FORM set_toolbar.
  gr_table->set_screen_status(
    EXPORTING
      report        = sy-repid
      pfstatus      = 'S100'
      set_functions = cl_salv_table=>c_functions_all ).
ENDFORM.

* 5) 이벤트 — added_function 핸들러 연결
FORM set_events.
  events = gr_table->get_event( ).
  CREATE OBJECT gr_event.
  SET HANDLER gr_event->user_command FOR events.
ENDFORM.

* 6) 행 선택 모드
FORM set_mode.
  gr_selections = gr_table->get_selections( ).
  gr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
ENDFORM.

* 7) 출력
FORM display_alv.
  gv_int = lines( gt_data ).
  MESSAGE gv_int && '건 조회' TYPE 'S'.

  gr_table->display( ).
ENDFORM.

* 8) 이벤트 분기 — 함수 코드별 처리
FORM uset_command USING i_ucomm TYPE salv_de_function.

  CASE i_ucomm.
    WHEN 'DELETE'.
      DATA : lt_rows TYPE salv_t_row,
             ls_row  TYPE string.

      gr_selections = gr_table->get_selections( ).
      lt_rows       = gr_selections->get_selected_rows( ).

      LOOP AT lt_rows INTO ls_row.
        DELETE gt_data INDEX ls_row.
      ENDLOOP.

      gr_table->refresh( ).
  ENDCASE.

ENDFORM.

요약

단계 기능 핵심
1 헤더 get_display_settingsset_list_header · set_striped_pattern
2 정렬+소계 get_sortsadd_sort( subtotal = abap_true )
3 집계 get_aggregationsadd_aggregation( if_salv_c_aggregation=>total )
4 선택 get_selectionsset_selection_mode + get_selected_rows
5 툴바 set_screen_status( pfstatus · set_functions = c_functions_all )
6 이벤트 CLASS-METHODS FOR EVENT added_function OF cl_salv_events_table + SET HANDLER
7 컬럼 get_columnsset_optimize + get_column ?= ... set_color

SALV 의 본질은 "factory 한 번 + get_* 로 설정 객체 꺼내 setter 호출". 클래식 ALV 의 fieldcat·layout 구조체 박는 패턴 대비 객체 분리가 명확하고, 이벤트가 added_function 하나로 통합되어 코드가 깔끔합니다. 표준 툴바는 c_functions_all 한 줄로 30+ 기능이 켜지고, 커스텀 버튼은 SE41 Menu Painter 의 "리스트뷰어 템플레이트" 로 표준 함수를 자동 채운 뒤 위에 추가만 하면 끝. 데이터 변경 후엔 refresh( ) 하나만 잊지 마세요.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

CL_SALV_TABLE · CL_SALV_DISPLAY_SETTINGS · CL_SALV_SORTS · CL_SALV_AGGREGATIONS · CL_SALV_SELECTIONS · CL_SALV_COLUMNS · CL_SALV_COLUMN_TABLE · CL_SALV_FUNCTIONS_LIST · CL_SALV_EVENTS_TABLE 와 인터페이스 상수 if_salv_c_selection_mode·if_salv_c_aggregation·if_salv_c_sort · 데이터 타입 SALV_T_ROW·SALV_DE_FUNCTION·LVC_S_COLO 는 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. SFLIGHT 는 SAP 스탠다드 학습 환경(IDES) 테이블이며 실무 적용 시 운영 테이블로 교체하시기 바랍니다. GUI Status 'S100'SE41 Menu Painter 에서 직접 생성해야 합니다(리스트뷰어 템플레이트 적용).