在创建ALV架构的时候,一个很重要的字段fieldname ,其等号后面单引号里面是对应内表的每个字段的名称,并且必须是大写的。

如果是把这个字段的值写成了小写字母,其他的都没有什么错误,但是alv就是不会把内表中的数据显示出来,就是debug你会看到

内表中已经查出了数据,而ALV就是不显示,你就要考虑是不是在创建ALV架构的时候,w_fieldcat_alv-fieldname = ‘vbeln’.

如果是这样只要把小写改成大写就ok了。

FORM fieldcat_build .
  w_fieldcat_alv-fieldname = ‘VBELN’.
  w_fieldcat_alv-ref_table = ‘VBAP’.
  w_fieldcat_alv-scrtext_s = ‘Sale Order No’.
  APPEND w_fieldcat_alv TO i_fieldcat_alv.
  CLEAR w_fieldcat_alv.

w_fieldcat_alv-scrtext_s = ‘CheckBox’.
  w_fieldcat_alv-checkbox = ‘X’.
  w_fieldcat_alv-edit = ‘X’.
  APPEND w_fieldcat_alv TO i_fieldcat_alv.
  CLEAR w_fieldcat_alv.

ENDFORM.                    " fieldcat_build

ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.

ALV有两种方式实现,一种方式是CALL FUNCTION: REUSE_ALV_GRID_DISPLAY, 标准按钮是包含刷新设置的,但是如果自定义功能,也就是需要设置USER_COMMAND CALL BACK程序的时候,需要对参数SELFIELD-REFRESH值设置为’X’,这样ALV的数据就会刷新显示。

作者:weixin_38238891
来源:CSDN
原文:https://blog.csdn.net/weixin_38238891/article/details/71710872
版权声明:本文为博主原创文章,转载请附上博文链接!

ALV有两种方式实现,一种方式是CALL FUNCTION: REUSE_ALV_GRID_DISPLAY, 标准按钮是包含刷新设置的,但是如果自定义功能,也就是需要设置USER_COMMAND CALL BACK程序的时候,需要对参数SELFIELD-REFRESH值设置为’X’,这样ALV的数据就会刷新显示。

作者:weixin_38238891
来源:CSDN
原文:https://blog.csdn.net/weixin_38238891/article/details/71710872
版权声明:本文为博主原创文章,转载请附上博文链接!

SAP提供的ALV标准Demo程序:
BCALV_EDIT_01切换 显示<–>修改 模式
BCALV_EDIT_02 修改单元格
BCALV_EDIT_03 修改的单元格校验
BCALV_EDIT_04 删除行, 添加行, 检查并保存
BCALV_EDIT_05 可编辑复选框,双击复选框单元格,更改复选框编辑状态
BCALV_EDIT_06 列级别的下拉清单框
BCALV_EDIT_07 单元格级别的下拉清单框
BCALV_EDIT_08 集成非标准的F4帮助

作者:SAP剑客
来源:CSDN
原文:https://blog.csdn.net/zhongguomao/article/details/77882199
版权声明:本文为博主原创文章,转载请附上博文链接!

输入’BCALV*'后按F4,你可以查到很多ALV示例程序。
在ALV中更新数据库表
FORM usercommand USING ucomm TYPE sy-ucomm

selfield TYPE slis_selfield.

DATA: lr_grid TYPE REF TO cl_gui_alv_grid.


方法①

CALL FUNCTION ‘GET_GLOBALS_FROM_SLVC_FULLSCR’  "获得数据

IMPORTING

e_grid = lr_grid.

CALL METHOD lr_grid->check_changed_data.


方法②

selfield-refresh = ‘X’.  " 所有更改全部更新

**    itab-fld1 = selfield-value                     "更改某一字段


注释:这里方法①②都可以用来更新数据,不知道有什么区别优势

CASE sy-ucomm.

*请填写删除操作

* 保存操作

WHEN ‘SAVE’.

*请填写修改操作

MODIFY ZSZ_LEAVE FROM TABLE ITAB.

COMMIT WORK.

ENDCASE.

ENDFORM.              "USER_COMMAND

http://blog.sina.com.cn/s/blog_55c871720102wlj0.html

通过ALV控件编辑内表和数据库更新 2011-06-20 17:23:27

分类:

&---------------------------------------------------------------------
*& Report  YGYTEST068
*&
&---------------------------------------------------------------------
*&
*&
&---------------------------------------------------------------------

REPORT  YGYTEST068.
DATA:OK_CODE TYPE SY-UCOMM,
     SAVE_OK LIKE OK_CODE.
TABLES SPFLI.
DATA LS_SPFLI TYPE SPFLI.
DATA WA_SPFLI TYPE TABLE OF SPFLI.
DATA WADEL_SPFLI TYPE TABLE OF SPFLI.
SELECT * INTO TABLE WA_SPFLI FROM SPFLI.
DATA:WA_CONTAINER TYPE SCRFNAME VALUE ‘ALVDATA’,
     ALV_GRID TYPE REF TO CL_GUI_ALV_GRID,
     WA_CUSTOM_CONTAINER TYPE REF TO  CL_GUI_CUSTOM_CONTAINER.
DATA WA_LAYOUT TYPE LVC_S_LAYO.
WA_LAYOUT-EDIT = ‘X’.
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
DATA EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    TYPES:DEL_ROWS TYPE STANDARD TABLE OF SPFLI.
    DATA:DDEL_ROWS TYPE STANDARD TABLE OF SPFLI.
  METHODS:
    HANDLE_DATA_CHANGED
      FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        IMPORTING ER_DATA_CHANGED.
  METHODS:
    UPDATE_DELTA_TABLES
      IMPORTING PR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  METHODS:
    GET_DELETED_ROWS
      EXPORTING
        DELETED_ROWS TYPE DEL_ROWS.
ENDCLASS.
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  METHOD HANDLE_DATA_CHANGED.
*    CALL METHOD UPDATE_DELTA_TABLES.
    CALL METHOD UPDATE_DELTA_TABLES( ER_DATA_CHANGED ).
  ENDMETHOD.
  METHOD UPDATE_DELTA_TABLES.
    DATA:L_DEL_ROW TYPE LVC_S_MOCE.
    LOOP AT PR_DATA_CHANGED->MT_DELETED_ROWS INTO L_DEL_ROW.
      READ TABLE WA_SPFLI INTO LS_SPFLI INDEX L_DEL_ROW-ROW_ID.
      IF SY-SUBRC NE 0.
        MESSAGE E208(00) WITH ‘处理错误’.
      ELSE.
        APPEND LS_SPFLI TO DDEL_ROWS.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.
  METHOD GET_DELETED_ROWS.
    DELETED_ROWS = ME->DDEL_ROWS.
  ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
  CALL SCREEN 100.
  WRITE / ‘删除的内表记录:’.
  WRITE / ‘--------’.
  CALL METHOD EVENT_RECEIVER->GET_DELETED_ROWS
    IMPORTING DELETED_ROWS = WADEL_SPFLI.
  LOOP AT WADEL_SPFLI INTO SPFLI.
    WRITE: / SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM.
  ENDLOOP.
  WRITE : / ‘更新后的内表记录:’.
  WRITE: / ‘-------’.
  LOOP AT WADEL_SPFLI INTO SPFLI.
    WRITE: / SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM.
  ENDLOOP.
MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN ‘EXIT’.
      DATA L_RET VALUE ‘X’.
      CALL METHOD ALV_GRID->CHECK_CHANGED_DATA
        IMPORTING E_VALID = L_RET.
      LEAVE TO SCREEN 0.
    WHEN ‘SAVE’.
      MODIFY SPFLI FROM TABLE WA_SPFLI.
      IF SY-SUBRC NE 0 .
         MESSAGE I005(YMESS) WITH ‘更新数据错误!’.
         EXIT.
      ELSE.
        MESSAGE I005(YMESS) WITH ‘更新数据OK!’.
      ENDIF.
      DELETE SPFLI FROM TABLE WADEL_SPFLI.
      IF SY-SUBRC NE 0 .
         MESSAGE I005(YMESS) WITH ‘更新数据错误!’.
         EXIT.
      ELSE.
        MESSAGE I005(YMESS) WITH ‘更新数据OK!’.
      ENDIF.
  ENDCASE.
ENDMODULE.
MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS ‘STATUS1’.
  IF WA_CUSTOM_CONTAINER IS INITIAL.
    CREATE OBJECT WA_CUSTOM_CONTAINER
      EXPORTING CONTAINER_NAME = WA_CONTAINER.
    CREATE OBJECT ALV_GRID
      EXPORTING I_PARENT = WA_CUSTOM_CONTAINER.
    CREATE OBJECT EVENT_RECEIVER.
    SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR ALV_GRID.
    CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING I_STRUCTURE_NAME = ‘SPFLI’
        IS_LAYOUT = WA_LAYOUT
      CHANGING IT_OUTTAB = WA_SPFLI.
  ENDIF.
ENDMODULE.

http://blog.sina.com.cn/s/blog_3f87d6a80100r9kj.html
原文地址:FM ALV可编辑字段值更新内表作者:北风
FM ALV在处理可编辑字段方面已经很强大了,所以平常很少用OO ALV来做。
当然OO ALV凭借类、事件、方法有其更强大的功能,FM ALV底层实际也是基于OO ALV的。
本文主要以REUSE_ALV_GRID_DISPLAY_LVC为例,演示可编辑字段处理的简单方法:

在REUSE_ALV_GRID_DISPLAY_LVC显示的ALV中,实现可编辑字段的新值自动更新到内表有一个前提:
REUSE_ALV_GRID_DISPLAY_LVC的输入参数中,有一个是:I_GRID_SETTINGS,其中的EDT_CLL_CB字段是可回调标识,需要设置EDT_CLL_CB = ‘X’。

在此前提下,再按是否自定义STATUS区分:
(1)没有自定义STATUS,即使用标准的界面。
当为可编辑字段输入新值后,敲回车点击标准工具栏的按钮点击标准的保存按钮,都可以自动更新字段的新值到内表中;
(2)自定义STATUS,此时又区分2种情况:
(2.1)自定义按钮的功能码设置为&DATA_SAVE。当为可编辑字段输入新值后,点击此按钮,也可以自动更新字段的新值到内表中;
(2.2)自定义按钮的功能码不是&DATA_SAVE。当为可编辑字段输入新值后,点击此按钮,是不会自动更新字段的新值到内表中的。
其中,&DATA_SAVE是标准界面保存按钮的功能码。

对于(2.2)情况,可以在判断功能码时,调用方法CHECK_CHANGED_DATA,这样即可自动更新可编辑字段的新值到内表中。

以“FM ALV自定义小计文本”一文代码为例,设置“数量”字段为可编辑字段。
新建了状态ZSTATUS,保留标准保存按钮。
创建了按钮YES、NO,功能码分别是POPUP_1、POPUP_2。
这2个按钮和标准的保存按钮都是调用FORM:FRM_ALV_POPUP弹出另一个ALV窗口显示内表最新值。
这2个按钮的区别在于:按钮YES在调用FORM:FRM_ALV_POPUP之前,调用了方法CHECK_CHANGED_DATA;而按钮NO没有。

