开启掘金成长之旅!这是我参与「掘金日新计划 · 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.
分别对应的事件名称和事件子例程.
............
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 '数据变动' && <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 '按了回车' && lw_cell-value && '行' 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 的使用方式, 主要还是对应的事件应用实例. 在工作中熟练使用对应的事件注册函数可以帮用户极大的解决需求,如系统不带的选择帮助,默认值,缺省值等等.
勤能补拙是良训,一分辛苦一分才. 今天的不开心就到此为止吧~ 这里是百里,一个努力学习者 .