ABAP 監聽ALV的data_changed事件 獲取數據的更新、新增、刪除
在使用 CL_GUI_ALV_GRID 的 check_changed_data 獲取ALV中數據的變化時,往往無法獲取所要的數據,如將原有的值刪除后,原值依然存在在內表中。這里我們可以使用事件監聽的方式來獲取到ALV數據的詳細的改變信息。
創建監聽類,並實例化: DATA: event_receiver TYPE REF TO lcl_event_receiver.
lcl_event_receiver的內容如下:
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
DATA: ucomm TYPE sy-ucomm.
METHODS handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
PRIVATE SECTION.
ENDCLASS. "lcl_event_receiver DEFINITION
*......................................................................*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_data_changed.
PERFORM data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
這里只是定義了一個方法,用來監聽數據變更事件
FORM data_changed USING p_er_data_changed
TYPE REF TO cl_alv_changed_data_protocol.
DATA : l_tabix TYPE sy-tabix .
DATA : ls_row TYPE ty_data .
DATA : ls_data TYPE ty_data .
FIELD-SYMBOLS: <f_data> LIKE LINE OF gt_data.
FIELD-SYMBOLS: <f_value> TYPE lvc_s_modi-value .
FIELD-SYMBOLS: <f_field> TYPE ANY .
DATA : ls_modi TYPE lvc_s_modi .
SORT gt_data by acttx1
acttx2
acttx3 .
* 這里將無法捕捉到的變更的數據,更新至內表
LOOP AT p_er_data_changed->mt_good_cells INTO ls_modi .
READ TABLE gt_data ASSIGNING <f_data> INDEX ls_modi-row_id .
ASSIGN ls_modi-value To <f_value> .
ASSIGN COMPONENT ls_modi-fieldname OF STRUCTURE <f_data> TO <f_field> .
IF sy-subrc EQ 0 .
<f_field> = <f_value> .
ENDIF.
ENDLOOP.
* FIELD-SYMBOLS: <f_mod_rows> TYPE table .
* ASSIGN p_er_data_changed->mp_mod_rows->* TO <f_mod_rows> .
*
* LOOP AT <f_mod_rows> INTO ls_row .
*
* LOOP AT gt_data INTO ls_data WHERE actid EQ ls_row-actid.
*
* l_tabix = sy-tabix .
*
* MODIFY gt_data FROM ls_row INDEX l_tabix .
*
* ENDLOOP.
*
* CLEAR ls_row .
*
*ENDLOOP.
ENDFORM. " data_changed
通過調試你會發現cl_alv_changed_data_protocol類中有你所想要的絕大多數有關ALV數據變更的內容,這里不一一闡述,說及這個類,一看便知!
