*&---------------------------------------------------------------------**& Report ZFTP_001*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zftp_001.INCLUDE zftp_001_screen.INCLUDE zftp_001_f01.INITIALIZATION."按钮显示描述
sscrfields-functxt_01 = TEXT-f01.".* sscrfields-functxt_02 = TEXT-f02.""隐藏执行按钮APPEND 'ONLI' TO gt_exclude.CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'EXPORTING
p_status = sy-pfkeyTABLES
p_exclude = gt_exclude.AT SELECTION-SCREEN.PERFORM sub_ftp_commd.
*----------------------------------------------------------------------****INCLUDE ZFTP_001_F01.*----------------------------------------------------------------------**&---------------------------------------------------------------------**& Form SUB_FTP_COMMD*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& *&---------------------------------------------------------------------*FORM sub_ftp_commd .DATA:
p_file_name TYPE char255, "文件名
p_file_prefix TYPE char255, "本地文件前缀
p_folder(1000) TYPE c.* VALUE '/ERP/bf/', "ftp 上传的路径DATA ls_ztftp_oa TYPE ztftp_oa.DATA: hdl TYPE i,key TYPE i VALUE 26101957,
slen TYPE i,
cmd(80) TYPE c.DATA lv_error TYPE char1.DATA ls_ztftp_002 TYPE ztftp_002.DATA result TYPE STANDARD TABLE OF gty_result WITH HEADER LINE.DATA: BEGIN OF lt_data_txt OCCURS 0 ,line(500),END OF lt_data_txt.* DATA: BEGIN OF lt_data_binary OCCURS 0,* x(2000) TYPE x,* END OF lt_data_binary.* DATA: lv_binary_len TYPE i.* DATA: l_codepage(4) TYPE n .* DATA: l_encoding(20).DATA:lv_memory TYPE i,
lv_visual TYPE i.* DATA: BEGIN OF result OCCURS 0,* line(100) TYPE c,* END OF result.REFRESH gt_msg[].CLEAR : p_file_name,p_file_prefix,p_folder.CLEAR :ls_ztftp_002,lv_error.REFRESH result[].CLEAR result."按钮相应CASE sscrfields-ucomm.WHEN 'FC01'. " 文件上传"获取文件名CLEAR :lv_error,p_file_name.PERFORM sub_get_p_file USING p_file_prefix p_file_name lv_error.* p_file_prefix = 'D:\test\'.* p_file_name = 't.rar'.IF lv_error = 'X'.MESSAGE e000(zftp) WITH '文件路径输入错误!'.EXIT.ENDIF.CLEAR lv_error.* DATA lv_str TYPE clike.CLEAR : lv_memory,lv_visual.* lv_str = p_file_name."判断文件名是否有汉字CALL FUNCTION 'NLS_VISUAL_CHARLEN'EXPORTING
str = p_file_nameIMPORTING
len_memory = lv_memory
len_visual = lv_visual.IF lv_visual = 2.MESSAGE e000(zftp) WITH '文件名不允许包含汉字!'.EXIT.ENDIF."检查流水号是否存在SELECT COUNT(*) FROM zgt_001 WHERE zlsh = p_js_no.IF sy-subrc NE 0 .MESSAGE e000(zftp) WITH '申请流水号不存在!'.EXIT.ENDIF.SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_ztftp_oa FROM ztftp_oaWHERE id = 'FTP001' AND status = 'X' .IF sy-subrc = 0.SELECT COUNT(*) FROM sapftp_servers WHERE ftp_server_name = ls_ztftp_oa-ftp_server_nameAND ftp_server_port = ls_ztftp_oa-ftp_server_port AND description = ls_ztftp_oa-description.IF sy-subrc = 0.
slen = strlen( ls_ztftp_oa-ftppwd ).* "获取加密密码 保存到ls_ztftp_oa-ftppwdCALL FUNCTION 'HTTP_SCRAMBLE'EXPORTING
source = ls_ztftp_oa-ftppwd
sourcelen = slenkey = keyIMPORTING
destination = ls_ztftp_oa-ftppwd.DO 3 TIMES.* 连接ftp服务器CALL FUNCTION 'FTP_CONNECT'EXPORTING
user = ls_ztftp_oa-ftpuser
password = ls_ztftp_oa-ftppwd
host = ls_ztftp_oa-ftp_server_name
rfc_destination = ls_ztftp_oa-description "destIMPORTING
handle = hdl. "连接的句柄IF sy-subrc = 0.EXIT.ENDIF.ENDDO.IF sy-subrc <> 0.MESSAGE e000(zftp) WITH sy-datum sy-uzeit sy-uname '连接ftp文档服务器失败!'.* WRITE :/ sy-datum, sy-uzeit, sy-uname, '连接ftp失败!'. "MESSAGEGSTOP.ENDIF."判断是否存在文件夹(打开此文件夹)CLEAR lv_error.REFRESH result[].CONCATENATE ls_ztftp_oa-prefix_path p_js_no '/' INTO p_folder.CONCATENATE 'cd' p_folder INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error = 'X'.* 文件夹不存在则打开前缀文件夹 再 创建创建CLEAR lv_error.REFRESH result[].
p_folder = ls_ztftp_oa-prefix_path.CONCATENATE 'cd' p_folder INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'.*创建文件夹CONCATENATE 'mkdir ' p_js_no INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error."文件夹创建成功后 打开IF lv_error NE 'X'.CLEAR lv_error.REFRESH result[].CONCATENATE ls_ztftp_oa-prefix_path p_js_no '/' INTO p_folder.CONCATENATE 'cd' p_folder INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'."打开本地文件夹CLEAR lv_error.REFRESH result[].CONCATENATE 'lcd' p_file_prefix INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'.*CALL FUNCTION 'SCMS_TEXT_TO_BINARY'* EXPORTING* ENCODING = '8400'* IMPORTING* output_length = blob_length* TABLES* text_tab = text " input* binary_tab = in_data" output* EXCEPTIONS* failed = 1* OTHERS = 2."创建文件CONCATENATE 'put ' p_file_name INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'.
add_msg 'S' '上传成功'.CLEAR lv_error.REFRESH result[]."存储信息* ZTFTP_002CLEAR ls_ztftp_002.
ls_ztftp_002-zlsh = p_js_no.CONCATENATE ls_ztftp_oa-prefix_path p_js_no '/' p_file_name INTO ls_ztftp_002-ftp_file_path.
ls_ztftp_002-uname = sy-uname.
ls_ztftp_002-aedat = sy-datum.
ls_ztftp_002-aetim = sy-uzeit.MODIFY ztftp_002 FROM ls_ztftp_002.COMMIT WORK.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.* 文件夹存在则直接创建文件"打开本地文件夹CLEAR lv_error.REFRESH result[].CONCATENATE 'lcd' p_file_prefix INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'.* "将文件名放入 lt_data_txt* "转码* DATA lv_len TYPE int4.* DATA lv_i TYPE i.* lv_i = 0.* lv_len = strlen( p_file_name ).** DO lv_len TIMES.* APPEND p_file_name+lv_i(1) TO lt_data_txt.* lv_i = lv_i + 1.* IF lv_i = lv_len .* EXIT.* ENDIF.* ENDDO.** CALL FUNCTION 'SCMS_TEXT_TO_BINARY'* EXPORTING* encoding = '8450'* IMPORTING* output_length = lv_binary_len "编码后占多少字节* TABLES* text_tab = lt_data_txt* binary_tab = lt_data_binary.* IF sy-subrc NE 0.** LOOP AT result.* add_msg 'E' '文件名转码错误,请检查文件名!'.* CLEAR result.* ENDLOOP.* REFRESH result[].** EXIT.** ENDIF.** CALL FUNCTION 'FTP_R3_TO_SERVER'* EXPORTING* handle = hdl* fname = p_file_name* blob_length = lv_binary_len* TABLES* blob = lt_data_binary. "二进制输出DATA aa TYPE string.DATA bb TYPE xstring.
aa = p_file_name.CALL FUNCTION 'SCMS_STRING_TO_XSTRING'EXPORTINGtext = aa "stringIMPORTINGbuffer = bbEXCEPTIONS
failed = 1OTHERS = 2."创建文件CONCATENATE 'put ' p_file_name INTO cmd SEPARATED BY space.PERFORM sub_ftp_command TABLES resultUSING hdl cmd lv_error.IF lv_error NE 'X'.
add_msg 'S' '上传成功'.CLEAR lv_error.REFRESH result[]."存储信息* ZTFTP_002CLEAR ls_ztftp_002.
ls_ztftp_002-zlsh = p_js_no.CONCATENATE ls_ztftp_oa-prefix_path p_js_no '/' p_file_name INTO ls_ztftp_002-ftp_file_path.
ls_ztftp_002-uname = sy-uname.
ls_ztftp_002-aedat = sy-datum.
ls_ztftp_002-aetim = sy-uzeit.MODIFY ztftp_002 FROM ls_ztftp_002.COMMIT WORK.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ELSE.LOOP AT result.
add_msg 'E' result-line.CLEAR result.ENDLOOP.REFRESH result[].ENDIF.ENDIF.CLEAR lv_error."根据金税发票号查找FTP 文件路径 TABLES result TYPE STANDARD TABLE gty_result* 断开FTP连接CALL FUNCTION 'FTP_DISCONNECT'EXPORTING
handle = hdl.* 断开RFC链接CALL FUNCTION 'RFC_CONNECTION_CLOSE'EXPORTING
destination = ls_ztftp_oa-description "destEXCEPTIONSOTHERS = 1.ELSE.MESSAGE e002(zftp) .EXIT .ENDIF.ELSE.MESSAGE e001(zftp) .EXIT .ENDIF.WHEN OTHERS.ENDCASE.IF gt_msg IS NOT INITIAL.
zbc_cl_tool=>display_msg( IMPORTING it_msg = gt_msg ).ENDIF.ENDFORM.FORM sub_ftp_command TABLES result STRUCTURE ls_resultUSING hdl TYPE i
cmd TYPE c
lv_error TYPE char1.CALL FUNCTION 'FTP_COMMAND'EXPORTING
handle = hdl
command = cmd
compress = 'N' "compressTABLESdata = resultEXCEPTIONS
command_error = 1
tcpip_error = 2.IF sy-subrc NE 0.
lv_error = 'X'.ENDIF.ENDFORM.*&---------------------------------------------------------------------**& Form SUB_GET_P_FILE*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------** -->P_P_FILE text*&---------------------------------------------------------------------*FORM sub_get_p_file USING p_file_prefix TYPE char255
p_file_name TYPE char255
lv_error TYPE char1.CALL FUNCTION 'STPU1_EXTRACT_FILENAME'EXPORTING
file_and_path = p_fileIMPORTING
file = p_file_name
pathname = p_file_prefix.IF sy-subrc NE 0.
lv_error = 'X'.ENDIF.ENDFORM.
*&---------------------------------------------------------------------**& 包含 ZFTP_001_SCREEN*&---------------------------------------------------------------------*TABLES: sscrfields.DATA gt_exclude TYPE TABLE OF sy-ucomm.TYPES: BEGIN OF gty_result,line(100) TYPE c,END OF gty_result.DATA ls_result TYPE gty_result.* 处理的日志DATA:gt_msg TYPE bapirettab.DATA:gs_msg TYPE bapiret2.DATA:gv_message TYPE bapiret2-message.DEFINE add_msg.
gs_msg-type = &1.
gs_msg-id = '00'.
gs_msg-number = '398'.
gs_msg-message_v1 = &2.APPEND gs_msg TO gt_msg.CLEAR:gs_msg,gv_message.END-OF-DEFINITION."添加了五个按钮SELECTION-SCREEN: FUNCTION KEY 1.SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE TEXT-h01.PARAMETERS p_js_no TYPE zgt_001-zlsh OBLIGATORY.PARAMETERS: p_file TYPE sapb-sappfad OBLIGATORY.SELECTION-SCREEN END OF BLOCK bl1.AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.CALL FUNCTION 'WS_FILENAME_GET'EXPORTING
def_filename = space
def_path = p_filemask = ',Excel Files,*.xls,All Files,*.csv,*.*.'mode = 'O'IMPORTING
filename = p_fileEXCEPTIONS
selection_cancel = 0.