SAP 标准ALV实现单元格可编辑,插入可编辑的新行,敲下回车后更新数据

实现单元格可编辑:

  1. 假定将要显示在ALV屏幕上的内表名为:it_alv。

  1. 通过slis_fieldcat_alv-edit = 'X',将单元格所在列设为可编辑状态。

  1. 在it_alv的data定义里添加新列field_style,类型为lvc_t_styl。

  1. 将内表it_alv中不需要编辑的行中单元格设为不可编辑状态。代码示例如下:

  DATA:ls_stylelin TYPE lvc_s_styl.
  LOOP AT it_alv ASSIGNING <wa_alv>.
    IF it_alv-werks = '1020'."当工厂为1020时,不允许编辑该行的工厂
        ls_stylelin-fieldname = 'WERKS'.
        ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态
        INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .
    ENDIF.
  ENDLOOP.

实现插入可编辑的新行:

  1. 往it_alv里第一行插入新行

  1. 把该新行的field_style( lvc_t_styl )清空。

  1. 这样该新行的可编辑字段就是设置了slis_fieldcat_alv-edit = 'X'的列所存的字段。

代码示例如下:

  INSERT INITIAL LINE INTO it_alv INDEX 1.
  IF sy-subrc = 0.
    READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.
    CLEAR <wa_alv>-field_style .
  ENDIF.

敲下回车后更新数据:

  1. 编写event类,在调用alv创建函数时添加输入参数。

ALV调用代码示例:

    DATA: lt_events   TYPE slis_t_event,
          ls_events   TYPE slis_alv_event. " Alv grid.
    ls_events-name = 'CALLER_EXIT'.
    ls_events-form = 'FRM_REGISTER_EVENTS'.
    APPEND ls_events TO lt_events.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'FRM_SET_STATUS'
        i_callback_user_command  = 'FRM_USER_COMMAND'
        is_layout_lvc            = gs_layo
        it_fieldcat_lvc          = gt_fcat
        it_events                = lt_events
        i_save                   = 'A'
      TABLES
        t_outtab                 = it_alv
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.

Event类定义代码示例:

*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,
     g_grid           TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义
  PUBLIC SECTION.
    METHODS:
      handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*       类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现
  METHOD handle_data_changed.
    PERFORM handle_data_changed ."具体处理数据事件
*    IF e_modified = 'X'.
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD g_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
*    ENDIF.
  ENDMETHOD.                    "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*&      Form  register_events
*&---------------------------------------------------------------------*
*       注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.
*
  DATA: gr_event_handler TYPE REF TO lcl_event_handler.
  CREATE OBJECT gr_event_handler.
*
  CALL METHOD g_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM. "register_events

*&---------------------------------------------------------------------*
*&      Form  HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output data
  LOOP AT it_alv ASSIGNING <wa_alv> .
        SELECT SINGLE ekgrp
          INTO <wa_alv>-ekgrp
          FROM zmarc
          WHERE wekrs = <wa_alv>-werks.
  ENDLOOP.
ENDFORM.                    "HANDLE_DATA_CHANGED

完整程序代码示例:

*&---------------------------------------------------------------------*
*& Report  ZTEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ztest.

TABLES:mara,marc,sscrfields.

TYPE-POOLS:slis.

DEFINE mro_fcat.
  clear: ls_fcat.
  ls_fcat-fieldname = &1.
  ls_fcat-coltext = &2.
  ls_fcat-scrtext_l = &2.
  ls_fcat-scrtext_m = &2.
  ls_fcat-scrtext_s = &2.
  ls_fcat-no_zero = 'X'.
  translate ls_fcat-fieldname to upper case.
  if &3 ne space.
    ls_fcat-ref_field = ls_fcat-fieldname.
    ls_fcat-ref_table = &3.
    ls_fcat-ref_field = &5.
  endif.
