很多时候我们的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.