ALV单元格可编辑模式
发布时间:2024/07/19
案例:根据选择画面的工厂查询自定义表的子图号和计划子图号。以alv呈现,新增修改按钮,选中需要修改的行,点击修改按钮,选中行的子图号和计划子图号变为可编辑模式。保存成功后变为不可编辑模式。
单元格编辑控制需要4个步骤:
- ztewm_psjh_sco_h是我的自定义表,要为alv输出表定义一个类型,这里我放入了选择框(box)、消息灯(icon)、消息(msg)和修改模式(field_style)字段。
- 在layout中指定修改模式字段。
gs_layout-stylefname = ‘FIELD_STYLE’. - 获取ooalv的可编辑控制
CALL METHOD lr_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1. - 编辑修改模式字段。
FORM frm_open_edit.
FORM frm_close_edit. - 命令执行完毕后一定要刷新alv
CALL METHOD lr_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
完整实现代码如下:
REPORT zmm_rpt_538_wu.
TABLES: ztewm_psjh_sco_h,sscrfields.
TYPES: BEGIN OF ts_alv,
box TYPE char1,
icon TYPE char10,
msg TYPE string,
field_style TYPE lvc_t_styl. "修改模式.
INCLUDE STRUCTURE ztewm_psjh_sco_h.
TYPES: END OF ts_alv.
DATA: gt_alv TYPE STANDARD TABLE OF ts_alv,
gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo.
SELECTION-SCREEN BEGIN OF BLOCK bl WITH FRAME TITLE TEXT-001.
PARAMETERS: p_werks TYPE ztewm_psjh_sco_h-werks.
SELECTION-SCREEN END OF BLOCK bl.
INITIALIZATION.
START-OF-SELECTION.
PERFORM frm_get_data.
END-OF-SELECTION.
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.
DATA: lv_where TYPE string.
IF p_werks IS INITIAL.
ELSE.
lv_where = 'werks = @p_werks'.
ENDIF.
SELECT * FROM ztewm_psjh_sco_h
WHERE (lv_where)
INTO CORRESPONDING FIELDS OF TABLE @gt_alv.
IF gt_alv IS INITIAL.
MESSAGE '未查询到数据' TYPE 'S'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv.
PERFORM frm_build_layout.
PERFORM frm_build_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'FRM_STATUS_SET'
i_callback_user_command = 'FRM_USER_COMMAND'
i_bypassing_buffer = abap_true
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = gt_alv
EXCEPTIONS ##FM_SUBRC_OK
program_error = 1
OTHERS = 2.
ENDFORM.
FORM frm_build_layout.
CLEAR gs_layout.
gs_layout-sel_mode = 'A'.
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
*layout中指定修改控制字段
gs_layout-stylefname = 'FIELD_STYLE'.
ENDFORM.
FORM frm_build_fieldcat .
CLEAR:gt_fieldcat.
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'BOX' coltext = '选择框' checkbox = 'X' hotspot = 'X' ) ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'ICON' coltext = '状态' icon = 'X') ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MSG' coltext = '消息' ) ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'WERKS' coltext = '工厂' ) ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'MATNR' coltext = '物料编号' ref_field = 'MATNR' ref_table = 'ZTEWM_PSJH_SCO_H' ) ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'PMATNR1' coltext = '子图号' ref_field = 'PMATNR1' ref_table = 'ZTEWM_PSJH_SCO_H' ) ).
gt_fieldcat = VALUE #( BASE gt_fieldcat ( fieldname = 'PMATNR' coltext = '计划子图号' ref_field = 'PMATNR' ref_table = 'ZTEWM_PSJH_SCO_H' ) ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_STATUS_SET
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM frm_status_set USING extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD'.
ENDFORM.
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
ls_stbl TYPE lvc_s_stbl,
ls_alv TYPE ts_alv.
DATA(lv_refresh) = abap_on.
*获取当前alv
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
*获取可编辑控制
CALL METHOD lr_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
*检查更新
CALL METHOD lr_grid->check_changed_data.
*稳定刷新,保持滚动条位置
ls_stbl-row = ls_stbl-col = 'X'.
CASE pv_ucomm.
WHEN '&ZAL'. "全选
ls_alv-box = 'X'.
MODIFY gt_alv FROM ls_alv TRANSPORTING box WHERE box = ''.
WHEN '&ZSAL'. "取消全选
ls_alv-box = ''.
MODIFY gt_alv FROM ls_alv TRANSPORTING box WHERE box = 'X'.
WHEN '&IC1'. "单选
READ TABLE gt_alv INTO ls_alv INDEX ps_selfield-tabindex.
IF ps_selfield-fieldname = 'BOX'.
IF ps_selfield-value = '1'.
ls_alv-box = ''.
ELSE.
ls_alv-box = 'X'.
ENDIF.
MODIFY gt_alv FROM ls_alv TRANSPORTING box WHERE werks = ls_alv-werks
AND gstrp = ls_alv-gstrp
AND gsuzp = ls_alv-gsuzp
AND bstnk = ls_alv-bstnk
AND matnr = ls_alv-matnr.
ENDIF.
WHEN '&ZUPD'.
READ TABLE gt_alv TRANSPORTING NO FIELDS WITH KEY box = 'X'.
IF sy-subrc <> 0.
MESSAGE '请至少选择一条数据进行操作' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
* 打开修改模式
PERFORM frm_data_edit USING 'X'.
WHEN '&DATA_SAVE'.
READ TABLE gt_alv TRANSPORTING NO FIELDS WITH KEY box = 'X'.
IF sy-subrc <> 0.
MESSAGE '请至少选择一条数据进行操作' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
PERFORM frm_data_save.
ENDCASE.
IF lv_refresh = abap_on.
CALL METHOD lr_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD lr_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
ENDIF.
ENDFORM.
FORM frm_data_save.
DATA:ls_alv TYPE ts_alv,
lt_alv TYPE STANDARD TABLE OF ts_alv,
lt_psjh_sco_h TYPE STANDARD TABLE OF ztewm_psjh_sco_h.
ls_alv-change_name = sy-uname.
ls_alv-change_date = sy-datum.
ls_alv-change_time = sy-uzeit.
MODIFY gt_alv FROM ls_alv TRANSPORTING change_name change_date change_time WHERE box = 'X'.
CLEAR:ls_alv.
lt_alv = gt_alv.
DELETE lt_alv WHERE box <> 'X'.
MOVE-CORRESPONDING lt_alv TO lt_psjh_sco_h.
MODIFY ztewm_psjh_sco_h FROM TABLE lt_psjh_sco_h.
IF sy-subrc = 0.
COMMIT WORK.
ls_alv-icon = icon_led_green.
ls_alv-msg = '数据保存成功!'.
MODIFY gt_alv FROM ls_alv TRANSPORTING icon msg WHERE box = 'X'.
*关闭修改模式
PERFORM frm_data_edit USING ''.
ELSE.
ROLLBACK WORK.
ls_alv-icon = icon_led_red.
ls_alv-msg = '数据保存失败!'.
MODIFY gt_alv FROM ls_alv TRANSPORTING icon msg WHERE box = 'X'.
ENDIF.
ENDFORM.
FORM frm_data_edit USING pv_open TYPE char1.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<lfs_alv>) WHERE box = 'X'.
IF pv_open = abap_on.
PERFORM frm_open_edit CHANGING <lfs_alv>-field_style.
ELSE.
PERFORM frm_close_edit CHANGING <lfs_alv>-field_style.
ENDIF.
MODIFY gt_alv FROM <lfs_alv>.
ENDLOOP.
ENDFORM.
*打开可编辑
FORM frm_open_edit CHANGING ct_field_style TYPE lvc_t_styl.
DATA: ls_stylerow TYPE lvc_s_styl.
*将需打开编辑的字段放入style表
CLEAR:ls_stylerow,ct_field_style.
ls_stylerow-fieldname = 'PMATNR'.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.
INSERT ls_stylerow INTO TABLE ct_field_style.
CLEAR:ls_stylerow.
ls_stylerow-fieldname = 'PMATNR1'.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_enabled.
INSERT ls_stylerow INTO TABLE ct_field_style.
ENDFORM.
*关闭可编辑
FORM frm_close_edit CHANGING ct_field_style TYPE lvc_t_styl.
DATA: ls_stylerow TYPE lvc_s_styl.
*将需关闭编辑的字段放入style表
CLEAR:ls_stylerow,ct_field_style.
ls_stylerow-fieldname = 'PMATNR'.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_stylerow INTO TABLE ct_field_style.
CLEAR:ls_stylerow.
ls_stylerow-fieldname = 'PMATNR1'.
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT ls_stylerow INTO TABLE ct_field_style.
ENDFORM.
最后我们来看一下效果吧。
选中前两行后点编辑
前两行的子图号和计划子图号变为了可编辑模式
点保存后,恢复为不可编辑模式。实现成功!
综上所述,通过以上方式,我们可以在需要的时候灵活调用控制编辑的form就能实现单元可编辑控制啦。