这是一个OO ALV的例子,在S4可以执行,下一个测试一下FUNCTION在S4的修改功能
*Alv grid有两个事件:data_changed和ata_changed_finished.第一个事件在可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性,第二个事件是当数据修改完成后触发
*如果数据没有被修改,当失去焦点或回车时,那么它不会走data change,而是直接触发data change finish事件
*可以通过CL_GUI_ALV_GRID类的REGISTER_EDIT_EVENT方法来设置在失去焦点或回车时,触发数据改变事件:
*2 按回车触发: i_event_id = cl_gui_alv_grid=>mc_event_enter
*2 单元格失去焦点: i_event_id = cl_gui_alv_grid=>mc_event_modifies
*必须设置一种方式,要不然数据变化事件不会被触发事件
*然后注册CL_GUI_ALV_GRID的data_changed、data_changed_finished事件,实现事件处理器方法,在数据发生改变时就会触发这两上事件
* 3个字段可改,但是代码只限定MAKTX修改才会有ACTION
*SAPLKKBL STANDARD
TYPE-POOLS: slis.
DATA:l_flag_modify TYPE c VALUE 'X'.
DATA: col_pos TYPE i.
TYPES: BEGIN OF itype,
sel TYPE char1, "行选择
icon TYPE char4, "检查结果
stype TYPE char1,
msg(200),
matnr LIKE mara-matnr,
matkx LIKE makt-maktx,
vbeln LIKE vbak-vbeln,
chk(10),
field_style TYPE lvc_t_styl, "可设定这一单元格的输入,输出属性
END OF itype.
DATA itab TYPE TABLE OF itype WITH HEADER LINE.
DATA:gs_data TYPE itype.
DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE,
fieldcat_ln LIKE LINE OF gt_fieldcat,
gs_layout TYPE lvc_s_layo,
gs_print TYPE lvc_s_prnt , "occurs 0 with header line, "ALV打印格式
g_repid LIKE sy-repid.
DATA: v_stru_disvar TYPE disvariant, "ALV 显示格式
it_sort TYPE lvc_t_sort WITH HEADER LINE, "ALV 排序内表
git_events TYPE slis_t_event, "ALV 事件
git_listheader TYPE slis_t_listheader. "ALV 表头
DATA l_tmp TYPE lvc_title.
CONSTANTS cns_pf_status TYPE slis_formname VALUE 'FRM_PF_STATUS'.
CONSTANTS cns_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.
DATA: gt_filtter TYPE lvc_t_fcat WITH HEADER LINE.
DATA tem_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER DEFinitioN
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFinitioN.
PUBLIC SECTION.
METHODS handle_modify
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
METHODS handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS. "LCL_EVENT_RECEIVER DEFinitioN
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_modify.
DATA stbl TYPE lvc_s_stbl.
PERFORM frm_refresh_data USING et_good_cells..
* 稳定刷新
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD tem_grid->refresh_table_display
EXPORTING
is_stable = stbl.
ENDMETHOD. "HANDLE_MODIFY
METHOD handle_data_changed.
DATA stbl TYPE lvc_s_stbl.
PERFORM handle_data_changed USING er_data_changed. "处理受变化的数据
* 稳定刷新
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD tem_grid->refresh_table_display
EXPORTING
is_stable = stbl.
ENDMETHOD. "HANDLE_MODIFY
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .
*&---------------------------------------------------------------------*
*& 宏定义
*&---------------------------------------------------------------------*
DEFINE frm_fieldcat. " ALV Fieldcat设置
gt_fieldcat-fieldname = &1.
gt_fieldcat-reptext = &2.
gt_fieldcat-outputlen = &3.
IF &4 = 'X'.
gt_fieldcat-no_zero = 'X'.
ENDIF.
gt_fieldcat-checkBox = &5.
IF l_flag_modify IS INITIAL.
gt_fieldcat-edit = ''.
* gt_fieldcat-key = 'X'.
ELSE.
gt_fieldcat-edit = &6.
ENDIF.
* if &6 is initial.
* gt_fieldcat-key = 'X'.
* endif.
gt_fieldcat-fix_column = &7.
gt_fieldcat-icon = &8.
gt_fieldcat-lowercase = &9.
APPEND gt_fieldcat.
CLEAR gt_fieldcat.
END-OF-DEFinitioN.
*&---------------------------------------------------------------------*
*& start of selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data.
*&---------------------------------------------------------------------*
*& end-of-selection
*&---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM frm_comment_build. "设置表头
PERFORM frm_get_event. "设置自定义事件处理程序
PERFORM frm_layout. "设置输出格式
PERFORM frm_fieldcat. "设置输出字段
PERFORM frm_sort. "设置排序、合计
PERFORM frm_print. "设置打印
PERFORM frm_output. "输出
*&---------------------------------------------------------------------*
*& Form FRM_COMMENT_BUILD
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
* fieldname/reptext/outputlen/no_zero/checkBox/edit/fix_column/Icon
frm_fieldcat 'ICON' 'LIGHT' 4 '' '' '' 'X' 'X' ''.
frm_fieldcat 'STYPE' 'MTYPE' 12 '' '' '' '' '' ''.
frm_fieldcat 'MSG' 'MESSAGE' 12 '' '' '' '' '' ''.
frm_fieldcat 'MATNR' '料号' 4 '' '' 'X' 'X' '' ''.
frm_fieldcat 'CHK' 'CHECKBox' 13 'X' 'X' 'X' 'X' '' ''.
frm_fieldcat 'MATKX' '料号说明' 13 'X' '' 'X' 'X' '' 'X'.
frm_fieldcat 'VBELN' '号码' 12 '' '' 'X' '' '' ''.
ENDFORM. " frm_FIELDCAT
*&---------------------------------------------------------------------*
*& Form frm_comment_build
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_comment_build .
*ALV表头
DATA l_listheader TYPE slis_listheader.
DATA: v_title(60).
CLEAR: git_listheader, l_listheader.
l_listheader-typ = 'H'.
v_title = 'ALV功能测试程式'.
l_listheader-info = v_title.
APPEND l_listheader TO git_listheader.
ENDFORM. " FRM_COMMENT_BUILD
*&---------------------------------------------------------------------*
*& Form FRM_GET_EVENT
*&---------------------------------------------------------------------*
FORM frm_get_event .
DATA formname_top_of_page TYPE slis_formname VALUE 'FRM_TOP_OF_PAGE'.
DATA l_events TYPE LINE OF slis_t_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = git_events
EXCEPTIONS
list_type_wrong = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* 修改TOP_OF_PAGE以加入表头,设置处理子程序为'FRM_TOP_OF_PAGE'
CLEAR l_events.
READ TABLE git_events
WITH KEY name = slis_ev_top_of_page INTO l_events.
IF sy-subrc = 0.
MOVE 'FRM_TOP_OF_PAGE' TO l_events-form.
MODIFY git_events FROM l_events INDEX sy-tabix.
ELSE.
l_events-form = 'FRM_TOP_OF_PAGE'.
l_events-name = slis_ev_top_of_page.
APPEND l_events TO git_events.
ENDIF.
*
l_events-name = 'CALLER_EXIT'.
l_events-form = 'FM_BUTTON'.
APPEND l_events TO git_events.
ENDFORM. " FRM_GET_EVENT
*&---------------------------------------------------------------------*
*& Form FRM_TOP_OF_PAGE 表头
*&---------------------------------------------------------------------*
FORM frm_top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = git_listheader.
ENDFORM. "FRM_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& Form frm_LAYOUT
*&---------------------------------------------------------------------*
FORM frm_layout .
gs_layout-Box_fname = 'SEL'.
gs_layout-zebra = 'X'.
gs_layout-sel_mode = 'A'.
gs_layout-cwidth_opt = 'X'.
gs_layout-edit = ''.
gs_layout-stylefname = 'FIELD_STYLE'.
ENDFORM. " frm_LAYOUT
*&---------------------------------------------------------------------*
*& Form frm_FIELDCAT
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_SORT
*&---------------------------------------------------------------------*
* ALV 排序
*----------------------------------------------------------------------*
FORM frm_sort .
CLEAR it_sort.
it_sort-fieldname = 'MATNR'. "排序字段
it_sort-spos = 1.
it_sort-up = 'X'. "升序
* it_sort-subtot = 'X'. "小计依据
APPEND it_sort .
ENDFORM. " frm_SORT
*&---------------------------------------------------------------------*
*& Form frm_PRINT
*&---------------------------------------------------------------------*
* ALV 打印
*----------------------------------------------------------------------*
FORM frm_print .
* gs_print-no_print_listinfos = 'X'. "不打印汇总页
* gs_print-prnt_info = 'X'. "打印日期,程序标题和页号
ENDFORM. " frm_PRINT
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
FORM frm_output .
* ALV输出
g_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_disPLAY_LVC'
EXPORTING
i_callback_program = g_repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat[]
i_save = 'X'
i_callback_pf_status_set = cns_pf_status
i_callback_user_command = 'FRM_USER_COMMAND'
is_variant = v_stru_disvar
it_events = git_events
it_sort_lvc = it_sort[]
is_print_lvc = gs_print
TABLES
t_outtab = itab[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " FRM_OUTPUT
*&---------------------------------------------------------------------*
*& Form ALV_PF_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM frm_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD' .
* SET PF-STATUS 'STANDARD' OF PROGRAM 'SAPLKKBL' .
ENDFORM. "ALV_PF_STATUS
*&---------------------------------------------------------------------*
*& Form ALV_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
DATA: s_str TYPE string,
l_num_a TYPE string,
l_num_s TYPE string.
* 修改字段状态,
LOOP AT itab INTO gs_data.
IF gs_data-chk IS NOT INITIAL.
PERFORM frm_set_field_layout USING gs_data 'MATNR' '0'.
ELSE.
PERFORM frm_set_field_layout USING gs_data 'MATNR' '1'.
ENDIF.
MODIFY itab FROM gs_data.
ENDLOOP.
CASE r_ucomm.
WHEN '&DATA_SAVE'.
WHEN '&IC1'.
WHEN OTHERS.
ENDCASE.
* Refresh output
rs_selfield-refresh = 'X'.
ENDFORM. "ALV_USER_COMMAND
*end of add.
FORM frm_refresh_alv .
DATA: ref_grid TYPE REF TO cl_gui_alv_grid.
* 取得当前alv的grid和fieldcat
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
* et_fieldcat_lvc = gt_fieldcat
CALL METHOD ref_grid->check_changed_data.
CALL METHOD ref_grid->refresh_table_display.
ENDFORM. " FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM vbap UP TO 10 ROWS.
MOVE '10014072598' TO gs_data-matnr.
MOVE 'TEST MATNR' TO gs_data-matkx.
MOVE '10009999' TO gs_data-vbeln .
APPEND gs_data TO itab.
LOOP AT itab INTO gs_data.
* PERFORM frm_set_field_layout USING gs_data.
IF gs_data-stype = 'E'.
gs_data-icon = '@0A@'.
ELSE.
gs_data-icon = '@08@'.
ENDIF.
MODIFY itab FROM gs_data.
ENDLOOP.
ENDFORM. " frm_save_data
*&---------------------------------------------------------------------*
*& Form fm_button
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->E_GRID text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = tem_grid.
* 设置enter事件
CALL METHOD tem_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
* 设置 单光标焦点移开被修改单元格后既触发事件
CALL METHOD tem_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
error = 1
OTHERS = 2.
CREATE OBJECT gt_event_receiver.
SET HANDLER gt_event_receiver->handle_modify FOR tem_grid.
SET HANDLER gt_event_receiver->handle_data_changed FOR tem_grid.
ENDFORM. "FM_BUTTON
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_refresh_data USING et_good_cells TYPE lvc_t_modi. .
* 重新设置ALV显示格式
DATA: l_tabix LIKE sy-tabix,
wa_mod_data TYPE lvc_s_modi.
DATA ls_stylerow TYPE lvc_s_styl .
* 修改单元格状态
LOOP AT et_good_cells INTO wa_mod_data .
l_tabix = wa_mod_data-row_id.
READ TABLE itab INTO gs_data INDEX l_tabix.
IF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value = 'dis'.
PERFORM frm_set_field_layout USING gs_data 'VBELN' '0'.
MODIFY itab FROM gs_data INDEX l_tabix.
ELSEIF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value = 'ENA'.
PERFORM frm_set_field_layout USING gs_data 'VBELN' '1'.
MODIFY itab FROM gs_data INDEX l_tabix.
ENDIF.
ENDLOOP.
ENDFORM. " FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
*& Form handle_data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM handle_data_changed USING p_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*单元格数据发生变化时事件,在此可以进行数据检查
DATA:mod_data TYPE lvc_t_modi,
l_tabix LIKE sy-tabix,
wa_mod_data TYPE lvc_s_modi.
mod_data = p_data_changed->mt_mod_cells.
LOOP AT mod_data INTO wa_mod_data .
l_tabix = wa_mod_data-row_id.
READ TABLE itab INTO gs_data INDEX l_tabix.
IF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value = 'dis'.
*检查一个字段必变为某值时如:dis,联动修改其他字段值如:vbeln
gs_data-vbeln = '999'.
MODIFY itab FROM gs_data INDEX l_tabix.
ELSEIF wa_mod_data-fieldname EQ 'MATKX' AND wa_mod_data-value = 'ENA'.
ENDIF.
MODIFY itab FROM gs_data INDEX l_tabix.
ENDLOOP.
ENDFORM. "handle_data_changed
*&---------------------------------------------------------------------*
*& Form frm_data_modify
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PT_MOD_DATA text
*----------------------------------------------------------------------*
*FORM frm_data_modify TABLES pt_mod_data STRUCTURE lvc_s_modi.
* DATA: ls_zput212 LIKE zput212,
* wa_mod_data TYPE lvc_s_modi,
* l_tabix TYPE i.
*
* LOOP AT pt_mod_data INTO wa_mod_data .
*
* l_tabix = wa_mod_data-row_id.
* ENDLOOP.
*ENDFORM. "frm_data_modify
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELD_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_DATA text
*----------------------------------------------------------------------*
FORM frm_set_field_layout USING ls_data TYPE itype p_field p_value.
DATA: ls_stylerow TYPE lvc_s_styl.
* 修改字段显示状态
IF p_value = '1'.
ls_stylerow-fieldname = p_field.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.
READ TABLE ls_data-field_style WITH KEY fieldname = p_field TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
MODIFY TABLE ls_data-field_style FROM ls_stylerow.
ELSE.
INSERT ls_stylerow INTO TABLE ls_data-field_style.
ENDIF.
ELSE.
ls_stylerow-fieldname = p_field.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
READ TABLE ls_data-field_style WITH KEY fieldname = p_field TRANSPORTING NO FIELDS..
IF sy-subrc = 0.
MODIFY TABLE ls_data-field_style FROM ls_stylerow.
ELSE.
INSERT ls_stylerow INTO TABLE ls_data-field_style.
ENDIF.
ENDIF.
ENDFORM. " FRM_SET_FIELD_LAYOUT
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。