你可以尝试上述说的几种情况,对比当前界面内表与弹出的窗口内表(即更新后)的值。
对可编辑字段输入新值后:直接点击标准保存按钮按钮YES,内表更新了;点击按钮NO,内表没有更新。
所以自定义按钮时,建议把方法CHECK_CHANGED_DATA的调用移到判断功能码前。

  • 本程序保留了“REUSE_ALV_POPUP_TO_SELECT导出”一文中的导出功能。

REPORT ZTEMP MESSAGE-ID OO.

----------------------------------------------------------------------

  • Pools and Types
    ----------------------------------------------------------------------
    TYPE-POOLS: SLIS,ABAP,VRM,ICON,OLE2.

TYPES: BEGIN OF STRUC_TAB,
         MBLNR TYPE MSEG-MBLNR,
         MJAHR TYPE MSEG-MJAHR,
         ZEILE TYPE MSEG-ZEILE,
         BWART TYPE MSEG-BWART,
         MATNR TYPE MSEG-MATNR,
         MAKTX TYPE MAKT-MAKTX,
         DMBTR TYPE MSEG-DMBTR,
         MENGE TYPE MSEG-MENGE,
         BPMNG TYPE MSEG-BPMNG,
         MEINS TYPE MARA-MEINS,
         SUM TYPE CHAR50,
       END OF STRUC_TAB.

----------------------------------------------------------------------

  • Work Area and Internal Table
    ----------------------------------------------------------------------
    DATA: GS_LAYOUT TYPE LVC_S_LAYO,
          GS_SETTINGS TYPE LVC_S_GLAY,
          GT_SORT TYPE LVC_T_SORT,
          GT_FIELDCAT TYPE LVC_T_FCAT.

DATA: GS_TAB TYPE STRUC_TAB,
      GT_TAB TYPE TABLE OF STRUC_TAB.

----------------------------------------------------------------------

  • Ranges and Field Symbols
    ----------------------------------------------------------------------
    FIELD-SYMBOLS: <FS_TAB> TYPE STRUC_TAB.

----------------------------------------------------------------------

  • Class and Object
    ----------------------------------------------------------------------
    DATA: GRID TYPE REF TO CL_GUI_ALV_GRID.

----------------------------------------------------------------------

  • START-OF-SELECTION
    ----------------------------------------------------------------------
    START-OF-SELECTION.

PERFORM FRM_DATA_GET.
  PERFORM FRM_DATA_PROCESS.
  PERFORM FRM_DATA_OUTPUT.

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_GET
&---------------------------------------------------------------------
FORM FRM_DATA_GET.

SELECT A~MBLNR A~MJAHR A~ZEILE A~BWART A~MATNR A~DMBTR A~MENGE A~BPMNG
         B~MAKTX
    FROM MSEG AS A
    INNER JOIN MAKT AS B ON B~MATNR EQ A~MATNR AND B~SPRAS EQ SY-LANGU
    UP TO 15 ROWS
    INTO CORRESPONDING FIELDS OF TABLE GT_TAB.

IF GT_TAB IS INITIAL.
    MESSAGE S000 WITH ‘没有符合条件的数据!’ DISPLAY LIKE ‘E’.
    STOP.
  ENDIF.

ENDFORM.                                                  "FRM_DATA_GET

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_PROCESS
&---------------------------------------------------------------------
FORM FRM_DATA_PROCESS.

LOOP AT GT_TAB ASSIGNING <FS_TAB>.
    CONCATENATE <FS_TAB>-MAKTX ‘-’ <FS_TAB>-BWART INTO <FS_TAB>-SUM.
  ENDLOOP.

GS_TAB-MEINS = ‘EA’.
  MODIFY GT_TAB FROM GS_TAB TRANSPORTING MEINS WHERE MEINS NE ‘EA’.
  CLEAR GS_TAB.

ENDFORM.                                               "FRM_DATA_PROCESS

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_OUTPUT
&---------------------------------------------------------------------
FORM FRM_DATA_OUTPUT.

PERFORM FRM_ALV_INIT_LAYOUT.
  PERFORM FRM_ALV_INIT_SETTINGS.
  PERFORM FRM_ALV_SORT_BUILD.
  PERFORM FRM_ALV_INIT_FIELDCAT.
  PERFORM FRM_ALV_DISPLAY.

ENDFORM.                    " FRM_DATA_OUTPUT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_LAYOUT
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_LAYOUT.

GS_LAYOUT-ZEBRA = ‘X’.
  GS_LAYOUT-SEL_MODE = ‘D’.
  GS_LAYOUT-CWIDTH_OPT = ‘X’.
  GS_LAYOUT-DETAILINIT = ‘X’.

ENDFORM.                    " FRM_ALV_INIT_LAYOUT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_SETTINGS
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_SETTINGS.

GS_SETTINGS-EDT_CLL_CB = ‘X’.

ENDFORM.                    " FRM_ALV_INIT_SETTINGS

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_SORT_BUILD
&---------------------------------------------------------------------
FORM FRM_ALV_SORT_BUILD.
  DATA: LS_SORT TYPE LVC_S_SORT.

LS_SORT-FIELDNAME = ‘MATNR’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘MAKTX’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘BWART’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘SUM’.
  LS_SORT-UP        = ‘X’.
  LS_SORT-SUBTOT    = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

ENDFORM.                    "FRM_ALV_SORT_BUILD

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_FIELDCAT
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_FIELDCAT.
  DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
  DEFINE MAC_FILL_FIELDCAT.
    LS_FIELDCAT-FIELDNAME  = &1.
    LS_FIELDCAT-COLTEXT = &2.
    LS_FIELDCAT-NO_ZERO = &3.
    LS_FIELDCAT-DO_SUM = &4.
    LS_FIELDCAT-NO_OUT = &5.
    LS_FIELDCAT-REF_TABLE = &6.
    LS_FIELDCAT-REF_FIELD = &7.
    LS_FIELDCAT-DECIMALS_O = &8.
    LS_FIELDCAT-QFIELDNAME = &9.
    APPEND LS_FIELDCAT TO GT_FIELDCAT.
    CLEAR LS_FIELDCAT.
  END-OF-DEFINITION.

MAC_FILL_FIELDCAT ‘MBLNR’ ‘物料凭证’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MJAHR’ ‘凭证年度’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘ZEILE’ ‘行号’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘BWART’ ‘移动类型’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MATNR’ ‘物料编码’ ‘X’ ‘’ ‘’ ‘MARA’ ‘MATNR’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MAKTX’ ‘物料描述’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘DMBTR’ ‘金额’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MENGE’ ‘数量’ ‘’ ‘X’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT ‘BPMNG’ ‘计算数量’ ‘’ ‘X’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT ‘SUM’ ‘小计:’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MEINS’ ‘单位’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.

LS_FIELDCAT-EDIT = ‘X’.
  MODIFY GT_FIELDCAT FROM LS_FIELDCAT TRANSPORTING EDIT
    WHERE FIELDNAME EQ ‘MENGE’.
  CLEAR LS_FIELDCAT.

ENDFORM.                    " FRM_ALV_INIT_FIELDCAT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_DISPLAY
&---------------------------------------------------------------------
FORM FRM_ALV_DISPLAY.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      IS_LAYOUT_LVC            = GS_LAYOUT
      I_GRID_SETTINGS          = GS_SETTINGS
      IT_SORT_LVC              = GT_SORT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      I_SAVE                   = ‘U’
      I_DEFAULT                = SPACE
      I_CALLBACK_PF_STATUS_SET = ‘FRM_ALV_STATUS_SET’
      I_CALLBACK_USER_COMMAND  = ‘FRM_ALV_USER_COMMAND’
    TABLES
      T_OUTTAB                 = GT_TAB
    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.

ENDFORM.                    " FRM_ALV_DISPLAY

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_STATUS_SET
&---------------------------------------------------------------------
FORM FRM_ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.

SET PF-STATUS ‘ZSTATUS’ EXCLUDING PT_EXTAB.

CHECK GRID IS INITIAL.

CALL FUNCTION ‘GET_GLOBALS_FROM_SLVC_FULLSCR’
    IMPORTING
      E_GRID = GRID.

ENDFORM.                    " FRM_ALV_STATUS_SET

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_USER_COMMAND
&---------------------------------------------------------------------
FORM FRM_ALV_USER_COMMAND USING PA_UCOMM TYPE SY-UCOMM
                                PS_SELFIELD TYPE SLIS_SELFIELD.

CASE PA_UCOMM.
    WHEN ‘&DATA_SAVE’.
      PERFORM FRM_ALV_POPUP.
    WHEN ‘POPUP_1’.
      CALL METHOD GRID->CHECK_CHANGED_DATA.
      PERFORM FRM_ALV_POPUP.
    WHEN ‘POPUP_2’.
      PERFORM FRM_ALV_POPUP.
  ENDCASE.

ENDFORM.                    " FRM_ALV_USER_COMMAND

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_POPUP
&---------------------------------------------------------------------
FORM FRM_ALV_POPUP.
  DATA: LS_FIELDCAT_SUB TYPE SLIS_FIELDCAT_ALV,
        LT_FIELDCAT_SUB TYPE SLIS_T_FIELDCAT_ALV.
  DEFINE MAC_FILL_FIELDCAT_SUB.
    LS_FIELDCAT_SUB-FIELDNAME  = &1.
    LS_FIELDCAT_SUB-SELTEXT_M = &2.
    LS_FIELDCAT_SUB-KEY = &3.
    LS_FIELDCAT_SUB-NO_ZERO = &4.
    LS_FIELDCAT_SUB-NO_OUT = &5.
    LS_FIELDCAT_SUB-REF_TABNAME = &6.
    LS_FIELDCAT_SUB-REF_FIELDNAME = &7.
    LS_FIELDCAT_SUB-DECIMALS_OUT = &8.
    LS_FIELDCAT_SUB-QFIELDNAME = &9.
    APPEND LS_FIELDCAT_SUB TO LT_FIELDCAT_SUB.
    CLEAR LS_FIELDCAT_SUB.
  END-OF-DEFINITION.

MAC_FILL_FIELDCAT_SUB ‘MBLNR’ ‘物料凭证’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MJAHR’ ‘凭证年度’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘ZEILE’ ‘行号’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘BWART’ ‘移动类型’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MATNR’ ‘物料编码’ ‘’ ‘X’ ‘’ ‘MARA’ ‘MATNR’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MAKTX’ ‘物料描述’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘DMBTR’ ‘金额’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MENGE’ ‘数量’ ‘’ ‘’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT_SUB ‘BPMNG’ ‘计算数量’ ‘’ ‘’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT_SUB ‘MEINS’ ‘单位’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.

CALL FUNCTION ‘REUSE_ALV_POPUP_TO_SELECT’
    EXPORTING
      I_CALLBACK_PROGRAM      = SY-REPID
      I_ZEBRA                 = ‘X’
      I_SCREEN_START_COLUMN   = 10
      I_SCREEN_START_LINE     = 1
      I_SCREEN_END_COLUMN     = 135
      I_SCREEN_END_LINE       = 15
      I_TABNAME               = ‘1’
      IT_FIELDCAT             = LT_FIELDCAT_SUB
      I_CALLBACK_USER_COMMAND = ‘FRM_ALV_USER_COMMAND_POPUP’
    TABLES
      T_OUTTAB                = GT_TAB
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.

