因顾问需要,写了个动态下载数据库表数据的程序。
考虑到当文件过大时程序运行极其缓慢甚至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.