2017-11-14 30 views
2

私たちのシステムから生成されたiDOCファイルがあります。今私たちはRFC接続を介してそれらをSAPに送信しようとしています。私はすでにRFC接続としてクライアントをetablishedしかし、私はiDOCを送信することができません!JavaからSAPへのiDOCの送信

サンプルiDOCをテストして作成しようとしましたが、動作しません。

Exception in thread "main" java.lang.NoSuchMethodError: com.sap.conn.idoc.jco.SAPRepository$ConnectionProvider.execute(Lcom/sap/conn/jco/JCoFunction;Lcom/sap/conn/jco/rt/AbapRepository;)V 
    at com.sap.conn.idoc.jco.SAPRepository.queryRootSegmentMetaData40(SAPRepository.java:1204) 
    at com.sap.conn.idoc.jco.SAPRepository.queryRootSegmentMetaData(SAPRepository.java:1110) 
    at com.sap.conn.idoc.jco.SAPRepository.getRootSegmentMetaData(SAPRepository.java:909) 
    at com.sap.conn.idoc.rt.DefaultIDocDocument.<init>(DefaultIDocDocument.java:124) 
    at com.sap.conn.idoc.rt.DefaultIDocDocument.<init>(DefaultIDocDocument.java:61) 
    at com.sap.conn.idoc.jco.JCoIDocDocument.<init>(JCoIDocDocument.java:51) 
    at com.sap.conn.idoc.jco.JCoIDocRuntime.createIDocDocument(JCoIDocRuntime.java:133) 
    at com.sap.conn.idoc.jco.JCoIDocRuntime.createIDocDocument(JCoIDocRuntime.java:35) 
    at com.sap.conn.idoc.rt.DefaultIDocRuntime.createIDocDocument(DefaultIDocRuntime.java:175) 
    at com.sap.conn.idoc.rt.DefaultIDocRuntime.createIDocDocument(DefaultIDocRuntime.java:18) 
    at com.idoc.sender.IDocClientExample.main(IDocClientExample.java:49) 

は私もサンプルのIDoc XMLを送信しようとしたが、私はまた、別のエラーが直面しています、XMLを何度も変更しようとしましたが、私は再び、再び同じ問題に直面しています!

com.sap.conn.idoc.IDocParseException: (7) IDOC_ERROR_PARSE_FAILURE: Invalid character encountered in XML input data source: 
state=READING_XMLDECLARATION, charPosition=14, lineNumber=1, columnNumber=15, invalidChar=U+003D, 
[email protected]<?xml version="1.0" encoding="UTF-8"?><DEBMAS06><IDOC><EDI_DC40><DOCNUM>20120114120000</DOCNUM><IDO... 
          ^
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.throwIDocParseException(DefaultIDocXMLParser.java:2223) 
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.parseProlog(DefaultIDocXMLParser.java:1635) 
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.parse(DefaultIDocXMLParser.java:320) 
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:112) 
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:54) 
    at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:31) 
    at com.idoc.sender.IDocClientExample.main(IDocClientExample.java:57) 

これは私がIDOCを作成して、IDOCのXMLを送信するために使用していたコードです:これは私のxmlファイルである

jco.client.lang=EN 
jco.client.client=100 
jco.client.passwd=xxxx 
jco.client.user=xxxx 
jco.client.sysnr=01 
jco.client.ashost=xxxx 

package com.idoc.sender; 


import com.sap.conn.idoc.*; 
import com.sap.conn.idoc.jco.JCoIDoc; 
import com.sap.conn.jco.JCoDestination; 
import com.sap.conn.jco.JCoDestinationManager; 

import java.io.BufferedReader; 
import java.io.FileReader; 