ENDFORM.     "FRM_ALV_POPUP

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_USER_COMMAND_POPUP
&---------------------------------------------------------------------
FORM FRM_ALV_USER_COMMAND_POPUP USING PA_UCOMM TYPE SY-UCOMM
                                      PWA_SELFIELD TYPE SLIS_SELFIELD.
  DATA: L_FILENAME TYPE STRING,
        L_PATH TYPE STRING,
        L_FULLPATH TYPE STRING,
        L_ACTION TYPE I.
  TYPES: BEGIN OF STRUC_TABLE,
           MBLNR TYPE CHAR20,
           MJAHR TYPE CHAR20,
           ZEILE TYPE CHAR20,
           BWART TYPE CHAR20,
           MATNR TYPE CHAR20,
           MAKTX TYPE CHAR20,
           DMBTR TYPE CHAR20,
           MENGE TYPE CHAR20,
           BPMNG TYPE CHAR20,
         END OF STRUC_TABLE.
  DATA: LS_TAB TYPE STRUC_TABLE,
        LT_TAB TYPE TABLE OF STRUC_TABLE.

CASE PA_UCOMM.
    WHEN ‘&ETA’.
      CLEAR PA_UCOMM.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
        EXPORTING
          FILE_FILTER          = ‘Excel Files (.xls,.xlsx)|.xls;.xlsx’
        CHANGING
          FILENAME             = L_FILENAME
          PATH                 = L_PATH
          FULLPATH             = L_FULLPATH
          USER_ACTION          = L_ACTION
        EXCEPTIONS
          CNTL_ERROR           = 1
          ERROR_NO_GUI         = 2
          NOT_SUPPORTED_BY_GUI = 39
          OTHERS               = 4.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

CHECK L_ACTION EQ 0.
      CLEAR LS_TAB.
      REFRESH LT_TAB.

LOOP AT GT_TAB ASSIGNING <FS_TAB>.
        MOVE-CORRESPONDING <FS_TAB> TO LS_TAB.
        APPEND LS_TAB TO LT_TAB.
        CLEAR LS_TAB.
      ENDLOOP.

LS_TAB-MBLNR = ‘物料凭证’.
      LS_TAB-MJAHR = ‘凭证年度’.
      LS_TAB-ZEILE = ‘行号’.
      LS_TAB-BWART = ‘移动类型’.
      LS_TAB-MATNR = ‘物料编码’.
      LS_TAB-MAKTX = ‘物料描述’.
      LS_TAB-DMBTR = ‘金额’.
      LS_TAB-MENGE = ‘数量’.
      LS_TAB-BPMNG = ‘计算数量’.
      INSERT LS_TAB INTO LT_TAB INDEX 1.
      CLEAR LS_TAB.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
        EXPORTING
          FILENAME                = L_FULLPATH
          WRITE_FIELD_SEPARATOR   = ‘X’
        CHANGING
          DATA_TAB                = LT_TAB
        EXCEPTIONS
          FILE_WRITE_ERROR        = 1
          NO_BATCH                = 2
          GUI_REFUSE_FILETRANSFER = 3
          INVALID_TYPE            = 4
          NO_AUTHORITY            = 5
          UNKNOWN_ERROR           = 6
          HEADER_NOT_ALLOWED      = 7
          SEPARATOR_NOT_ALLOWED   = 8
          FILESIZE_NOT_ALLOWED    = 9
          HEADER_TOO_LONG         = 10
          DP_ERROR_CREATE         = 11
          DP_ERROR_SEND           = 12
          DP_ERROR_WRITE          = 13
          UNKNOWN_DP_ERROR        = 14
          ACCESS_DENIED           = 15
          DP_OUT_OF_MEMORY        = 16
          DISK_FULL               = 17
          DP_TIMEOUT              = 18
          FILE_NOT_FOUND          = 19
          DATAPROVIDER_EXCEPTION  = 20
          CONTROL_FLUSH_ERROR     = 21
          NOT_SUPPORTED_BY_GUI    = 22
          ERROR_NO_GUI            = 23
          OTHERS                  = 24.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
  ENDCASE.

ENDFORM. " FRM_ALV_USER_COMMAND_POPUP

http://blog.sina.com.cn/s/blog_3f87d6a80100r9kf.html
原文地址:FM ALV根据可编辑字段的值更新相关字段值作者:北风
以“FM ALV自定义小计文本”一文代码为例,设置“数量”字段为可编辑字段。
在“数量”字段输入新值后,敲回车点击标准保存按钮点击自定义按钮YES,用“数量”字段值减去5更新“计算数量”字段的值。

为了在更新内表字段值后,保证小计、合计值也重新汇总,需要调用方法:REFRESH_TABLE_DISPLAY。注意这个方法对应的事件:DATA_CHANGED_FINISHED。

2011-05-30:发现一个小问题,在没有修改数据的情况下,点击标准查看明细按钮时,也会执行事件DATA_CHANGED_FINISHED,导致刷新后,鼠标始终定位在第1行,即所查看到的明细永远是第1行。解决方法:
在调用方法前,CHECK E_MODIFIED EQ ‘X’,即发生修改时才刷新。

REPORT ZTEMP MESSAGE-ID OO.

----------------------------------------------------------------------

  • Pools and Types
    ----------------------------------------------------------------------
    TYPE-POOLS: SLIS,ABAP,VRM,ICON,OLE2.

TYPES: BEGIN OF STRUC_TAB,
         MBLNR TYPE MSEG-MBLNR,
         MJAHR TYPE MSEG-MJAHR,
         ZEILE TYPE MSEG-ZEILE,
         BWART TYPE MSEG-BWART,
         MATNR TYPE MSEG-MATNR,
         MAKTX TYPE MAKT-MAKTX,
         DMBTR TYPE MSEG-DMBTR,
         MENGE TYPE MSEG-MENGE,
         BPMNG TYPE MSEG-BPMNG,
         MEINS TYPE MARA-MEINS,
         SUM TYPE CHAR50,
       END OF STRUC_TAB.

----------------------------------------------------------------------

  • Work Area and Internal Table
    ----------------------------------------------------------------------
    DATA: GS_LAYOUT TYPE LVC_S_LAYO,
          GS_SETTINGS TYPE LVC_S_GLAY,
          GT_SORT TYPE LVC_T_SORT,
          GT_FIELDCAT TYPE LVC_T_FCAT.

DATA: GS_TAB TYPE STRUC_TAB,
      GT_TAB TYPE TABLE OF STRUC_TAB.

----------------------------------------------------------------------

  • Ranges and Field Symbols
    ----------------------------------------------------------------------
    RANGES: R_ROW FOR MSEG-ZEILE.

FIELD-SYMBOLS: <FS_TAB> TYPE STRUC_TAB.

----------------------------------------------------------------------

  • Class and Object
    ----------------------------------------------------------------------
    DATA: GRID TYPE REF TO CL_GUI_ALV_GRID.

----------------------------------------------------------------------

  • CLASS DEFINITION
    ----------------------------------------------------------------------
    CLASS LCL_EVENT_RECEIVER DEFINITION.

PUBLIC SECTION.
    METHODS:
      CALCULATE_QUANTITY
         FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
           IMPORTING ER_DATA_CHANGED.

METHODS:
      REFRESH_SUBTOTAL
        FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
          IMPORTING E_MODIFIED.

ENDCLASS.                                 "LCL_EVENT_RECEIVER DEFINITION

----------------------------------------------------------------------

  • START-OF-SELECTION
    ----------------------------------------------------------------------
    START-OF-SELECTION.

PERFORM FRM_DATA_GET.
  PERFORM FRM_DATA_PROCESS.
  PERFORM FRM_DATA_OUTPUT.

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_GET
&---------------------------------------------------------------------
FORM FRM_DATA_GET.

SELECT A~MBLNR A~MJAHR A~ZEILE A~BWART A~MATNR A~DMBTR A~MENGE A~BPMNG
         B~MAKTX
    FROM MSEG AS A
    INNER JOIN MAKT AS B ON B~MATNR EQ A~MATNR AND B~SPRAS EQ SY-LANGU
    UP TO 15 ROWS
    INTO CORRESPONDING FIELDS OF TABLE GT_TAB.

IF GT_TAB IS INITIAL.
    MESSAGE S000 WITH ‘没有符合条件的数据!’ DISPLAY LIKE ‘E’.
    STOP.
  ENDIF.

ENDFORM.                                                  "FRM_DATA_GET

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_PROCESS
&---------------------------------------------------------------------
FORM FRM_DATA_PROCESS.

LOOP AT GT_TAB ASSIGNING <FS_TAB>.
    CONCATENATE <FS_TAB>-MAKTX ‘-’ <FS_TAB>-BWART INTO <FS_TAB>-SUM.
  ENDLOOP.

GS_TAB-MEINS = ‘EA’.
  MODIFY GT_TAB FROM GS_TAB TRANSPORTING MEINS WHERE MEINS NE ‘EA’.
  CLEAR GS_TAB.

ENDFORM.                                               "FRM_DATA_PROCESS

&---------------------------------------------------------------------
*&      FORM  FRM_DATA_OUTPUT
&---------------------------------------------------------------------
FORM FRM_DATA_OUTPUT.

PERFORM FRM_ALV_INIT_LAYOUT.
  PERFORM FRM_ALV_INIT_SETTINGS.
  PERFORM FRM_ALV_SORT_BUILD.
  PERFORM FRM_ALV_INIT_FIELDCAT.
  PERFORM FRM_ALV_DISPLAY.

ENDFORM.                    " FRM_DATA_OUTPUT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_LAYOUT
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_LAYOUT.

GS_LAYOUT-ZEBRA = ‘X’.
  GS_LAYOUT-SEL_MODE = ‘D’.
  GS_LAYOUT-CWIDTH_OPT = ‘X’.
  GS_LAYOUT-DETAILINIT = ‘X’.

ENDFORM.                    " FRM_ALV_INIT_LAYOUT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_SETTINGS
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_SETTINGS.

GS_SETTINGS-EDT_CLL_CB = ‘X’.

ENDFORM.                    " FRM_ALV_INIT_SETTINGS

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_SORT_BUILD
&---------------------------------------------------------------------
FORM FRM_ALV_SORT_BUILD.
  DATA: LS_SORT TYPE LVC_S_SORT.

LS_SORT-FIELDNAME = ‘MATNR’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘MAKTX’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘BWART’.
  LS_SORT-UP        = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

LS_SORT-FIELDNAME = ‘SUM’.
  LS_SORT-UP        = ‘X’.
  LS_SORT-SUBTOT    = ‘X’.
  APPEND LS_SORT TO GT_SORT.
  CLEAR LS_SORT.

