を使用してRPGプログラムから構造体の配列を取り出すcom.ibm.as400.data.ProgramCallDocument
クラスを使用して、Javaを介してiSeries上のRPGプログラムとインターフェースします。私たちのWebSphereアプリケーションのほとんどのケースでは、RPG/SynonプログラムにCLの方が向いており、PCMLを使ってそれらとインターフェースを取っています。私たちはまた、通常はinput出力として構造体を扱っていません。jt400.jar APIの
今回は、RPG開発者の1人がRPG IV(Synonではなく)でプログラムを作成し、このプログラムとのインターフェイスをPCMLで教えてくれました。私たちは通常の文字列として3つの入力出力parmsを持っています。大したことではありません。私たちはこれまでにやったことがあります。今では4番目のparmはcount 100の構造体で、inputoutputです。
私たちがRPGプログラムを呼び出しようとしているときには、それは何トンもの空白(すなわち16進数40)です。 String parmsがうまく戻ってきます。しかし構造体はそうではありません。すべてのindecesは空白です。
RPGプログラマーが検証したとき、彼のプログラムが確かに構造体の配列を返すことがわかりました。彼はまた、彼のプログラムが確かに価値を戻していることを確認するために、迅速かつ汚れたCLを書いた。そして彼はCLがそれを証明したと言った。
だから私は困惑しています。私は値を渡し、それが違いを生むかどうかを調べる方法を見つけようとしました。しかし、私がそれを不幸にしても(パームスのリストと一致しないので)、私は空白だけを返す。行くべき方向にあるアイデア?ここで
はPCMLファイルは
<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>
されており、次のようにProgramCallDocumentをロードするために:
//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);
}
}
をして、私たちは、呼び出しが戻っている、newPcml.callProgram('program');
で、我々が見ることができるものから、私たちのプログラムを起動します本当。しかし、構造体を読み出すためには何もありません。私はさらに、parmsを見てみるためにcom.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true);
を使ったことがあります。それが私を困惑させるものです。問題はないように見えますが、期待していることは得られません。
ご迷惑をおかけして申し訳ございません。これまでのところ、Javadocとオンラインの例は、最も有用ではありませんでした。