public class IDocClientExample { 

public static void main(String[] args) { 

    try { 

    String iDocXML = null; 
    FileReader fileReader; 

    try { 
    fileReader = new FileReader("TestSalesOrder.xml"); 
    BufferedReader br = new BufferedReader(fileReader); 
    StringBuffer sb = new StringBuffer(); 
    String line; 
    while ((line = br.readLine()) != null) { 
    sb.append(line); 
    } 

    iDocXML = sb.toString(); 

    br.close(); 
    fileReader.close(); 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    } 

    // see provided configuration file xxxx.jcoDestination 
    JCoDestination destination = JCoDestinationManager.getDestination("xxxx"); 
    IDocRepository iDocRepository = JCoIDoc.getIDocRepository(destination); 
    String tid = destination.createTID(); 
    IDocFactory iDocFactory = JCoIDoc.getIDocFactory(); 

    System.out.println(destination.getAttributes()); 


    // a) create sample new idoc 
    IDocDocument doc = iDocFactory.createIDocDocument(iDocRepository, "SYSTAT01"); 
    IDocSegment segment = doc.getRootSegment(); 
    segment.addChild("E1MARAM"); 
    JCoIDoc.send(doc, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid); 


    // b) use existent xml file 
    IDocXMLProcessor processor = iDocFactory.getIDocXMLProcessor(); 
    IDocDocumentList iDocList = processor.parse(iDocRepository, iDocXML); 
    JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid); 
    destination.confirmTID(tid); 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    System.out.print("program end"); 
} 
} 
// a) create sample new idoc 
IDocDocument doc = iDocFactory.createIDocDocument(iDocRepository, "SYSTAT01"); 
IDocSegment segment = doc.getRootSegment(); 
segment.addChild("E1MARAM"); 
JCoIDoc.send(doc, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid); 


// b) use existent xml file 
IDocXMLProcessor processor = iDocFactory.getIDocXMLProcessor(); 
IDocDocumentList iDocList = processor.parse(iDocRepository, iDocXML); 
JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid); 
destination.confirmTID(tid); 

} catch (Exception e) { 
e.printStackTrace(); 
} 
System.out.print("program end"); 
} 
} 

これは私の接続ファイルです:

<?xml version="1.0" encoding="UTF-8"?> 
<DEBMAS06> 
<IDOC> 
<EDI_DC40> 
<DOCNUM>20120114120000</DOCNUM><IDOCTYP>DEBMAS06</IDOCTYP> 
<MESTYP>DEBMAS</MESTYP> 
<SNDPOR>HTTPDEMO</SNDPOR> 
<SNDPRT>LS</SNDPRT> 
<SNDPRN>HTTPDEMO</SNDPRN> 
<RCVPOR>SAPxxx</RCVPOR> 
<RCVPRT>LS</RCVPRT> 
<RCVPRN>xxxCLNT100</RCVPRN> 
</EDI_DC40> 
<E1KNA1M segment="1"> 
<KUNNR>47</KUNNR> 
<NAME1>Test Customer</NAME1> 
<KTOKD>0004</KTOKD> 
<SORTL>TEST</SORTL> 
<ORT01>City</ORT01> 
<LAND1>PL</LAND1> 
<LZONE>A</LZONE> 
<SPRAS>L</SPRAS> 
<STRAS>Street</STRAS> 
</E1KNA1M> 
</IDOC> 
</DEBMAS06> 

私はsapjco3-x86-6を使用しています4bit-3.0.5とsapidoc-3.0.1!

iDOCの作成をテストし、IDOC XMLを送信することはテストのためのものですが、私たちの場合はiDOCが用意されています!

私の質問は、私のディスクからiDOC を直接RFC経由でSAPに送ることができますか?私がそうすることができない場合、iDOCの作成やiDOC XMLの送信のエラーをどうやって解決できますか?私の2番目の質問は、一度私はiDOCを送ることができる、私はSAPからiDOCを受け取ることができるように私は新しいSERVER RFC接続をetablishする必要がありますか?

** EDIT **

今私が正しくのIDocを送受信することができミリアンペア。私の問題は、フラットIDocとしてIDocを取得する方法です。

私はこのコードでXML IDocのとしての私のIDocを受け取ることができます。

package com.idoc.actif; 

import com.sap.conn.idoc.IDocDocumentList; 
import com.sap.conn.idoc.IDocXMLProcessor; 
import com.sap.conn.idoc.jco.*; 
import com.sap.conn.jco.server.*; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 


