ALV 单元格动态可编辑

当我们提到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.

结果如下:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ALV单元格动态编辑ABAP技术在ALV报表上的一个重要扩展。ALVABAP List Viewer)是SAP系统中常用的报表显示工具,可以方便地展示和处理大量的数据。但是在默认情况下,ALV报表的单元格是不可编辑的,用户只能查看报表数据而无法进行修改。 为了满足用户对报表数据进行动态修改的需求,开发人员通过对ALV控件进行扩展,使其支持单元格动态编辑功能。这样用户可以直接在报表上进行数据编辑,无需打开数据源进行修改。 实现ALV单元格动态编辑的扩展需要进行如下步骤: 1. 定义ALV报表的显示结构。 首先,需要定义ALV报表的显示结构,包括字段名、字段类型、长度等信息。 2. 扩展ALV函数模块。 在ALV函数模块中,需要添加相应的功能模块来支持单元格动态编辑。通过修改ALV函数模块的代码,实现对报表数据的修改和保存。 3. 增加用户交互接口。 为了方便用户进行数据修改,可以在报表上添加一些用户交互接口,比如勾选框、输入框等。用户可以通过这些接口直接修改报表数据,并进行保存操作。 4. 编写逻辑处理程序。 最后,需要编写逻辑处理程序,处理用户的修改操作。这个程序会根据用户输入的数据,更新相应的报表数据,并将修改后的数据保存回数据库中。 通过以上步骤的扩展,用户可以实现在ALV报表中直接进行数据编辑的功能。这样,用户可以更加方便地进行数据修改和保存,提高工作效率。同时,ALV单元格动态编辑的扩展也为定制化的报表需求提供了更多的灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值