- 关于给报表做模板下载和文件上传的功能ABAPER是最熟悉不过的了,于是乎整理一下下,方便以后用到.
- 报表大概长这样:
- 按照业务顾问讲的需求,用户先点击模板下载按钮,下载模板填数据后,在报表界面的文件上传模板,然后执行。
- 根据需求是先完成模板下载的实现:在SMW0上传准备好的模板,然后在程序处理。
- SMW0操作步骤:输入TCODE:SMW0
- 现在是可以进行报表的开发了
- 示例代码:
TABLES ekpo.
TABLES sscrfields.
PARAMETERS: p_file LIKE rlgrap-filename." obligatory.
SELECTION-SCREEN FUNCTION KEY 1. "第一个按钮
INITIALIZATION.
sscrfields-functxt_01 = '模板下载'. "定义第一个按钮文本
** 给p_file绑定事件
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_selectfile CHANGING p_file. "文件上传处理的FROM
AT SELECTION-SCREEN.
** 按钮命令事件处理 按钮功能
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_temp_download. "模板下载处理的FROM
ENDCASE.
START-OF-SELECTION.
IF p_file NE ''.
PERFORM frm_get_data_file. "文件内容处理的FROM
ELSE.
MESSAGE '请先上传文件' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
FORM frm_selectfile CHANGING cv_selfile LIKE rlgrap-filename.
DATA: lv_rc TYPE i,
lt_filetable TYPE filetable.
DATA lv_file_filter TYPE string.
DATA lv_window_title TYPE string.
lv_window_title = '请选择导入Excel文件'."'请选择导入Excel文件'
lv_file_filter = 'Excel(*.XLSX)|*.XLSX|全部文件 (*.*)|*.*|'."'Excel(*.XLSX)|*.XLSX|全部文件 (*.*)|*.*|'
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = lv_window_title
file_filter = lv_file_filter
multiselection = space
CHANGING
file_table = lt_filetable
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE '文件上传失败' TYPE 'E'.
ENDIF.
ENDFORM. "SELECT_FILE
FORM frm_temp_download .
DATA: ls_wwwdatatab LIKE wwwdatatab,
lt_mime LIKE w3mime OCCURS 10,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
window_title TYPE string,
default_file_name TYPE string.
DATA: lv_destination TYPE rlgrap-filename,
lv_subrc TYPE sy-subrc.
CLEAR: ls_wwwdatatab,lt_mime[],lv_filename,lv_path,lv_fullpath,window_title,default_file_name.
CLEAR: lv_destination,lv_subrc.
ls_wwwdatatab-relid = 'MI'.
ls_wwwdatatab-objid = 'ZMM_XX'. "这里写入TCODE:SMW0上传的对象
ls_wwwdatatab-text = 'XXXX模板关系(ZACE06)'.
window_title = '下载导入模板'.
default_file_name = 'XXXX模板关系(ZACE06)'.
CALL FUNCTION 'WWWDATA_IMPORT' "#EC *
EXPORTING
key = ls_wwwdatatab
TABLES
mime = lt_mime
EXCEPTIONS
wrong_object_type = 1
import_error = 2
OTHERS = 3.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = window_title
default_extension = 'xlsx'
default_file_name = default_file_name
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
STOP.
ENDIF.
IF lv_fullpath IS NOT INITIAL.
lv_destination = lv_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wwwdatatab
destination = lv_destination
IMPORTING
rc = lv_subrc.
IF lv_subrc = 0.
MESSAGE '模板下载成功' TYPE 'S'.
ELSE.
MESSAGE '模板下载失败' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM.
FORM frm_get_data_file .
DATA: lt_raw TYPE truxs_t_text_data.
TYPES: BEGIN OF ty_datatab,
fd01 TYPE string, "存放第一列数据的字段
fd02 TYPE string, "存放第二列数据的字段
fd03 TYPE string, "存放第三列数据的字段
fd04 TYPE string, "存放第四列数据的字段
END OF ty_datatab.
DATA lt_datatab TYPE TABLE OF ty_datatab.
DATA lw_datatab TYPE ty_datatab.
REFRESH: lt_datatab[],lt_raw[].
** 调用函数将Excel内容保存到内表
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X'
i_tab_raw_data = lt_raw
i_filename = p_file
TABLES
i_tab_converted_data = lt_datatab
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE '获取文件数据失败' TYPE 'I'.
STOP.
ENDIF.
LOOP AT lt_datatab INTO lw_datatab.
ENDLOOP.
ENDFORM.