본문 바로가기
ABAP 문법 & 기법

[SAP ABAP] 여러 GRID에서 공통 CLASS EVENT 사용하기 — FOR ALL INSTANCES + SENDER

by Song.sh 2026. 5. 12.

한 화면에 ALV Grid를 두 개 이상 띄워놓고, 각 그리드에 더블 클릭이나 툴바 같은 같은 이벤트를 동일하게 동작시켜야 하는 상황이 종종 있습니다. 예를 들어 위쪽 그리드에서 구매 문서를 더블클릭하면 상세 라인을 아래 그리드에 채우거나, 두 그리드 모두에서 사용자 정의 버튼을 동작시키는 경우죠.

 

이때 각 그리드마다 핸들러를 따로 등록해도 되지만, ABAP은 FOR ALL INSTANCES 옵션 하나로 같은 클래스 이벤트를 모든 인스턴스에 한 번에 적용할 수 있게 해줍니다.


핵심 차이 — FOR g_grid vs FOR ALL INSTANCES

구문 적용 범위
SET HANDLER ... FOR g_grid 지정한 특정 그리드 인스턴스에서 발생한 이벤트만 처리
SET HANDLER ... FOR ALL INSTANCES 해당 클래스(cl_gui_alv_grid)의 모든 인스턴스에서 발생한 이벤트를 한 번에 처리

여러 그리드에서 똑같이 동작해야 하는 이벤트는 FOR ALL INSTANCES, 특정 그리드에만 붙어야 하는 이벤트는 FOR g_grid 식으로 섞어 쓰면 됩니다.


1) 이벤트 등록부 — CREATE_EVENT

FORM create_event.

  lo_class = NEW #( ).

  " FOR ALL INSTANCES를 사용하면
  " EVENT를 공통으로 쓸 그리드에 전체 EVENT 적용을 시킬 수 있다.
  SET HANDLER lo_class->handle_double_click FOR ALL INSTANCES.

  " 특정 그리드(g_grid2)에만 붙이는 이벤트
  SET HANDLER lo_class->handle_toolbar      FOR g_grid2.
  SET HANDLER lo_class->handle_usercommand  FOR g_grid2.
  SET HANDLER lo_class->handle_datachanged  FOR g_grid2.

  g_grid2->set_ready_for_input(
    EXPORTING i_ready_for_input = 1 ).

  g_grid2->register_edit_event(
    EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter ).

  g_grid2->register_edit_event(
    EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
ENDFORM.

핵심은 첫 번째 줄, SET HANDLER lo_class->handle_double_click FOR ALL INSTANCES입니다. 이 한 줄로 g_grid, g_grid2 어느 그리드에서 더블 클릭이 발생해도 똑같이 handle_double_click이 호출됩니다.


2) 이벤트 핸들러 클래스 — sender 파라미터가 핵심

여러 그리드에서 같은 이벤트를 받으면, 핸들러 안에서 "어느 그리드에서 발생한 이벤트인지" 구분할 수 있어야 합니다. 이때 사용하는 게 표준 이벤트의 sender 파라미터입니다.

CLASS lcl_event_receiver DEFINITION.

  " 여러 그리드에 같은 event를 사용하고 싶다면
  " IMPORTING에 sender를 추가해준다.
  PUBLIC SECTION.
    METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column es_row_no sender.

    METHODS handle_toolbar      FOR EVENT toolbar      OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.

    METHODS handle_usercommand  FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.

    METHODS handle_datachanged  FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed e_ucomm.
ENDCLASS.