ENDFORM.                    "FRM_ALV_SORT_BUILD

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_INIT_FIELDCAT
&---------------------------------------------------------------------
FORM FRM_ALV_INIT_FIELDCAT.
  DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
  DEFINE MAC_FILL_FIELDCAT.
    LS_FIELDCAT-FIELDNAME  = &1.
    LS_FIELDCAT-COLTEXT = &2.
    LS_FIELDCAT-NO_ZERO = &3.
    LS_FIELDCAT-DO_SUM = &4.
    LS_FIELDCAT-NO_OUT = &5.
    LS_FIELDCAT-REF_TABLE = &6.
    LS_FIELDCAT-REF_FIELD = &7.
    LS_FIELDCAT-DECIMALS_O = &8.
    LS_FIELDCAT-QFIELDNAME = &9.
    APPEND LS_FIELDCAT TO GT_FIELDCAT.
    CLEAR LS_FIELDCAT.
  END-OF-DEFINITION.

MAC_FILL_FIELDCAT ‘MBLNR’ ‘物料凭证’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MJAHR’ ‘凭证年度’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘ZEILE’ ‘行号’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘BWART’ ‘移动类型’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MATNR’ ‘物料编码’ ‘X’ ‘’ ‘’ ‘MARA’ ‘MATNR’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MAKTX’ ‘物料描述’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘DMBTR’ ‘金额’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MENGE’ ‘数量’ ‘’ ‘X’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT ‘BPMNG’ ‘计算数量’ ‘’ ‘X’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT ‘SUM’ ‘小计:’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT ‘MEINS’ ‘单位’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.

LS_FIELDCAT-EDIT = ‘X’.
  MODIFY GT_FIELDCAT FROM LS_FIELDCAT TRANSPORTING EDIT
    WHERE FIELDNAME EQ ‘MENGE’.
  CLEAR LS_FIELDCAT.

ENDFORM.                    " FRM_ALV_INIT_FIELDCAT

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_DISPLAY
&---------------------------------------------------------------------
FORM FRM_ALV_DISPLAY.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      IS_LAYOUT_LVC            = GS_LAYOUT
      I_GRID_SETTINGS          = GS_SETTINGS
      IT_SORT_LVC              = GT_SORT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      I_SAVE                   = ‘U’
      I_DEFAULT                = SPACE
      I_CALLBACK_PF_STATUS_SET = ‘FRM_ALV_STATUS_SET’
      I_CALLBACK_USER_COMMAND  = ‘FRM_ALV_USER_COMMAND’
    TABLES
      T_OUTTAB                 = GT_TAB
    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.

ENDFORM.                    " FRM_ALV_DISPLAY

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_STATUS_SET
&---------------------------------------------------------------------
FORM FRM_ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
  DATA: L_GRID_EVENTS TYPE REF TO LCL_EVENT_RECEIVER.

SET PF-STATUS ‘ZSTATUS’ EXCLUDING PT_EXTAB.

CHECK GRID IS INITIAL.

CALL FUNCTION ‘GET_GLOBALS_FROM_SLVC_FULLSCR’
    IMPORTING
      E_GRID = GRID.

CALL METHOD GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

CREATE OBJECT L_GRID_EVENTS.
  SET HANDLER L_GRID_EVENTS->CALCULATE_QUANTITY FOR GRID.
  SET HANDLER L_GRID_EVENTS->REFRESH_SUBTOTAL FOR GRID.

ENDFORM.                    " FRM_ALV_STATUS_SET

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_USER_COMMAND
&---------------------------------------------------------------------
FORM FRM_ALV_USER_COMMAND USING PA_UCOMM TYPE SY-UCOMM
                                PS_SELFIELD TYPE SLIS_SELFIELD.

CALL METHOD GRID->CHECK_CHANGED_DATA.

CASE PA_UCOMM.
    WHEN ‘&DATA_SAVE’.
      PERFORM FRM_ALV_POPUP.
    WHEN ‘POPUP_1’.
      PERFORM FRM_ALV_POPUP.
  ENDCASE.

ENDFORM.                    " FRM_ALV_USER_COMMAND

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_POPUP
&---------------------------------------------------------------------
FORM FRM_ALV_POPUP.
  DATA: LS_FIELDCAT_SUB TYPE SLIS_FIELDCAT_ALV,
        LT_FIELDCAT_SUB TYPE SLIS_T_FIELDCAT_ALV.
  DEFINE MAC_FILL_FIELDCAT_SUB.
    LS_FIELDCAT_SUB-FIELDNAME  = &1.
    LS_FIELDCAT_SUB-SELTEXT_M = &2.
    LS_FIELDCAT_SUB-KEY = &3.
    LS_FIELDCAT_SUB-NO_ZERO = &4.
    LS_FIELDCAT_SUB-NO_OUT = &5.
    LS_FIELDCAT_SUB-REF_TABNAME = &6.
    LS_FIELDCAT_SUB-REF_FIELDNAME = &7.
    LS_FIELDCAT_SUB-DECIMALS_OUT = &8.
    LS_FIELDCAT_SUB-QFIELDNAME = &9.
    APPEND LS_FIELDCAT_SUB TO LT_FIELDCAT_SUB.
    CLEAR LS_FIELDCAT_SUB.
  END-OF-DEFINITION.

MAC_FILL_FIELDCAT_SUB ‘MBLNR’ ‘物料凭证’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MJAHR’ ‘凭证年度’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘ZEILE’ ‘行号’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘BWART’ ‘移动类型’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MATNR’ ‘物料编码’ ‘’ ‘X’ ‘’ ‘MARA’ ‘MATNR’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MAKTX’ ‘物料描述’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘DMBTR’ ‘金额’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’ ‘’.
  MAC_FILL_FIELDCAT_SUB ‘MENGE’ ‘数量’ ‘’ ‘’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT_SUB ‘BPMNG’ ‘计算数量’ ‘’ ‘’ ‘’ ‘MSEG’ ‘MENGE’ ‘0’ ‘MEINS’.
  MAC_FILL_FIELDCAT_SUB ‘MEINS’ ‘单位’ ‘’ ‘’ ‘X’ ‘’ ‘’ ‘’ ‘’.

CALL FUNCTION ‘REUSE_ALV_POPUP_TO_SELECT’
    EXPORTING
      I_CALLBACK_PROGRAM      = SY-REPID
      I_ZEBRA                 = ‘X’
      I_SCREEN_START_COLUMN   = 10
      I_SCREEN_START_LINE     = 1
      I_SCREEN_END_COLUMN     = 135
      I_SCREEN_END_LINE       = 15
      I_TABNAME               = ‘1’
      IT_FIELDCAT             = LT_FIELDCAT_SUB
      I_CALLBACK_USER_COMMAND = ‘FRM_ALV_USER_COMMAND_POPUP’
    TABLES
      T_OUTTAB                = GT_TAB
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.

ENDFORM.     "FRM_ALV_POPUP

&---------------------------------------------------------------------
*&      FORM  FRM_ALV_USER_COMMAND_POPUP
&---------------------------------------------------------------------
FORM FRM_ALV_USER_COMMAND_POPUP USING PA_UCOMM TYPE SY-UCOMM
                                      PWA_SELFIELD TYPE SLIS_SELFIELD.
  DATA: L_FILENAME TYPE STRING,
        L_PATH TYPE STRING,
        L_FULLPATH TYPE STRING,
        L_ACTION TYPE I.
  TYPES: BEGIN OF STRUC_TABLE,
           MBLNR TYPE CHAR20,
           MJAHR TYPE CHAR20,
           ZEILE TYPE CHAR20,
           BWART TYPE CHAR20,
           MATNR TYPE CHAR20,
           MAKTX TYPE CHAR20,
           DMBTR TYPE CHAR20,
           MENGE TYPE CHAR20,
           BPMNG TYPE CHAR20,
         END OF STRUC_TABLE.
  DATA: LS_TAB TYPE STRUC_TABLE,
        LT_TAB TYPE TABLE OF STRUC_TABLE.

CASE PA_UCOMM.
    WHEN ‘&ETA’.
      CLEAR PA_UCOMM.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
        EXPORTING
          FILE_FILTER          = ‘Excel Files (.xls,.xlsx)|.xls;.xlsx’
        CHANGING
          FILENAME             = L_FILENAME
          PATH                 = L_PATH
          FULLPATH             = L_FULLPATH
          USER_ACTION          = L_ACTION
        EXCEPTIONS
          CNTL_ERROR           = 1
          ERROR_NO_GUI         = 2
          NOT_SUPPORTED_BY_GUI = 39
          OTHERS               = 4.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

CHECK L_ACTION EQ 0.
      CLEAR LS_TAB.
      REFRESH LT_TAB.

LOOP AT GT_TAB ASSIGNING <FS_TAB>.
        MOVE-CORRESPONDING <FS_TAB> TO LS_TAB.
        APPEND LS_TAB TO LT_TAB.
        CLEAR LS_TAB.
      ENDLOOP.

LS_TAB-MBLNR = ‘物料凭证’.
      LS_TAB-MJAHR = ‘凭证年度’.
      LS_TAB-ZEILE = ‘行号’.
      LS_TAB-BWART = ‘移动类型’.
      LS_TAB-MATNR = ‘物料编码’.
      LS_TAB-MAKTX = ‘物料描述’.
      LS_TAB-DMBTR = ‘金额’.
      LS_TAB-MENGE = ‘数量’.
      LS_TAB-BPMNG = ‘计算数量’.
      INSERT LS_TAB INTO LT_TAB INDEX 1.
      CLEAR LS_TAB.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
        EXPORTING
          FILENAME                = L_FULLPATH
          WRITE_FIELD_SEPARATOR   = ‘X’
        CHANGING
          DATA_TAB                = LT_TAB
        EXCEPTIONS
          FILE_WRITE_ERROR        = 1
          NO_BATCH                = 2
          GUI_REFUSE_FILETRANSFER = 3
          INVALID_TYPE            = 4
          NO_AUTHORITY            = 5
          UNKNOWN_ERROR           = 6
          HEADER_NOT_ALLOWED      = 7
          SEPARATOR_NOT_ALLOWED   = 8
          FILESIZE_NOT_ALLOWED    = 9
          HEADER_TOO_LONG         = 10
          DP_ERROR_CREATE         = 11
          DP_ERROR_SEND           = 12
          DP_ERROR_WRITE          = 13
          UNKNOWN_DP_ERROR        = 14
          ACCESS_DENIED           = 15
          DP_OUT_OF_MEMORY        = 16
          DISK_FULL               = 17
          DP_TIMEOUT              = 18
          FILE_NOT_FOUND          = 19
          DATAPROVIDER_EXCEPTION  = 20
          CONTROL_FLUSH_ERROR     = 21
          NOT_SUPPORTED_BY_GUI    = 22
          ERROR_NO_GUI            = 23
          OTHERS                  = 24.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
  ENDCASE.

ENDFORM. " FRM_ALV_USER_COMMAND_POPUP

----------------------------------------------------------------------

  • CLASS IMPLEMENTATION
    ----------------------------------------------------------------------
    CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

METHOD CALCULATE_QUANTITY.
    DATA: LS_MOD_CELL TYPE LVC_S_MODI,
          L_MENGE TYPE MSEG-MENGE,
          L_DMBTR TYPE BSID-DMBTR.

CLEAR R_ROW.
    REFRESH R_ROW[].

R_ROW-SIGN = ‘I’.
    R_ROW-OPTION = ‘EQ’.

LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_MOD_CELL.
      IF SY-TABIX EQ 1.
        R_ROW-LOW = LS_MOD_CELL-ROW_ID.
        APPEND R_ROW TO R_ROW[].
      ELSE.
        IF LS_MOD_CELL-ROW_ID NOT IN R_ROW[].
          R_ROW-LOW = LS_MOD_CELL-ROW_ID.
          APPEND R_ROW TO R_ROW[].
        ELSE.
          CONTINUE.
        ENDIF.
      ENDIF.

CALL METHOD ER_DATA_CHANGED->GET_CELL_VALUE
        EXPORTING
          I_ROW_ID    = LS_MOD_CELL-ROW_ID
          I_FIELDNAME = ‘MENGE’
        IMPORTING
          E_VALUE     = L_MENGE.

READ TABLE GT_TAB ASSIGNING <FS_TAB> INDEX LS_MOD_CELL-ROW_ID.
      IF <FS_TAB>-MENGE EQ L_MENGE.
        CONTINUE.
      ENDIF.

L_MENGE = L_MENGE - 5.
      CALL METHOD ER_DATA_CHANGED->MODIFY_CELL
        EXPORTING
          I_ROW_ID    = LS_MOD_CELL-ROW_ID
          I_FIELDNAME = ‘BPMNG’
          I_VALUE     = L_MENGE.
    ENDLOOP.

ENDMETHOD.                    "CALCULATE_QUANTITY

METHOD REFRESH_SUBTOTAL.

CHECK E_MODIFIED EQ ‘X’.
    CALL METHOD GRID->REFRESH_TABLE_DISPLAY.

ENDMETHOD.                    "REFRESH_SUBTOTAL

ENDCLASS.                             "LCL_EVENT_RECEIVER IMPLEMENTATION

https://archive.sap.com/discussions/thread/1392609
REPORT ZSAN_EDITABLE_ALV.

type-POOLs : slis.

data : it_fieldcat type slis_t_fieldcat_alv.

data : wa_fieldcat like line of it_fieldcat.

data : it_ZEMPLOYEE type STANDARD TABLE OF ZEMPLOYEE WITH HEADER LINE.

SELECT * FROM ZEMPLOYEE

INTO TABLE IT_ZEMPLOYEe.

CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’

EXPORTING

I_PROGRAM_NAME = SY-REPID

I_INTERNAL_TABNAME =

I_STRUCTURE_NAME = ‘ZEMPLOYEE’

I_CLIENT_NEVER_DISPLAY = ‘X’

I_INCLNAME =

I_BYPASSING_BUFFER =

I_BUFFER_ACTIVE =

CHANGING

CT_FIELDCAT = it_fieldcat

EXCEPTIONS

INCONSISTENT_INTERFACE = 1

PROGRAM_ERROR = 2

OTHERS = 3

.

loop at it_fieldcat into wa_fieldcat.

if wa_fieldcat-fieldname = ‘ENAME’ or

wa_fieldcat-fieldname = ‘AGE’.

wa_fieldcat-edit = ‘X’.

MODIFY it_fieldcat from wa_fieldcat.

endif.

endloop.

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’

EXPORTING

I_CALLBACK_PROGRAM = sy-repid

I_CALLBACK_USER_COMMAND = ‘ALV_USER_COMMAND’

IT_FIELDCAT = it_fieldcat

TABLES

T_OUTTAB = it_zemployee

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2

.

FORM ALV_USER_COMMAND

USING ucomm TYPE syucomm

selfield TYPE slis_selfield. "#EC_CALLED

data : wa_employee like line of it_zemployee.

IF ucomm = ‘&DATA_SAVE’.

read table it_zemployee into wa_employee index selfield-tabindex.

if sy-subrc = 0.

modify zemployee from wa_employee.

if sy-subrc = 0.

MESSAGE ‘Database table updated’ TYPE ‘S’.

endif.

endif.

endif.

selfield-refresh = ‘X’.

selfield-row_stable = ‘X’.

selfield-col_stable = ‘X’.

endform. "alv_user_command

https://www.saptechpro.com/post/BCALV_GRID_EDIT
program test.

parameters p_cell as checkbox default ’ '.
parameters p_loce as checkbox default ’ '.
parameters p_cedit as checkbox default ’ '.
parameters p_f4 as checkbox default ’ '.
parameters p_bforf4 as checkbox default ’ '.
parameters p_aftrf4 as checkbox default ‘X’.
parameters p_style as checkbox default ’ '.

class cl_gui_object definition load.

class lcl_event_receiver definition deferred.

include .

data: ok_code like sy-ucomm.
data: blubber2(30) type c.
data: blubber6(1) type c value ‘X’.
data: blubber7(1) type c value ’ '.
data: ls_cell type lvc_s_styl.
data: blubber9(1) type c value ’ '.
data: gs_variant type disvariant.
data: gt_fieldcat type lvc_t_fcat.
data: gt_sort type lvc_t_sort.
data: gs_sort type lvc_s_sort.
data: gs_layout type lvc_s_layo.
data: gt_f4 type lvc_t_f4.
data: gs_f4 type lvc_s_f4.
data: gs_fieldcat type lvc_s_fcat.
data: begin of gt_sflight occurs 0.
include structure sflight.
data: carrname like scarr-carrname,
cell type lvc_t_styl,
end of gt_sflight.
data: begin of gt_sflight1 occurs 0.
include structure sflight.
data: carrname like scarr-carrname,
end of gt_sflight1,

  g_container type scrfname value 'BCALV_GRID_DEMO_0100_CONT1',g_container2 type scrfname value 'BCALV_GRID_DEMO_0100_CONT2',grid1  type ref to cl_gui_alv_grid,g_custom_container type ref to cl_gui_custom_container.

data g_custom_container2 type ref to cl_gui_custom_container.

data: event_receiver type ref to lcl_event_receiver.

initialization.
if cl_gui_object=>www_active = ‘X’.
p_loce = ‘X’.
endif.
blubber2 = text-002.

---------------------------------------------------------------------

  •   CLASS LCL_EVENT_RECEIVER DEFINITION
    

---------------------------------------------------------------------

  •   ........                                                      *
    

---------------------------------------------------------------------
class lcl_event_receiver definition.
public section.
methods handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed.
methods handle_f4
for event onf4 of cl_gui_alv_grid
importing e_fieldname
es_row_no
er_event_data
et_bad_cells.
endclass.

---------------------------------------------------------------------

  •   CLASS lcl_event_receiver IMPLEMENTATION
    

---------------------------------------------------------------------

  •   ........                                                      *
    

---------------------------------------------------------------------
class lcl_event_receiver implementation.
method handle_data_changed.
perform data_changed using er_data_changed.
endmethod.

method handle_f4.
perform f4 using e_fieldname
es_row_no
er_event_data
et_bad_cells.
endmethod.
endclass.

---------------------------------------------------------------------

  •   MAIN                                                          *
    

---------------------------------------------------------------------
start-of-selection.
if ( p_loce = ’ ’ and cl_gui_object=>www_active = ‘X’ ).
message i000(0K) with text-003.
p_loce = ‘X’.
endif.

if ( cl_gui_control=>www_active = ’ ’ ).
select * into corresponding fields of table gt_sflight1 from
( sflight left join scarr
on sflight~carrid = scarr~carrid ) up to 50 rows.
else.
select * into corresponding fields of table gt_sflight1 from
( sflight left join scarr
on sflight~carrid = scarr~carrid ) up to 60 rows.
endif.

loop at gt_sflight1.
clear gt_sflight.
clear ls_cell.
move-corresponding gt_sflight1 to gt_sflight.
if p_cedit = ‘X’.
if sy-tabix = 7.
ls_cell-style = cl_gui_alv_grid=>mc_style_disabled.

    append ls_cell to gt_sflight-cell.endif.if sy-tabix = 9.ls_cell-style  = cl_gui_alv_grid=>mc_style_enabled.ls_cell-maxlen = 4.ls_cell-fieldname = 'PLANETYPE'.append ls_cell to gt_sflight-cell.endif.if sy-tabix = 11.ls_cell-style  = cl_gui_alv_grid=>mc_style_enabled.ls_cell-maxlen = 4.ls_cell-fieldname = 'CARRNAME'.append ls_cell to gt_sflight-cell.endif.
endif.
append gt_sflight.

endloop.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘CARRID’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-outputlen = ‘5’.
gs_fieldcat-key = ‘X’.
gs_fieldcat-edit = ‘X’.
gs_fieldcat-auto_value = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘CARRNAME’.
gs_fieldcat-ref_table = ‘SCARR’.
gs_fieldcat-outputlen = ‘12’.
gs_fieldcat-key = ‘X’.
gs_fieldcat-auto_value = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘CONNID’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-key = ‘X’.
gs_fieldcat-edit = ‘X’.
gs_fieldcat-auto_value = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘FLDATE’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-edit = ‘X’.
gs_fieldcat-key = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘PLANETYPE’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-edit = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘SEATSMAX’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘SEATSOCC’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-edit = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘PAYMENTSUM’.
gs_fieldcat-datatype = ‘CURR’.
gs_fieldcat-coltext = text-004.
gs_fieldcat-cfieldname = ‘CURRENCY’.
gs_fieldcat-edit = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘PRICE’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-cfieldname = ‘CURRENCY’.
gs_fieldcat-edit = ‘X’.
append gs_fieldcat to gt_fieldcat.

clear gs_fieldcat.
gs_fieldcat-fieldname = ‘CURRENCY’.
gs_fieldcat-ref_table = ‘SFLIGHT’.
gs_fieldcat-edit = ‘X’.
gs_fieldcat-checktable = ‘!’.
gs_fieldcat-auto_value = ‘X’.
append gs_fieldcat to gt_fieldcat.

gs_variant-report = sy-repid.

gs_sort-fieldname = ‘CARRID’.
append gs_sort to gt_sort.

gs_f4-fieldname = ‘PLANETYPE’.
if p_f4 = ‘X’.
gs_f4-register = ‘X’.
endif.
if p_bforf4 = ‘X’.
gs_f4-getbefore = ‘X’.
endif.
if p_aftrf4 = ‘X’.
gs_f4-chngeafter = ‘X’.
endif.
insert gs_f4 into table gt_f4.
gs_f4-fieldname = ‘CONNID’.
if p_f4 = ‘X’.
gs_f4-register = 'X '.
endif.
if p_bforf4 = ‘X’.
gs_f4-getbefore = ‘X’.
endif.
if p_aftrf4 = ‘X’.
gs_f4-chngeafter = ‘X’.
endif.
if ( p_loce = ‘X’ ).
call screen 200.
else.
call screen 100.
endif.

---------------------------------------------------------------------

  •   MODULE PBO OUTPUT                                             *
    

---------------------------------------------------------------------
module pbo output.
perform pbo_output.
endmodule.

---------------------------------------------------------------------

  •   MODULE PAI INPUT                                              *
    

---------------------------------------------------------------------
module pai input.
perform pai_input.
endmodule.

&---------------------------------------------------------------------
*& Form data_changed
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------
form data_changed using rr_data_changed type ref to
cl_alv_changed_data_protocol.

