한 화면에 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 | IMPORTING에 sender를 반드시 추가 |
| 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 문법 기준으로 작성되었으며, 실제 시스템 환경/버전에 따라 결과가 다를 수 있습니다. 운영 시스템에 적용하기 전 개발 시스템에서 충분히 테스트하시기 바랍니다.
'ABAP 문법 & 기법' 카테고리의 다른 글
| [SAP ABAP] RFC 펑션 모듈 종류 — Normal · Remote-Enabled 차이와 선택 기준 (SE37) (0) | 2026.05.12 |
|---|---|
| [SAP ABAP] Function·Table 어디에 쓰이는지 찾는 법 — Where-Used 영향도 분석 (0) | 2026.05.12 |
| [SAP ABAP] 동적 TABLE & ITAB 생성하기 — RTTS(RTTI + RTTC) 활용 (0) | 2026.05.12 |
| [SAP ABAP] FTP·EDI 송신 시 BYTE 단위로 글자 수 맞추기 — CL_ABAP_LIST_UTILITIES 활용 (0) | 2026.05.12 |
| [SAP ABAP] AMDP 생성·호출 방법 — HANA DB 프로시저 가이드 (0) | 2026.05.08 |