본문 바로가기
ERP-SAP

<ABAP> 저장전, ALV 데이터가 변경되었는지 체크하는 방법

by 행복한워니의 기록 2013. 11. 26.
728x90
반응형

ALV 필드를 체인지 한 후에 CHANGE 클래스를 타려면 ENTER 를 치거나, 셀을 이동해야 한다....

 

그렇다면.. 유저가 데이터를 체인지 후, 셀이동이나 엔터를 안하고 바로 저장버튼을 누른다면....

 

당연히 셀이 바뀐 것을 인식하지 못한다.   아래 코드는 엔터나 셀이동시에 타는 로직인데, 그냥 저장하면 아래 로짓을

 

타지 않게 된다.. (아래 로직은 참고사항.. 범용적으로 쓰이니까..)

 

  *---------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_data_changed   <---- 선언
            FOR EVENT data_changed OF cl_gui_alv_grid
            IMPORTING er_data_changed.
    METHODS handle_f4
            FOR EVENT onf4 OF cl_gui_alv_grid
            IMPORTING e_fieldname es_row_no er_event_data et_bad_cells.
    METHODS handle_hotspot_click
            FOR EVENT hotspot_click OF cl_gui_alv_grid
            IMPORTING e_row_id e_column_id es_row_no.
    METHODS handle_toolbar
            FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object e_interactive.
    METHODS handle_user_command
            FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm.

ENDCLASS.                    "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.
    PERFORM data_changed USING er_data_changed.   <-- 여길 타게 되지요.. (셀 이동이나 엔터 쳤을 때.
  ENDMETHOD.                    "handle_data_changed

 

  FORM data_changed USING  rr_data_changed TYPE REF TO
                                         cl_alv_changed_data_protocol.

  DATAls_mod_cells TYPE lvc_s_modi.
  DATAlv_bisdat    TYPE sy-datum.
  DATAlv_ticket_no TYPE zeticket_no.

  LOOP AT rr_data_changed->mt_good_cells INTO ls_mod_cells.

    CASE ls_mod_cells-fieldname.
* 종료일
      WHEN  'BISDAT'.
        CALL METHOD rr_data_changed->get_cell_value
          EXPORTING
            i_row_id    ls_mod_cells-row_id
            i_fieldname ls_mod_cells-fieldname
          IMPORTING
            e_value     lv_bisdat.

        CALL METHOD rr_data_changed->get_cell_value
          EXPORTING
            i_row_id    ls_mod_cells-row_id
            i_fieldname 'TICKET_NO'
          IMPORTING
            e_value     lv_ticket_no.

        it_basic-x_upd 'X'.
        it_basic-bisdat lv_bisdat.
        MODIFY it_basic TRANSPORTING  x_upd bisdat WHERE ticket_no lv_ticket_no.

        gv_changed 'X'.
    ENDCASE.
  ENDLOOP.
ENDFORM.                               " data_changed

 

 

 

그렇다면.. 저장전에 데이터가 체인지 되었는지를 한번 더 타면 되는데.

 

위 로직을 그대로 갖다 쓸 수는 없고.. ALV 에서 체크하는 구문이 있다.

 

바로 아래 구문이다. 체크한 곳만 보기

 

  *&---------------------------------------------------------------------*
*&      Form  SAVE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM save_data .

  CLEAR gv_changed.
  gv_dest zcl_fs_bsp_common_service=>get_rfc_destination'RETAIL' ).
* 데이터 저장

*---------------------------아래가 데이터 체인지 체크하는 곳이다 *---
**  IF g_cocd = 'J100'.        "국내
  DATA lv_valid TYPE char01,
       LV_REFRESH TYPE CHAR01.

  CALL METHOD g_grid1->check_changed_data     " 이 구문을 타면, 위에 HANDEL DATA CHAGNE 를
    IMPORTING                                 "타는 것과 똑같은 효과를 낸다. 이것만 넣어라.
      e_valid   lv_valid
    CHANGING
      c_refresh LV_REFRESH.

*-------------------------------------데이터 체인지 체크 완료 *--------
  PERFORM save_data_db.    " ON COMMIT.

ENDFORM.                    " SAVE_DATA

 

 

 

 

이러면... 필드이동이나 엔터 이벤트가 발생하지 않아도 바뀐 필드를 가져오게 된다.

 

 

 

728x90
반응형