ABAP FTP传输
FUNCTION zftp_tsfr.*"----------------------------------------------------------------------
*"*"Local Interface:
*"IMPORTING
*" VALUE(BLART) TYPEZSFISMSG-BLART OPTIONAL
*" VALUE(WERKS) TYPEZSFISMSG-WERKS OPTIONAL
*" VALUE(MODE) TYPECHAR3 OPTIONAL
*" VALUE(FILENAME) TYPEC
*" VALUE(COMMAND) TYPEC OPTIONAL
*" VALUE(ENCODING) TYPEABAP_ENCODING DEFAULT '4110'
*" VALUE(SAPERATOR) TYPEC OPTIONAL
*" VALUE(NO_SEPERATOR) TYPEC DEFAULT SPACE
*"TABLES
*" IT_DATA
*" USRDATA STRUCTUREZFTP_USER OPTIONAL
*" FTP_RESULT OPTIONAL
*"EXCEPTIONS
*" NO_CONNECT
*" COMMAND_ERROR
*" TRANSFER_ERROR
*" ERROR_PATH
*" DOWNLOAD_ERROR
*" NO_DATA
*" NO_LOGON_INFO
*" ERROR_PARAMETER
*"----------------------------------------------------------------------
**FTP传输功能
**Programer: Lean Liu
**Create Date:2011/08/01
**内表字段类型只能是:P/C/T/X/D/F,或基于此基本类型上面的数据
**---------------------------------------------------------------------------
DATA:localfile TYPE string.
TYPES:ty_bin(80) TYPE x.
DATA:it_bin TYPE TABLE OF ty_bin WITH HEADER LINE.
DATA:temp_bin LIKE TABLE OF it_bin WITH HEADER LINE.
DATA:it_text TYPE truxs_t_text_data."转换成TEXT后的内表
DATA:wa_text LIKE LINE OF it_text.
*DATA:L_COUNT TYPE SY-TABIX.
DATA:l_string TYPE string.
DATA:x_string TYPE xstring.
DATA:x_tstring TYPE xstring.
DATA:totallen TYPE i.
DATA:slen TYPE i.
DATA:l_slen TYPE i."开始位置
DATA:l_flen TYPE i."字段输出长度
DATA:c_filename TYPE dbmsgora-filename.
DATA:c_file_extension TYPE sdbad-funct.
DATA:P_POS TYPE SY-FDPOS.
FIELD-SYMBOLS: TYPE table,
TYPE ANY.
DATA:wa_user LIKE LINE OF usrdata.
DATA cl_conv TYPE REF TOcl_abap_conv_out_ce.
DATA:l_lpcount TYPE i."循环次数
DATA:descr_ref TYPE REF TO cl_abap_structdescr.
DATA:it_field TYPE TABLE OF abap_compdescr.
DATA:l_fieldcount TYPE i.
DATA:l_current_field_len TYPE i ."CURRENT FIELD LENGTH.
*DATA:TEST_LEN TYPE I .
CONSTANTS:c_space TYPE syhex02 VALUE '00a0'."space code.
DATA:g_space TYPE string.
**FTP相关变量
DATA:ftp_handle TYPE i,
ftp_dest TYPE rfcdes-rfcdest VALUE 'SAPFTPA'.
**生成空格符
g_space = cl_abap_conv_in_ce=>uccp( c_space ).
**1.检测输入基本信息是否都正确
IF it_data[] IS INITIAL."传输的数据是空值,无效
MESSAGE text-001 TYPE 'S'
RAISING no_data.
EXIT.
ENDIF.
IF mode NE 'BIN' AND mode NE 'ASC'.
MESSAGE s008 RAISING error_parameter WITH 'MODE'.
ENDIF.
IF blart IS NOT INITIAL OR werks IS NOT INITIAL."从ZSFISMSG表中获取额外的FTP登录信息
SELECT host user1 AS username pass1 AS password FROM zsfismsg APPENDING CORRESPONDING FIELDS OF TABLE usrdata WHERE blart = blart
AND werks = werks.
ENDIF.
IF usrdata[] IS INITIAL."没有FTP用户信息
MESSAGE text-010 TYPE 'S' RAISING no_logon_info.
ENDIF.
**拆分文件名(文件名+扩展名)
c_filename = filename.
CALL FUNCTION 'SPLIT_FILENAME'
EXPORTING
long_filename= c_filename
IMPORTING
pure_extension = c_file_extension.
TRANSLATE c_file_extension TO UPPER CASE.
**设定分隔符
*IF NO_SEPERATOR ='X'.
* SAPERATOR=''.
*ENDIF.
IF saperator IS INITIAL.
saperator=cl_abap_char_utilities=>horizontal_tab."Tab分隔
ENDIF.
IF no_seperator = 'X'."固定输出的
**获取对应内表总的列数
descr_ref ?= cl_abap_typedescr=>describe_by_data( it_data ).
it_field = descr_ref->components.
DESCRIBE TABLE it_field LINES l_fieldcount.
REFRESH it_text.
* BREAK FITDEBUG.
LOOP AT it_data.
CLEAR: wa_text,l_lpcount,l_slen,l_flen.
* L_SLEN = 1.
DO.
l_lpcount = l_lpcount + 1.
ASSIGN COMPONENT l_lpcount OF STRUCTURE it_data TO .
IF sy-subrc NE 0.
EXIT.
ENDIF.
* CHECK SY-SUBRC EQ 0.
DESCRIBE FIELDOUTPUT-LENGTH l_flen.
IF l_lpcount NE l_fieldcount.
wa_text+l_slen(l_flen) = .
l_slen = l_slen + l_flen.
ELSE.
l_current_field_len = STRLEN().
IF l_current_field_len > 0."enhance by snow.zeng:20111228
wa_text+l_slen(l_current_field_len) = .
ENDIF.
l_slen = l_slen + l_current_field_len.
WHILE l_current_field_len LT l_flen.
wa_text+l_slen(1) = g_space.
l_slen = l_slen + 1.
l_current_field_len = l_current_field_len + 1.
ENDWHILE.
ENDIF.
ENDDO.
UNASSIGN .
* IF c_file_extension = 'XLS'
* OR c_file_extension = 'XLSX'
* OR c_file_extension = 'CSV'.
* if (1) = '"'.
* REPLACE '"' WITH '""""' INTO .
* endif.
* ENDIF.
APPEND wa_text(l_slen) TO it_text.
ENDLOOP.
ELSE.
** 先转换成文本
CALL FUNCTION 'ZSAP_CONVERT_TO_TEX_FORMAT'
*CALL FUNCTION 'SAP_CONVERT_TO_TXT_FORMAT'
EXPORTING
i_field_seperator = saperator
TABLES
i_tab_sap_data = it_data[]
CHANGING
i_tab_converted_data = it_text[]
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING downloaderror.
ENDIF.
ENDIF.
**处理数据,判断是否要二进制传输呢,还是文本传输,文本传输遇到中文有可能就会出现乱码
IF mode = 'BIN'."二进制传输
REFRESH:it_bin,temp_bin.
IF encoding IS INITIAL.
encoding = '4110'.
ENDIF.
***实例化字符类
TRY.
CALL METHOD cl_abap_conv_out_ce=>create
EXPORTING
encoding = encoding
endian = 'L'
RECEIVING
conv = cl_conv.
CATCH cx_parameter_invalid_range .
MESSAGE ID 'FES' TYPE 'E' NUMBER '023'.
CATCH cx_sy_codepage_converter_init .
MESSAGE ID 'FES' TYPE 'E' NUMBER '024'.
ENDTRY.
* DESCRIBE TABLE IT_TEXT LINES L_COUNT.
* BREAK FITDEBUG.
LOOP AT it_text INTO wa_text.
CLEAR:x_string,temp_bin[].
IF c_file_extension = 'XLS'
OR c_file_extension = 'XLSX'
OR c_file_extension = 'CSV'.
**该方法也只能屏蔽一个双引号
CLEAR P_POS.
SEARCH WA_TEXT FOR '"'.
IF SY-SUBRC EQ 0.
P_POS = SY-FDPOS.
IF P_POS >= 1.
P_POS = P_POS - 1.
IF WA_TEXT+P_POS(1) = SAPERATOR.
REPLACE '"' WITH '""""' INTO wa_text.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
CONCATENATE l_string wa_text INTO l_string.
* L_STRING = WA_TEXT.
* IF L_COUNT NE SY-TABIX.
* CONCATENATE L_STRING CL_ABAP_CHAR_UTILITIES=>CR_LF INTO L_STRING.
* ENDIF.
**将缓存清空
CALL METHOD cl_conv->reset( ).
**转换成16进制
TRY.
CALL METHOD cl_conv->write( data = l_string ).
CATCH cx_sy_codepage_converter_init.
* MESSAGE ID 'FES' TYPE 'E' NUMBER '024'.
CATCH cx_sy_conversion_codepage.
* MESSAGE ID 'FES' TYPE 'E' NUMBER '026'.
* text = oref->get_text( ).
* WRITE: / INPUT COLOR COL_KEY, TEXT COLOR COL_NEGATIVE.
CATCH cx_parameter_invalid_type.
* MESSAGE ID 'FES' TYPE 'E' NUMBER '023'.
CATCH cx_parameter_invalid_range.
* MESSAGE ID 'FES' TYPE 'E' NUMBER '023'.
ENDTRY.
x_string = cl_conv->get_buffer( ).
* CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
* EXPORTING
* text = L_STRING
* ENCODING = ENCODING
* IMPORTING
* buffer = X_STRING
* EXCEPTIONS
* FAILED = 1
* OTHERS = 2.
* CHECK SY-SUBRC EQ 0.
* CONDENSE X_STRING.
slen = XSTRLEN( x_string ).
CONCATENATE x_tstring x_string INTO x_tstring IN BYTE MODE.
totallen=totallen+slen.
slen=XSTRLEN( x_tstring ).
WHILE slen > 80.
CLEAR it_bin.
* APPEND X_TSTRING TO IT_BIN.
it_bin =x_tstring+0(80).
APPEND it_bin.
SHIFT x_tstring BY 80 PLACES IN BYTE MODE.
slen =slen-80.
ENDWHILE.
AT LAST.
CLEAR it_bin.
it_bin=x_tstring.
APPEND it_bin.
CONTINUE.
ENDAT.
CLEAR l_string.
MOVE cl_abap_char_utilities=>cr_lf TO l_string.
ENDLOOP.
* PERFORM INITIALCHAROBJ USING ENCODING"实例化字符类,用来实现16进制的字符
* CHANGINGCL_CONV.
* CALL METHOD CL_CONV->RESET.
* LOOP AT IT_DATA.
* CLEAR LINESTR.
* LINESTR = IT_DATA.
* CALL METHOD CL_CONV->WRITE( DATA = LINESTR ).
* LSTRING = CL_CONV->GET_BUFFER( ).
* SLEN = XSTRLEN( LSTRING ).
* TOTALLEN = TOTALLEN + SLEN.
* CONCATENATE TOTALSTR LSTRING INTO TOTALSTR IN BYTE MODE.
* SLEN = XSTRLEN( TOTALSTR ).
* WHILE SLEN > 80.
* CLEAR IT_FILE.
* IT_FILE = TOTALSTR+0(80).
* SLEN = SLEN - 80.
* SHIFT TOTALSTR BY 80 PLACES LEFT IN BYTE MODE.
* APPEND IT_FILE.
* ENDWHILE.
* AT LAST.
* CLEAR IT_FILE.
* IT_FILE = TOTALSTR.
* APPEND IT_FILE.
* EXIT.
* ENDAT.
* CALL METHOD CL_CONV->RESET.
* CALL METHOD CL_CONV->WRITE( DATA = cl_abap_char_utilities=>cr_lf )."不是最后一行,那么就输入换行符
* ENDLOOP.
IF it_bin[] IS NOT INITIAL.
ASSIGN it_bin[] TO .
ENDIF.
ELSE.
ASSIGN it_text[] TO .
ENDIF.
**3.开始连接FTP
IF usrdata[] IS NOT INITIAL."FTP有用户信息哦,那开始做FTP传输吧
SORT usrdata.
DELETE ADJACENT DUPLICATES FROM usrdata.
LOOP AT usrdata INTO wa_user.
PERFORM open_ftp USING wa_user-host
wa_user-username
wa_user-password
ftp_dest
CHANGINGftp_handle
l_return.
IF l_return NE 0."连接失败
CASE l_return.
WHEN 1.
MESSAGE text-004 TYPE 'S' RAISING not_connect.
ENDCASE.
ENDIF.
**判断是否有FTP COMMAND
IF command IS NOT INITIAL.
PERFORM ftp_command TABLES ftp_result
USING command
ftp_dest
CHANGINGftp_handle
l_return.
IF l_return NE 0.
MESSAGE text-005 TYPE 'S' RAISING command_error.
ENDIF.
ENDIF.
**传输数据
**计算传输的大小
PERFORM send_to_ftp TABLES
USING filename
mode
ftp_dest
totallen
CHANGING ftp_handle
l_return.
.
IF l_return NE 0.
MESSAGE text-006 TYPE 'S' RAISING transfer_error.
ENDIF.
**关闭连接
PERFORM ftp_close USINGftp_dest
CHANGING ftp_handle.
ENDLOOP.
ENDIF.
ENDFUNCTION.
页:
[1]