相關類 CL_ALV_TABLE_CREATE
動態內表構建步驟
(1)獲得主數據:獲取將要展示的數據
(2)構建fieldcat :根據選擇屏幕來動態的構建fieldcat
(3)根據fieldcat構建動態內表:根據已經構建好的fieldcat來構建內表字段, CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
(4)將主數據添加到動態內表 :將獲取到的主數據添加到對應字段
code
FORM BUILS_DYTABLE .
PERFORM GET_DATA . "獲得主數據
PERFORM BUILD_FIELDCAT . "構建動態fieldcat
PERFORM BUILD_DYNAMIC_TABLE."構建動態內表
PERFORM ADD_DATA. "向動態內表添加數據
ENDFORM.
數據定義
TABLES ZTEST_TABLE.
DATA GT_MAIN TYPE TABLE OF ZTEST_TABLE.
DATA GS_MAIN TYPE ZTEST_TABLE.
DATA GT_FIELDCAT TYPE LVC_T_FCAT. "fieldcat
DATA GS_FIELDCAT TYPE LVC_S_FCAT. "fieldcat 工作區
DATA GV_FIELDCAT TYPE C LENGTH 20 .
DATA GV_MONTH TYPE C LENGTH 20 .
FIELD-SYMBOLS: <FT_TB> TYPE STANDARD TABLE , " 動態內表
<FS_TB> TYPE ANY , " 工作區
<DYN_TBFIELD> TYPE ANY . "動態內表字段
DATA GV_POS TYPE I .
DEFINE __BUILDFIELDCAT. "宏 構建fieldcat
CLEAR GS_FIELDCAT .
GV_POS = GV_POS + 1.
GS_FIELDCAT-FIELDNAME = &1.
GS_FIELDCAT-SCRTEXT_L = &2.
GS_FIELDCAT-OUTPUTLEN = 20.
GS_FIELDCAT-CURRENCY = &3 .
APPEND GS_FIELDCAT TO GT_FIELDCAT .
END-OF-DEFINITION.
PARAMETERS P_YEAR TYPE ZTEST_TABLE-ZYEAR .
SELECT-OPTIONS S_NAME FOR GS_MAIN-COMPANY.
SELECT-OPTIONS S_MATHON FOR GS_MAIN-ZMONTH.
獲得主數據
FORM GET_DATA .
SELECT *
FROM ZTEST_TABLE
INTO CORRESPONDING FIELDS OF TABLE GT_MAIN
WHERE ZYEAR EQ P_YEAR
AND COMPANY IN S_NAME
AND ZMONTH IN S_MATHON .
ENDFORM.
構建fieldcat
FORM BUILD_FIELDCAT .
DATA LV_INDEX TYPE N LENGTH 2 .
__BUILDFIELDCAT 'ZYEAR' '年份' '' .
__BUILDFIELDCAT 'COMPANY' '公司' '' .
DO 12 TIMES.
LV_INDEX = SY-INDEX .
IF LV_INDEX IN S_MATHON. "根據選擇屏幕動態構建月份
CONCATENATE 'MONTH_' LV_INDEX INTO GV_FIELDCAT .
CONCATENATE LV_INDEX '月' INTO GV_MONTH .
__BUILDFIELDCAT GV_FIELDCAT GV_MONTH 'WEARS' .
ENDIF.
ENDDO.
__BUILDFIELDCAT 'WEARS' '金額單位' '' .
ENDFORM.
構建動態內表
FORM BUILD_DYNAMIC_TABLE .
DATA LT_DYTABLE TYPE REF TO DATA.
DATA LS_DYTABLE TYPE REF TO DATA.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
* I_STYLE_TABLE =
IT_FIELDCATALOG = GT_FIELDCAT
* I_LENGTH_IN_BYTE =
IMPORTING
EP_TABLE = LT_DYTABLE
* E_STYLE_FNAME =
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN LT_DYTABLE->* TO <FT_TB> .
CREATE DATA LS_DYTABLE LIKE LINE OF <FT_TB>.
ASSIGN LS_DYTABLE->* TO <FS_TB> .
ENDFORM.
將主數據和動態內表相關聯
FORM ADD_DATA .
DATA LS_MAIN TYPE ZTEST_TABLE. "避免AT事件中字符字段變*
SORT GT_MAIN BY ZYEAR COMPANY.
LOOP AT GT_MAIN INTO LS_MAIN .
MOVE-CORRESPONDING LS_MAIN TO GS_MAIN .
AT NEW COMPANY .
CLEAR <FS_TB> .
ASSIGN COMPONENT 'COMPANY' OF STRUCTURE <FS_TB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0.
<DYN_TBFIELD> = GS_MAIN-COMPANY .
ENDIF.
ASSIGN COMPONENT 'ZYEAR' OF STRUCTURE <FS_TB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0.
<DYN_TBFIELD> = GS_MAIN-ZYEAR .
ENDIF.
ASSIGN COMPONENT 'WEARS' OF STRUCTURE <FS_TB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0.
<DYN_TBFIELD> = GS_MAIN-WEARS .
ENDIF.
ENDAT.
CONCATENATE 'MONTH_' GS_MAIN-ZMONTH INTO GV_FIELDCAT.
ASSIGN COMPONENT GV_FIELDCAT OF STRUCTURE <FS_TB> TO <DYN_TBFIELD>.
IF SY-SUBRC EQ 0.
<DYN_TBFIELD> = GS_MAIN-INCOM .
ENDIF.
AT END OF COMPANY .
APPEND <FS_TB> TO <FT_TB>.
ENDAT .
ENDLOOP.
ENDFORM.