当我们提到ALV可编辑,会想到一下编辑:
1.Layout(LVC_S_LAYO)的ALV控制可编辑:这种编辑是ALV所有数据都可编辑
2.Fieldcat(LVC_T_FCAT)的ALV控制可编辑:这种编辑是ALV字段列数据可编辑
最后就是本文的动态单元格可编辑:可以根据我们逻辑动态进行可编辑。
具体方法如下:
1.在ALV数据输出表定义field_style参考表类型LVC_T_STYL( 单元格的类型表)主要是放入控制单元格的状态的一些参数。
2.在处理我们想要进行可以编辑、不可以编辑的单元格数据的逻辑,想编辑的字段名称放入LVC_T_STYL的fieldname中,把类cl_gui_alv_grid=>mc_style_enabled方法(单元格可编辑),cl_gui_alv_grid=>mc_style_disabled(单元格不可编辑)放入LVC_T_STYL的style中。
3.Layout的stylefname 为 ALV数据表添加的field_style表类型字段。
4.注意事项:
1:当我们所做的多可以了但是实现不了我们想要的单元格可编辑的结果
我们需要ALV至少要有一列是可以编辑的(本人自己了解的解决办法,如果有更好的办法希望得到分享)。
2.在我们都谢完我们的处理还有参数设定但是导致ALV Dump 如下方结果:
原因:lvc_t_styl是排序表 我们需要编辑的单元格名称需要按具体的排序规则放入其表lvc_t_styl中,否则会Dump.
具体可以根据Demo代码进行试验(Copy代码即可执行):
*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_DEMO1
*& 程序描述:ALV单元格可编辑
*& 创 建 者:你们的小涵
*& 创建日期:2023/03/10
*&---------------------------------------------------------------------*
*& 版本 修改者(公司) 日期 修改描述
*& 1.0.0 XXXX YYYYMMDD 创建程序
*&---------------------------------------------------------------------*
REPORT ytest_demo1.
TYPE-POOLS: slis."类型池
TYPES:
"选择屏幕用
BEGIN OF typ_s_screen,
ebeln TYPE ekko-ebeln, "采购凭证编号
bukrs TYPE ekko-bukrs, "公司代码
werks TYPE ekpo-werks, "工厂
ernam TYPE ekko-ernam, "对象创建人姓名
END OF typ_s_screen,
"ALV显示用
BEGIN OF ty_out,
c TYPE char01, "(单元格编辑前提需要有可编辑的!!)
sel TYPE sel,
ebeln TYPE ekko-ebeln, "采购凭证编号
bukrs TYPE ekko-bukrs, "公司代码
ekorg TYPE ekko-ekorg, "采购组织
ekgrp TYPE ekko-ekgrp, "采购组
kunnr TYPE ekko-kunnr, "客户编号
ebelp TYPE ekpo-ebelp, "凭证项目编号
matnr TYPE ekpo-matnr, "物料编号
werks TYPE ekpo-werks, "工厂
lgort TYPE ekpo-lgort, "库存地点
matkl TYPE ekpo-matkl, "物料组
menge TYPE ekpo-menge, "采购订单数量
meins TYPE ekpo-meins, "采购订单计量单位
* 单元格可编辑
field_style TYPE lvc_t_styl, "控制字段可编辑的参数
END OF ty_out,
"表类型
tt_out TYPE STANDARD TABLE OF ty_out.
DATA:
gt_alv TYPE tt_out,
gv_screen TYPE typ_s_screen.
DATA:
gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat.
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_ebeln FOR gv_screen-ebeln,
s_bukrs FOR gv_screen-bukrs.
PARAMETERS: p_werks TYPE werks_d OBLIGATORY DEFAULT '1000'.
SELECTION-SCREEN END OF BLOCK b01.
INITIALIZATION.
CLEAR:
gt_alv,
gt_fieldcat.
*&---------------------------------------------------------------------*
* START-OF-SELECTION 执行主逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"数据取得
SELECT
ekko~ebeln,
ekko~bukrs,
ekko~ekorg,
ekko~ekgrp,
ekko~kunnr,
ekpo~ebelp,
ekpo~matnr,
ekpo~werks,
ekpo~lgort,
ekpo~matkl,
ekpo~menge,
ekpo~meins
FROM ekko
INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln
WHERE ekpo~werks = @p_werks
AND ekko~ebeln IN @s_ebeln
AND ekko~bukrs IN @s_bukrs
INTO CORRESPONDING FIELDS OF TABLE @gt_alv
UP TO 20 ROWS.
DATA: stylelin TYPE lvc_s_styl.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs1>).
IF <fs1>-field_style IS INITIAL.
CLEAR stylelin.
IF <fs1>-menge > 1.
stylelin-fieldname = 'MENGE'." 需要编辑的列名
* STYLELIN-STYLE = cl_gui_alv_grid=>mc_style_disabled. " 设置为可编辑状态
stylelin-style = cl_gui_alv_grid=>mc_style_enabled. " 设置为不可编辑状态
APPEND stylelin TO <fs1>-field_style.
CLEAR stylelin.
ENDIF.
"注释解开即可Dump
* CLEAR stylelin.
* IF <fs1>-menge > 1.
* stylelin-fieldname = 'BUKRS'." 需要编辑的列名
** STYLELIN-STYLE = cl_gui_alv_grid=>mc_style_disabled. " 设置为可编辑状态
* stylelin-style = cl_gui_alv_grid=>mc_style_enabled. " 设置为不可编辑状态
* APPEND stylelin TO <fs1>-field_style.
* CLEAR stylelin.
* ENDIF.
ENDIF.
ENDLOOP.
"Layout
gs_layout-cwidth_opt = 'X'. "优化行宽度
gs_layout-zebra = 'X'. "斑马纹!
gs_layout-box_fname = 'SEL'. "选择列
* gs_layout-edit = 'X'. "ALV全部可编辑
"单元格可编辑
gs_layout-stylefname = 'FIELD_STYLE'.
"Fieldcat
DATA: ls_fieldcat TYPE lvc_s_fcat.
DEFINE hong.
ls_fieldcat-fieldname = &1."字段名
ls_fieldcat-scrtext_l = &2."文本描述
ls_fieldcat-edit = &3."可编辑-------->ALV列全部可编辑
ls_fieldcat-no_out = &4."不显示列
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
hong 'C' 'C' 'X' 'X'."必须有一列可编辑
hong 'EBELN' '采购凭证编号' '' ''.
hong 'BUKRS' '公司代码' '' ''.
hong 'EKORG' '采购组织' '' ''.
hong 'EKGRP' '采购组' '' ''.
hong 'KUNNR' '客户编号' '' ''.
hong 'EBELP' '凭证项目编号' '' ''.
hong 'MATNR' '物料编号' '' ''.
hong 'WERKS' '工厂' '' ''.
hong 'LGORT' '库存地点' '' ''.
hong 'MATKL' '物料组' '' ''.
hong 'MENGE' '采购订单数量' '' ''.
hong 'MEINS' '采购订单计量单位' '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
* i_callback_pf_status_set = 'F_STATUS_SET '
* i_callback_user_command = 'F_USER_COMMAND '
* i_grid_title = ''
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = gt_alv
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.
结果如下: