一段比较好的动态生成alv的例子

 *&---------------------------------------------------------------------*
*& Report  ZTESTDYNMICINTERNALTABLE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTESTDYNMICINTERNALTABLE.
*REPORT Z_BARRY_TEST_FIELDSYMOLS .

TYPE-POOLS: SLIS.
TABLES: MSEG,MKPF.
DATA: GD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: SLA TYPE SLIS_LAYOUT_ALV ,
      IVARIANT LIKE DISVARIANT,
      I_REPID LIKE SY-REPID ,
      I_EXCLUDING TYPE SLIS_T_EXTAB.
**define structure
TYPESBEGIN OF TY_SUM ,
        WERKS LIKE MSEG-WERKS , " Plant
        MATNR LIKE MSEG-MATNR , " Material
        LGORT LIKE MSEG-LGORT , " Location
        BWART LIKE MSEG-BWART , " Movetype
*        MENGE LIKE MSEG-MENGE , " Qty
*        MENGE TYPE P DECIMALS 0 ,
        MENGE TYPE P ,
      END OF TY_SUM.
** 定议内表itab 来接查询出来的数据
DATA : ITAB TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
** 定议哈希内表并指明key
DATA : HS_SUM TYPE HASHED TABLE OF TY_SUM
       WITH UNIQUE KEY WERKS MATNR LGORT BWART WITH HEADER LINE .

DATA : ITAB_SUM TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
**要把movetype 对应的数量做交叉分析
TYPESBEGIN OF TY_BWART ,
        BWART LIKE MSEG-BWART , " Movetype
      END OF TY_BWART.

DATA : HS_BWART TYPE HASHED TABLE OF TY_BWART
       WITH UNIQUE KEY BWART WITH HEADER LINE .

DATA : ITAB_BWART TYPE STANDARD TABLE OF TY_BWART WITH HEADER LINE .
FIELD-SYMBOLS: <F_FS1> ,
               <F_OUT> TYPE STANDARD TABLE ,
               <F_OUT_WA> .
DATA: MAX_COUNT TYPE I ,
      DY_OUT    TYPE REF TO DATA ,
      DY_OUT_WA TYPE REF TO DATA,
      XFC       TYPE LVC_S_FCAT,
      IFC       TYPE LVC_T_FCAT.
