ALV DataChange 事件

(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  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、付费专栏及课程。

余额充值