"运行这个程序前先双击call screen 0100 .建立屏幕。这个程序只用到屏幕,而没用控件,注意逻辑流和OK_CODE的添加
report z_barry_alv_datachanged.
data: begin of itab occurs 0 ,
carrid like spfli-carrid,
connid like spfli-connid,
cityfrom like spfli-cityfrom,
cityto like spfli-cityto,
end of itab .
data: ok_code like sy-ucomm .
data: l_valid(1) type c.
data: go_grid type ref to cl_gui_alv_grid,
go_custom_container type ref to cl_gui_custom_container.
data: gt_fieldcat type lvc_t_fcat,
gs_fieldcat type lvc_s_fcat,
gs_variant type disvariant,
gt_filt type lvc_t_filt,
gs_filt type lvc_s_filt,
sla type lvc_s_layo.
class lcl_event_receiver definition deferred .
data: event_receiver type ref to lcl_event_receiver.
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
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. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
class lcl_event_receiver implementation.
method handle_data_changed.
perform handle_data_changed using er_data_changed.
endmethod. "handle_data_changed
endclass. "lcl_event_receiver IMPLEMENTATION
initialization.
* gd_repid = sy-repid.
perform fieldcat_init using gt_fieldcat[].
start-of-selection.
call screen 0100 .
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
module user_command_0100 input.
case ok_code.
when '&F03'.
leave program.
when 'ENTE'.
perform enter.
when 'CHANGE'."改变模式为查看或修改
perform change.
when '&DATA_SAVE'.
MESSAGE 'save' type 'I'.
endcase.
clear ok_code .
endmodule. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form load_data_into_grid
*&---------------------------------------------------------------------*
form load_data_into_grid.
select * from spfli into corresponding fields of table itab
up to 20 rows .
sla-cwidth_opt = 'X'.
sla-zebra = 'X'.
sla-no_toolbar = 'X'."隐藏全部标准按钮
call method go_grid->set_table_for_first_display
exporting
is_variant = gs_variant
i_save = 'A'
is_layout = sla
changing
it_outtab = itab[]
it_fieldcatalog = gt_fieldcat[]
exceptions
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
others = 4.
call method go_grid->set_ready_for_input "处于编辑状态
exporting
i_ready_for_input = 1.
call method cl_gui_control=>set_focus "设置焦点在go_grid 上
exporting
control = go_grid .
endform. " load_data_into_grid
*&--------------------------------------------------------------------*
*& Form fieldcat_init
*&--------------------------------------------------------------------*
form fieldcat_init using rt_fieldcat type lvc_t_fcat.
data: ls_fieldcat type lvc_s_fcat.
perform frm_catlg_set using:
'CARRID' 'X' '航班ID' '' 'CARRID' 'SPFLI' rt_fieldcat,
'CONNID' '' '连接' 'X' '' '' rt_fieldcat,
'CITYTO' '' '到达城市' 'X' '' '' rt_fieldcat,
'CITYFROM' '' 'CITYFROM' 'X' '' '' rt_fieldcat.
endform. "fieldcat_init
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
form frm_catlg_set using p_field p_key p_text p_edit ref_f ref_t
rt_fieldcat type lvc_t_fcat .
data: tmp_fieldcat type lvc_s_fcat.
tmp_fieldcat-fieldname = p_field.
tmp_fieldcat-key = p_key .
tmp_fieldcat-scrtext_l = p_text.
tmp_fieldcat-edit = p_edit.
tmp_fieldcat-ref_field = ref_f.
tmp_fieldcat-ref_table = ref_t.
append tmp_fieldcat to rt_fieldcat .
clear tmp_fieldcat .
endform. " FRM_CATLG_SET
*&---------------------------------------------------------------------*
*& Form change
*&---------------------------------------------------------------------*
form change .
data: ls_stable type lvc_s_stbl.
ls_stable-row = 'X'."行稳定更新
ls_stable-col = 'X'."列稳定更新
if go_grid->is_ready_for_input( ) = 0.
call method go_grid->set_ready_for_input
exporting
i_ready_for_input = 1.
else.
call method go_grid->check_changed_data
importing
e_valid = l_valid.
call method go_grid->set_ready_for_input
exporting
i_ready_for_input = 0.
call method go_grid->refresh_table_display
exporting
is_stable = ls_stable
exceptions
finished = 1
others = 2.
endif.
endform. " change
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
module status_0100 output.
set pf-status 'S_100'.
gs_variant-report = sy-repid.
if go_grid is initial.
create object go_grid
exporting
i_parent = cl_gui_container=>screen0.
create object event_receiver.
set handler event_receiver->handle_data_changed for go_grid.
if sy-batch is initial.
call method go_grid->register_edit_event
exporting
* i_event_id = cl_gui_alv_grid=>mc_evt_enter. "回车时触发
i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格更改触发
endif.
perform load_data_into_grid.
endif.
endmodule. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Form ENTER
*&---------------------------------------------------------------------*
form enter .
data: ucomm like sy-ucomm.
ucomm = '&DATA_SAVE'." '&REFRESH'.
call method go_grid->set_function_code
changing
c_ucomm = ucomm.
endform. " ENTER
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
form handle_data_changed using data_changed type ref to cl_alv_changed_data_protocol.
field-symbols: <fs_mod_rows> type standard table,
<fs_cells> type lvc_t_modi ,
<fs_cell_wa> type lvc_s_modi ,
<fs> like line of itab.
if not data_changed->mp_mod_rows is initial.
assign data_changed->mp_mod_rows->* to <fs_mod_rows>.
assign data_changed->mt_mod_cells to <fs_cells>.
* loop at <fs_mod_rows> assigning <fs>.
* if <fs>-carrid = 'AA' .
* read table <fs_cells> index sy-tabix assigning <fs_cell_wa>.
* call method data_changed->add_protocol_entry
* exporting
* i_msgid = 'OO'
* i_msgty = 'E'
* i_msgno = '000'
* i_msgv1 = '不可以为ABC'
* i_fieldname = 'AA'
* i_row_id = <fs_cell_wa>-row_id
** i_tabix = tabix
* .
* endif.
* endloop.
endif.
* BREAK-POINT.
MESSAGE 'dd' type 'S'.
endform. " HANDLE_DATA_CHANGED
*CL_ALV_CHANGED_DATA_PROTOCOL参数的常用方法和属性
*
*方法 用途
*MODIFY_CELL 修改指定位置单元格的值
*GET_CELL_VALUE 获取单元格的值
*ADD_PROTOCOL_ENTRY 弹出一个消息,必须使用系统标准的消息类
*MODIFY_PROTOCOL_ENTRY 修改消息
*PROTOCOL_IS_VISIBLE 是否显示错误信息提示
*REFRESH_PROTOCOL 删除错误消息
*
*属性 用途
*MT_PROTOCOL LOGs
*MT_MOD_CELLS 更新的单元格信息
*MP_MOD_ROWS 更新了的行的信息
*MT_GOOD_CELLS 正确的CELL的值
*MT_DELETED_ROWS 被删除的行信息
*MT_INSERTED_ROWS 新插入的行信息
评论