data: ls_mod_cells type lvc_s_modi.
data: ls_cells type lvc_s_modi.
data: l_carrid type sflight-carrid.
data: l_seats type sflight-seatsocc.
data: l_curr type sflight-currency.
data: l_seatsmax type sflight-seatsmax.
data: ls_sflight like gt_sflight1.
data: ls_tcurc like tcurc. "#EC NEEDED

loop at rr_data_changed->mt_good_cells into ls_mod_cells.

case ls_mod_cells-fieldname.when  'CARRID'.call method rr_data_changed->get_cell_valueexporting i_row_id = ls_mod_cells-row_idi_fieldname = ls_mod_cells-fieldnameimporting e_value = l_carrid.select single * into corresponding fieldsof ls_sflight from( sflight left join scarron sflight~carrid = scarr~carrid )where sflight~carrid = l_carrid.if sy-subrc ne 0.else.call method rr_data_changed->modify_cellexporting i_row_id = ls_mod_cells-row_idi_fieldname = 'CARRNAME'i_value     = ls_sflight-carrname.endif.when 'CONNID'.if p_style = 'X'.call method rr_data_changed->modify_styleexporting i_fieldname = 'CURRENCY'i_row_id    = ls_mod_cells-row_idi_style     = cl_gui_alv_grid=>mc_style_disabled.endif.when  'PLANETYPE'.
  •    perform change_planetype using rr_data_changed
    
  •                                   ls_mod_cells.
    when  'SEATSOCC'.call method rr_data_changed->add_protocol_entryexporting i_msgid = '0K'i_msgno = '000'i_msgty = 'I'i_msgv1 = text-007i_msgv2 = text-008i_fieldname = ls_mod_cells-fieldnamei_row_id    = ls_mod_cells-row_id.read table rr_data_changed->mt_good_cells into ls_cellswith key row_id = ls_mod_cells-row_idfieldname = 'PLANETYPE'.if sy-subrc = 0.perform change_planetype using rr_data_changedls_cells.endif.call method rr_data_changed->get_cell_valueexporting i_row_id = ls_mod_cells-row_idi_fieldname = ls_mod_cells-fieldnameimporting e_value = l_seats.call method rr_data_changed->get_cell_valueexporting i_row_id = ls_mod_cells-row_idi_fieldname = 'SEATSMAX'importing e_value = l_seatsmax.if l_seatsmax < l_seats.call method rr_data_changed->add_protocol_entryexporting i_msgid = '0K'i_msgno = '000'i_msgty = 'E'i_msgv1 = text-007i_msgv2 = text-008i_fieldname = ls_mod_cells-fieldnamei_row_id    = ls_mod_cells-row_id.call method rr_data_changed->add_protocol_entryexporting i_msgid = '0K'i_msgno = '000'i_msgty = 'I'i_msgv1 = text-007i_msgv2 = text-008i_fieldname = ls_mod_cells-fieldnamei_row_id    = ls_mod_cells-row_id.endif.
    when  'CURRENCY'.call method rr_data_changed->get_cell_valueexporting i_row_id = ls_mod_cells-row_idi_fieldname = ls_mod_cells-fieldnameimporting e_value = l_curr.select single * from tcurc into ls_tcurc where waers = l_curr.if sy-subrc ne 0.call method rr_data_changed->add_protocol_entryexporting i_msgid = '0K'i_msgno = '000'i_msgty = 'E'i_msgv1 = text-001i_msgv2 = l_curri_msgv3 = text-006i_fieldname = ls_mod_cells-fieldnamei_row_id    = ls_mod_cells-row_id.endif.
    

    endcase.
    endloop.
    endform. " data_changed

&---------------------------------------------------------------------
*& Form change_planetype
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------
form change_planetype using rr_data_changed type ref to
cl_alv_changed_data_protocol
rs_mod_cells type lvc_s_modi.

data: l_planetype type sflight-planetype.
data: ls_saplane type saplane .

call method rr_data_changed->get_cell_value
exporting i_row_id = rs_mod_cells-row_id
i_fieldname = rs_mod_cells-fieldname
importing e_value = l_planetype.
select single * from saplane into ls_saplane where
planetype = l_planetype.
if sy-subrc ne 0.
call method rr_data_changed->add_protocol_entry
exporting i_msgid = ‘0K’
i_msgno = ‘000’
i_msgty = ‘E’
i_msgv1 = text-005
i_msgv2 = l_planetype
i_msgv3 = text-006
i_fieldname = rs_mod_cells-fieldname
i_row_id = rs_mod_cells-row_id.
else.
call method rr_data_changed->modify_cell
exporting i_row_id = rs_mod_cells-row_id
i_fieldname = ‘SEATSMAX’
i_value = ls_saplane-seatsmax.
call method rr_data_changed->modify_cell
exporting i_row_id = rs_mod_cells-row_id
i_fieldname = ‘PAYMENTSUM’
i_value = ‘1000’.
call method rr_data_changed->modify_style
exporting i_fieldname = ‘PAYMENTSUM’
i_row_id = rs_mod_cells-row_id
i_style = cl_gui_alv_grid=>mc_style_disabled.

endif.

endform. " change_planetype

&---------------------------------------------------------------------
*& Form F4
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------
form f4 using r_fieldname type lvc_fname
rs_row_no type lvc_s_roid
rr_event_data type ref to cl_alv_event_data
rt_bad_cells type lvc_t_modi. "#EC *

field-symbols: type lvc_t_modi.
data: ls_f4 type lvc_s_modi.

assign rr_event_data->m_data->* to .
ls_f4-fieldname = r_fieldname.
ls_f4-row_id = rs_row_no-row_id.
ls_f4-value = ‘BLUBBER’.
append ls_f4 to .
rr_event_data->m_event_handled = ‘X’.

endform. " F4

&---------------------------------------------------------------------
*& Form pbo_output
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------
FORM pbo_output.
set pf-status ‘MAIN100’.

if g_custom_container is initial.
if sy-batch is initial.
create object g_custom_container
exporting container_name = g_container.
if ( p_loce = ‘X’ ).
create object g_custom_container2
exporting container_name = g_container2.
endif.
endif.
create object grid1
exporting i_parent = g_custom_container
i_applogparent = g_custom_container2.

create object event_receiver.
set handler event_receiver->handle_data_changed for grid1.
if p_f4 = 'X'.set handler event_receiver->handle_f4 for grid1.
endif.
call method grid1->register_f4_for_fields exporting it_f4 = gt_f4.
if sy-batch is initial.if p_cell = 'X'.call method grid1->register_edit_event exportingi_event_id =cl_gui_alv_grid=>mc_evt_modified.else.call method grid1->register_edit_event exportingi_event_id =cl_gui_alv_grid=>mc_evt_enter.endif.
endif.
gs_layout-stylefname = 'CELL'.
call method grid1->set_table_for_first_displayexporting                     " i_buffer_active = 'X'i_save = 'A'is_variant = gs_variantis_layout  = gs_layoutchanging  it_fieldcatalog = gt_fieldcatit_sort = gt_sortit_outtab        = gt_sflight[].

endif.
ENDFORM. " pbo_output

&---------------------------------------------------------------------
*& Form pai_input
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------
FORM pai_input.
data: l_valid(1) type c.

case ok_code.
when ‘SAVE’.
call method grid1->check_changed_data importing e_valid = l_valid.
if l_valid = ‘X’.
message i000(0k) with text-009.
else.
message i000(0k) with text-010.
endif.
when ‘CHANGE’.
if grid1->is_ready_for_input( ) = 0.
call method grid1->set_ready_for_input exporting
i_ready_for_input = 1.
else.
call method grid1->check_changed_data
importing e_valid = l_valid.
if l_valid = ‘X’.
call method grid1->set_ready_for_input exporting
i_ready_for_input = 0.
endif.
endif.
when ‘EXIT’.
set screen 0.
leave screen.
endcase.
clear ok_code.
ENDFORM. " pai_input

https://www.sapnuts.com/tutorials/Edit-and-Save-Functionality-in-ABAP.html

Follow the below steps to Create ALV with edit and Save functionality

Create a program in SE38, add data declarations

Create a report program in SE38 and add data declarations for MARA table, MAKT table.Add select-options for material no input.

TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
LABOR TYPE MARA-LABOR,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE TY_MARA.
SELECT-OPTIONS: S_MATNR FOR WA_MARA-MATNR. "material no input

Build Field catalog for MARA

Build field catalog for MARA table and specify EDIT = ‘X’ for field catalog fields to make them editable.

DATA : WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV, "Field catalog work area
IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV. "field catalog internal table
WA_FIELDCAT-FIELDNAME = ‘MATNR’. "field name
WA_FIELDCAT-SELTEXT_M = ‘Material Value’. "field text
WA_FIELDCAT-COL_POS = 1. "position
WA_FIELDCAT-KEY = ‘X’. "is key field
WA_FIELDCAT-HOTSPOT = ‘X’. "hotspot(hperlink)
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MTART’.
WA_FIELDCAT-SELTEXT_M = ‘Material Type’.
WA_FIELDCAT-EDIT = ‘X’. "make editable
WA_FIELDCAT-COL_POS = 2.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MBRSH’.
WA_FIELDCAT-SELTEXT_M = ‘Industry Sector’.
WA_FIELDCAT-EDIT = ‘X’. "make editable
WA_FIELDCAT-COL_POS = 3.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MATKL’.
WA_FIELDCAT-SELTEXT_M = ‘Material Group’.
WA_FIELDCAT-EDIT = ‘X’. "make editable
WA_FIELDCAT-COL_POS = 4.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MEINS’.
WA_FIELDCAT-SELTEXT_M = ‘Base UOM’.
WA_FIELDCAT-COL_POS = 5.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘LABOR’.
WA_FIELDCAT-SELTEXT_M = ‘Lab Office’.
WA_FIELDCAT-COL_POS = 6.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

Call Function Module to display ALV

Call ALV function module, provide subroutine names for top of page and user command.

DATA : IT_LAYOUT TYPE SLIS_LAYOUT_ALV, "ALV layout settings
FORM_TOP_OF_PAGE TYPE SLIS_FORMNAME VALUE ‘FORM_TOP_OF_PAGE’, "for avl header.
FORM_CALLBACK TYPE SLIS_FORMNAME VALUE ‘USER_COMMAND’. "For user command
IT_MARACP[] = IT_MARA[]. "store original data before displaying ALV
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING

  • I_INTERFACE_CHECK       = ' '
    
  • I_BYPASSING_BUFFER      = ' '
    
  • I_BUFFER_ACTIVE         = ' '
    I_CALLBACK_PROGRAM      = SY-REPID "program name
    
  • I_CALLBACK_PF_STATUS_SET          = ' '
    I_CALLBACK_USER_COMMAND = FORM_CALLBACK "user command subroutine name
    I_CALLBACK_TOP_OF_PAGE  = FORM_TOP_OF_PAGE "sub routine for top of page
    
  • I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
    
  • I_CALLBACK_HTML_END_OF_LIST       = ' '
    
  • I_STRUCTURE_NAME        =
    
  • I_BACKGROUND_ID         = ' '
    
  • I_GRID_TITLE            =
    
  • I_GRID_SETTINGS         =
    IS_LAYOUT               = IT_LAYOUT
    IT_FIELDCAT             = IT_FIELDCAT
    
  • IT_EXCLUDING            =
    
  • IT_SPECIAL_GROUPS       =
    
  • IT_SORT                 =
    
  • IT_FILTER               =
    
  • IS_SEL_HIDE             =
    
  • I_DEFAULT               = 'X'
    
  • I_SAVE                  = ' '
    
  • IS_VARIANT              =
    
  • IT_EVENTS               =
    
  • IT_EVENT_EXIT           =
    
  • IS_PRINT                =
    
  • IS_REPREP_ID            =
    
  • I_SCREEN_START_COLUMN   = 0
    
  • I_SCREEN_STARlv_line    = 0
    
  • I_SCREEN_END_COLUMN     = 0
    
  • I_SCREEN_END_LINE       = 0
    
  • I_HTML_HEIGHT_TOP       = 0
    
  • I_HTML_HEIGHT_END       = 0
    
  • IT_ALV_GRAPHICS         =
    
  • IT_HYPERLINK            =
    
  • IT_ADD_FIELDCAT         =
    
  • IT_EXCEPT_QINFO         =
    
  • IR_SALV_FULLSCREEN_ADAPTER        =
    
  • IMPORTING
  • E_EXIT_CAUSED_BY_CALLER =
    
  • ES_EXIT_CAUSED_BY_USER  =
    

    TABLES
    T_OUTTAB = IT_MARA
    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.