DATAC(2TYPE N ,
      TXT(20TYPE C .

SELECT-OPTIONS: S_MBLNR FOR MSEG-MBLNR ,
                S_BUDAT FOR MKPF-BUDAT .
PARAMETERS:     P_SUM AS CHECKBOX .

START-OF-SELECTION.
  PERFORM GETDATA.  " 读取数据
** Form FIXDATA 把数据处理成交叉表格式.
  PERFORM FIXDATA.
  IF P_SUM = 'X'.
    PERFORM OUTDATA.  " 显示未处理前的数据传ITAB_SUM 给ALF function
  ELSE.
    PERFORM OUTDATA2. " 显示交叉表格式传<F_OUT> 给ALV function
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  GETDATA
*&---------------------------------------------------------------------*
FORM GETDATA.
  SELECT WERKS MATNR LGORT BWART MENGE INTO TABLE ITAB
  FROM MKPF INNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR AND
                               MKPF~MJAHR = MSEG~MJAHR
  WHERE MKPF~MBLNR IN S_MBLNR AND
        MKPF~BUDAT IN S_BUDAT .

*  SORT ITAB BY WERKS MATNR .
ENDFORM.                    " GETDATA

*&---------------------------------------------------------------------*
*&      Form  FIXDATA
*&---------------------------------------------------------------------*
FORM FIXDATA.
  DATAINDEX LIKE SY-TABIX .
  LOOP AT ITAB.
    HS_SUM = ITAB.
    COLLECT HS_SUM.
    HS_BWART = ITAB-BWART .
    COLLECT HS_BWART.
  ENDLOOP.
  SORT HS_BWART.
  ITAB_BWART[] = HS_BWART[].
  ITAB_SUM[] = HS_SUM[].
  PERFORM CREAT_ITAB_OUT.

**SORT
  DATA NAME1(10TYPE C.
  DATA NAME2(10TYPE C.
  NAME1 = 'WERKS'.
  NAME2 = 'MATNR'.

  LOOP AT ITAB_SUM.


    ASSIGN COMPONENT 'WERKS' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> = ITAB_SUM-WERKS.
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> = ITAB_SUM-MATNR.
    ASSIGN COMPONENT 'LGORT' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> = ITAB_SUM-LGORT.

    READ TABLE ITAB_BWART WITH KEY BWART = ITAB_SUM-BWART .
    INDEX = SY-TABIX + 3.
    ASSIGN COMPONENT INDEX OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> = ITAB_SUM-MENGE.

    ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
    <F_FS1> = ITAB_SUM-MENGE.

    COLLECT <F_OUT_WA> INTO <F_OUT>  .
    CLEAR <F_OUT_WA>.
  ENDLOOP.

  SORT <F_OUT> BY (NAME1) (NAME2).

ENDFORM.                    " FIXDATA

*&---------------------------------------------------------------------*
*&      Form  outdata
*&---------------------------------------------------------------------*
FORM OUTDATA.
  PERFORM FIELDCAT_INIT .
  SLA-COLWIDTH_OPTIMIZE = 'X'.
  SLA-ZEBRA             = 'X'.
  I_REPID = SY-REPID.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
            I_CALLBACK_PROGRAM      = I_REPID
            IT_FIELDCAT             = GD_FIELDCAT[]
            I_SAVE                  = 'A'
            IS_VARIANT              = IVARIANT
            IS_LAYOUT               = SLA
            IT_EXCLUDING            = I_EXCLUDING
*            i_callback_user_command = 'USER_COMMAND'
       TABLES
            T_OUTTAB                = ITAB_SUM
       EXCEPTIONS
            PROGRAM_ERROR           = 1
            OTHERS                  = 2.
ENDFORM.                    " outdata
*---------------------------------------------------------------------*
*       FORM fieldcat_init                                            *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT .
  PERFORM FRM_CATLG_SET USING'WERKS'     'WERKS1' 'X' ,
                               'MATNR'     'MATNR1' 'X' ,
                               'LGORT'     'LGORT1' 'X' ,
                               'BWART'     'BWART1' '' ,
                               'MENGE'     'MENGE1' '' .
ENDFORM.                    "fieldcat_init

*---------------------------------------------------------------------*
*       FORM fieldcat_init2                                           *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT2 .
  CLEAR C .
  PERFORM FRM_CATLG_SET USING'WERKS'   'WERKS1' 'X' ,
                               'MATNR'   'MATNR1' 'X' ,
                               'LGORT'   'LGORT1' 'X' .
  LOOP AT HS_BWART .
    C = C + 1.
    CONCATENATE 'MENGE' C INTO TXT.
    PERFORM FRM_CATLG_SET USING: TXT HS_BWART-BWART '' .
  ENDLOOP.
  PERFORM FRM_CATLG_SET USING'LINE_SUM'  'SUM' '' .
ENDFORM.                    "fieldcat_init

*---------------------------------------------------------------------*
*       FORM frm_catlg_set                                            *
*---------------------------------------------------------------------*
FORM FRM_CATLG_SET USING P_FIELD
                         P_TEXT
                         P_KEY.
  DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
  LS_FIELDCAT-FIELDNAME     = P_FIELD.
  LS_FIELDCAT-SELTEXT_L     = P_TEXT.
  LS_FIELDCAT-KEY           = P_KEY.
  LS_FIELDCAT-NO_ZERO       = 'X'.
  IF P_FIELD = 'LINE_SUM'.
    LS_FIELDCAT-EMPHASIZE  = 'C700'.
  ENDIF.
  IF P_FIELD = 'LINE_SUM'.
    LS_FIELDCAT-DECIMALS_OUT = '0'.
  ENDIF.
  APPEND LS_FIELDCAT TO GD_FIELDCAT .
  CLEAR LS_FIELDCAT .
ENDFORM.                    "frm_catlg_set

*&--------------------------------------------------------------------*
*&      Form  user_command
*&--------------------------------------------------------------------*
*FORM user_command USING r_ucomm LIKE sy-ucomm
*                    rs_selfield TYPE slis_selfield.
*  READ TABLE itab INDEX rs_selfield-tabindex.
*  CASE r_ucomm.
*    WHEN '&IC1'. "双击
*
*    WHEN 'EXIT'.
*      LEAVE PROGRAM.
*  ENDCASE.
**  rs_selfield-refresh = 'X'.  "自动刷新
*ENDFORM. "user_com

*---------------------------------------------------------------------*
*       FORM outdata2                                                 *
*---------------------------------------------------------------------*
FORM OUTDATA2.
  PERFORM FIELDCAT_INIT2 .
  SLA-COLWIDTH_OPTIMIZE = 'X'.
  SLA-ZEBRA             = 'X'.
  I_REPID = SY-REPID.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
            I_CALLBACK_PROGRAM = I_REPID
            IT_FIELDCAT        = GD_FIELDCAT[]
            I_SAVE             = 'A'
            IS_VARIANT         = IVARIANT
            IS_LAYOUT          = SLA
            IT_EXCLUDING       = I_EXCLUDING
       TABLES
            T_OUTTAB           = <F_OUT>
       EXCEPTIONS
            PROGRAM_ERROR      = 1
            OTHERS             = 2.
ENDFORM.                    " outdata



*---------------------------------------------------------------------*
*       FORM creat_itab_out                                           *
*---------------------------------------------------------------------*
FORM CREAT_ITAB_OUT.
  CLEAR C.
  PERFORM BUILD_ITAB_STRU USING'WERKS' 'MSEG' 'WERKS' ,
                                 'MATNR' 'MSEG' 'MATNR' ,
                                 'LGORT' 'MSEG' 'LGORT' .
  LOOP AT HS_BWART.
    C = C + 1.
    CONCATENATE 'MENGE' C INTO TXT.
    PERFORM BUILD_ITAB_STRU USING: TXT 'MSEG' 'MENGE' .
  ENDLOOP.
  PERFORM BUILD_ITAB_STRU USING'LINE_SUM' 'MSEG' 'MENGE' .

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
               EXPORTING
                  IT_FIELDCATALOG = IFC
               IMPORTING
                  EP_TABLE        = DY_OUT.
  ASSIGN DY_OUT->* TO <F_OUT>.
  CREATE DATA DY_OUT_WA LIKE LINE OF <F_OUT>.
  ASSIGN DY_OUT_WA->* TO <F_OUT_WA>.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM build_itab_stru                                          *
*---------------------------------------------------------------------*
FORM BUILD_ITAB_STRU USING FDNAME REF_T REF_F.
  XFC-FIELDNAME = FDNAME .
  XFC-REF_TABLE = REF_T.
  XFC-REF_FIELD = REF_F.
  APPEND XFC TO IFC.
ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值