(1) 首先得在XXXC01里面定义一个事件。 如:
CLASS lcl_event_receiver
DEFINITION
.
METHODS : handle_data_changed
IMPORTING er_data_changed
.
ENDCLASS
.
(2) 定义 类之后 得实现 如:
CLASS lcl_event_receiver
IMPLEMENTATION
.
.
METHOD handle_user_command .
.
METHOD handle_user_command .
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.
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.
DATA: mod_data TYPE lvc_t_modi.
”调用方法 mt_mod_cells 来获取改变数据的信息(获取的为表类型)
mod_data =
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 .
” 调用方法 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 .
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 .
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 .
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的一个实列)