• 如何将SAP数据传输到其他系统(Transferring Data from SAP to Other Systems)


    在sap里有GUI_DOWNLOAD 函数将sap的数据下载到客户端机器(presentation server),而Dataset则是将数据传输到应用服务器(Application server)。然而在有些时候需要将数据传输到第三方其他系统(3rd Party System),这是我们就可以使用FTP命令来完成数据传输。

    1、相关函数
    HTTP_SCRAMBLE
    FTP_CONNECT
    FTP_R3_TO_SERVER
    FTP_DISCONNECT
    RFC_CONNECTION_CLOSE

    2、函数说明
    HTTP_SCRAMBLE: 将密码转化为SAP的格式
    样例代码
    l_pwd = p_pwd.
    l_slen = STRLEN( l_pwd ).
    CALL FUNCTION 'HTTP_SCRAMBLE'
    exporting
      source = l_pwd
      sourcelen = l_slen
      key = c_key
    importing
      destination = l_pwd.

    FTP_CONNECT : 连接其他系统
    * To Connect to the Server using FTP
    样例代码
    CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
      user = p_user
      password = l_pwd
      host = p_host
      rfc_destination = c_dest
    IMPORTING
      handle = w_hdl
    EXCEPTIONS
      OTHERS = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    FTP_R3_TO_SERVER: 将SAP的内表数据按字符方式传输到其他系统.
    样例代码
    CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
      handle = w_hdl
      fname = <file path of destination system>
      character_mode = 'X'
    TABLES
      text = <internal table data>
    EXCEPTIONS
      tcpip_error = 1
      command_error = 2
      data_error = 3
    OTHERS = 4.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
      RAISING invalid_output_file.
    ENDIF.

    FTP_DISCONNECT: 关闭SAP与其他系统的连接.
    样例代码
    * To disconnect the FTP
    CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
      handle = w_hdl.

    RFC_CONNECTION_CLOSE:关闭SAP与其他系统的RFC连接.
    样例代码
    CALL FUNCTION 'RFC_CONNECTION_CLOSE'
    EXPORTING
      destination = c_dest
    EXCEPTIONS
    OTHERS = 1.

    3、SAP的样例代码
    report rsftp004.

    parameters: suser(30) type c lower case,
                spwd(30) type c lower case,
                shost(64) type c lower case,
                duser(30) type c lower case,
                dpwd(30) type c lower case,
                dhost(64) type c lower case,
                lines type i default 1000,
                pasv.
    selection-screen skip 1.
    parameters: dest like rfcdes-rfcdest default 'SAPFTP'.

    types: begin of text,
           line(120) type c,
           end of text.

    types: begin of blob,
           line(80) type x,
           end of blob.

    data: shdl type i,
          dhdl type i,
          key type i value 26101957,
          slen type i,
          bline(80) type x,
          sdocid like sysuuid-c,
          ddocid like sysuuid-c,
          blob_length type i,
          cmd(120),
          error.

    data: result type table of text with header line,
          bindata type table of blob with header line.

    * Create data

    set extended check off.
    error = 0.
    bline = '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' &
            '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' &
            '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F' &
            '0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F'.

    do lines times.
      bindata-line = bline.
      append bindata.
    enddo.

    call function 'SYSTEM_UUID_C_CREATE'
      importing
        uuid = sdocid.

    call function 'SYSTEM_UUID_C_CREATE'
      importing
        uuid = ddocid.

    * connect to ftp server - source

    slen = strlen( spwd ).

    call function 'HTTP_SCRAMBLE'
      exporting
        source      = spwd
        sourcelen   = slen
        key         = key
      importing
        destination = spwd.

    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = 'Connect to FTP Server - Source'.

    call function 'FTP_CONNECT'
      exporting
        user            = suser
        password        = spwd
        host            = shost
        rfc_destination = dest
      importing
        handle          = shdl.

    * connect to ftp server - destination

    slen = strlen( dpwd ).

    call function 'HTTP_SCRAMBLE'
      exporting
        source      = dpwd
        sourcelen   = slen
        key         = key
      importing
        destination = dpwd.

    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = 'Connect to FTP Server - Destination'.

    call function 'FTP_CONNECT'
      exporting
        user            = duser
        password        = dpwd
        host            = dhost
        rfc_destination = dest
      importing
        handle          = dhdl.

    if not pasv is initial.
      refresh result.

      call function 'FTP_COMMAND'
        exporting
          handle        = shdl
          command       = 'set passive on'
        tables
          data          = result
        exceptions
          tcpip_error   = 1
          command_error = 2
          data_error    = 3.

      if sy-subrc eq 0.
        write: / 'Set passive mode - Source'.
      endif.

      refresh result.

      call function 'FTP_COMMAND'
        exporting
          handle        = dhdl
          command       = 'set passive on'
        tables
          data          = result
        exceptions
          tcpip_error   = 1
          command_error = 2
          data_error    = 3.

      if sy-subrc eq 0.
        write: / 'Set passive mode - Destination'.
      endif.
      skip 1.

    endif.

    * Create file on Source

    blob_length = lines * 80.

    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = 'Create File on Source'.

    call function 'FTP_R3_TO_SERVER'
      exporting
        handle      = shdl
        fname       = sdocid
        blob_length = blob_length
      tables
        blob        = bindata.

    * Copy Files

    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = 'Copy File to Destination'.

    refresh result.

    call function 'FTP_COPY'
      exporting
        handle_source      = shdl
        handle_destination = dhdl
        file_source        = sdocid
        file_destination   = ddocid
      tables
        data               = result
      exceptions
        tcpip_error        = 1
        command_error      = 2
        data_error         = 3
        others             = 4.

    if sy-subrc ne 0. error = 1. endif.

    loop at result.
      write / result-line.
    endloop.

    * compare content

    if error eq 0.

      call function 'SAPGUI_PROGRESS_INDICATOR'
        exporting
          text = 'Compare Content'.

      skip 1.
      refresh bindata.

      call function 'FTP_SERVER_TO_R3'
        exporting
          handle      = shdl
          fname       = sdocid
        importing
          blob_length = blob_length
        tables
          blob        = bindata.

      slen = lines * 80.

      if slen ne blob_length.
        error = 1.
        write: / 'Length error - expected',slen,'received',blob_length.
      else.
        loop at bindata.
          if bindata-line ne bline.
            slen = sy-tabix * 80.
            write: / 'Content error at',slen,bindata-line.
            error = 1.
            exit.
          endif.
        endloop.
      endif.

      refresh bindata.

      call function 'FTP_SERVER_TO_R3'
        exporting
          handle      = dhdl
          fname       = ddocid
        importing
          blob_length = blob_length
        tables
          blob        = bindata.

      slen = lines * 80.

      if slen ne blob_length.
        error = 1.
        write: / 'Length error - expected',slen,'received',blob_length.
      else.
        loop at bindata.
          if bindata-line ne bline.
            slen = sy-tabix * 80.
            write: / 'Content error at',slen,bindata-line.
            error = 1.
            exit.
          endif.
        endloop.
      endif.

      if error eq 0.
        write: / 'Content compare OK'.
      else.
        write: / 'Content compare error'.
      endif.
      skip 1.

    endif.

    * Delete

    concatenate 'del' sdocid into cmd separated by ' '.
    refresh result.

    call function 'SAPGUI_PROGRESS_INDICATOR'
      exporting
        text = 'Delete Files'.

    call function 'FTP_COMMAND'
      exporting
        handle        = shdl
        command       = cmd
      tables
        data          = result
      exceptions
        tcpip_error   = 1
        command_error = 2
        data_error    = 3.

    loop at result.
      write / result-line.
    endloop.

    concatenate 'del' ddocid into cmd separated by ' '.
    refresh result.

    call function 'FTP_COMMAND'
      exporting
        handle        = dhdl
        command       = cmd
      tables
        data          = result
      exceptions
        tcpip_error   = 1
        command_error = 2
        data_error    = 3.

    loop at result.
      write / result-line.
    endloop.

    * Disconnect
    call function 'FTP_DISCONNECT'
      exporting
        handle = shdl.
    call function 'FTP_DISCONNECT'
      exporting
        handle = dhdl.

    call function 'RFC_CONNECTION_CLOSE'
      exporting
        destination = dest
      exceptions
        others = 1.

    if error ne 0.
      format color col_negative.
      write: / 'Error im Test'.
    else.
      format color col_positive.
      write: / ' Test OK'.
    endif.

    * password not visible

    at selection-screen output.

      loop at screen.
        if screen-name = 'SPWD' or screen-name = 'DPWD'.
          screen-invisible = '1'.
          modify screen.
        endif.
      endloop.

  • 相关阅读:
    使用scrapy-redis 搭建分布式爬虫环境
    爬虫必备工具-chrome 开发者工具
    Python 中多进程、多线程、协程
    Python 中命令行参数解析工具 docopt 安装和应用
    什么是中台?
    ubuntu 18.04 上安装 docker
    深入理解 ajax系列第一篇(XHR 对象)
    scrapy 中 shell 出现 403 Forbiidden 解决方案
    python 的参数总结
    Python 的直接赋值、Deepcopy、Copy的区别
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157417.html
Copyright © 2020-2023  润新知