SAP动态下载数据库表数据至EXCEL

因顾问需要,写了个动态下载数据库表数据的程序。

考虑到当文件过大时程序运行极其缓慢甚至DUMP,于是写成按输入的数字确定每个EXCEL存储数据条数,同时文件名除选择屏幕输入前缀外,再补上流水号

下图为选择屏幕

代码如下

*&---------------------------------------------------------------------*
*& Report ZIFR012
*&---------------------------------------------------------------------*
*& 最后修改人       时间       版本
*& 王浩辉(新建)    20220331   DSHK932478
*&---------------------------------------------------------------------*
REPORT zifr012.

DATA:go_datat TYPE REF TO data,
     gt_fcat  TYPE lvc_t_fcat,
     gt_dntab TYPE STANDARD TABLE OF dntab,
     gv_eor   TYPE char1.

DATA: go_table2   TYPE REF TO cl_abap_tabledescr,
      go_struc    TYPE REF TO cl_abap_structdescr,
      go_table    TYPE REF TO cl_abap_tabledescr,
      go_data     TYPE REF TO data,
      gt_comps_wa TYPE abap_compdescr_tab.

DATA:gv_json  TYPE string,
     gv_json2 TYPE string,
     gv_line  TYPE i,
     gv_line2 TYPE i,
     gv_line3 TYPE i,
     gv_name  TYPE char128.

FIELD-SYMBOLS:<fs_tab> TYPE STANDARD TABLE,
              <fs_asy> TYPE STANDARD TABLE.

SELECTION-SCREEN BEGIN OF BLOCK b01.
PARAMETERS:p_tname TYPE tabname OBLIGATORY,
           p_name  TYPE text40,
           p_line  TYPE i,
           p_linet TYPE i.
SELECTION-SCREEN END OF BLOCK b01.

START-OF-SELECTION.

  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu          = sy-langu
      tabname        = p_tname
    TABLES
      nametab        = gt_dntab
    EXCEPTIONS
      no_texts_found = 1.
  IF sy-subrc NE 0.
    MESSAGE '该表不存在于数据库!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*根据取出的字段目录生成参考字段目录
  LOOP AT gt_dntab ASSIGNING FIELD-SYMBOL(<fs_table>).
    APPEND VALUE #( fieldname = <fs_table>-fieldname
                    ref_table = p_tname
                    ref_field = <fs_table>-fieldname ) TO gt_fcat.
  ENDLOOP.

*内表创建
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fcat
    IMPORTING
      ep_table        = go_datat.

  ASSIGN go_datat->* TO <fs_tab>.

  "获取传入参数中内表 字段信息
  go_table2  ?= cl_abap_typedescr=>describe_by_data( <fs_tab> ).
  go_struc   ?= go_table2->get_table_line_type( ).

  "根据动态结构创建动态内表类型
  CALL METHOD cl_abap_tabledescr=>create
    EXPORTING
      p_line_type = go_struc
    RECEIVING
      p_result    = go_table.

  CREATE DATA go_data TYPE HANDLE go_table.
  ASSIGN go_data->* TO <fs_asy>.

  SELECT * FROM (p_tname) INTO TABLE <fs_tab> UP TO p_linet ROWS..

  DESCRIBE TABLE <fs_tab> LINES gv_line.

  gv_line2 = p_line.
  LOOP AT <fs_tab> ASSIGNING FIELD-SYMBOL(<fs_line>).
    gv_line2 = gv_line2 - 1.
    gv_line  = gv_line  - 1.
    APPEND <fs_line> TO <fs_asy>.
    IF gv_line2 GT 0 AND gv_line NE 0.
      CONTINUE.
    ELSE.
      gv_line2 = p_line.
      gv_line3 = gv_line3 + 1.
      gv_name  = |{ p_name }{ gv_line3 }.xls|.
      "下载文件
      CALL FUNCTION 'WS_DOWNLOAD'
        EXPORTING
          codepage = '8400'
          filename = gv_name
          filetype = 'DAT'
        TABLES
          data_tab = <fs_asy>.

      CLEAR <fs_asy>.
    ENDIF.
  ENDLOOP. 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条划水的鱼儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值