ABAP ALV检查单元格更新数据

来源:互联网 发布:台达人机界面编程 编辑:程序博客网 时间:2024/06/05 21:01

ABAP ALV检查单元格更新数据

将ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,而我们只更新了少量的单元格数据,这样检查显得非常的麻烦,而且效率低下

在ALV OO中我们可以通过DATA_CHANGE事件得到被修改的单元格的信息,利用这些信息我们可以很方便的对所填数据做检查,别且可以给用户相应的错误提示,以及自动修改单元格数据

1.       我们需要在处理事件的类中添加一个处理DATA_CHANGE事件的方法

Eg:

CLASS lcl_alv_receiver DEFINITION DEFERRED.

 

CLASS lcl_alv_receiver DEFINITION.

PUBLIC SECTION.

    ……..

    METHODS:

    handle_data_changed

        FOR EVENT data_changed OF cl_gui_alv_grid

            IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.

ENDCLASS.                    "lcl_event_receiver DEFINITION

 

2.       初始化ALV后为lcl_alv_receiver类注册一个DATA_CHANGED事件

Eg:

CALL METHOD g_grid->set_table_for_first_display

    EXPORTING

      i_save          = x_save

      is_variant     = ls_layout

      is_layout       = is_layout

    CHANGING

      it_fieldcatalog = it_fieldcat

      it_outtab       = lt_zqsdmx[].

SET HANDLER g_alv_application->handle_data_changed FOR g_grid.

CALL METHOD g_grid->register_edit_event “注册更新事件

    EXPORTING

      i_event_id = cl_gui_alv_grid=>mc_evt_enter .

其中i_event_id = cl_gui_alv_grid=>mc_evt_enter 表示在单元格修改后回车或者执行其他操作时触发事件,此类型可用于多个单元格修改后一起检查修改的值

i_event_id = cl_gui_alv_grid=>mc_evt_modified 表示单光标焦点移开被修改单元格后既触发事件,此类型可用于每个每个单元个的实时更新检查

3.实现lcl_alv_receiver类的handle_data_changed方法,其中一些常用的一些属性方法我会在后附表列出

Eg:

CLASS lcl_alv_receiver IMPLEMENTATION.

METHOD handle_toolbar.

    METHOD handle_data_changed.

    PERFORM. handle_data_changed USING er_data_changed.

ENDMETHOD.                    "handle_data_changed

ENDCLASS.               "lcl_ALV_event_receiver

 

*&---------------------------------------------------------------------*

*&      Form handle_data_changed

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_ER_DATA_CHANGED text

*----------------------------------------------------------------------*

FORM. handle_data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

*如果更新的reason字段长度小于10为则提示用户填入字符数不能低于10

DATA:mod_data TYPE lvc_t_modi,

       wa_mod_data TYPE lvc_s_modi.

mod_data = p_er_data_changed->mt_mod_cells.

LOOP AT mod_data INTO wa_mod_data WHERE fieldname = 'ZRESON'.

    IF STRLEN( wa_mod_data-value ) < 10.

      CALL METHOD p_er_data_changed->add_protocol_entry

        EXPORTING

          i_msgid     = '00'

          i_msgty     = 'E'

          i_msgno     = '001'

          i_msgv1     = '长度必须大于10 '

          i_fieldname = wa_mod_data-fieldname.

 

*如果长度小于10,则将字段内容更新为长都无法确定

      CALL METHOD p_er_data_changed->modify_cell

        EXPORTING

          i_row_id    = wa_mod_data-row_id

          i_fieldname = wa_mod_data-fieldname.

    ENDIF.

ENDLOOP.

ENDFORM.                    " handle_data_changed