ALV DataChange 事件
2013-06-28 19:57
344 查看
(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
-
8b4c
>handle_user_command FOR po_alv_grid (ALV的一个实列)
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
-
8b4c
>handle_user_command FOR po_alv_grid (ALV的一个实列)
相关文章推荐
- ALV Data_Changed事件应用一例
- ALV DataChange EVENT
- ALV DataChange EVENT
- ALV DataChange EVENT
- select onchange事件控制tr的显示或隐藏
- flash cs3 FileReference .onUploadCompleteData 事件侦听器
- ABAP_ALV_事件调用标准Tcode_ZMM1036
- JavaScript document.all 用法(oninput、onpropertychange事件的使用)
- ORA-01439: column to be modified must be empty to change datatype
- 第20章、OnCheckedChangeListener事件(从零开始学Android)
- 理解SQL Server变更数据捕获(Change Data Capture)
- Borland DataSnap(MIDAS)三层架构中,常用事件及其触发顺序(转)
- SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的区别及应用
- 图片上传时input file change事件多次触发解决
- 邮编栏置灰 被选元素的属性 attr() 和变更值事件 change()
- onchange事件与onpropertychange事件的区别
- GridView事件DataBinding,DataBound,RowCreated,RowDataBound区别及执行顺序分析(转)
- C#--SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的区别及联系
- asp.net关于onpropertychange和oninput事件实现代码
- <input type="file"> change事件异常处理办法