CLASS lcl_event_receiver IMPLEMENTATION.

  " 하나의 event를 여러 grid에서 사용할 수 있음
  METHOD handle_double_click.

    CASE sender.
      WHEN g_grid.
        DATA(ls_ekpo) = gt_ekpo[ e_row-index ].
      WHEN g_grid2.
        DATA(ls_data) = gt_data[ e_row-index ].
    ENDCASE.

  ENDMETHOD.

  METHOD handle_toolbar.
    PERFORM handle_toolbar USING e_object e_interactive.
  ENDMETHOD.

  METHOD handle_usercommand.
    PERFORM handle_usercommand USING e_ucomm.
  ENDMETHOD.

  METHOD handle_datachanged.
    PERFORM handle_datachanged USING er_data_changed e_ucomm.
  ENDMETHOD.
ENDCLASS.

DATA : lo_class TYPE REF TO lcl_event_receiver.

체크포인트는 세 줄입니다.

위치 핵심
DEFINITION IMPORTINGsender를 반드시 추가
IMPLEMENTATION CASE sender.로 그리드별 분기 처리
SET HANDLER 공통은 FOR ALL INSTANCES, 개별은 FOR g_gridN

sender는 SAP 표준이 정의한 이벤트 파라미터라서 임의의 이름이 아닙니다. 이벤트 시그니처에 있는 파라미터를 받기만 하면 SAP이 자동으로 "이 이벤트가 발생한 인스턴스 레퍼런스"를 채워 줍니다.


결과 확인

좌측의 작은 그리드와 우측의 큰 그리드 양쪽 모두에서 더블 클릭이 동일하게 동작합니다. handle_double_click 안의 CASE sender에서 어느 그리드인지를 가려내고, 각각의 내부 테이블(gt_ekpo / gt_data)에서 해당 행을 꺼내 처리합니다.


어떤 상황에 쓰면 좋은가

상황 활용
마스터/디테일 화면 상단 헤더 ALV에서 더블 클릭 → 하단 디테일 ALV 갱신
좌·우 분할 ALV 한쪽에서 선택한 행을 다른 쪽으로 이동 / 매핑
같은 핸들러로 N개 그리드 묶기 탭별로 ALV가 여러 개 떠 있고, 모두 같은 더블 클릭 정책을 적용
공통 핸들러 + 개별 핸들러 혼합 더블 클릭은 공통, 툴바·USER_COMMAND·DATA_CHANGED는 특정 그리드에만

주의사항

포인트 설명
모든 인스턴스에 적용된다 의도치 않은 그리드(서브 화면, 팝업 ALV 등)에도 이벤트가 걸릴 수 있으니, 핸들러 안에서 CASE sender로 명확히 분기
sender 누락 시 분기 불가 DEFINITION에 sender를 빠뜨리면 어느 그리드에서 발생한지 알 수 없어, 같은 로직만 반복 실행됨
편집 가능 이벤트는 별도 등록 register_edit_event(ENTER / MODIFIED 등)는 그리드 인스턴스별로 따로 호출해야 함
해제도 같은 방식으로 필요 시 SET HANDLER ... FOR ALL INSTANCES ACTIVATION space로 해제 가능

요약

단계 해야 할 일
1. 핸들러 클래스 선언 IMPORTING ... sender 빠뜨리지 않기
2. 핸들러 구현 CASE sender로 그리드별 분기
3. 공통 이벤트 등록 SET HANDLER ... FOR ALL INSTANCES
4. 개별 이벤트 등록 특정 그리드에만 붙일 이벤트는 FOR g_gridN

FOR ALL INSTANCES는 그리드가 늘어날 때마다 SET HANDLER 줄을 N번씩 복붙하지 않아도 되게 해주는, 의외로 손이 자주 가는 옵션입니다. 공통 정책 이벤트는 FOR ALL INSTANCES로, 그리드별 특수 동작은 FOR g_gridN으로 분리해서 등록하는 패턴을 기본 골격으로 잡아두면 유지보수가 훨씬 깔끔해집니다.


본 글은 SAP 표준 ABAP 문법 기준으로 작성되었으며, 실제 시스템 환경/버전에 따라 결과가 다를 수 있습니다. 운영 시스템에 적용하기 전 개발 시스템에서 충분히 테스트하시기 바랍니다.