SAP ABAP 灵活调整ALV单元格可编辑模式

ALV单元格可编辑模式

发布时间:2024/07/19

案例:根据选择画面的工厂查询自定义表的子图号和计划子图号。以alv呈现,新增修改按钮,选中需要修改的行,点击修改按钮,选中行的子图号和计划子图号变为可编辑模式。保存成功后变为不可编辑模式。

单元格编辑控制需要4个步骤:

  1. ztewm_psjh_sco_h是我的自定义表,要为alv输出表定义一个类型,这里我放入了选择框(box)、消息灯(icon)、消息(msg)和修改模式(field_style)字段。
  2. 在layout中指定修改模式字段。
    gs_layout-stylefname = ‘FIELD_STYLE’.
  3. 获取ooalv的可编辑控制
    CALL METHOD lr_grid->set_ready_for_input
    EXPORTING
    i_ready_for_input = 1.
  4. 编辑修改模式字段。
    FORM frm_open_edit.
    FORM frm_close_edit.
  5. 命令执行完毕后一定要刷新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就能实现单元可编辑控制啦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值