alv回车_CQ-OO 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. \

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. \ ENDCLASS. \

*&---------------------------------------------------------------------* *& 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. \ 附:

DATA_CHANGED 事件ER_DATA_CHANGED参数的常用方法和属性一览表 方法

名称 modify_cell add_protocol_entry protocol_is_visible 用途 修改指定位置单元格的值 弹出一个消息,必须使用系统标准的消息类 是否显示错误信息提示 refresh_protocol 属性 名称 MT_MOD_CELLS MP_MOD_ROWS MT_GOOD_CELLS 删除错误消息 用途 更新的单元格信息 更新的行信息 更新的单元格信息,系统按照标准格式对字段内容转换后的值 MT_DELETED_ROWS 被删除的行信息 MT_INSERTED_ROWS 新插入的行信息

二、回车后控制数据变化(网上)

6. 控制数据变化

我们可以设置alv处于可编辑状态,当然ALV也提供给我们控制数据的输入。Alv grid

有两个事件:data_changed和data_changed_finished.第一个事件在可编辑字段的数据发生变化时触发,可用来检查数据的输入,第二个事件是当数据修改完成后触发。

我们可以通过方式REGISTER_EDIT_EVENT来设置,如何触发数据改变事件.2种方式:

1.按回车触发: i_event_id = cl_gui_alv_grid=>mc_event_enter 2.单元格失去焦点: i_event_id = cl_gui_alv_grid=>mc_event_modifies

必须设置一种方式,要不然数据变化事件不会被触发.

为了获取ALV里字段修改的一些信息,DATA_CHANGED事件会把参考

CL_ALV_CHANGED_DATA_PROTOCOL创建的实例通过参数ER_DATA_CHANGED传递给ALV.通过这个参数我们可以知道哪些单元格被修改了,修改了什么值.下面是类CL_ALV_CHANGED_DATA_PROTOCOL的一些方法: Get_cell_value Modify_cell Add_protocol_entry Protocol_is_visible Refresh_protocol 通过这个类的属性,我们可以查到一些修改信息: MT_MOD_CELLS MT_MOD_ROWS MT_GOOD_CELLS MT_DELETED_ROWS Contains address of modified cells with rowed and field name Contain modified rows Its type is genric Contain cells have proper values Contain rows deleted from the list 获取单元格的值 修改单元格 增加日志记录 是否允许错误表可见 刷新日志记录 MT_INSERTED_ROWS

下面是一段示例代码:

Contain rows deleted from the list 通过上述一系列方式和属性,可以获取修改的值,而进行一些输入的检查.

FORM handle_data_changed USING ir_data_changed

TYPE REF TO cl_alv_changed_data_protocol. DATA: ls_mod_cell TYPE lvc_s_modi, Lv_value TYPE lvc_value.

SORT ir_data_changed->mt_mod_cells BY row_id. LOOP AT ir_data_changed->mt_mod_cells INTO ls_mod_cell

WHERE fieldname = 'SEATSMAX'.

CALL METHOD ir_data_changed->get_cell_value EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = 'CARRID' IMPORTING e_value = lv_value.

IF lv_value = 'THY' AND ls_mod_cell-value > '500'. CALL METHOD ir_data_changed->add_protocol_entry EXPORTING I_msgid = 'SU' I_msgno = '000' I_msgty = 'E'

I_msgv1 = 'This number can not exceed 500 for ' I_msgv2 = lv_value

I_msgv3 = 'The value is et to ''500''' I_fieldname = ls_mod_cell-fieldname I_row_id = ls_mod_cell-rowid.

CALL METHOD ir_data_changed->modify_cell EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = ls_mod_cell-fieldname I_value = '500'. ENDIF. ENDLOOP. ENDFORM.

三、新增行项目,回车后根据KEY带出其他字段值(自己实践 ZMMRP099)

定义,实现,注册方法和事件

CLASS cl_grid_event 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. \

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

* CLASS cl_grid_event IMPLEMENTATION

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

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

CLASS cl_grid_event IMPLEMENTATION.

METHOD handle_data_changed.\修改后事件扑捉

PERFORM handle_data_changed USING er_data_changed . ENDMETHOD. \ ENDCLASS. \

注册方法:

SET HANDLER cl_grid_eventobj->handle_data_changed FOR grid1. CALL METHOD grid1->register_edit_event \注册更新事件 EXPORTING

i_event_id = cl_gui_alv_grid=>mc_evt_enter.

实现方法里的子函数PERFORM handle_data_changed USING er_data_changed . *&---------------------------------------------------------------------*

*& Form HANDLE_DATA_CHANGED

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

* text

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值