*  if &1 eq 'ztype'. " OR &1 EQ 'aufnr'.
*    ls_fcat-hotspot = 'X'.
*  endif.
  ls_fcat-edit = &4.
  translate ls_fcat-ref_table to upper case.
  ls_fcat-datatype  = &6 .  " 指定数据类型
*  ls_fcat-inttype   = &7 .          "这个是指定字段的类型为C
  append ls_fcat to gt_fcat.
END-OF-DEFINITION.


"ALV data define
DATA: ls_fcat TYPE slis_fieldcat_alv,
      gt_fcat TYPE lvc_t_fcat,
      gs_layo TYPE lvc_s_layo.

DATA: lt_events   TYPE slis_t_event,
      ls_events   TYPE slis_alv_event. " Alv grid.

"Red Green Color
CONSTANTS: c_green  TYPE icon-id VALUE '@08@',
           c_yellow TYPE icon-id VALUE '@09@',
           c_red    TYPE icon-id VALUE '@0A@'.

DATA: it_data LIKE TABLE OF zmarc WITH HEADER LINE.


DATA: BEGIN OF it_alv OCCURS 0,
        box     TYPE xfeld,         " Check Box
        message TYPE char255,
        id      TYPE char25,
        werks   LIKE zmm_rebaterule-werks ,
        ekgrp   LIKE zmm_rebaterule-ekgrp ,
        field_style TYPE lvc_t_styl,  "单元格可编辑
      END OF it_alv.
FIELD-SYMBOLS: <wa_alv> LIKE it_alv.


SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-000.
SELECT-OPTIONS: s_werks FOR zmm_rebaterule-werks OBLIGATORY.
SELECT-OPTIONS: s_ekgrp FOR zmm_rebaterule-ekgrp .
SELECTION-SCREEN END OF BLOCK blk2.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-000.
PARAMETERS:rd01 RADIOBUTTON GROUP rd USER-COMMAND zchg DEFAULT 'X'.
PARAMETERS:rd02 RADIOBUTTON GROUP rd.
SELECTION-SCREEN END OF BLOCK b1.


START-OF-SELECTION.
  IF rd01 EQ 'X'."Create/Change
    PERFORM get_data.
    PERFORM process_alv_show.
    PERFORM alv_display.
  ELSEIF rd02 EQ 'X'."Display/Print
    PERFORM get_data.
    PERFORM alv_display.
  ENDIF.


*&---------------------------------------------------------------------*
*&      Form  PROCESS_ALV_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM process_alv_show.
  DATA:ls_stylelin TYPE lvc_s_styl.
  DATA:lt_lvc_t_styl TYPE lvc_t_styl.
  LOOP AT it_alv ASSIGNING <wa_alv>.
    ls_stylelin-fieldname = 'WERKS'.
    ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态
    INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .
  ENDLOOP.
ENDFORM.                    "PROCESS_ALV_SHOW



*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data.
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE it_alv
    FROM zmarc
    WHERE werks IN s_werks AND ekgrp IN s_ekgrp .
  SORT it_alv BY werks lifnr matnr.
ENDFORM.                    "get_data




