加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ABAP ALV检查单元格更新数据和字段有效性和错误检查

(2016-06-03 09:44:58)
标签:

abap

alv

bapi

it

分类: sapalv

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有