Hallo Forum,
Ich versuche mittels JCO 3.x ( Standalone ) IDocs an ein SAP System zu Übermitteln, zu Empfangen sowie den Status empfangener IDocs zu Ändern.
Während die ersten beiden Teile problemlos funktionieren scheitere ich leider am letzten Teil, der Status-Änderung.
Ich möchte hierzu IDOC_STATUS_WRITE_TO_DATABASE nutzen, der Versuch vom Repository eine Function bzw. ein FunctionTemplate zu erhalten scheitert allerdings.
Laut Doku sollte für den Fall, dass eine Function nicht gefunden werden kann eigentlich ein NULL-Wert zurückgeliefert werden.
In diesem Fall erhalte ich allerdings eine AbapException. Grund dafür ist, dass JCo wohl rekursiv die Metadaten sämtlicher Parameter abzuruft und letztendlich bei BD11_FLAG scheitert - siehe Stacktrace weiter unten.
Der Abruf anderer Funktionen funktioniert problemlos. Tatsächlich sind die beiden BD11_FLAG definierten Felder optional und ich bin mit den Default-Werten zufrieden komme aber leider mit dem Aufruf nicht weiter.
Ganz unten findet ihr einen minimalen Sourcecode um den Fehler zu reproduzieren.
Um den Code mit beliebigen Funktionen zu Testen sollte als erster Parameter "direct" ( es sei den Ihr arbeitet über ein lokales oder entferntes SAP Gateway ) und als zweiter ein beliebiger Funktionsname angegeben werden.
Bin gespannt auf eure Kommentare.
Besten Dank vorab,
Ralf
-------------------------------------------
com.sap.conn.jco.AbapException: (126) NOT_FOUND: NOT_FOUND Message 300 of class DA type E, Par[1]: BD11_FLAG
at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcClient.execute(MiddlewareJavaRfc.java:2025)
at com.sap.conn.jco.rt.ClientConnection.execute(ClientConnection.java:1160)
at com.sap.conn.jco.rt.ClientConnection.execute(ClientConnection.java:989)
at com.sap.conn.jco.rt.ClientConnection.execute(ClientConnection.java:971)
at com.sap.conn.jco.rt.AbapRepository$DDICHelper.queryFunctionTemplate(AbapRepository.java:2026)
at com.sap.conn.jco.rt.AbapRepository.queryFunctionTemplate(AbapRepository.java:1054)
at com.sap.conn.jco.rt.AbapRepository.queryFunctionTemplate(AbapRepository.java:633)
at com.sap.conn.jco.rt.AbapRepository.getFunctionTemplate(AbapRepository.java:895)
at com.sap.conn.jco.rt.BasicRepository.getFunction(BasicRepository.java:167)
at ei.sap.jco.GetFunctionFailed.startUp(GetFunctionFailed.java:59)
at ei.sap.jco.GetFunctionFailed.main(GetFunctionFailed.java:48)
-------------------------------------------
package check.sap.jco;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoRepository;
public class GetFunctionFailed {
private final String REMOTE_GATEWAY_GWHOST = "<REMOTE_SAP_HOST>";
private final String REMOTE_GATEWAY_PROGID = "<JCOREMOTE_PROGID>";
private final String REMOTE_GATEWAY_GWSERV= "sapgw00";
private final String REMOTE_GATEWAY_REPOSITORY= "does_not_matter";
private final String LOCAL_GATEWAY_GWHOST = "localhost";
private final String LOCAL_GATEWAY_PROGID = "<JCOLOCAL_PROGID>";
private final String LOCAL_GATEWAY_GWSERV= "sapgw33";
private final String LOCAL_GATEWAY_REPOSITORY= "does_not_matter";
private final String CLIENT_CLIENT = "800";
private final String CLIENT_SYSNR = "00";
private final String CLIENT_LANG = "en";
private final String CLIENT_USER = "<JCOUSER>";
private final String CLIENT_PASSWD = "<JCOPASSWORD>";
private final String CLIENT_ASHOST = "<REMOTE_SAP_HOST>";
public static void main(String[] args) throws JCoException {
GetFunctionFailed instance = new GetFunctionFailed();
instance.startUp(args);
}
private void startUp(String[] args) {
String connectionMode = args.length > 0 ? args[0] : "direct";
String functionModule = args.length > 1 ? args[1] : "IDOC_STATUS_WRITE_TO_DATABASE";
buildConnectionProperties(connectionMode);
try {
JCoDestination destination = JCoDestinationManager.getDestination(connectionMode);
destination.ping();
JCoRepository repository = destination.getRepository();
JCoFunction function = repository.getFunction(functionModule);
System.out.println(String.format("function %s retrieved", function.getName()));
} catch (Exception e) {
System.err.println(String.format("error occured:%n%s", e.getMessage()));
e.printStackTrace();
}
}
enum Type {
DestinationData, ServerData
};
private void buildConnectionProperties(String connectionMode) {
this.storeConnectionProperties("direct", buildConnectionProperties4Direct(Type.DestinationData));
this.storeConnectionProperties("local_gateway",
buildConnectionProperties4LocalGateway(Type.DestinationData));
this.storeConnectionProperties("remote_gateway",
buildConnectionProperties4RemoteGateway(Type.DestinationData));
}
private Properties buildConnectionProperties4RemoteGateway(Type type) {
Properties p = new Properties();
// SERVER
p.put("jco.server.connection_count", "1");
p.put("jco.server.gwhost", REMOTE_GATEWAY_GWHOST);
p.put("jco.server.progid", REMOTE_GATEWAY_PROGID);
p.put("jco.server.gwserv", REMOTE_GATEWAY_GWSERV);
p.put("jco.server.repository_destination", REMOTE_GATEWAY_REPOSITORY);
// CLIENT
p.put("jco.client.lang", CLIENT_LANG);
p.put("jco.destination.peak_limit", "10");
p.put("jco.client.client", CLIENT_CLIENT);
p.put("jco.client.sysnr", CLIENT_SYSNR);
p.put("jco.destination.pool_capacity", "3");
p.put("jco.client.ashost", CLIENT_ASHOST);
p.put("jco.client.user", CLIENT_USER);
p.put("jco.client.passwd", CLIENT_PASSWD);
// p.put("jco.client.type", "E");
//
return p;
}
private Properties buildConnectionProperties4LocalGateway(Type type) {
Properties p = new Properties();
// SERVER
p.put("jco.server.connection_count", "1");
p.put("jco.server.gwhost", LOCAL_GATEWAY_GWHOST);
p.put("jco.server.progid", LOCAL_GATEWAY_PROGID);
p.put("jco.server.gwserv", LOCAL_GATEWAY_GWSERV);
p.put("jco.server.repository_destination", LOCAL_GATEWAY_REPOSITORY);
// CLIENT
p.put("jco.client.lang", CLIENT_LANG);
p.put("jco.destination.peak_limit", "10");
p.put("jco.client.client", CLIENT_CLIENT);
p.put("jco.client.sysnr", CLIENT_SYSNR);
p.put("jco.destination.pool_capacity", "3");
p.put("jco.client.ashost", CLIENT_ASHOST);
p.put("jco.client.user", CLIENT_USER);
p.put("jco.client.passwd", CLIENT_PASSWD);
// p.put("jco.client.type", "E");
//
return p;
}
private Properties buildConnectionProperties4Direct(Type type) {
Properties p = new Properties();
p.put("jco.client.lang", "en");
p.put("jco.destination.peak_limit", "10");
p.put("jco.client.client", CLIENT_CLIENT);
p.put("jco.client.sysnr", CLIENT_SYSNR);
p.put("jco.destination.pool_capacity", "3");
p.put("jco.client.ashost", CLIENT_ASHOST);
p.put("jco.client.user", CLIENT_USER);
p.put("jco.client.passwd", CLIENT_PASSWD);
//
return p;
}
private void storeConnectionProperties(String connectionMode, Properties p) {
try {
p.store(new FileWriter(String.format("%s.jcoDestination", connectionMode)), "connection parameters");
} catch (IOException e) {
System.err.println(String.format("error occured:%n%s", e.getMessage()));
e.printStackTrace();
}
}
}