-
[ABAP] #25 ALV의 Event ClassSAP/ABAP 2026. 1. 10. 22:45
Class
데이터를 저장하고(속성) 기능을 수행하는(메서드) 하나의 설계도 또는 틀이다.
ABAP 레포트에서는 주로 로직 분리, ALV 이벤트 처리, 재사용성 확보를 위해 클래스를 사용한다.
Class Type
1. Global Class : SE24에서 생성해서 사용한다.
2. Local Class : 프로그램 내에서 클래스를 생성하여 사용한다.
클래스 구성 요소
1. 속성(Attribute, Data) : 클래스가 가지고 있는 변수, 데이터
1) Instance Attribute
- DATA
- 객체마다 각각 다른 값을 가짐
- 인스턴스 메서드에서 접근 가능
2) Static Attribute
- CLASS-DATA
- 클래스당 하나의 값만 존재
- 객체 생성 없이 사용 가능
2. 메서드(Method) : 클래스가 수행하는 기능(함수)
1) Instance Method
- METHODS
- 객체를 생성해야 호출 가능
- instance attribute 접근 가능
2) Static Method
- CLASS-METHODS
- 객체 생성 없이 호출 가능
- static attribute만 접근 가능
- ALV 이벤트 핸들러에서 주로 사용
3. 이벤트(Event) : 클래스에서 발생시키는 알림.
4. 생성자(Constructor) : 객체가 생성될 때 자동으로 실행되는 메서드
클래스 기본구조
CLASS 클래스명 DEFINITION. " 클래스 선언부 " PRIVATE SECTION. " 클래스 내부에서만 접근 가능 " PROTECTED SECTION. " 상속한 클래스만 접근 가능 " PUBLIC SECTION. " 모든 곳에서 접근 가능 " CLASS-METHODS. " static 메서드 " METHODS. " 인스턴스 메서드 " ENDCLASS. CLASS 클래스명 IMPLEMENTATION. " 클래스 구현부 " METHOD <메서드명>. ENDMETHOD. ENDCLASS.객체생성
DATA: ref1 TYPE REF TO myclass. " 클래스를 참조하는 참조 변수 선언 " CREATE OBJECT ref1. " 객체 생성 " * 신문법 DATA(ref1) = NEW myclass( ).
Global Class
ABAP Dictionary에 등록하여 사용하는 것으로 프로그램 내에서
- Static Method: 클래스=>메서드
- Instance Method: 객체->메서드
형태로 호출한다.
예시
cl_bc400_compute=>get_power( ). " static " lo_obj->method( ). " instance "
글로벌 클래스 사용 예
딕셔너리에 생성되어있는 cl_bc400_compute 클래스에 get_power 메서드를 사용하여 구현.
REPORT zprogb20_0010. TYPES tv_result TYPE p LENGTH 16 DECIMALS 2. PARAMETERS: pa_int1 TYPE i, pa_int2 TYPE i. DATA: gv_result TYPE tv_result. TRY. CALL METHOD cl_bc400_compute=>get_power EXPORTING iv_base = pa_int1 iv_power = pa_int2 IMPORTING ev_result = gv_result. CATCH cx_bc400_power_too_high. MESSAGE 'Power too high!!' TYPE 'E'. CATCH cx_bc400_result_too_high. MESSAGE 'Result too high!!' TYPE 'E'. ENDTRY. WRITE: gv_result.
Local Class (ALV 기준 이벤트 클래스)
ALV에서 이벤트를 처리할 때 Local Class를 구현하여 이벤트를 처리한다.
메서드 정의
CLASS-METHODS: <메서드명> FOR EVENT <발생할 이벤트> OF <이벤트가 구현되어있는 클래스명> IMPORTING <para1> <para2> ... SENDER.- SENDER : 이벤트를 발생시킨 객체의 참조. 여러 ALV를 구분할 때 사용
- 파라미터 : 구현부의 메서드 내에서 사용할 수 있다.
ALV 이벤트 처리 흐름
1. 이벤트 핸들러 클래스 정의 및 메서드 구현
*&---------------------------------------------------------------------* *& Include ZPROGB20_0029_C01 *&---------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING es_row_no e_column sender. "cl_gui_alv_grid 클래스의 더블클릭 이벤트가 발생하면 " "ON_DOUBLE_CLICK 이라는 메서드를 실행하겠다." ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. "더블클릭 이벤트의 메서드 구현 " METHOD on_double_click. IF sender = go_alv. MESSAGE i004(zmcb20) WITH es_row_no-row_id e_column-fieldname. ENDIF. ENDMETHOD. ENDCLASS.2. 이벤트 등록
SET HANDLER를 하지 않으면 메서드가 있어도 이벤트는 절대 실행되지 않는다.
SET HANDLER <클래스명>=><메서드명> FOR <이벤트를 일으키는 ALV객체>.MODULE init_alv OUTPUT. IF go_cont IS INITIAL. ... " 이벤트 등록 " SET HANDLER lcl_event_handler=>on_double_click FOR go_alv. CALL METHOD go_alv->set_table_for_first_display EXPORTING i_structure_name = 'SBOOK' is_layout = gs_layout CHANGING it_outtab = gt_data it_fieldcatalog = gt_fcat EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4. ENDIF. ENDMODULE.※ ALV 이벤트에서 CLASS-METHODS를 쓰는 이유
- SET HANDLER 클래스=>메서드
- 객체를 생성하지 않음
- 따라서 static 메서드만 가능
ALV에서 자주 쓰는 이벤트들
이벤트 용도 double_click 행 더블클릭 hotspot_click 핫스팟 클릭 toolbar 툴바 버튼 추가 user_command 툴바 버튼 클릭 button_click 셀 버튼 클릭 before_user_command 표준 버튼 제어
hotspot_click
핫스팟 설정되어 있는 필드의 값을 클릭했을 때 해당 이벤트 로직이 실행된다.
CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING es_row_no e_column_id. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD on_hotspot_click. MESSAGE i004(zmcb20) WITH 'Hotspot' e_column_id-fieldname. ENDMETHOD. ENDCLASS.
toolbar
AVL의 어플리케이션 툴바에 버튼을 추가한다.

CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD on_toolbar. DATA ls_button TYPE stb_button. ls_button-butn_type = 3. INSERT ls_button INTO TABLE e_object->mt_toolbar. CLEAR ls_button. ls_button-function = 'CUSTOM_TB'. ls_button-icon = icon_flight. ls_button-quickinfo = 'This is tooltip'. ls_button-butn_type = 0. ls_button-text = 'flight'. INSERT ls_button INTO TABLE e_object->mt_toolbar. ENDMETHOD. ENDCLASS.
user_command
어플리케이션 툴바에 추가로 생성한 버튼에 대해 이벤트를 처리하기 위해 사용된다.
e_ucomm 변수에 클릭한 버튼의 Function Code가 들어간다.
*&---------------------------------------------------------------------* *& Include ZPROGB20_0029_C01 *&---------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD on_user_command. DATA: lv_row TYPE i, lv_col TYPE i. CASE e_ucomm. WHEN 'CUSTOM_TB'. CALL METHOD go_alv->get_current_cell IMPORTING e_row = lv_row e_col = lv_col. MESSAGE 'row: ' && lv_row && ', col: ' && lv_col TYPE 'I'. WHEN 'SHOW_BOOK'. MESSAGE 'Show-book 클릭되었습니다.' TYPE 'I'. WHEN OTHERS. ENDCASE. ENDMETHOD. ENDCLASS.
button_click
버튼이 있는 컬럼 필드가 있을 때 클릭 이벤트를 구현하기 위해 사용된다.
*&---------------------------------------------------------------------* *& Include ZPROGB20_0029_C01 *&---------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_button_click FOR EVENT button_click OF cl_gui_alv_grid IMPORTING es_row_no es_col_id. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD on_button_click. IF es_col_id-fieldname = 'DISPLAY_BOOKINGS'. READ TABLE gt_data INTO gs_data INDEX es_row_no-row_id. MESSAGE gs_data-class TYPE 'I'. ENDIF. ENDMETHOD. ENDCLASS.
before_user_command
툴바 버튼을 클릭했을 때 실제 동작을 하기 전에 미리 검사하거나 밑작업이 필요할 때 사용된다.
(실제 클릭 이벤트가 시작되기 전에 입력값 검증이나 데이터 동기화 등 작업을 처리할 수 있다.)
*&---------------------------------------------------------------------* *& Include ZPROGB20_0029_C01 *&---------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD on_before_user_command. CASE e_ucomm. WHEN go_alv->mc_fc_detail. CALL METHOD go_alv->set_user_command EXPORTING i_ucomm = 'SHOW_BOOK'. WHEN OTHERS. ENDCASE.. ENDMETHOD. ENDCLASS.
ALV 데이터 선택관련 메서드
메서드 설명 주요 기능 get_current_cell 현재 셀의 좌표와 값을 반환 사용자가 현재 클릭하거나 선택하고 있는 단일 셀의 행/열 위치와 데이터를 가져옴. get_selected_cells 선택된 셀들의 좌표와 값들을 반환 그리드에서 드래그 등으로 선택된 여러 개의 셀 정보를 한꺼번에 가져옴. get_selected_columns 선택된 열(Column)들의 이름을 반환 사용자가 상단 헤더를 클릭하여 선택한 열의 이름(필드명) 리스트를 가져옴. get_selected_rows 선택된 행(Row)들의 번호를 반환 왼쪽 행 선택기를 통해 선택된 행 번호(Index) 리스트를 가져옴. get_subtotals ALV 그리드 컨트롤의 현재 소계(Subtotal)를 가져옴 현재 화면에 계산되어 표시되고 있는 부분 합계 데이터를 추출. set_toolbar_interactive 툴바 이벤트를 트리거(발생) 프로그램적으로 ALV 툴바의 버튼 상태를 변경하거나 이벤트를 다시 호출할 때 사용. set_user_command 현재 사용자 명령(User Command)을 덮어씀. 툴바 버튼 클릭 시 수행될 **커스텀 동작(Function Code)**을 강제로 설정하거나 변경. 'SAP > ABAP' 카테고리의 다른 글
[ABAP] #27 프로그램 호출과 데이터 전달 (0) 2026.01.10 [ABAP] #26 ALV Container (1) 2026.01.10 [ABAP] #24 Report Program - ALV (3) (0) 2026.01.10 [ABAP] #23 Report Program - ALV (2) (1) 2026.01.05 [ABAP] #22 Report Program - ALV (1) (0) 2026.01.04