このクラスを使用して、com.ibm.as400.data.ProgramCallDocument
Javaを介してiSeries上のRPGプログラムとインターフェースを取ります。WebSphereアプリケーションのほとんどの場合、RPG / Synonプログラムの前にCLを配置し、PCMLを使用してそれらとインターフェースを取りました。また、通常、構造体を入出力として使用していません。
今回は、RPG開発者の1人がRPG IV(Synonではない)でプログラムを作成し、このプログラムとインターフェイスするためのPCMLを提供してくれました。通常の文字列として3つの入出力パラメーターがあります。大したことではありません。私たちは以前にそれをしました。ご覧のとおり、4番目のパラメーターはカウント100の構造体であり、入出力です。
RPGプログラムを呼び出そうとしたときに返されるのは、大量のブランク(つまり、16進数の40)だけです。文字列パラメーターは正常に戻ります。しかし、構造体はそうではありません。すべてのインデックスは空白に他なりません。
RPGプログラマーに検証してもらうと、彼のプログラムが実際に構造体の配列を返すことがわかります。彼はまた、彼のプログラムが実際に値を返していることを確認するために、迅速で汚いCLを作成し、CLがそれを証明したと述べました。
だから今私は困惑しています。値を渡す方法を見つけて、それが違いを生むかどうかを確認しようとさえしました。しかし、私がそれを不幸にしたとしても(parmsリストと一致しないため)、または空白のみを返します。進むべき方向について何か考えはありますか?
これが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');
呼び出します。呼び出しはtrueを返します。しかし、構造体を読みに行くときは何もありません。私はcom.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true);
parmsを見ようとさえしました、そしてそれは私を困惑させるものです。問題はないようですが、期待どおりの結果が得られていません。
任意の助けや指示をいただければ幸いです。これまでのところ、オンラインのJavadocと例は最も役に立ちませんでした。