ALV 的 data changed 事件在离开单元格时触发,比如回车,tab 键等。利用 data changed 事件可以实现诸如校验,自动填充字段等功能。本文演示 data changed 事件的用法,实现对 ALV 界面编辑的数据自动保存到数据库,并且对 cityto 字段进行校验两个小的功能。
首先编写一个可以运行的 alv 程序,并且将 data changed 事件加入到关联到 ALV:
1) 声明 event 相关的变量
data: gt_fieldcat type slis_t_fieldcat_alv,
gs_fieldcat type slis_fieldcat_alv,
gt_events type slis_t_event,
gs_event type slis_alv_event.
2)将 data changed 事件添加到 gt_events 中:
form frm_add_events.
clear gs_event.
gs_event-name = slis_ev_data_changed.
gs_event-form = 'FRM_ALV_DATA_CHANGED'.
append gs_event to gt_events.
endform.
3)调用 reuse_alv_grid_display 函数时设置 gt_events 参数:
form frm_disp_data.
call function 'Z_FALV_FIELD_CATALOG'
exporting
it_output = gt_spfli[]
tables
field_catalog = gt_fieldcat[].
perform frm_add_events.
gs_grid_settings-edt_cll_cb = 'X'.
" 使ALV可编辑
loop at gt_fieldcat into gs_fieldcat.
if gs_fieldcat-key = 'X'.
gs_fieldcat-edit = ''.
else.
gs_fieldcat-edit = 'X'.
endif.
modify gt_fieldcat from gs_fieldcat.
clear gs_fieldcat.
endloop.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = sy-repid
i_grid_settings = gs_grid_settings
it_fieldcat = gt_fieldcat[]
it_events = gt_events
tables
t_outtab = gt_spfli[].
endform.
注意 gs_grid_settings-edit_cll_cb = 'X' 语句是必须的,否则事件不被触发。
4)编写子例程处理 data changed 事件,例程名为 frm_alv_data_changed:
form frm_alv_data_changed using p_changed_data type ref to cl_alv_changed_data_protocol.
data: field_name(20),
modified_cells type lvc_s_modi.
data: l_city like spfli-cityto.
field-symbols <field_value>.
" 对 cityto字段进行校验
loop at p_changed_data->mt_mod_cells into modified_cells where fieldname = 'CITYTO'.
read table gt_cities with table key city = modified_cells-value.
if not sy-subrc is initial.
call method p_changed_data->add_protocol_entry
exporting
i_msgid = '00'
i_msgty = 'E'
i_msgno = '001'
i_msgv1 = '您所输入的城市并不在范围内, 数据不会被保存. '
i_fieldname = modified_cells-fieldname.
return.
endif.
endloop.
" ALV 界面修改的数据自动保存
loop at p_changed_data->mt_mod_cells into modified_cells.
clear gt_spfli.
read table gt_spfli index modified_cells-row_id.
concatenate 'GT_SPFLI-' modified_cells-fieldname into field_name .
assign (field_name) to <field_value>.
<field_value> = modified_cells-value.
modify gt_spfli index modified_cells-row_id.
endloop.
update spfli from table gt_spfli.
endform.
data changed 事件在单元格离开后才触发,所以刚才作为演示的程序存在最后编辑数据不被保存的风险。为了确保编辑的数据能被保存,可以使用 checkbox 字段,用户在修改后选中 checkbox,显示标识所修改的行,在工具栏上添加「保存」按钮,点击「保存」按钮才进行保存。checkbox 选中的时候,也会触发 data changed 事件。
使用 checkbox 的方法如下:
1)定义内表包含 checkbox 字段:
types: begin of t_spfli.
include structure spfli.
types: check type c.
types: end of t_spfli.
data: gt_spfli type standard table of t_spfli with header line.
2) 在 fieldcatlog 内表中标识该字段以 checkbox 方式显示:
loop at gt_fieldcat into gs_fieldcat.
if gs_fieldcat-fieldname = 'CHECK'.
gs_fieldcat-checkbox = 'X'.
gs_fieldcat-seltext_m = '选择'.
gs_fieldcat-outputlen = 6.
endif.
modify gt_fieldcat from gs_fieldcat.
clear gs_fieldcat.
endloop.