您的位置:首页 > 其它

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的一个实列)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  abap