public class IDocServerExample 
{ 
    public static void main(String[] a) 
    { 
     try 
     { 
      // see provided examples of configuration files xxxx.jcoServer and xxxx.jcoDestination 
      JCoIDocServer server = JCoIDoc.getServer("xxxx"); 
      server.setIDocHandlerFactory(new MyIDocHandlerFactory()); 

      server.setTIDHandler(new MyTidHandler()); 

      MyThrowableListener listener = new MyThrowableListener(); 
      server.addServerErrorListener(listener); 
      server.addServerExceptionListener(listener); 
      //server.setConnectionCount(1); 
      server.start(); 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    static class MyIDocHandler implements JCoIDocHandler 
    { 
     public void handleRequest(JCoServerContext serverCtx, IDocDocumentList idocList) 
     { 

      FileOutputStream fos=null; 
      OutputStreamWriter osw=null; 
      try 
      { 
       //receiving XML IDoc, how to get the IDoc as a Flat IDoc (SAP is sending the IDoc as Flat)??? 
       IDocXMLProcessor xmlProcessor = JCoIDoc.getIDocFactory().getIDocXMLProcessor(); 
       fos=new FileOutputStream(serverCtx.getTID()); 
       osw=new OutputStreamWriter(fos, "UTF8"); 
       xmlProcessor.render(idocList, osw, IDocXMLProcessor.RENDER_WITH_TABS_AND_CRLF); 
       osw.flush(); 
      } 
      catch (Throwable thr) 
      { 
       thr.printStackTrace(); 
      } 
      finally 
      { 
       try 
       { 
        if (osw!=null) 
         osw.close(); 
        if (fos!=null) 
         fos.close(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    static class MyIDocHandlerFactory implements JCoIDocHandlerFactory 
    { 
     private JCoIDocHandler handler = new MyIDocHandler(); 
     public JCoIDocHandler getIDocHandler(JCoIDocServerContext serverCtx) 
     { 
      return handler; 
     } 
    } 

    static class MyThrowableListener implements JCoServerErrorListener, JCoServerExceptionListener 
    { 

     public void serverErrorOccurred(JCoServer server, String connectionId, JCoServerContextInfo ctx, Error error) 
     { 
      System.out.println(">>> Error occured on " + server.getProgramID() + " connection " + connectionId); 
      error.printStackTrace(); 
     } 
     public void serverExceptionOccurred(JCoServer server, String connectionId, JCoServerContextInfo ctx, Exception error) 
     { 
      System.out.println(">>> Error occured on " + server.getProgramID() + " connection " + connectionId); 
      error.printStackTrace(); 
     } 
    } 

    static class MyTidHandler implements JCoServerTIDHandler 
    { 
     public boolean checkTID(JCoServerContext serverCtx, String tid) 
     { 
      System.out.println("checkTID called for TID="+tid); 
      return true; 
     } 


     public void confirmTID(JCoServerContext serverCtx, String tid) 
     { 
      System.out.println("confirmTID called for TID="+tid); 
     } 


     public void commit(JCoServerContext serverCtx, String tid) 
     { 
      System.out.println("commit called for TID="+tid); 
     } 


     public void rollback(JCoServerContext serverCtx, String tid) 
     { 
      System.out.print("rollback called for TID="+tid); 
     } 
    } 
} 
+0

/LS/HTTPDEMOのxxxCLNT100に入力ポートを設定しましたか? WE20トランザクションコードを参照してください。 –

+0

申し訳ありませんが、私はあなたが何を意味するのかよく分かりません!私はSAPに新しいです!私はiDOC APIに問題があると思いますか? –

+0

はい、そうです。私の質問は、受信機システムが適切に設定されているかどうかを確認することでした。 –

答えて

0

私はあなたが使用する2つのSAPライブラリ間の非互換性があることを推測します。まず、最新のパッチレベルをインストールすることをお勧めします。現在、JCoバージョン3.0.17およびJava IDocライブラリ3.0.12です。

ここではStringBufferで何をやっているのか分かりません。あなたは、ファイルからのIDoc-XMLを読みたい場合は、IDocXMLProcessorは、このための適切な解析方法を提供しています - 含んで指定され、それはまた別のファイルのエンコーディングの世話をすることができるように最善を

IDocXMLProcessor.parse(IDocRepository repository, InputStream xmlStream) 

だろうXMLエンコーディング属性。 java.io.ReaderまたはStringを選択した場合は、これを自分で処理する必要があります(これはあなたの例では行いません)。

原則として、あなたのコードは一見して間違っているようには見えません。 <IDOC>および<EDI_DC40>タグの必須のBEGIN = "1"およびSEGMENT = "1"属性が欠落しているIDoc-XML自体とは対照的です。

+0

はい、私は新しいAPIを手に入れて解決しました。編集してください。 –

+0

私の答えがあなたの問題を解決した場合は、正解とマークしてください。ありがとうございました。 さらに、元の投稿では尋ねられず、それに直接関連しない新しい質問(ここではそうです)は別の新しい質問で尋ねる必要があります。 – Trixx

+0

あなたは完全に正しいです!完了! –

関連する問題