ABAP 之DATA_CHANGED和DATA_CHANGE_FINISHED的应用场景

2022-11-28 15:40:58 浏览数 (1)

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看

Hello,这里是百里,一个学习中的ABAPER, 本栏目记录工作生活中遇到的问题,bug,知识积累等内容. 今天我们要研究的是,ABAP中的事件内容,ALV_CHANGE_DATA 和 ALV_CHANGE_DATA_FINISHED 的应用场景.

在ABAP开发中,会经常遇到事件,比如相同单号自动选择, 料号内容自动完善,光标移开保存数据等等等,ABAP的OOALV开发中也提供了大量的事件处理函数.比如,选择帮助,光标事件,回车事件,按键等等,这里不详细介绍,只是针对.两个change_Data 和finished 两块做比较 .

ALV_data_changed

在ALV中若需要用户交互输入数据,则数据的输入后可能需要做检查或者其他联动设备,则需要alv中进行回车操作,或者在被修改的单元格失去焦点的时候,能够触发事件,以便程序可以对变化的结果信息做详细的分析,或者做处理。 这个时候就需要使用ALV_data_changed .

实例

在ALV func函数中 需要在it_events 中增加对应 事件内容 其中,MOVE 'DATA_CHANGED'     TO gs_event-name.  MOVE 'ALV_DATA_CHANGED' TO gs_event-form. 分别对应的事件名称和事件子例程.

代码语言:javascript复制
............
FORM call_alv_func .  
  DATA :gt_event TYPE slis_t_event,  
        gs_event TYPE slis_alv_event.
 MOVE 'DATA_CHANGED'     TO gs_event-name.  
 MOVE 'ALV_DATA_CHANGED' TO gs_event-form.  
 APPEND gs_event TO gt_event.
 gs_glay-edt_cll_cb = abap_true.     " 选中复选款,立刻触发data changed 事件  
  
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'  
    EXPORTING  
      i_callback_program       = sy-repid           "回调程序  
      i_callback_pf_status_set = 'SET_PF_STATUS'  
      i_callback_user_command  = 'USER_COMMAND'  
      i_grid_settings          = gs_glay  
      is_layout_lvc            = wa_layout  
      it_fieldcat_lvc          = gt_fieldcat        "需要显示的内表的列  
      i_save                   = 'A'  
      it_events                = gt_event  
    TABLES  
      t_outtab                 = gt_alv         "需要显示的数据  
    EXCEPTIONS  
      program_error            = 1  
      OTHERS                   = 2.  
  IF sy-subrc <> 0.  
  ENDIF.
ENDFORM. 
FORM alv_data_changed USING pcl_data TYPE REF TO cl_alv_changed_data_protocol.  
  DATA:  
        l_name(100),  
  ls_cells TYPE lvc_s_modi.  
  
  
  FIELD-SYMBOLS: <f_field> TYPE any .  
  LOOP AT pcl_data->mt_mod_cells INTO ls_cells.  
    READ TABLE gt_alv    INTO  gs_alv   INDEX ls_cells-row_id.  
    ASSIGN COMPONENT ls_cells-fieldname OF STRUCTURE gs_alv   TO <f_field>.  
    <f_field> = ls_cells-value.  
    MESSAGE '数据变动'  &amp;&amp; <f_field> TYPE  'S' .  
    i_flag = 'X' .  
   " gs_DAta-SLBOX = <f_field>.  
 "   MODIFY gt_DAta FROM gs_DAta TRANSPORTING SLBOX WHERE DELIVERY = gs_DAta-DELIVERY.  
    CLEAR gs_alv  . 
  ENDLOOP.  
  DATA: ls_stbl TYPE lvc_s_stbl.  
  
 PERFORM refresh_alv  .  
ENDFORM.

注意: 使用alv_data_changed 时,这个事件时间是在操作时就触发的,内表会当即发生变化.而且使用该事件时一定要更新刷新alv事件 .

DATA_CHANGED_FINISHED

使用该函数时,需要在data 数据准备的地方注册定义屏幕类并注册对应的事件 ,其次是该事件是在处理完毕后修改对应内表数据. 在前面讲的 alv_Data_changed 后面, 在类中定义一个专门用户捕获和处理alv 的 data_changed事件的方法,并编写相应的代码。 在事件回调代码中进行绑定,绑定时需要alv对象, 绑定之后,该alv就可以相应data_changed事件 提高了联动的效果。

实例

代码语言:javascript复制
........数据准备
" 屏幕函数  
CLASS lcl_event_receiver  DEFINITION .  "定义类 捕捉各种事件  
  PUBLIC SECTION .  
**   搜索帮助  
*    METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid  
*      IMPORTING e_fieldname es_row_no er_event_data.  
*   数据改变事件  
    METHODS handle_data_changed_finished  FOR EVENT data_changed_finished OF cl_gui_alv_grid  
      IMPORTING e_modified et_good_cells.  
  
