ALV DataChange 事件

本文详细介绍了在ABAP中如何定义和实现ALV Grid的数据更改事件处理过程,包括事件定义、触发方式设置、修改信息获取及具体处理逻辑,确保数据更新的有效性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1) 首先得在XXXC01里面定义一个事件。 如:

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.

(2) 定义 类之后 得实现 如:

CLASS lcl_event_receiver IMPLEMENTATION.
.
METHOD handle_user_command.

 PERFORM handle_data_changed
               USING er_data_changed.

ENDMETHOD.

ENDCLASS.

(3) 设置完 data_changed事件之后 必须得设置 通过什么方式来触发 有两种可以选择 如下:

  1. 通过按回车键 触发
    CALL METHOD po_alv_grid->register_edit_event
    EXPORTING
    i_event_id =cl_gui_alv_grid=>mc_evt_enter.

  2. 通过单元格失去焦点 触发
    CALL METHOD
    po_alv_grid->register_edit_event
    EXPORTING
    i_event_id =cl_gui_alv_grid=> mc_evt_modified.

  3. 设置全局编辑设置 就是 LAYOUT编辑

    CALL METHOD po_alv_grid->set_ready_for_input
    EXPORTING
    i_ready_for_input = 1.

(4) 为了获取ALV里字段修改的一些信息,DATA_CHANGED事件会把参考CL_ALV_CHANGED_DATA_PROTOCOL创建的实列通过参数 ER_DATA_CHANGED 传递给 ALV, 通过这个参数 可以知道哪些单元格被修改了,修改了什么值。

(5) 实现 第(2)步骤中调用的子程序。

FORM handle_data_changed USING
p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

”声明 LVC_S_MODI 类型的 数据对象。(结构类型)
DATA: ls_lvc_modi TYPE lvc_s_modi.
”声明 LVC_T_MODI 类型的 数据对象。(表类型)
DATA: mod_data TYPE lvc_t_modi.
”调用方法 mt_mod_cells 来获取改变数据的信息(获取的为表类型)
mod_data =
p_er_data_changed->mt_mod_cells.
”调用方法 mt_mod_cells 来获取改变数据的信息 循环获取的表
LOOP AT p_er_data_changed->mt_mod_cells INTO ls_lvc_modi.
” 读取 修改单元格 所在的行 (读取的是 内表)
READ TABLE gt_list INDEX ls_lvc_modi-row_id.
” 如果 读取成功 并且 标志不是创建行的标志
IF sy-subrc = 0 AND gt_list-ind <> gc_c.
” 设置该行的标志为 数据更新的标志
gt_list-ind = gc_u.
gt_c_boolean = ‘x’.
ENDIF.
ENDLOOP.

” 读取 修改行的信息表的 price字段的值
LOOP AT mod_data INTO wa_mod_data WHERE fieldname = ‘PRICE’.

DATA lv_price TYPE sflight-price.

” 如果修改的值 大于500 则 增加日志记录。并弹出错误消息
IF wa_mod_data-value > 500.
CALL METHOD p_er_data_changed->add_protocol_entry
EXPORTING
i_msgid = ‘00’
i_msgty = ‘E’
i_msgno = ‘001’
i_msgv1 = ‘长度不能大于500’
i_fieldname = wa_mod_data-fieldname.
ELSE.
" 调用方法获取 单元格的值
CALL METHOD p_er_data_changed->get_cell_value
EXPORTING
i_row_id = wa_mod_data-row_id
i_fieldname = ‘PRICE’
IMPORTING
e_value = lv_price.
“ 修改内表的值
gt_list-price = lv_price.
MODIFY gt_list INDEX wa_mod_data-row_id.
ENDIF.
ENDLOOP.
ENDFORM.

(5) 创建 事件的 实列 如下:

DATA event_receiver TYPE REF TO lcl_event_receiver.

CREATE OBJECT event_receiver.

SET HANDLER event_receiver
->handle_user_command FOR po_alv_grid (ALV的一个实列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值