ABAP 动态指针实现动态报表

使用动态指针的方式实现动态报表
优点:开发简单省时
缺点:扩展性差,数据量大时效率低
下面是代码:


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…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值