ABAP OPEN DATASET
屏幕加个文本控件,勾选回应双击作为上传触发操作
分配功能键DCLICK
再加俩按钮上传和下载
*&---------------------------------------------------------------------*
*& Report YDEMO2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ydemo2.
TYPES: BEGIN OF ty_file,
file_type TYPE string, " 屏幕文件类型
source_path TYPE string, " 来源本地路径
target_path TYPE string, " 目标服务器路径
END OF ty_file.
" 屏幕字段
DATA: gv_file TYPE string.
" 文件上传变量
DATA: gt_file TYPE TABLE OF ty_file,
gs_file TYPE ty_file.
CALL SCREEN 9001.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
SET PF-STATUS 'STATUS_9001'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
DATA: lv_name TYPE char20,
lv_subrc TYPE i.
"获取光标焦点
GET CURSOR FIELD lv_name.
" 双击上传文件事件
IF sy-ucomm = 'DCLICK'.
PERFORM frm_select_file USING lv_name.
ENDIF.
CASE sy-ucomm.
WHEN 'UPD'. " 上传
PERFORM frm_upload_file CHANGING lv_subrc.
IF lv_subrc <> 0.
EXIT.
ELSE.
" 更新屏幕为服务器路径
LOOP AT gt_file INTO gs_file.
CASE gs_file-file_type.
WHEN 'GV_FILE'.
gv_file = gs_file-target_path.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
CLEAR gt_file[].
ENDIF.
WHEN 'DLD'. " 下载
PERFORM frm_download_file USING lv_name.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_select_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_NAME
*&---------------------------------------------------------------------*
FORM frm_select_file USING pv_name TYPE char20.
DATA: lt_file TYPE filetable,
lv_rc TYPE i,
lv_filename TYPE string,
lv_filedname TYPE string.
FIELD-SYMBOLS: <fs_field> TYPE any.
" 选择文件
cl_gui_frontend_services=>file_open_dialog(
CHANGING
file_table = lt_file
rc = lv_rc ).
READ TABLE lt_file INTO DATA(ls_file) INDEX 1.
IF sy-subrc EQ 0.
gs_file-file_type = pv_name.
gs_file-source_path = ls_file-filename. " 本地路径
gs_file-target_path = |/mnt/smbshare/{ sy-sysid }/GTS/%ZAPP_NO%_|. " 服务器路径
CASE pv_name.
WHEN 'GV_FILE'.
lv_filename = TEXT-t02. " XX文件名
WHEN OTHERS.
ENDCASE.
SPLIT gs_file-source_path AT '/' INTO TABLE DATA(lt_split).
DATA(lv_line) = lines( lt_split ).
READ TABLE lt_split INTO DATA(ls_split) INDEX lv_line.
IF sy-subrc = 0.
REPLACE ALL OCCURRENCES OF REGEX '.+\.' IN ls_split WITH ''. " 正则删除文件名,取后缀
ENDIF.
lv_filename = lv_filename && sy-datum && sy-uzeit.
gs_file-target_path = gs_file-target_path && lv_filename && '.' && ls_split.
" 只保留一个单据地址
READ TABLE gt_file ASSIGNING FIELD-SYMBOL(<fs_file>) WITH KEY file_type = pv_name.
IF sy-subrc = 0.
MOVE-CORRESPONDING gs_file TO <fs_file>.
ELSE.
APPEND gs_file TO gt_file.
ENDIF.
" 更新屏幕为本地路径
ASSIGN (pv_name) TO <fs_field>.
IF <fs_field> IS ASSIGNED.
<fs_field> = gs_file-source_path.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_SOR_PATH
*& --> LV_TAR_PATH
*&---------------------------------------------------------------------*
FORM frm_upload_file CHANGING pv_subrc TYPE sy-subrc.
DATA: lv_len TYPE i,
lv_length TYPE i,
lt_file_data TYPE solix_tab,
lv_content TYPE xstring,
lv_fieldname TYPE string.
FIELD-SYMBOLS: <fs_field> TYPE any.
IF gt_file IS INITIAL.
RETURN.
ENDIF.
LOOP AT gt_file INTO gs_file.
REPLACE FIRST OCCURRENCE OF '%ZAPP_NO%' IN gs_file-target_path WITH '100001'.
MODIFY gt_file FROM gs_file.
"上传文件
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = gs_file-source_path
filetype = 'BIN'
IMPORTING
filelength = lv_len
TABLES
data_tab = lt_file_data[].
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_len
IMPORTING
buffer = lv_content
TABLES
binary_tab = lt_file_data[]
EXCEPTIONS
failed = 1
OTHERS = 2.
" 打开文件以写入数据
OPEN DATASET gs_file-target_path FOR OUTPUT IN BINARY MODE.
IF sy-subrc = 0.
" 将数据写入文件
LOOP AT lt_file_data INTO DATA(ls_file_data).
DESCRIBE FIELD ls_file_data-line LENGTH lv_length IN BYTE MODE.
IF lv_length > lv_len.
lv_length = lv_len.
ELSE.
lv_len = lv_len - lv_length.
ENDIF.
TRANSFER ls_file_data-line TO gs_file-target_path LENGTH lv_length.
ENDLOOP.
" 关闭文件
CLOSE DATASET gs_file-target_path.
ASSIGN (gs_file-file_type) TO <fs_field>.
IF <fs_field> IS ASSIGNED.
<fs_field> = gs_file-target_path.
ENDIF.
CLOSE DATASET gs_file-target_path.
"文件已成功写入
* MESSAGE s062(zpp001) WITH lv_full_path.
ELSE.
"无法打开文件 &1
pv_subrc = 1.
MESSAGE s063(zpp001) WITH gs_file-target_path DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_NAME
*&---------------------------------------------------------------------*
FORM frm_download_file USING pv_name TYPE char20.
DATA: lv_error TYPE c VALUE 'X',
lv_name TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_extension TYPE string,
lv_filename TYPE string,
lt_result TYPE match_result_tab,
ls_result TYPE match_result.
DATA: lt_solix TYPE solix_tab,
ls_solix TYPE solix,
lv_file_length TYPE i,
lv_content TYPE xstring,
lv_max_length TYPE i VALUE 255,
lv_actual_length TYPE i.
FIELD-SYMBOLS: <fs_server_path> TYPE any.
* lv_name = 'ZGTST001-' && pv_name.
lv_name = 'GV_FILE'.
ASSIGN (lv_name) TO <fs_server_path>.
IF <fs_server_path> IS ASSIGNED AND <fs_server_path> IS NOT INITIAL.
" 文件名提取
FIND ALL OCCURRENCES OF REGEX '[^/\\]+[/\\]*$' IN <fs_server_path> RESULTS lt_result.
IF sy-subrc = 0.
READ TABLE lt_result INTO ls_result INDEX 1.
lv_filename = <fs_server_path>+ls_result-offset(ls_result-length).
lv_extension = lv_filename.
REPLACE ALL OCCURRENCES OF REGEX '\.\w*' IN lv_filename WITH ''. " 正则删除后缀,取文件名
REPLACE ALL OCCURRENCES OF REGEX '.+\.' IN lv_extension WITH ''. " 正则删除文件名,取后缀
" 选择文件保存路径
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
default_extension = lv_extension
default_file_name = lv_filename
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
OTHERS = 1 ).
IF sy-subrc <> 0 OR lv_fullpath IS INITIAL.
MESSAGE s028(zgts001) DISPLAY LIKE 'E'. " 未选择文件保存路径
RETURN.
ENDIF.
" 下载文件
OPEN DATASET <fs_server_path> FOR INPUT IN BINARY MODE.
IF sy-subrc = 0.
DO.
CLEAR: ls_solix, lv_actual_length.
READ DATASET <fs_server_path> INTO ls_solix-line MAXIMUM LENGTH lv_max_length ACTUAL LENGTH lv_actual_length.
IF lv_actual_length IS INITIAL.
EXIT.
ELSE.
APPEND ls_solix TO lt_solix.
lv_file_length += lv_actual_length.
ENDIF.
ENDDO.
CLOSE DATASET <fs_server_path>.
" 转换二进制
IF lt_solix IS NOT INITIAL.
" 下载本地
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = lv_fullpath
filetype = 'BIN'
TABLES
data_tab = lt_solix.
IF sy-subrc = 0.
CLEAR lv_error.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF lv_error = 'X'.
MESSAGE s027(zgts001) DISPLAY LIKE 'E'. " 根据屏幕路径下载服务器文件失败
RETURN.
ENDIF.
ENDFORM.
上述代码测试可成功上传下载服务器文件
原文地址:https://blog.csdn.net/qq_44826887/article/details/146316396
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589426.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589426.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!