ENDCLASS .                     "LCL_EVENT_RECEIVER DEFINITION  
DATA:  
  g_event_receiver TYPE  REF  TO lcl_event_receiver,  
  g_grid           TYPE  REF  TO cl_gui_alv_grid.  
  
  
CLASS lcl_event_receiver  IMPLEMENTATION .  "实现类 处理事件  
** 界面修改事件  
*  METHOD handle_onf4  .  
**   编辑供应商搜索帮助  
*    PERFORM frm_f4_lifnr USING e_fieldname es_row_no er_event_data.  
**    M_REFRESH_GRID V_GRID21.  
*  ENDMETHOD .                     "HANDLE_MODIFY  
  
  METHOD handle_data_changed_finished.  
    CHECK sy-ucomm <> 'BACK'.  
    CHECK e_modified = 'X'.   "ALV OO中修改数据  
  
*   数据改变  
    PERFORM frm_data_changed  
      USING et_good_cells."系统中的被修改单元格的数据  
  
*    PERFORM FRM_REFRESH_ALV.  
  ENDMETHOD.                    "handle_data_changed_finished  
  
ENDCLASS .                     "LCL_EVENT_RECEIVER IMPLEMENTATION
*选择屏幕 

*INITIALIZATION .


*子例程
FORM frm_data_changed  USING ft_good_cells TYPE lvc_t_modi.  
  
  
  LOOP AT ft_good_cells INTO DATA(lw_cell).  
  
    READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<lfs_alv>) INDEX lw_cell-row_id.  
  
    IF sy-subrc = 0.  
  
      CASE lw_cell-fieldname.  
        WHEN 'ZNAME' .  
           IF i_flag <> 'X'.  
              MESSAGE '按了回车'  &amp;&amp; lw_cell-value  &amp;&amp; '行' TYPE 'S' .  
           ENDIF.  
  
  
  
          IF lw_cell-value IS INITIAL.  
            "  select SINGLE  zkhic  from  @gt_alv  as a where  index =   @lw_cell-row_id  into  @data(ls_zkhic) .  
            "   SELECT SINGLE matnr FROM zmmtmara AS a   WHERE zkhic   = @<lfs_alv>-zkhic  INTO  @DATA(ls_matnr)  .  
  
            "  
            "  <lfs_alv>-zmatnr =  ls_matnr .  
  
  
          ENDIF.
          WHEN OTHERS.  
          RETURN.  
      ENDCASE.  
    ENDIF.  
  ENDLOOP.  
  
  " PERFORM frm_refresh_alv.  
ENDFORM.
........
FORM call_alv_func .  
  DATA :gt_event TYPE slis_t_event,  
        gs_event TYPE slis_alv_event.  
  
 gs_event-name  =  'CALLER_EXIT' .  
  gs_event-form  =  'FRM_CALLER_EXIT' .  
  APPEND gs_event TO gt_event.
............
FORM frm_caller_exit  USING e_grid  TYPE slis_data_caller_exit .  
  DATA:lt_f4 TYPE  lvc_t_f4,  
       ls_f4 TYPE  lvc_s_f4.  
  DATA:  
    lw_f4 TYPE lvc_s_f4.  
  "  lt_f4 TYPE lvc_t_f4.  
  
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'  
    IMPORTING  
      e_grid = g_grid.  
  
  CALL METHOD g_grid->register_edit_event      "注册GRID事件  
    EXPORTING  
      i_event_id = cl_gui_alv_grid=>mc_evt_enter "事件:回车  
    EXCEPTIONS  
      error      = 1  
      OTHERS     = 2.  
  
 " CALL METHOD g_grid->register_edit_event      "注册GRID事件  
"    EXPORTING  
"      i_event_id = cl_gui_alv_grid=>mc_evt_modified "事件:光标移动  
"    EXCEPTIONS  
"      error      = 1  
"      OTHERS     = 2.  
  
  CREATE OBJECT g_event_receiver.  
  SET  HANDLER g_event_receiver->handle_data_changed_finished  FOR g_grid .  
  
 ENDFORM .

注意: alv_data_changed也是事件类函数,需要lt_event 中增加对应内表. 并且需要注册对应的事件,使用该事件也必须后面跟带刷新函数,否则无法生效. 该函数使用场景主要为,修改料号, 选择帮助,权限检查,下拉列表等.

总结

以上就为data_changed 和data_change_finished 的使用方式, 主要还是对应的事件应用实例. 在工作中熟练使用对应的事件注册函数可以帮用户极大的解决需求,如系统不带的选择帮助,默认值,缺省值等等.

勤能补拙是良训,一分辛苦一分才. 今天的不开心就到此为止吧~ 这里是百里,一个努力学习者 .

0 人点赞