*&---------------------------------------------------------------------*
*&      Form  alv_display
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_display.
  DATA: ls_fcat TYPE lvc_s_fcat.
  DATA: ls_disvariant TYPE disvariant.
  gs_layo-zebra = 'X'.
  gs_layo-cwidth_opt = 'X'.
  gs_layo-box_fname = 'BOX'.
  gs_layo-stylefname = 'FSTYLE'.
  gs_layo-info_fname = 'ZCOL' .
  gs_layo-stylefname = 'FIELD_STYLE'.  " 将内表中的字段名存入显示格式


  IF rd02 EQ 'X' ."Display/Print
    mro_fcat 'WERKS'      'Plant Code'        'ZMARC' space '' ''.
    mro_fcat 'EKGRP'      'Purchase Group'    'ZMARC' space '' ''.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'FRM_SET_STATUS'
        i_callback_user_command  = 'FRM_USER_COMMAND'
        is_layout_lvc            = gs_layo
        it_fieldcat_lvc          = gt_fcat
        i_save                   = 'A'
      TABLES
        t_outtab                 = it_alv
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.
  ELSEIF rd01 EQ 'X' ."Create/Change
    ls_events-name = 'CALLER_EXIT'.
    ls_events-form = 'FRM_REGISTER_EVENTS'.
    APPEND ls_events TO lt_events.
    mro_fcat 'message' 'MESSAGE' '' space '' ''.
    mro_fcat 'id' 'ICON' '' space '' ''.
    mro_fcat 'WERKS'      'Plant Code'        'ZMARC' 'X' '' ''.
    mro_fcat 'EKGRP'      'Purchase Group'    'ZMARC' 'X' '' ''.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'FRM_SET_STATUS'
        i_callback_user_command  = 'FRM_USER_COMMAND'
        is_layout_lvc            = gs_layo
        it_fieldcat_lvc          = gt_fcat
        it_events                = lt_events
        i_save                   = 'A'
      TABLES
        t_outtab                 = it_alv
      EXCEPTIONS
        program_error            = 1
        OTHERS                   = 2.
  ENDIF.
ENDFORM.                    "alv_display


*&---------------------------------------------------------------------*
*&      Form  frm_set_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab.
  IF rd02 EQ 'X'.
    SET PF-STATUS '200'.
  ELSE.
    SET PF-STATUS '100'.
  ENDIF.

  DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.
  IF sy-subrc <> 0.
  ENDIF.

ENDFORM.                    "frm_set_status

*&---------------------------------------------------------------------*
*&      Form  frm_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
      rs_selfield TYPE slis_selfield.
  IF r_ucomm  EQ '&SAVE'.
    PERFORM update_data.
    PERFORM insert_data.
    rs_selfield-refresh = 'X'.
  ELSEIF r_ucomm  EQ '&NEWLINE'.
    PERFORM add_new_line.
    rs_selfield-refresh = 'X'.
  ENDIF.

ENDFORM.                    "frm_user_command

*&---------------------------------------------------------------------*
*&      Form  update_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM update_data.

ENDFORM.                    "update_data

*&---------------------------------------------------------------------*
*&      Form  insert_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM insert_data.
  
ENDFORM.                    "insert_data

*&---------------------------------------------------------------------*
*&      Form  add_new_line
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM add_new_line.
  DATA:ls_stylelin TYPE lvc_s_styl.
  DATA:lt_lvc_t_styl TYPE lvc_t_styl.
  INSERT INITIAL LINE INTO it_alv INDEX 1.
  IF sy-subrc = 0.
    READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.
    <wa_alv>-zccstatus = '1'.
    CLEAR <wa_alv>-field_style .
  ENDIF.
ENDFORM.                    "add_new_line

*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,
     g_grid           TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义
  PUBLIC SECTION.
    METHODS:
      handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*       类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现
  METHOD handle_data_changed.
    PERFORM handle_data_changed ."具体处理数据事件
*    IF e_modified = 'X'.
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD g_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
*    ENDIF.
  ENDMETHOD.                    "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*&      Form  register_events
*&---------------------------------------------------------------------*
*       注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.
*
  DATA: gr_event_handler TYPE REF TO lcl_event_handler.
  CREATE OBJECT gr_event_handler.
*
  CALL METHOD g_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM. "register_events

*&---------------------------------------------------------------------*
*&      Form  HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output data 自动刷新数据
  LOOP AT it_alv ASSIGNING <wa_alv> .
        SELECT SINGLE ekgrp
          INTO <wa_alv>-ekgrp
          FROM zmarc
          WHERE wekrs = <wa_alv>-werks.
  ENDLOOP.
ENDFORM.                    "HANDLE_DATA_CHANGED
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------------------------Enter event Definition-------------------------------------------
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALV单元格动态可编辑是ABAP技术在ALV报表上的一个重要扩展。ALV(ABAP 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、付费专栏及课程。

余额充值