Add Code to display top of page

Implement subroutine for top of page.

FORM FORM_TOP_OF_PAGE.

DATA: IT_HEADER TYPE SLIS_T_LISTHEADER,
WA_HEADER TYPE SLIS_LISTHEADER,
LV_LINE LIKE WA_HEADER-INFO,
LD_LINES TYPE I,
LD_LINESC(10) TYPE C.

  • Title
    WA_HEADER-TYP = ‘H’.
    WA_HEADER-INFO = ‘MARA Master Report’.
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR WA_HEADER.

  • Date
    WA_HEADER-TYP = ‘S’.
    WA_HEADER-KEY = 'Date: '.
    CONCATENATE SY-DATUM+6(2) ‘.’
    SY-DATUM+4(2) ‘.’
    SY-DATUM(4) INTO WA_HEADER-INFO. "todays date
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER.

  • Date
    WA_HEADER-TYP = ‘S’.
    WA_HEADER-KEY = 'User: '.
    CONCATENATE SY-UNAME ’ ’ INTO WA_HEADER-INFO. "Logged in user
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER.

  • Total No. of Records Selected
    DESCRIBE TABLE IT_MARA LINES LD_LINES.
    LD_LINESC = LD_LINES.
    CONCATENATE 'Total No. of Records Selected: ’ LD_LINESC
    INTO LV_LINE SEPARATED BY SPACE.
    WA_HEADER-TYP = ‘A’.
    WA_HEADER-INFO = LV_LINE.
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER, LV_LINE.

    CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’
    EXPORTING
    IT_LIST_COMMENTARY = IT_HEADER.
    .
    CLEAR IT_HEADER.
    ENDFORM. "TOP-OF-PAGE

Implement user command subroutine

Implement subroutine for user command to save data after edit.

FORM USER_COMMAND USING P_UCOMM LIKE SY-UCOMM
P_SELFIELD TYPE SLIS_SELFIELD.
"p_ucomm will hold user action like double click, clicking a button ,etc
CASE P_UCOMM.
WHEN ‘&IC1’. " Function code for double click
READ TABLE IT_MARA INTO WA_MARA INDEX P_SELFIELD-TABINDEX. " Getting Row data
CASE P_SELFIELD-FIELDNAME.
WHEN ‘MATNR’. " Column data
SET PARAMETER ID: ‘MAT’ FIELD P_SELFIELD-VALUE.

      CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.WHEN 'MTART'.MESSAGE P_SELFIELD-VALUE TYPE 'S'.ENDCASE.
WHEN '&DATA_SAVE'. "Save FunctionMESSAGE 'Saving data' TYPE 'S'.DATA : WA_MARACP     TYPE TY_MARA.

DATA : WA_MARA_TMP TYPE MARA.
CLEAR IT_CHANGES[].
**loop thorugh it_mara and dind changed records
LOOP AT IT_MARA INTO WA_MARA.
READ TABLE IT_MARACP INTO WA_MARACP INDEX SY-TABIX.
IF WA_MARACP NE WA_MARA.
MOVE-CORRESPONDING WA_MARA TO WA_MARA_TMP.
MODIFY MARA FROM WA_MARA_TMP . "modify standard MARA table
IF SY-SUBRC EQ 0.
MESSAGE ‘Data Updated’ TYPE ‘I’.
ENDIF.
ENDIF.
CLEAR WA_MARACP.
ENDLOOP.

ENDCASE.
ENDFORM. "user_command

Full and Final Code to display blocked list ALV

REPORT ZSAN_EDITABLE_MARA.
TYPES: BEGIN OF TY_MARA,
MATNR TYPE MARA-MATNR,
MTART TYPE MARA-MTART,
MBRSH TYPE MARA-MBRSH,
MATKL TYPE MARA-MATKL,
MEINS TYPE MARA-MEINS,
LABOR TYPE MARA-LABOR,
END OF TY_MARA.
DATA : IT_MARA TYPE TABLE OF TY_MARA,
WA_MARA TYPE TY_MARA.
DATA : IT_MARACP TYPE STANDARD TABLE OF TY_MARA, "temparary table for MARA
IT_CHANGES TYPE STANDARD TABLE OF TY_MARA. "changes on grid

DATA : WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV, "Field catalog work area
IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, "field catalog internal table
IT_LAYOUT TYPE SLIS_LAYOUT_ALV, "ALV layout settings
FORM_TOP_OF_PAGE TYPE SLIS_FORMNAME VALUE ‘FORM_TOP_OF_PAGE’, "for avl header.
FORM_CALLBACK TYPE SLIS_FORMNAME VALUE ‘USER_COMMAND’. "For user command
SELECT-OPTIONS: S_MATNR FOR WA_MARA-MATNR. "material no input

START-OF-SELECTION.
SELECT MATNR
MTART
MBRSH
MATKL
MEINS
LABOR FROM MARA INTO TABLE IT_MARA WHERE MATNR IN S_MATNR.
PERFORM BUILD_FCAT.
PERFORM DISPLAY_ALV.
FORM BUILD_FCAT .
WA_FIELDCAT-FIELDNAME = ‘MATNR’.
WA_FIELDCAT-SELTEXT_M = ‘Material Value’.
WA_FIELDCAT-COL_POS = 1.
WA_FIELDCAT-KEY = ‘X’.
WA_FIELDCAT-HOTSPOT = ‘X’.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MTART’.
WA_FIELDCAT-SELTEXT_M = ‘Material Type’.
WA_FIELDCAT-EDIT = ‘X’.
WA_FIELDCAT-COL_POS = 2.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MBRSH’.
WA_FIELDCAT-SELTEXT_M = ‘Industry Sector’.
WA_FIELDCAT-EDIT = ‘X’.
WA_FIELDCAT-COL_POS = 3.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MATKL’.
WA_FIELDCAT-SELTEXT_M = ‘Material Group’.
WA_FIELDCAT-EDIT = ‘X’.
WA_FIELDCAT-COL_POS = 4.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘MEINS’.
WA_FIELDCAT-SELTEXT_M = ‘Base UOM’.
WA_FIELDCAT-ICON = ‘X’. " Display the field as ICON
WA_FIELDCAT-COL_POS = 5.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.

WA_FIELDCAT-FIELDNAME = ‘LABOR’.
WA_FIELDCAT-SELTEXT_M = ‘Lab Office’.
WA_FIELDCAT-ICON = ‘X’. " Display the field as ICON
WA_FIELDCAT-COL_POS = 6.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT.
ENDFORM. " BUILD_FCAT

FORM DISPLAY_ALV .
IT_MARACP[] = IT_MARA[].
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID "program name
I_CALLBACK_USER_COMMAND = FORM_CALLBACK "user command subroutine name
I_CALLBACK_TOP_OF_PAGE = FORM_TOP_OF_PAGE "sub routine for top of page
IS_LAYOUT = IT_LAYOUT
IT_FIELDCAT = IT_FIELDCAT
TABLES
T_OUTTAB = IT_MARA
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.
ENDFORM. " DISPLAY_ALV

FORM FORM_TOP_OF_PAGE.

DATA: IT_HEADER TYPE SLIS_T_LISTHEADER,
WA_HEADER TYPE SLIS_LISTHEADER,
LV_LINE LIKE WA_HEADER-INFO,
LD_LINES TYPE I,
LD_LINESC(10) TYPE C.

  • Title
    WA_HEADER-TYP = ‘H’.
    WA_HEADER-INFO = ‘MARA Master Report’.
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR WA_HEADER.

  • Date
    WA_HEADER-TYP = ‘S’.
    WA_HEADER-KEY = 'Date: '.
    CONCATENATE SY-DATUM+6(2) ‘.’
    SY-DATUM+4(2) ‘.’
    SY-DATUM(4) INTO WA_HEADER-INFO. "todays date
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER.

  • Date
    WA_HEADER-TYP = ‘S’.
    WA_HEADER-KEY = 'User: '.
    CONCATENATE SY-UNAME ’ ’ INTO WA_HEADER-INFO. "Logged in user
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER.

  • Total No. of Records Selected
    DESCRIBE TABLE IT_MARA LINES LD_LINES.
    LD_LINESC = LD_LINES.
    CONCATENATE 'Total No. of Records Selected: ’ LD_LINESC
    INTO LV_LINE SEPARATED BY SPACE.
    WA_HEADER-TYP = ‘A’.
    WA_HEADER-INFO = LV_LINE.
    APPEND WA_HEADER TO IT_HEADER.
    CLEAR: WA_HEADER, LV_LINE.

    CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’
    EXPORTING
    IT_LIST_COMMENTARY = IT_HEADER.
    .
    CLEAR IT_HEADER.
    ENDFORM. "TOP-OF-PAGE
    FORM F_SAVE_DATA.
    DATA : WA_MARACP TYPE TY_MARA.
    DATA : WA_MARA_TMP TYPE MARA.
    CLEAR IT_CHANGES[].
    LOOP AT IT_MARA INTO WA_MARA.
    READ TABLE IT_MARACP INTO WA_MARACP INDEX SY-TABIX.
    IF WA_MARACP NE WA_MARA.
    APPEND WA_MARA TO IT_CHANGES.
    MOVE-CORRESPONDING WA_MARA TO WA_MARA_TMP.
    MODIFY MARA FROM WA_MARA_TMP .
    IF SY-SUBRC EQ 0.
    MESSAGE ‘Data Updated’ TYPE ‘I’.
    ENDIF.
    ENDIF.
    CLEAR WA_MARACP.
    ENDLOOP.
    ENDFORM. "f_save_data
    FORM USER_COMMAND USING P_UCOMM LIKE SY-UCOMM
    P_SELFIELD TYPE SLIS_SELFIELD.
    "p_ucomm will hold user action like double click, save click
    CASE P_UCOMM.
    WHEN ‘&IC1’. " SAP standard code for double-clicking
    READ TABLE IT_MARA INTO WA_MARA INDEX P_SELFIELD-TABINDEX. " Getting Row data
    CASE P_SELFIELD-FIELDNAME.
    WHEN ‘MATNR’. " Column data
    SET PARAMETER ID: ‘MAT’ FIELD P_SELFIELD-VALUE.

        CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.WHEN 'MTART'.MESSAGE P_SELFIELD-VALUE TYPE 'S'.
    ENDCASE.
    

    WHEN ‘&DATA_SAVE’.
    MESSAGE ‘Trying to save’ TYPE ‘S’.
    PERFORM F_SAVE_DATA.

    "It_changes hold all the change made in the ALV
    

    ENDCASE.
    ENDFORM. "user_command

