使用动态指针的方式实现动态报表
优点:开发简单省时
缺点:扩展性差,数据量大时效率低
下面是代码:
DATA: WA_LAYOUT TYPE LVC_S_LAYO.
DATA: GT_FIELDCAT TYPE LVC_T_FCAT.
FIELD-SYMBOLS : <FS_OUTPUT> TYPE STANDARD TABLE .
TABLES : SFLIGHT.
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME.
SELECT-OPTIONS: S_ID FOR SFLIGHT-CARRID.
SELECTION-SCREEN END OF BLOCK BLK1.
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
END-OF-SELECTION.
PERFORM FRM_DISPLAY_DATA.
FORM FRM_GET_DATA .
DATA: LT_TABLE TYPE REF TO DATA.
DATA: REF_LINE TYPE REF TO DATA.
SELECT SFLIGHT~*
INTO TABLE @DATA(LT_DATA)
FROM SFLIGHT
WHERE
SFLIGHT~CARRID IN @S_ID .
CHECK LT_DATA IS NOT INITIAL.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT'
CHANGING
CT_FIELDCAT = GT_FIELDCAT
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
ENDIF.
DELETE GT_FIELDCAT WHERE FIELDNAME EQ 'MANDT'.
"弄出动态内表
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = GT_FIELDCAT
IMPORTING
EP_TABLE = LT_TABLE
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ASSIGN LT_TABLE->* TO <FS_OUTPUT>.
CREATE DATA REF_LINE LIKE LINE OF <FS_OUTPUT>.
ASSIGN REF_LINE->* TO FIELD-SYMBOL(<FS_LINE>).
LOOP AT LT_DATA INTO DATA(LW_DATA).
MOVE-CORRESPONDING LW_DATA TO <FS_LINE>.
APPEND <FS_LINE> TO <FS_OUTPUT>.
CLEAR :<FS_LINE>.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_DATA .
"为了布局不相互影响
DATA : LV_VARIANT TYPE DISVARIANT .
LV_VARIANT-HANDLE = 'H'.
LV_VARIANT-REPORT = SY-REPID.
CLEAR: WA_LAYOUT.
WA_LAYOUT-ZEBRA = 'X'. "斑马线
WA_LAYOUT-CWIDTH_OPT = 'X'. "自动列宽
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID "回调程序
IS_LAYOUT_LVC = WA_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT "需要显示的内表的列
I_SAVE = 'A'
IS_VARIANT = LV_VARIANT
TABLES
T_OUTTAB = <FS_OUTPUT> "需要显示的数据
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.
短期应付,数据量不大的时候还是可以使用的,开发确实省时不少。
但是在下不是很推荐。
OVER…