[SALV] 7탄: 나만의 기능 구현, 툴바 버튼 추가 및 이벤트 핸들링

2026. 4. 9.
SAP ABAP SALV 시리즈 7탄. 표준 툴바를 넘어 사용자 정의 버튼을 추가하고, 이를 클릭했을 때 작동하는 전용 로직을 구현하는 방법을 상세히 다룹니다.
 

CONTENTS: SALV 7탄 - 툴바 버튼 추가 및 기능 구현

    1. 실무 적용 코드 예시 (Custom Toolbar Button)

    
    " 1. 아이콘 상수를 사용하기 위한 선언
    TYPE-POOLS: icon.
    
    " 2. 데이터 선언 (전역 변수)
    DATA: gt_flight TYPE TABLE OF sflight.
    DATA: go_alv    TYPE REF TO cl_salv_table.
    
    " -----------------------------------------------------------------------
    " 3. 이벤트 핸들러 클래스 정의 (Definition)
    " -----------------------------------------------------------------------
    CLASS lcl_event_handler DEFINITION.
      PUBLIC SECTION.
        METHODS:
          on_user_command FOR EVENT added_function OF cl_salv_events_table
            IMPORTING e_salv_function.
    ENDCLASS.
    " -----------------------------------------------------------------------
    " 4. 메인 실행 로직 (START-OF-SELECTION)
    " -----------------------------------------------------------------------
    START-OF-SELECTION.
    
      " 1. BACK 버튼 버그 방지용 더미 화면 생성 (매우 중요!)
      WRITE: space.
    
      " 데이터 준비
      SELECT * FROM sflight INTO TABLE @gt_flight UP TO 50 ROWS.
    
      TRY.
          " 2. 다시 컨테이너를 지정하여 Grid View 모드로 생성 (그래야 버튼 추가 오류가 안 납니다)
          cl_salv_table=>factory(
            EXPORTING
              r_container    = cl_gui_container=>default_screen
            IMPORTING
              r_salv_table   = go_alv
            CHANGING
              t_table        = gt_flight
          ).
    
          " 툴바 기능 활성화
          DATA(lo_functions) = go_alv->get_functions( ).
          lo_functions->set_all( abap_true ).
    
          " 사용자 정의 버튼 추가 (이제 오류 없이 정상 작동합니다)
          TRY.
              lo_functions->add_function(
                name     = 'MY_FUNC'
                icon     = '@15@'
                text     = '실행버튼'
                tooltip  = '커스텀 로직 실행'
                position = if_salv_c_function_position=>right_of_salv_functions
              ).
            CATCH cx_salv_existing cx_salv_wrong_call.
          ENDTRY.
    
          " 이벤트 핸들러 등록 및 출력
          DATA(lo_handler) = NEW lcl_event_handler( ).
          DATA(lo_events)  = go_alv->get_event( ).
          SET HANDLER lo_handler->on_user_command FOR lo_events.
    
          go_alv->display( ).
    
        CATCH cx_root INTO DATA(lx_root).
          MESSAGE lx_root->get_text( ) TYPE 'E'.
      ENDTRY.
    
    " -----------------------------------------------------------------------
    " 5. 클래스 구현부 (Implementation) - 반드시 최하단!
    " -----------------------------------------------------------------------
    CLASS lcl_event_handler IMPLEMENTATION.
      METHOD on_user_command.
        CASE e_salv_function.
          WHEN 'MY_FUNC'.
            MESSAGE '사용자 정의 버튼 클릭 성공!' TYPE 'I'.
        ENDCASE.
      ENDMETHOD.
    ENDCLASS.
    

    2. 기술 상세 설명: SALV 툴바 제어의 메커니즘

    기존 Function 기반 ALV(REUSE_ALV_GRID_DISPLAY)에서는 툴바를 수정하기 위해 SE41(GUI Status)을 직접 복사하고 관리해야 하는 번거로움이 있었습니다. 하지만 SALV는 객체 지향 메서드인 add_function을 통해 프로그램 내부에서 동적으로 버튼을 생성하고 제어합니다.

    CL_SALV_FUNCTIONS_LIST 클래스의 역할

    이 클래스는 SALV 툴바의 모든 버튼과 기능을 관리하는 컨트롤 타워입니다. get_functions( ) 메서드를 통해 인스턴스를 가져오며, 주요 기능은 다음과 같습니다.

    • set_all( ): 정렬, 필터, 합계 등 모든 표준 기능을 한 번에 활성화/비활성화합니다.
    • add_function( ): 개발자가 원하는 ID와 아이콘을 가진 버튼을 툴바에 추가합니다.
    • remove_function( ): 특정 표준 기능이나 커스텀 기능을 툴바에서 제거합니다.

    3. 비즈니스 시나리오: 버튼 하나로 업무 자동화

    실무에서 커스텀 버튼은 단순한 클릭 이상의 가치를 지닙니다. 데이터 조회 후 후속 프로세스를 연결하는 '워크플로우의 허브' 역할을 하기 때문입니다.

    시나리오 A: 대량 전표 생성 및 BDC 처리

    영업 사원이 당일 판매 내역을 ALV로 조회한 후, 이상이 없는 내역을 다중 선택(Multiple Selection)합니다. 이후 툴바의 '전표 생성' 버튼을 누르면 내부적으로 BDC나 BAPI가 호출되어 수백 건의 회계 전표가 자동으로 생성되는 시나리오입니다. 이때 5탄에서 배운 이벤트 핸들링과 결합하여 강력한 시너지를 냅니다.

    시나리오 B: 외부 시스템으로 데이터 전송

    현재 리스트에 표시된 정보를 인터페이스 테이블로 전송하거나, 특정 API를 호출하여 타 시스템(Legacy)에 정보를 동기화하는 버튼을 구현할 수 있습니다. 사용자는 별도의 티코드(T-Code)를 실행할 필요 없이 ALV 화면 내에서 모든 작업을 끝낼 수 있습니다.

    4. 주의사항 및 트러블슈팅 (Q&A)

    툴바 구현 시 초보 개발자들이 가장 많이 겪는 오류와 해결 방안입니다.

    • 버튼이 보이지 않아요: add_function 호출 후 반드시 lo_alv->display( )가 호출되는지 확인하세요. 또한, 컨테이너 타입(Popup 등)에 따라 툴바가 제한적으로 표시될 수 있습니다.
    • 아이콘 이름 찾기: SAP 표준 아이콘의 이름과 코드는 티코드 'ICON'에서 확인할 수 있습니다. 텍스트 대신 @15@와 같은 시스템 코드를 사용하면 더 직관적인 툴바를 만들 수 있습니다.
    • Duplicate ID 에러: name 파라미터에 전달하는 버튼 ID는 프로그램 내에서 유일해야 합니다. 반복문 내에서 버튼을 추가하거나 재호출되는 로직이 있다면 TRY-CATCH로 예외 처리를 반드시 해주어야 합니다.