ALV 单元格动态可编辑

文章介绍了如何在ABAP中实现ALV报告的单元格动态编辑,包括通过LVC_S_LAYO和LVC_T_FCAT控制编辑,以及设置field_style来控制单元格的可编辑状态。关键在于确保单元格名称按排序规则放入LVC_T_STYL,否则会导致错误。提供了一个DEMO代码示例来演示具体实现过程。
摘要由CSDN通过智能技术生成

当我们提到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_STYLfieldname中,把类cl_gui_alv_grid=>mc_style_enabled方法(单元格可编辑),cl_gui_alv_grid=>mc_style_disabled(单元格不可编辑)放入LVC_T_STYLstyle中。

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.

结果如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值