2017-11-14 9 views
2

Wir haben iDOC-Dateien, die von unserem System generiert werden. Jetzt versuchen wir, sie per RFC-Verbindung an SAP zu senden. Ich habe bereits eine RFC-Verbindung AS A CLIENT eingerichtet, aber ich kann nicht iDOC senden!Senden von iDOC von Java nach SAP

Ich habe versucht, eine Probe iDOC zu erstellen, um es zu testen, aber es funktioniert nicht!

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) 

Ich habe sogar versucht, eine Probe iDOC XML zu senden, aber ich habe auch einen anderen Fehler bin vor, versucht, die XML oft zu ändern, aber ich bin das gleiche Problem wieder ein wieder mit Blick!

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) 

Dies ist der Code, den ich die iDOC erstellen bin mit und die iDOC XML senden:

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"); 
} 
} 

Dies ist meine Verbindungsdatei:

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

Dies ist meine XML-Datei:

<?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> 

Ich verwende sapjco3-x86-6 4bit-3.0.5 und sapidoc-3.0.1!

Testen der Erstellung von IDoc und Senden von IDOC-XML ist nur zum Testen, aber in unserem Fall haben wir die IDOC bereit!

Meine Frage ist, wie kann ich senden iDOC direkt von meiner Platte zu SAP über RFC? Wenn ich das nicht kann, wie kann ich den Fehler beim Erstellen von iDOC oder beim Senden von iDOC XML umgehen? Meine zweite Frage, wenn ich iDOC senden kann, muss ich eine neue SERVER RFC-Verbindung einrichten, damit ich iDOC von SAP erhalten kann?

** EDIT **

Jetzt i ma Lage IDoc richtig zu senden und empfangen. Mein Problem ist, wie ich das IDoc als Flat IDoc bekommen kann.

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

Haben Sie den Eingangsport für xxxCLNT100 für Ihr/LS/HTTPDEMO konfiguriert? siehe WE20 Transaktionscode. –

+0

Sorry, aber ich verstehe nicht ganz, was du meinst! Ich bin neu bei SAP! Denkst du, dass ich ein Problem mit der iDOC API habe? –

+0

Ja, Sie haben Recht. Meine Frage war, um sicher zu gehen, ob das Empfängersystem richtig konfiguriert ist. –

Antwort

0

Ich denke, dass es eine Unverträglichkeit zwischen den beiden SAP-Bibliotheken, die Sie verwenden:

Ich kann meine IDoc als XML IDoc mit diesem Code erhalten. Ich empfehle, zuerst die neuesten Patch-Level zu installieren. Derzeit sind dies JCo Version 3.0.17 und die Java IDoc Library 3.0.12.

Ich verstehe nur nicht, was Sie mit dem StringBuffer hier tun. Wenn Sie möchten, IDoc-XML aus einer Datei lesen, dann bietet die IDocXMLProcessor geeignete Parse-Methoden für diese - die besten

IDocXMLProcessor.parse(IDocRepository repository, InputStream xmlStream) 

sein würde, so dass es auch um verschiedene Dateikodierungen nehmen kann, wie in den enthaltenen angegeben XML-Codierungsattribut Wenn Sie einen java.io.Reader oder einen String auswählen, müssen Sie sich selbst darum kümmern (was Sie in Ihrem Beispiel nicht tun).

Aber im Prinzip scheint Ihr Code nicht auf den ersten Blick falsch zu sein. Im Gegensatz zum IDoc-XML selbst fehlen die obligatorischen Attribute BEGIN = "1" und SEGMENT = "1" für die Tags <IDOC> und <EDI_DC40>.

+0

Ja, ich habe das gelöst, indem ich die neue API bekommen habe, kannst du bitte zur Bearbeitung gehen? –

+0

Wenn meine Antwort Ihr Problem gelöst hat, würden Sie es dann bitte als richtige Antwort markieren? Vielen Dank. Außerdem sollten neue Fragen, die nicht im ursprünglichen Post gestellt wurden und auch nicht direkt damit in Verbindung stehen (was hier der Fall ist), in einer separaten neuen Frage gestellt werden - und nicht nachträglich mit einem Edit versehen werden. – Trixx

+0

Sie sind völlig richtig! Erledigt! –

Verwandte Themen