https://wiki.scn.sap.com/wiki/display/ABAP/Alv+with+EDIT+and+SAVE

ALV with EDIT and SAVE functionality

REPORT z_demo_alv_jg.
*******************************************************************

  • TYPE-POOLS *
    *******************************************************************
    TYPE-POOLS: slis.
    *******************************************************************
  • INTERNAL TABLES/WORK AREAS/VARIABLES *
    *******************************************************************
    DATA: i_fieldcat TYPE slis_t_fieldcat_alv,
    i_index TYPE STANDARD TABLE OF i WITH HEADER LINE,
    w_field TYPE slis_fieldcat_alv,
    p_table LIKE dd02l-tabname,
    dy_table TYPE REF TO data,
    dy_tab TYPE REF TO data,
    dy_line TYPE REF TO data.
    *******************************************************************
  • FIELD-SYMBOLS *
    *******************************************************************
    FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
    <dyn_wa> TYPE ANY,
    <dyn_field> TYPE ANY,
    <dyn_tab_temp> TYPE STANDARD TABLE.
    *******************************************************************
  • SELECTION SCREEN *
    *******************************************************************
    PARAMETERS: tabname(30) TYPE c,
    lines(5) TYPE n.
    *******************************************************************
  • START-OF-SELECTION *
    *******************************************************************
    START-OF-SELECTION.
  • Storing table name
    p_table = tabname.
  • Create internal table dynamically with the stucture of table name
  • entered in the selection screen
    CREATE DATA dy_table TYPE STANDARD TABLE OF (p_table).
    ASSIGN dy_table->* TO <dyn_table>.
    IF sy-subrc <> 0.
    MESSAGE i000(z_zzz_ca_messages) WITH ’ No table found’.
    LEAVE TO LIST-PROCESSING.
    ENDIF.
  • Create workarea for the table
    CREATE DATA dy_line LIKE LINE OF <dyn_table>.
    ASSIGN dy_line->* TO <dyn_wa>.
  • Create another temp. table
    CREATE DATA dy_tab TYPE STANDARD TABLE OF (p_table).
    ASSIGN dy_tab->* TO <dyn_tab_temp>.
    SORT i_fieldcat BY col_pos.
  • Select data from table
    SELECT * FROM (p_table)
    INTO TABLE <dyn_table>
    UP TO lines ROWS.
    REFRESH <dyn_tab_temp>.
  • Display report
    CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’
    EXPORTING
    i_callback_program = sy-repid
    i_structure_name = p_table
    i_callback_user_command = ‘USER_COMMAND’
    i_callback_pf_status_set = ‘SET_PF_STATUS’
    TABLES
    t_outtab = <dyn_table>
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    ENDIF.
    &-----------------------------------------------------------------
    *& Form SET_PF_STATUS
    &-----------------------------------------------------------------
  • Setting custom PF-Status
    ------------------------------------------------------------------
  • –>RT_EXTAB Excluding table
    ------------------------------------------------------------------
    FORM set_pf_status USING rt_extab TYPE slis_t_extab.
    SET PF-STATUS ‘Z_STANDARD’.
    ENDFORM. "SET_PF_STATUS
    &----------------------------------------------------------------
    *& Form user_command
    &-----------------------------------------------------------------
  • Handling custom function codes
    ------------------------------------------------------------------
  • –>R_UCOMM Function code value
  • –>RS_SELFIELD Info. of cursor position in ALV
    ------------------------------------------------------------------
    FORM user_command USING r_ucomm LIKE sy-ucomm
    rs_selfield TYPE slis_selfield.
  • Local data declaration
    DATA: li_tab TYPE REF TO data,
    l_line TYPE REF TO data.
  • Local field-symbols
    FIELD-SYMBOLS:<l_tab> TYPE table,
    <l_wa> TYPE ANY.
  • Create table
    CREATE DATA li_tab TYPE STANDARD TABLE OF (p_table).
    ASSIGN li_tab->* TO <l_tab>.
  • Create workarea
    CREATE DATA l_line LIKE LINE OF <l_tab>.
    ASSIGN l_line->* TO <l_wa>.
    CASE r_ucomm.
  • When a record is selected
    WHEN ‘&IC1’.
  • Read the selected record
    READ TABLE <dyn_table> ASSIGNING <dyn_wa> INDEX
    rs_selfield-tabindex.
    IF sy-subrc = 0.
  • Store the record in an internal table
    APPEND <dyn_wa> TO <l_tab>.
  • Fetch the field catalog info
    CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’
    EXPORTING
    i_program_name = ‘Z_DEMO_PDF_JG’
    i_structure_name = p_table
    CHANGING
    ct_fieldcat = i_fieldcat
    EXCEPTIONS
    inconsistent_interface = 1
    program_error = 2
    OTHERS = 3.
    IF sy-subrc = 0.
  • Make all the fields input enabled except key fields
    w_field-input = ‘X’.
    MODIFY i_fieldcat FROM w_field TRANSPORTING input
    WHERE key IS INITIAL.
    ENDIF.
  • Display the record for editing purpose
    CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’
    EXPORTING
    i_callback_program = sy-repid
    i_structure_name = p_table
    it_fieldcat = i_fieldcat
    i_screen_start_column = 10
    i_screen_start_line = 15
    i_screen_end_column = 200
    i_screen_end_line = 20
    TABLES
    t_outtab = <l_tab>
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.
    IF sy-subrc = 0.
  • Read the modified data
    READ TABLE <l_tab> INDEX 1 INTO <l_wa>.
  • If the record is changed then track its index no.
  • and populate it in an internal table for future
  • action
    IF sy-subrc = 0 AND <dyn_wa> <> <l_wa>.
    <dyn_wa> = <l_wa>.
    i_index = rs_selfield-tabindex.
    APPEND i_index.
    ENDIF.
    ENDIF.
    ENDIF.
  • When save button is pressed
    WHEN ‘SAVE’.
  • Sort the index table
    SORT i_index.
  • Delete all duplicate records
    DELETE ADJACENT DUPLICATES FROM i_index.
    LOOP AT i_index.
  • Find out the changes in the internal table
  • and populate these changes in another internal table
    READ TABLE <dyn_table> ASSIGNING <dyn_wa> INDEX i_index.
    IF sy-subrc = 0.
    APPEND <dyn_wa> TO <dyn_tab_temp>.
    ENDIF.
    ENDLOOP.
  • Lock the table
    CALL FUNCTION ‘ENQUEUE_E_TABLE’
    EXPORTING
    mode_rstable = ‘E’
    tabname = p_table
    EXCEPTIONS
    foreign_lock = 1
    system_failure = 2
    OTHERS = 3.
    IF sy-subrc = 0.
  • Modify the database table with these changes
    MODIFY (p_table) FROM TABLE <dyn_tab_temp>.
    REFRESH <dyn_tab_temp>.
  • Unlock the table
    CALL FUNCTION ‘DEQUEUE_E_TABLE’
    EXPORTING
    mode_rstable = ‘E’
    tabname = p_table.
    ENDIF.
    ENDCASE.
    rs_selfield-refresh = ‘X’.
    ENDFORM. "user_command

alv edit and save all相关推荐

  1. Sublime Text 3便携版下载安装和常用插件安装--顺便解决报错An error occured installing和no packages available for install

    文章目录 Sublime Text 3便携版下载安装和常用插件安装 1.Sublime Text 3便携版下载: 2.sublime 插件控制器(Package Control)安装 2.1离线安装P ...

  2. XSLT教程 [转]

    XSLT教程 XSL代表可扩充样式表语言 为了适应基于XML的样式表语言的需要,万维网联盟(W3C)开始发展XSL. XSLT代表XSL的变革.在这个教程里,你会学到如何通过XSLT把XML文档转换成 ...

  3. BootstrapTable

    <!---------------------------------------- BEGIN动态表相关 ----------------------------------------> ...

  4. 自己动手实现简单权限控制

    最近接手一小型私活,用户量封顶上千,工期预期的也相对宽松,权限控制当然是必不可少. web 权限控制,很多项目会引入 shiro/spring-security. shiro/spring-secur ...

  5. nodejs web开发入门: Simple-TODO Nodejs 实现版

    起因 看到simple todo的各种python版本实现, 我也来凑凑热闹... 既然已经有这么多python版本了, 我就对比实现了一个Simple-TODO的nodejs版本: Node TOD ...

  6. python官网怎么改中文-如何配置pycharm为中文?

    1.Python执行程序形式 python script.py python -c "print()" python -i 执行后进入交互式 2.虚拟环境配置: 介绍python需 ...

  7. python官网怎么改中文-pycharm如何设置成中文

    1.Python执行程序形式 python script.py python -c "print()" python -i 执行后进入交互式 2.虚拟环境配置: 介绍python需 ...

  8. python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!

    前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Pytho ...

  9. php smeoa,install.php

    smeoa $files = "Conf/config.php"; if (!is_writable($files)) { echo "不可写!!!"; } e ...

最新文章

  1. 告别视频通话“渣画质”,英伟达新算法最高压缩90%流量
  2. Mysql日期时间Extract函数介绍
  3. 39.原码、反码、补码的转换
  4. java–jwt_java – Spring引导如何使用jwt管理用户角色
  5. 【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)
  6. jsoup: Java HTML Parser
  7. STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf;
  8. dump文件 linux,linux使用MAT分析dump文件
  9. 作为一个程序猿你必须会的技能----自学框架!
  10. Flash学习资源下载列表
  11. 【趣味实践】Stable Diffusion绘制中秋美景
  12. win 10网络适配器没有无线网络连接(连不上WLAN)
  13. EDI 公开课:X12 850采购订单转换至可视化Excel
  14. 视觉slam中的一种单目稠密建图方法
  15. 【FAQ】接入HMS Core推送服务过程中一些常见问题总结
  16. leetcode — 46. 全排列(不含重复数字)
  17. 英汉《营销学》常用词汇-1
  18. php正则表达式总结
  19. 【转】phpcms授课学习
  20. 闭关修炼(四)并发包/类

热门文章

  1. Multisim添加Spice模型
  2. 微信小程序使用TDesign(TS版本)
  3. 基于PyQt5实现的PDF小工具
  4. 第12期 《顿开金锁走蛟龙》2月刊
  5. 移动web(看这一篇就够了)
  6. Redis 分布式锁笔记
  7. 安居客冲刺上市:姚劲波全力支持,距离贝壳找房还差6个我爱我家
  8. 悟了,电商的千人千面系统,原来还可以这么搞
  9. iOS UIColor RGB 颜色对照表
  10. Did you mean..?解法