Wir verwenden die com.ibm.as400.data.ProgramCallDocument
Klasse, um eine Schnittstelle mit unseren RPG-Programme auf der iSeries über Java. In den meisten Fällen für unsere WebSphere-Anwendungen haben wir unsere RPG/Synon-Programme mit CLs versehen und die PCML als Schnittstelle verwendet. Wir haben auch normalerweise nicht mit Strukturen als Inputoutput gearbeitet.Abrufen eines Arrays von Strukturen aus einem RPG-Programm mit jt400.jar API
Dieses Mal hat einer unserer RPG-Entwickler das Programm in RPG IV (nicht Synon) erstellt und uns die PCML zur Verfügung gestellt, um mit diesem Programm zu interagieren. Wir haben drei Input-Parts als reguläre Strings. Keine große Sache. Das haben wir schon mal gemacht. Jetzt ist der vierte Parm, wie Sie sehen können, eine Struktur von 100, und es ist Inputoutput.
Alles, was wir vom RPG-Programm zurückbekommen, wenn wir versuchen, es aufzurufen, sind Tonnen von Leerzeichen (dh hex 40). Die String Pars kommen wieder gut. Aber die Struktur nicht. Alle Indices sind nichts als Leerzeichen.
Als wir den RPG-Programmierer validieren ließen, kann er sehen, dass sein Programm tatsächlich das Array von Strukturen zurückgibt. Er schrieb auch einen schnellen und schmutzigen CL, um sicherzustellen, dass sein Programm tatsächlich Werte zurückgab, und er sagte, dass der CL es bewiesen habe.
So jetzt bin ich ratlos. Ich habe sogar versucht, einen Weg zu finden, einen Wert zu übergeben und zu sehen, ob das einen Unterschied macht. Aber egal, was ich entweder unglücklich mache (da ich nicht mit der Parmistenliste übereinstimme), oder ich bekomme nur Leerzeichen zurück. Irgendeine Idee auf eine Richtung zu gehen? Hier
ist die PCML Datei
<pcml version="4.0">
<!-- RPG program: IL010S20 -->
<!-- created: 2010-07-13-11.28.53 -->
<!-- source: CPPGENL/QRPGLESRC(IL010S20) -->
<!-- 2208 -->
<struct name="ADDRINFO">
<data name="PREDIRECTION" type="char" length="2" usage="inherit" />
<data name="STREETNAME" type="char" length="30" usage="inherit" />
<data name="POSTDIRECTION" type="char" length="2" usage="inherit" />
<data name="STREETTYPE" type="char" length="4" usage="inherit" />
<data name="LOWADDRESS" type="char" length="11" usage="inherit" />
<data name="HIGHADDRESS" type="char" length="11" usage="inherit" />
<data name="ODDEVEN" type="char" length="1" usage="inherit" />
<data name="TERRID" type="char" length="2" usage="inherit" />
<data name="TAXCODE" type="char" length="5" usage="inherit" />
<data name="TERRNAME" type="char" length="30" usage="inherit" />
</struct>
<!-- 2226 -->
<program name="program" path="/QSYS.LIB/DEVOBJL.LIB/IL010S20.PGM">
<data name="STATE" type="char" length="2" usage="inputoutput" />
<data name="ZIP" type="char" length="5" usage="inputoutput" />
<data name="STREET" type="char" length="30" usage="inputoutput" />
<data name="RETURNADDR" type="struct" struct="ADDRINFO" count="100" usage="inputoutput" />
</program>
</pcml>
Und die ProgramCallDocument zu laden, wie folgt:
//sys is our AS400 object and parameters is a HashMap.
ProgramCallDocument newPcml = new ProgramCallDocument(sys, pcmlfileName);
Iterator parametersKeysI = parameters.keySet().iterator();
StringBuffer loggingStatement = new StringBuffer();
while(parametersKeysI.hasNext()) {
String key = (String)parametersKeysI.next();
if("program.RETURNADDR".equalsIgnoreCase(key)) {
AS400Structure [] structure = (AS400Structure[]) parameters.get(key);
int [] indeces = new int[1];
indeces[0] = 0;
for(int i = 0; i < structure.length; i++) {
indeces[0] = i;
Object paramValue = structure[i];
loggingStatement.append(paramValue).append(", ");
newPcml.setValue(key, indeces, paramValue);
}
}
else {
Object paramValue = parameters.get(key);
loggingStatement.append(paramValue).append(", ");
//set the value
newPcml.setValue(key, paramValue);
}
}
und dann rufen wir unser Programm mit newPcml.callProgram('program');
und von dem, was wir sehen können, der Aufruf zurückkehrt wahr. Aber wenn wir die Struktur lesen, gibt es nichts. Ich habe sogar com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true);
verwendet, um zu versuchen, die Parms zu sehen, und das ist was mich verwirrt. Wir sehen aus, als gäbe es kein Problem, aber wir bekommen nicht, was wir erwarten.
Jede Hilfe oder Richtung würde geschätzt werden. Bisher waren die Javadocs und Beispiele online nicht die hilfreichsten.