1.动态生成内表字段和ALV FILECATE
*&---------------------------------------------------------------------*
*& Report Z_GT_DATA
*&---------------------------------------------------------------------*
*& 1.定义一个指针类型的表 和 需要存东西的字段
*& 2.先生成必有的字段,然后查出需要动态生成的字段
*& 3.循环处理要动态生成的字段
*& 4.利用函数处理生成的字段放到定义的指针表
*&---------------------------------------------------------------------*
REPORT Z_GT_DATA.
FIELD-SYMBOLS: <GT_DATA> TYPE TABLE.
DATA : LT_COMP_TAB TYPE ABAP_COMPONENT_TAB,
LR_TAB_TYPE TYPE REF TO CL_ABAP_TABLEDESCR,
LR_LINE_TYPE TYPE REF TO CL_ABAP_STRUCTDESCR,
LR_TAB_REF TYPE REF TO DATA,
LV_FIELD TYPE CHAR20,"存放要动态生成的字段
LV_FIELD_DESC TYPE CHAR20."存放要动态生成的FILECAT的字段名称
* 创建新内表
PERFORM FRM_COMP_TAB USING 'BOX' 'CHAR1' CHANGING LT_COMP_TAB. "必有的字段
PERFORM FRM_COMP_TAB USING 'ZCLR' 'LVC_T_SCOL' CHANGING LT_COMP_TAB.
PERFORM FRM_COMP_TAB USING 'ZPSRID' 'ZE_ZPSRID' CHANGING LT_COMP_TAB.
*SET_FIELDCAT: "必有的字段
* 'BOX' '选择'(031) 'X' '' '' '',
* 'VBELN' '销售订单'(032) 'X' '' 'VBAK' 'VBELN',
* 'VKBURT' '业务部' '' '' '' ''.
SELECT * FROM SFLIGHT WHERE PLANETYPE = '747-400' INTO TABLE @DATA(GT_FLIGHT) ."查出要动态的字段
DELETE ADJACENT DUPLICATES FROM GT_FLIGHT COMPARING CARRID.
LOOP AT GT_FLIGHT INTO DATA(GS_FLIGHT).
LV_FIELD = 'ZZZ' && GS_FLIGHT-CARRID.
PERFORM FRM_COMP_TAB USING LV_FIELD 'CHAR10' CHANGING LT_COMP_TAB. "循环动态处理字段
* LV_FIELD_DESC = GS_FLIGHT-CARRID && '日期'. "循环动态处理FILECATE字段
* SEARCH LV_FIELD_DESC FOR '****日期'.
* SET_FIELDCAT: LV_FIELD LV_FIELD_DESC '' 'C701' 'ZTPP003' 'ZPDAT1'.
ENDLOOP.
LR_LINE_TYPE ?= CL_ABAP_STRUCTDESCR=>CREATE( LT_COMP_TAB[] ).
LR_TAB_TYPE ?= CL_ABAP_TABLEDESCR=>CREATE( LR_LINE_TYPE ).
CREATE DATA : LR_TAB_REF TYPE HANDLE LR_TAB_TYPE.
ASSIGN LR_TAB_REF->* TO <GT_DATA>.
WRITE: '动态生成内表字段和生成fieldcat'.
FORM FRM_COMP_TAB USING UV_NAME
UV_TYPE
CHANGING CT_COMP_TAB TYPE ABAP_COMPONENT_TAB.
DATA: LS_COM_TAB TYPE ABAP_COMPONENTDESCR.
LS_COM_TAB-NAME = UV_NAME.
LS_COM_TAB-TYPE ?= CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME( UV_TYPE ).
APPEND LS_COM_TAB TO CT_COMP_TAB.
ENDFORM.