ABAP - OOALV 数据修改同步到内表

  • OOALV在单元格编辑时数据发生了改变同步到程序的内表。
  • 主要依赖于cl_gui_alv_grid内置事件 data_changed实现
  1. 类的定义和实现
    CLASS cl_event DEFINITION.
      PUBLIC SECTION.
        METHODS handle_data_changed FOR EVENT data_changed
              OF cl_gui_alv_grid
          IMPORTING
              er_data_changed.
    ENDCLASS.
    
    CLASS cl_event IMPLEMENTATION.
    
      METHOD handle_data_changed.
        "er_data_changed->mt_mod_cells这是在ALV做了数据修改的时给方法生成的传入参数内表
        "<ft_alv>是调用方法时的展示OOALV的内表
        "注意:er_data_changed->mt_mod_cells这个内表的结构和被调用的<ft_alv>内表不同
        "所以要把做了修改的数据 er_data_changed->mt_mod_cells 补充到 被调用的程序内表<ft_alv>
        LOOP AT er_data_changed->mt_mod_cells INTO DATA(ls_cell).
          "1.读到修改的行
          READ TABLE <ft_alv> ASSIGNING FIELD-SYMBOL(<fs_data05>) INDEX ls_cell-row_id.
          IF sy-subrc = 0 .
            "2.根据字段修改对应的值
            CASE ls_cell-fieldname.
              WHEN 'SEL'.
                ASSIGN COMPONENT 'SEL' OF STRUCTURE <fs_data05> TO <fs_field>.
                IF sy-subrc = 0.
                  <fs_field> = ls_cell-value.
                ENDIF.
    
              WHEN 'MENGE'.
                ASSIGN COMPONENT 'ZMENGE' OF STRUCTURE <fs_data05> TO <fs_field>.
                IF sy-subrc = 0.
                  <fs_field> = ls_cell-value.
                ENDIF.
            ENDCASE.
          ENDIF.
        ENDLOOP.
        
        "当OOALV被调用的内表发生了变化,但是OOALV没发生变化,要么需要被再次调用才能展示
        "所以用到OOALV刷新的方式,内表变化了,OOLAV也变化
        "注意上面的OOALV没发生变化的意思是:
        "1.<ft_alv>的数据虽然在上面的操作中已经发生改变,但是<ft_alv>是在被OOALV实例对象方法调用之 
        "后才发的改变的,所以OOALV实例对象的属性还是基于<ft_alv>未发生数据改变的状态
        "2.虽然OOALV做编辑操作时,OOALV界面的值确实发生了改变,但是这是假的视觉效果
        "本质还是和1.的解释相同,例如,就像某些网页注册信息、修改信息,刷新网页加载最新的数据
        DATA: ls_stable TYPE lvc_s_stbl. "刷新稳定性
        ls_stable-row = ‘1’.
        ls_stable-col = ‘1’.
    
        CALL METHOD go_alv->refresh_table_display
          EXPORTING
            is_stable = lv_stable.
    
      ENDMETHOD.
    ENDCLASS.

  2.   通过事件处理类的实例对象给OOALVDUI的实例对象设置注册事件
      CREATE OBJECT go_con
        EXPORTING
          container_name = 'CONTORL'.
    
      CREATE OBJECT go_alv
        EXPORTING
          I_parent = go_con.
    
      DATA(lo_event) = NEW cl_event( ).
    
      SET HANDLER lo_event->handle_data_changed  FOR go_alv.
    
    ** 将焦点设置到ALV上
      CALL METHOD cl_gui_control=>set_focus
        EXPORTING
          control = go_alv.
    
    ** data_changed事件触发时点
      CALL METHOD go_alv->register_edit_event
        EXPORTING
    **    i_event_id = cl_gui_alv_grid=>mc_evt_enter  "回车时触发
          i_event_id = cl_gui_alv_grid=>mc_evt_modified "单元格修改时触发
        EXCEPTIONS
          error      = 1
          OTHERS     = 2.
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值