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

    技术2022-05-11  112

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

    1、相关函数HTTP_SCRAMBLEFTP_CONNECTFTP_R3_TO_SERVERFTP_DISCONNECTRFC_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_keyimporting  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_hdlEXCEPTIONS  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 = 3OTHERS = 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 FTPCALL FUNCTION 'FTP_DISCONNECT'EXPORTING  handle = w_hdl.

    RFC_CONNECTION_CLOSE:关闭SAP与其他系统的RFC连接.样例代码CALL FUNCTION 'RFC_CONNECTION_CLOSE'EXPORTING  destination = c_destEXCEPTIONSOTHERS = 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.

    * Disconnectcall 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.


    最新回复(0)