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.

 

 

 

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