废话可以忽略
最近在做公司的项目,基本上全是自开发程序,遇到了各种各样的需求。于是挑选出一些不常用的,但是可能在某些地方确实需要的功能做一些笔记。以便于加强自己的记忆,使自己不易于忘却,以后回过头来翻翻也是件乐事。放在公众号里展示又可以给同是ABAP开发却不曾谋面的朋友一些提示或者思路,用以解惑,也算是我在这艰难的痛苦的一行做一份卑微的贡献。
需求分析
要求在上传文件的时候,此文件与某一个单号进行绑定,以用于再下载的时候通过单号可以找到对应的文件,如下图
实现步骤
由于要实现附件与单号的一一对应,所以我们要建一个自建表来存放附件与单号的对应关系。表结构可以参考下图,其中字段FTAPPL为事务码:AL11下面的文件存放路径,至于AL11怎么创建文件存放路径这里不做讲解,字段FTFRONT为本地文件路径。
上传
通过方法:
CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
获取本地文件路径,然后通过SPLIT关键字分割字符串,将文件名与服务器路径拼接在一起用于上传,比如我最终拼接成的文件路径为:/usr/sap/data/sddoc/test.txt,由于公众号不能插入ABAP代码,所以大家将就着看。
DATA:LV_STR TYPE STRING, LT_SPLIT_TABLE TYPE TABLE OF STRING WITH HEADER LINE.* 获取文件路径 DATA LT_FILETABLE TYPE FILETABLE. DATA LS_FILETABLE TYPE FILE_TABLE. DATA LV_RC TYPE I. CLEAR GV_FILE. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = '选择文件' "选择窗口描述 DEFAULT_EXTENSION = 'XLSX' "默认打开的文件格式* default_filename = 'C:\TEST.txt' "默认打开的文件名 FILE_FILTER = 'EXCEL文件 (*.XLS)|*.XLS|EXCEL文件 (*.XLSX)|*.XLSX|全部文件 (*.*)|*.*|'* with_encoding = INITIAL_DIRECTORY = 'C:\' "初始化的目录* multiselection = "是否可以同时打开多个文件 CHANGING FILE_TABLE = LT_FILETABLE RC = LV_RC* user_action =* file_encoding = EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF SY-SUBRC <> 0.* Implement suitable error handling here ELSE. LOOP AT LT_FILETABLE INTO LS_FILETABLE. GV_FILE = LS_FILETABLE-FILENAME. ENDLOOP. ENDIF. CLEAR LT_SPLIT_TABLE[]. SPLIT GV_FILE AT '\' INTO TABLE LT_SPLIT_TABLE. DESCRIBE TABLE LT_SPLIT_TABLE LINES GV_LINES. READ TABLE LT_SPLIT_TABLE INDEX GV_LINES. REMOTE_FILE = GV_PATH && LT_SPLIT_TABLE. LOCAL_FILE = GV_FILE.
然后,通过函数
'C13Z_FILE_UPLOAD_BINARY'
将文件上传到SAP服务器中,代码如下,其中参数I_FILE_FRONT_END为本地文件路径,I_FILE_APPL为SAP服务器路径,在上传成功之后我们将单号、本地文件路径、SAP文件路径保存到自建表中,用于下载的时候能让文件件和单号一一对应。注意:别忘了给SY-CPROG赋值,如下。
SY-CPROG = 'RC1TCG3Z'. CALL FUNCTION 'C13Z_FILE_UPLOAD_BINARY' EXPORTING I_FILE_FRONT_END = LOCAL_FILE I_FILE_APPL = REMOTE_FILE I_FILE_OVERWRITE = 'X' "覆盖现有文件* IMPORTING* E_FLG_OPEN_ERROR = E_FLG_OPEN_ERROR* E_OS_MESSAGE = E_OS_MESSAGE EXCEPTIONS FE_FILE_NOT_EXISTS = 1 FE_FILE_READ_ERROR = 2 AP_NO_AUTHORITY = 3 AP_FILE_OPEN_ERROR = 4 AP_FILE_EXISTS = 5 AP_CONVERT_ERROR = 6 OTHERS = 7. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ELSE. CLEAR GS_ZTSD_005_WJSC. GS_ZTSD_005_WJSC-ZESD_KFHYZBM = GS_2201-ZESD_KFHYZBM. GS_ZTSD_005_WJSC-FTAPPL = REMOTE_FILE. GS_ZTSD_005_WJSC-FTFRONT = LOCAL_FILE. MODIFY ZTSD_005_WJSC FROM GS_ZTSD_005_WJSC. MESSAGE '附件上传成功!!' TYPE 'S'. ENDIF.
下载
同样,通过函数获取到本地的文件路径
CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
然后通过单号查询自建表,获取之前上传的文件路径,也获取到之前存放的SAP服务器路径,用SPLIT关键字将分割路径,获取文件名,在调用函数的时候给文件名赋初始值,或者可以手工改。在获取路径之后使用函数
'C13Z_FILE_DOWNLOAD_BINARY' 下载SAP服务器上的文件,本地路径和SAP服务器路径参数别传错了。
DATA: LV_DESTINATION TYPE RLGRAP-FILENAME, LV_ACTION TYPE I, LV_FILENAME TYPE STRING, LV_PATH TYPE STRING, LV_FULLPATH TYPE STRING. "下载后存放路径 DATA:LV_STR TYPE STRING, LT_SPLIT_TABLE TYPE TABLE OF STRING WITH HEADER LINE. CLEAR LT_SPLIT_TABLE[]. SPLIT GS_ZTSD_005_WJSC-FTFRONT AT '\' INTO TABLE LT_SPLIT_TABLE. DESCRIBE TABLE LT_SPLIT_TABLE LINES GV_LINES. READ TABLE LT_SPLIT_TABLE INDEX GV_LINES. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG EXPORTING WINDOW_TITLE = '附件下载'* default_extension = DEFAULT_FILE_NAME = LT_SPLIT_TABLE* with_encoding =* file_filter =* initial_directory = PROMPT_ON_OVERWRITE = 'X' CHANGING FILENAME = LV_FILENAME PATH = LV_PATH FULLPATH = LV_FULLPATH USER_ACTION = LV_ACTION* file_encoding = EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4. IF SY-SUBRC <> 0 OR LV_ACTION <> 0. MESSAGE S000(OO) WITH '已取消'. ELSE. REMOTE_FILE = GS_ZTSD_005_WJSC-FTAPPL. LOCAL_FILE = LV_FULLPATH. SY-CPROG = 'RC1TCG3Z'. CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY' EXPORTING I_FILE_FRONT_END = LOCAL_FILE I_FILE_APPL = GS_ZTSD_005_WJSC-FTAPPL I_FILE_OVERWRITE = 'X'* IMPORTING* E_FLG_OPEN_ERROR = E_FLG_OPEN_ERROR* E_OS_MESSAGE = E_OS_MESSAGE EXCEPTIONS FE_FILE_OPEN_ERROR = 1 FE_FILE_EXISTS = 2 FE_FILE_WRITE_ERROR = 3 AP_NO_AUTHORITY = 4 AP_FILE_OPEN_ERROR = 5 AP_FILE_EMPTY = 6 OTHERS = 7. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ELSE. MESSAGE '附件下载成功!!' TYPE 'S'. ENDIF. ENDIF.
我只贴了主要的代码,由于并不是代码编辑器,所以细节代码也不好展示,如有问题可以加我微信号索要源码。
-公众号第一篇文章,帮忙点个关注吧-