ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ABAP] #25 ALV의 Event Class
    SAP/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
Designed by Tistory.