FIELD-SYMBOLS 動態內表

相關類 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.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章