Bootstrap

ABAP 动态生成内表

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.
;