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.
DATA: ls_mod_cells TYPE lvc_s_modi.
DATA: lv_bisdat TYPE sy-datum.
DATA: lv_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
이러면... 필드이동이나 엔터 이벤트가 발생하지 않아도 바뀐 필드를 가져오게 된다.
'ERP-SAP' 카테고리의 다른 글
SAP 무료교육 SYNC ACADEMY~ 안하면 손해인거 같은디?! (9) | 2023.09.26 |
---|---|
<SAP 모듈> 각 모듈에 대한 설명 (0) | 2013.05.14 |