可编辑ALV字段更新检查

来源:互联网 发布:好看的单眼皮女生知乎 编辑:程序博客网 时间:2024/06/05 20:01

可编辑字段较少时,可采用循环内表的方式逐个检查;当字段较多时,就比较繁琐了。可采用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.
  DATAls_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 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

0 0
原创粉丝点击