动态内表

很多时候我们的alv报表列是动态的不确定,这样的话如果用平时那种办法肯定是不可行的。

最近有个需求刚好是alv动态的报表,所以现学现卖,总结经验一下:

有一般的列是固定的,还有一些列是动态的

必须要定义的语法如下

*存储动态字段
DATA: IT_STRUCTURE TYPE LVC_T_FCAT,                 "存储动态内表列的内表,其中的每一行代表动态内表的一列
         WA_STRUCTURE TYPE LVC_S_FCAT.                 "lvc_t_fact的工作区

取出数据存储在内表IT_DATA中,其中内表IT_DATA中的部分值是动态内表的描述和字段。

这边循环内表IT_DATA把值赋给IT_STRUCTURE 

   loop  IT_DATA

   TRANSLATE IT_DATA-ATNAM TO UPPER CASE.            把字段转换为大写
    WA_STRUCTURE-FIELDNAME IT_DATA-ATNAM.         "动态字段
    WA_STRUCTURE-SCRTEXT_L IT_DATA-ATBEZ.          "描述
    WA_STRUCTURE-SCRTEXT_M IT_DATA-ATBEZ.         "描述
    WA_STRUCTURE-SCRTEXT_S IT_DATA-ATBEZ.          "描述

       WA_STRUCTURE-INTLEN    60  .                             "字段长度
       WA_STRUCTURE-OUTPUTLEN 30 .                          "字段长度

    APPEND WA_STRUCTURE TO IT_STRUCTURE.
    CLEAR IT_DATA.

  endloop.

************************************下面是指定 组件COL_POS,类似于alv下面的输出列位置

 CLEAR WA_STRUCTURE.
  LOOP AT IT_STRUCTURE INTO WA_STRUCTURE.
    I_COL I_COL + 1.
    WA_STRUCTURE-COL_POS I_COL.
    MODIFY IT_STRUCTURE FROM WA_STRUCTURE TRANSPORTING COL_POS.
    CLEAR WA_STRUCTURE.
  ENDLOOP.

还有关于固定的那些字段的定义如:

  CLEAR WA_STRUCTURE.
  WA_STRUCTURE-FIELDNAME 'AUFNR'.          "    字段
  WA_STRUCTURE-SCRTEXT_L '订单号码'.        "    描述,可用于alv显示时候赋给SELTEXT_L 
  WA_STRUCTURE-SCRTEXT_M '订单号码'.
  WA_STRUCTURE-SCRTEXT_S '订单号码'.
  WA_STRUCTURE-ICON      ''.
  WA_STRUCTURE-REF_TABLE 'AUFK'.           "参考数据表  很重要
  WA_STRUCTURE-REF_FIELD 'AUFNR'.         " 参考字段     很重要  这两个如果不写的话 会默认都是字符类型,需要定义长度,而且alv不会有                                                                           汇总按钮
  WA_STRUCTURE-COL_POS   TEMP.            "定义变量用于alv显示时候的输出位置

WA_STRUCTURE-OUTPUTLEN 13.                  "特别需要注意的是这种生成动态字段的方式如果没有定义长度的时候alv的筛选是没有用的所以需要添加
  APPEND WA_STRUCTURE TO IT_STRUCTURE.
  CLEAR IT_DATA.

************接下来就需要顶用一个类的静态方法实现这个动态内表

  DATA: P_TABLE   TYPE  REF TO DATA.    “定义引用
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE   ”调用此静态方法
    EXPORTING
      IT_FIELDCATALOG  IT_STRUCTURE    “输入值为存了字段的内表
      I_LENGTH_IN_BYTE 'X'                        ”这个不知道
    IMPORTING
      EP_TABLE         P_TABLE.                  “输出该引用
  ASSIGN  P_TABLE->TO <TABLE>.        ”接触引用并且把表赋值给指针<table>

*************给内表赋值

 DATA:P_LINE TYPE REF TO DATA.  “定义引用

LOOP AT GT_TAB INTO GS_TAB.

 CREATE DATA P_LINE LIKE LINE OF <TABLE>.  "根据内表<TABLE>.创建行的引用

 ASSIGN P_LINE->TO <LINE>.  "接触引用并且指向指针<line>.

    ASSIGN COMPONENT 'AUFNR' OF STRUCTURE <LINE> TO <DY_FIELD>.   "把结构<line>中的AUFNR地址指向指针<DY_FIELD>.
    <DY_FIELD> GS_TAB-AUFNR.     ”把 GS_TAB-AUFNR赋值给字段符号<DY_FIELD> ,也就是此时说<line>中的AUFNR的值就是GS_TAB-AUFNR.

      LOOP AT IT_DATA WHERE AUFNR GS_TAB-AUFNR
                         AND MATNR GS_TAB-MATNR
                         AND CHARG GS_TAB-CHARG.
        ASSIGN COMPONENT IT_DATA-ATNAM OF STRUCTURE  <LINE> TO <DY_FIELD>.   循环内表方法同上
        <DY_FIELD> IT_DATA-ATWRT.
      ENDLOOP.

endloop.

append <line > to <table>

到这一步动态内表已经定义好并赋值完毕

接下来只需要输出alv,方法和一般的一样

甚至更简单些,

*layout control
  GS_LAYOUT-ZEBRA 'X'.                              "显示斑马线
  GS_LAYOUT-COLWIDTH_OPTIMIZE 'X'.                  " 自动调整列宽


  CLEAR: WA_STRUCTURE,GS_FIELDCAT.
  LOOP AT  IT_STRUCTURE INTO WA_STRUCTURE.
    MOVE-CORRESPONDING  WA_STRUCTURE TO GS_FIELDCAT.
    GS_FIELDCAT-SELTEXT_L WA_STRUCTURE-SCRTEXT_L.
    GS_FIELDCAT-SELTEXT_M WA_STRUCTURE-SCRTEXT_M.
    GS_FIELDCAT-SELTEXT_M WA_STRUCTURE-SCRTEXT_M.
    IF GS_FIELDCAT-FIELDNAME 'AUFNR' OR GS_FIELDCAT-FIELDNAME 'ZMATNR' OR GS_FIELDCAT-FIELDNAME 'MATNR'.
      GS_FIELDCAT-NO_ZERO          'X'.
    ENDIF.
    APPEND GS_FIELDCAT TO GT_FIELDCAT.
    CLEAR: WA_STRUCTURE,GS_FIELDCAT.
  ENDLOOP.

  GF_REPID SY-REPID.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM GF_REPID
      IS_LAYOUT          GS_LAYOUT
      IT_FIELDCAT        GT_FIELDCAT
                                                                                                                                                                                " I_SAVE             = 'A '                                    "保存标准格式和用户特定格式
    TABLES
      T_OUTTAB           <TABLE>
    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.

 

原文地址:https://www.cnblogs.com/caizjian/p/3312158.html