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数据变更的内容,这里不一一阐述,说及这个类,一看便知!