公眾號:
matinal
本文作者:
matinal
前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
在SAP的實際應用中,經常會需要將生成的文件上傳到FTP,或從FTP下載相關文檔數據。本例實現將本地指定文件上傳到FTP,及從FTP下載文件到本地的功能。
從FTP復制文件共有兩種方式,一種是直接復制文件,另一種方式是先從FTP讀取文件數據到內表,拷貝再寫入指定位置文件,不過該功能僅支持文本格式文件(*.TXT,*.DAT),一般不予推薦。
相關函數:
1)FTP_CONNECT:通過賬號連接FTP。
2)FTP_COMMAND:執行FTP操作命令(注意,程序中所有命令必須為小寫)。
1cd:指定本地文件夾路徑;
cd:指定FTP文件夾路徑;
put <filename>:上傳文件;
get <filename>:下載文件;
3)FTP_SERVER_TO_R3:將FTP上的指定文本文件數據讀取到內表。
4)FTP_DISCONNECT:關閉FTP連接。
REPORT ZR_EXAMPLE_07 . DATA: KEY TYPE I VALUE 26101957, TRFCDEST LIKE RFCDES-RFCDEST, THANDLE TYPE I. INCLUDE:<ICON>. *定義輸入界面 SELECTION-SCREEN:BEGIN OF BLOCK FTPLOGIN WITH FRAME TITLE TEXT-001. PARAMETERS: P_USER(45) LOWER CASE OBLIGATORY MEMORY ID USR, P_PWD(45) MODIF ID PWD LOWER CASE OBLIGATORY MEMORY ID PWD, P_HOST(15) MEMORY ID HOS OBLIGATORY, FTP_PATH(30) MEMORY ID FPOS OBLIGATORY. SELECTION-SCREEN:END OF BLOCK FTPLOGIN. SELECTION-SCREEN:BEGIN OF BLOCK UPLOAD WITH FRAME TITLE TEXT-002. PARAMETERS: P_UPPATH(45), P_FILE(20) . SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: PUSHBUTTON 1(20) PUBU USER-COMMAND UPLOAD. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN:END OF BLOCK UPLOAD. SELECTION-SCREEN:BEGIN OF BLOCK DOWNLOAD WITH FRAME TITLE TEXT-003. PARAMETERS: DL_PATH(45), DL_FILE(20) . SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: PUSHBUTTON 1(20) GEBU USER-COMMAND DOWNLOAD. SELECTION-SCREEN: PUSHBUTTON 24(30) SHBU USER-COMMAND ITAB_DL. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN:END OF BLOCK DOWNLOAD. AT SELECTION-SCREEN OUTPUT. * 對密碼輸入欄進行加密處理 PERFORM MASK_PWD. * 給各按鈕加入文本及圖標 WRITE ICON_OUTGOING_OBJECT AS ICON TO PUBU. CONCATENATE PUBU 'Upload FTP' INTO PUBU SEPARATED BY SPACE. WRITE ICON_INCOMING_OBJECT AS ICON TO GEBU. CONCATENATE GEBU 'FTP download' INTO GEBU SEPARATED BY SPACE. WRITE ICON_WRITE_FILE AS ICON TO SHBU. CONCATENATE SHBU 'Internal table download' INTO SHBU SEPARATED BY SPACE. AT SELECTION-SCREEN. PERFORM FTPCONNECT. IF SY-SUBRC <> 0. MESSAGE I001(00) WITH 'Can''t connect to FTP!'. EXIT. ENDIF. MESSAGE S001(00) WITH 'FTP connect OK!'. CASE SY-UCOMM. WHEN 'ONLI'. PERFORM FTPDISCONNECT. EXIT. ENDCASE.
*執行FTP功能 PERFORM FTP_EXECUTE. *關閉FTP連接 PERFORM FTPDISCONNECT. *-----------------------------------------------------------------------------* * 改變密碼輸入框顯示屬性,實現密碼保護 * *-----------------------------------------------------------------------------* FORM MASK_PWD. LOOP AT SCREEN . IF SCREEN-NAME = 'P_PWD'. SCREEN-INVISIBLE = '1'. MODIFY SCREEN . CONTINUE. ENDIF. ENDLOOP. ENDFORM. " *-----------------------------------------------------------------------------* * 通過IP、用戶名、密碼連接FTP服務器 * *-----------------------------------------------------------------------------* FORM FTPCONNECT. DATA: THOSTS(45),TUSERS(45),TPWORD(45). THOSTS = P_HOST. TUSERS = P_USER. TPWORD = P_PWD. * 對密碼數值進行加密解析處理 CALL 'AB_RFC_X_SCRAMBLE_STRING' " System Function ID 'SOURCE' FIELD TPWORD ID 'KEY' FIELD KEY ID 'SCR' FIELD 'X' ID 'DESTINATION' FIELD TPWORD ID 'DSTLEN' FIELD 64. * 定義RFC連接目標,前后台執行時不同 IF SY-BATCH = 'X'. TRFCDEST = 'SAPFTPA'. ELSE. TRFCDEST = 'SAPFTP'. ENDIF. *該函數可以定義有網關時賬戶密碼,一般公司內部訪問時無此設置 CALL FUNCTION 'FTP_CONNECT' EXPORTING USER = TUSERS PASSWORD = TPWORD HOST = THOSTS RFC_DESTINATION = TRFCDEST IMPORTING HANDLE = THANDLE EXCEPTIONS NOT_CONNECTED = 1 OTHERS = 2. ENDFORM. " FTPCONNECT *&--------------------------------------------------------------------- *& 設置結束時關閉SAP *&--------------------------------------------------------------------- FORM FTPDISCONNECT. CALL FUNCTION 'FTP_DISCONNECT' EXPORTING HANDLE = THANDLE. ENDFORM. " FTPDISCONNECT *&---------------------------------------------------------------------* *& 通過SAP執行命令上傳或下載FTP文件 *&---------------------------------------------------------------------* FORM FTP_EXECUTE. DATA:TSUBRC LIKE SY-SUBRC. DATA:BEGIN OF COM OCCURS 0, CMD(100) TYPE C, END OF COM. DATA:BEGIN OF RES OCCURS 0, LINE(100) TYPE C, END OF RES. *指定FTP文件夾路徑 IF NOT FTP_PATH IS INITIAL. CONCATENATE 'cd' FTP_PATH INTO COM-CMD SEPARATED BY ' '. APPEND COM. ENDIF. CASE SY-UCOMM. WHEN 'UPLOAD'. *指定上傳文件夾路徑及上傳文件命令 CONCATENATE 'lcd' P_UPPATH INTO COM-CMD SEPARATED BY ' '. APPEND COM. CONCATENATE 'put' P_FILE INTO COM-CMD SEPARATED BY ' '. APPEND COM. WHEN 'DOWNLOAD'. *指定下載文件夾路徑及下載文件命令 CONCATENATE 'lcd' DL_PATH INTO COM-CMD SEPARATED BY ' '. APPEND COM. CONCATENATE 'get' DL_FILE INTO COM-CMD SEPARATED BY ' '. APPEND COM. ENDCASE. LOOP AT COM FROM 1. IF COM-CMD <> ''. *執行FTP指令 CALL FUNCTION 'FTP_COMMAND' EXPORTING HANDLE = THANDLE COMCOMMAND = COM-CMD TABLES DATA = RES EXCEPTIONS TCPIP_ERROR = 1 COMMAND_ERROR = 2 DATA_ERROR = 3 OTHERS = 4. *當執行失敗時回執數據並退出 IF SY-SUBRC <> 0. CASE SY-UCOMM. WHEN 'UPLOAD'. MESSAGE E001(00) WITH 'FTP UPLOAD FAIL!'. WHEN 'DOWNLOAD'. MESSAGE E001(00) WITH 'FTP DOWNLOAD FAIL!'. ENDCASE. EXIT. ELSE. *根據不同按鈕的功能碼判斷程序執行邏輯及回執信息,當選擇從內表下載功能時轉入子程序 CASE SY-UCOMM. WHEN 'UPLOAD'. MESSAGE S001(00) WITH 'FTP UPLOAD SUCCESS!'. WHEN 'DOWNLOAD'. MESSAGE S001(00) WITH 'FTP DOWNLOAD SUCCESS!'. WHEN 'ITAB_DL'. PERFORM DL_ITAB USING THANDLE DL_PATH DL_FILE. ENDCASE. ENDIF. ENDIF. ENDLOOP. CLEAR:COM,RES,TSUBRC. REFRESH:COM,RES. ENDFORM. " FTPPUTFILE
*---------------------------------------------------------------------* * 將FTP文本類型文件數據讀取到內表 * *---------------------------------------------------------------------* FORM DL_ITAB USING THANDLE TYPE I VALUE(FILEPATH) TYPE C FILENAME TYPE C. DATA: BEGIN OF BLOB OCCURS 0, LINE(255) TYPE C, END OF BLOB. *連接字符串定義本地文件具體路徑 CONCATENATE FILEPATH FILENAME INTO FILEPATH. *將FTP文本類型文件數據讀取到內表 *若所讀FTP文件為非文本文件(*.txt,*.dat)時將出現錯誤 CALL FUNCTION 'FTP_SERVER_TO_R3' EXPORTING HANDLE = THANDLE FNAME = FILENAME TABLES BLOBBLOB = BLOB. *讀取文件失敗時退出程序並回執錯誤 IF SY-SUBRC <> 0. MESSAGE E001(00) WITH 'Read FTP File FAIL!'. EXIT. ENDIF. *將內表數據下載到本地文件 CALL FUNCTION 'WS_DOWNLOAD' EXPORTING FILENAME = FILEPATH FILETYPE = 'DAT' TABLES DATA_TAB = BLOB EXCEPTIONS FILE_OPEN_ERROR = 1 FILE_WRITE_ERROR = 2 INVALID_FILESIZE = 3 INVALID_TABLE_WIDTH = 4 INVALID_TYPE = 5. *將數據寫入本地文件失敗時回執錯誤 IF SY-SUBRC <> 0. MESSAGE E001(00) WITH 'FTP Download By Internal table FAIL!'. ELSE. MESSAGE S001(00) WITH 'FTP Download By Internal table SUCCESS!'. ENDIF. ENDFORM.