设为首页 收藏本站
查看: 909|回复: 0

ABAP FTP传输

[复制链接]

尚未签到

发表于 2015-5-28 09:44:35 | 显示全部楼层 |阅读模式
  FUNCTION zftp_tsfr.
  *"----------------------------------------------------------------------
  *"*"Local Interface:
  *"  IMPORTING
  *"     VALUE(BLART) TYPE  ZSFISMSG-BLART OPTIONAL
  *"     VALUE(WERKS) TYPE  ZSFISMSG-WERKS OPTIONAL
  *"     VALUE(MODE) TYPE  CHAR3 OPTIONAL
  *"     VALUE(FILENAME) TYPE  C
  *"     VALUE(COMMAND) TYPE  C OPTIONAL
  *"     VALUE(ENCODING) TYPE  ABAP_ENCODING DEFAULT '4110'
  *"     VALUE(SAPERATOR) TYPE  C OPTIONAL
  *"     VALUE(NO_SEPERATOR) TYPE  C DEFAULT SPACE
  *"  TABLES
  *"      IT_DATA
  *"      USRDATA STRUCTURE  ZFTP_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 TO  cl_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 FIELD  OUTPUT-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进制的字符
  *                           CHANGING  CL_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
  CHANGING  ftp_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
  CHANGING  ftp_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 USING  ftp_dest
  CHANGING ftp_handle.
  ENDLOOP.
  ENDIF.
  ENDFUNCTION.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-71368-1-1.html 上篇帖子: C# FTP上传文件报550异常解决方案 下篇帖子: 连接ftp时出现Entering Passive Mode
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表