2010-12-15 7 views
2

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.

Antwort

2

Ok. Das ist dumm, wir haben nicht daran gedacht dies vorher zu überprüfen. Aber das Problem war Fall auf unseren Strings/Chars. Auch wenn unsere iSeries hier sehr viel mit Großbuchstaben beim Tippen zu tun hat, weil wir jt400.jar verwenden, glaube ich, dass es unsere Kleinbuchstaben in unserer Java-App liest und die Byte-Äquivalente von ihnen in die iSeries schickt und somit nicht Match auf der DB liest das RPG-Programm ein. Unser iSeries-Typ hat dieses Programm so modifiziert, dass alles, was reinkommt, "nach oben" gebracht wurde, also haben wir das Problem gelöst. Wir haben einfach angenommen, dass es ok ist, weil die meisten Dinge automatisch "nach Upper" auf der iSeries sind. Schätze, wir lagen falsch.