2010-12-15 15 views
2

を使用して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とオンラインの例は、最も有用ではありませんでした。

答えて

2

これは私たちが以前これをチェックするとは思わなかったばかげたことです。しかし問題は文字列/文字列の場合でした。私たちのiSeriesは、入力時に大文字のアルファベットを扱っていますが、jt400.jarを使用しているため、私たちのJavaアプリケーションの小文字が読み取られ、それらのバイト等価がiSeriesに送信されるため、 RPGプログラムのDB読み込みで一致します。私たちのiSeriesの人は、このプログラムを "上の"すべてのものに変更したので、問題を回避しました。 iSeries上のほとんどのものが自動的に「上に」どのようになっているのかがわかっていたので、これで問題はないと仮定しました。私たちは間違っていたと思います。

関連する問題