본문 바로가기
ABAP

ALV Data changed Event

by clode 2023. 2. 20.
728x90
반응형

사용자가 자재유형을 입력하고 엔터를 치거나 다른 곳을 클릭하면 자재번호와 자재유형명이 나오게 한다.

DATA_CHANGED
이 이벤트는 사용자가 ALV에서 값을 변경한다거나 어떤 행동을 한뒤 엔터를 치거나 다른 셀을 클릭하면 타는 이벤트이다.

클래스 정의

CLASS lcl_event DEFINITION.
  PUBLIC SECTION.
    METHODS : handler_data_changed
                  FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS.
CLASS lcl_event IMPLEMENTATION. 
  METHOD handler_data_changed.
    PERFORM data_changed  USING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
  ENDMETHOD.                    "handler_data_changed
ENDCLASS.       

이벤트 로직

FORM data_changed  USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol
                          e_onf4   TYPE  char01
                          e_onf4_before  TYPE  char01
                          e_onf4_after  TYPE char01
                          e_ucomm   TYPE sy-ucomm.

DATA: ls_mod_cells TYPE lvc_s_modi.

LOOP AT er_data_changed->mt_good_cells INTO ls_mod_cells.

기본적으로 이렇게 사용된다.

⭐ get_cell_value

  CASE ls_mod_cells-fieldname.
    WHEN  'MTART'. 
      CALL METHOD er_data_changed->get_cell_value
        EXPORTING
          i_row_id    = ls_mod_cells-row_id 
          i_fieldname = ls_mod_cells-fieldname
        IMPORTING
          e_value     = gs_tab-mtart.

get_cell_value는 변경된 값을 가져오는 메소드이다. 보통 이 메소드로 변경된 값을 가져오고, 변경된 값을 modify_cell 메소드를 사용해 ALV에 반영한다. 그래서 두개가 같이 사용되는 경우가 많다.

ls_mod_cells-row_id 변경된 행의 INDEX가 담긴다.
ls_mod_cells-fieldname 변경된 열(필드)의 이름이 담긴다.
e_value 변경된 값을 담는다.

 

⭐ modify_cell

      CALL METHOD er_data_changed->modify_cell
        EXPORTING
          i_row_id    = ls_mod_cells-row_id
          i_fieldname = 'MATNR'
          i_value     = gs_tab-matnr.

      CALL METHOD er_data_changed->modify_cell
        EXPORTING
          i_row_id    = ls_mod_cells-row_id
          i_fieldname = 'MTBEZ'
          i_value     = gs_tab-mtbez.

  ENDCASE.
ENDFORM.

(+)

 PERFORM MODIFY_CELL USING    LS_GOOD_CELL-ROW_ID
                              LS_GOOD_CELL-TABIX
                              LS_GOOD_CELL-FIELDNAME
                                       PR_DATA_CHANGED
                   CHANGING   GT_OUTTAB-KUNNR.


FORM MODIFY_CELL USING P_ROW_ID
                           P_TABIX
                           P_FIELDNAME
                           PR_DATA_CHANGED TYPE REF TO  CL_ALV_CHANGED_DATA_PROTOCOL
                  CHANGING P_VALUE.
  CALL METHOD PR_DATA_CHANGED->MODIFY_CELL
    EXPORTING
      I_ROW_ID    = P_ROW_ID
      I_TABIX     = P_TABIX
      I_FIELDNAME = P_FIELDNAME
      I_VALUE     = P_VALUE.
ENDFORM. "modify_cell                               

i_value 변경할 값을 말한다. gs_tab의 자재번호와 자재유형명에 담아준 값으로 변경된다.

핸들러 등록

다른 이벤트와 마찬가지로 핸들러를 등록해줘야 한다. 핸들러를 등록해주지 않으면 이벤트, 디버깅 아무것도 타지 않으니 주의하며 꼭!!!! 등록한다.

    CREATE OBJECT g_application.
    SET HANDLER g_application->handler_data_changed FOR g_alv.

데이터 변경시 바로 이벤트 타게함

alv display하기 전에 입력

  CALL METHOD g_alv->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified. 
728x90
반응형

'ABAP' 카테고리의 다른 글

ALV Top-of-Page  (0) 2023.02.21
ALV 특정 Cell EDIT  (0) 2023.02.21
ALV 툴바 버튼 Add & Exclude  (0) 2023.02.20
ALV 조회, 변경 mode  (0) 2023.02.20
유용한 날짜 function들  (0) 2023.02.20

댓글