可编辑字段较少时,可采用循环内表的方式逐个检查;当字段较多时,就比较繁琐了。可采用ooalv中类CL_ALV_CHANGED_DATA_PROTOCOL属性MP_MOD_ROWS
具体代码如下
*----------------------------------------------------------------------*
* 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.
ENDCLASS. "lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
*--DATA_CHANGED
METHOD handle_data_changed.
PERFORM handle_data_changed CHANGING er_data_changed.
ENDMETHOD. "HANDLE_CHANGED_DATA
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form handle_data_changed
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM handle_data_changed CHANGING ir_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA: ls_mod_cell TYPE lvc_s_modi,
lt_mod_cell TYPE lvc_t_modi.
FIELD-SYMBOLS : <ls_mod_row> TYPE type_line,
<lt_mod_row> TYPE tab_type_line.
ASSIGN ir_data_changed->mp_mod_rows->* TO <lt_mod_row>.
IF <lt_mod_row> IS ASSIGNED AND <lt_mod_row> IS NOT INITIAL. "判断是否有更改
LOOP AT ir_data_changed->mt_mod_cells INTO ls_mod_cell.
READ TABLE <lt_mod_row> ASSIGNING <ls_mod_row> INDEX ls_mod_cell-tabix.
IF sy-subrc = 0 AND <ls_mod_row>-flag = ''.
<ls_mod_row>-flag = 'X'.
ls_mod_cell-fieldname = 'FLAG'.
ls_mod_cell-value = 'X'.
APPEND ls_mod_cell TO lt_mod_cell.
ENDIF.
CLEAR ls_mod_cell.
ENDLOOP.
IF lt_mod_cell[] IS NOT INITIAL.
SORT lt_mod_cell.
DELETE ADJACENT DUPLICATES FROM lt_mod_cell COMPARING ALL FIELDS.
APPEND LINES OF lt_mod_cell TO ir_data_changed->mt_mod_cells.
ENDIF.
ir_data_changed->mt_good_cells[] = ir_data_changed->mt_mod_cells[].
ENDIF.
ENDFORM. "handle_data_changed