本文转自barry的博客(http://blog.chinaunix.net/space.php?uid=8527621&do=blog&id=2030165),内容有所改进,修改了部分bug.
TABLES: sscrfields.
DATA: serverfile(100) ,
file(80),
router(120).
* 定义屏幕字段内表,用来存储字段和其值
DATA dyfields LIKE dynpread OCCURS 0 WITH HEADER LINE.
* 定义两个pushbutton 对应的crl+f1 crl+f2.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
PARAMETERS: p_file LIKE rcgfiletr-ftfront OBLIGATORY LOWER CASE ," 本地文件路径和文件名
p_serv LIKE rcgfiletr-ftappl OBLIGATORY."服务器文件路径和文件名
PARAMETERS p_over LIKE bapistdtyp-boolean.
INITIALIZATION.
* 初始化服务器文件路径
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'DIR_TEMP'
ID 'VALUE' FIELD serverfile.
CONCATENATE serverfile '\' INTO serverfile.
p_serv = serverfile.
* push button的label
sscrfields-functxt_01 = '上载到服务器'.
sscrfields-functxt_02 = '从服务器下载'.
* F4 ON field p_file
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* File selected 对话框
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = ' '
IMPORTING
file_name = p_file."文件路径和文件名
* 获取文件名
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = p_file
IMPORTING
stripped_name = file
EXCEPTIONS
x_error = 1
OTHERS = 2.
CLEAR:dyfields, dyfields[].
* 给屏幕字段P_SERV 赋值
dyfields-fieldname = 'P_SERV'.
CONCATENATE serverfile file INTO dyfields-fieldvalue.
APPEND dyfields.
* 更新屏幕字段和值
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = sy-cprog "当前程序
dynumb = sy-dynnr "当前屏幕
TABLES
dynpfields = dyfields.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_serv.
CLEAR: dyfields[], dyfields, router.
dyfields-fieldname = 'P_SERV'.
APPEND dyfields.
* 读取屏幕上field的值
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-cprog
dynumb = sy-dynnr
TABLES
dynpfields = dyfields.
READ TABLE dyfields INDEX 1.
* 获取文件路径
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = dyfields-fieldvalue
IMPORTING
* stripped_name = file
file_path = router
EXCEPTIONS
x_error = 1
OTHERS = 2.
* File selected 对话框
CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
EXPORTING
directory = router
filemask = ' '
IMPORTING
serverfile = serverfile
EXCEPTIONS
canceled_by_user = 1
OTHERS = 2.
* CONCATENATE serverfile '\' INTO serverfile .
p_serv = serverfile.
AT SELECTION-SCREEN.
CASE sy-ucomm . " SY-DYNNR SSCRFIELDS-UCOMM
WHEN 'FC01'.
CALL FUNCTION 'C13Z_FILE_UPLOAD_BINARY'
EXPORTING
i_file_front_end = p_file
i_file_appl = p_serv
i_file_overwrite = p_over
EXCEPTIONS
fe_file_not_exists = 1
fe_file_read_error = 2
ap_no_authority = 3
ap_file_open_error = 4
ap_file_exists = 5
OTHERS = 6.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
MESSAGE e000(oo) WITH '本地文件不存在'.
WHEN 2.
MESSAGE e000(oo) WITH '读取本地文件错误'.
WHEN 3.
MESSAGE e000(oo) WITH '没有服务器上载权限'.
WHEN 4.
MESSAGE e000(oo) WITH '服务器文件打开错误'.
WHEN 5.
MESSAGE e000(oo) WITH '服务器上此文件已存在'.
WHEN OTHERS.
MESSAGE e000(oo) WITH '不知道什么错误,反正是出错了'.
ENDCASE.
ELSE.
MESSAGE s000(oo) WITH '上传完毕!'.
ENDIF.
WHEN 'FC02'.
CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY'
EXPORTING
i_file_front_end = p_file
i_file_appl = p_serv
i_file_overwrite = p_over
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.
CASE sy-subrc.
WHEN 1.
MESSAGE e000(oo) WITH '本地文件打开错误'.
WHEN 2.
MESSAGE e000(oo) WITH '本地文件已存在'.
WHEN 3.
MESSAGE e000(oo) WITH '写本地文件出错,可能是这个路径不让写'.
WHEN 4.
MESSAGE e000(oo) WITH '没有服务器下载权限'.
WHEN 5.
MESSAGE e000(oo) WITH '服务器文件打开错误'.
WHEN 6.
MESSAGE e000(oo) WITH '服务器上文件为空'.
WHEN OTHERS.
MESSAGE e000(oo) WITH '不知道什么错误,反正是出错了'.
ENDCASE.
ELSE.
MESSAGE s000(oo) WITH '下载完毕!'.
ENDIF.
ENDCASE.
START-OF-SELECTION.
MESSAGE s000(oo) WITH '点旁边那两个按钮,别点我!'.