2

このクラスを使用して、com.ibm.as400.data.ProgramCallDocumentJavaを介して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と例は最も役に立ちませんでした。

4

1 に答える 1

2

Ok。これは、以前にこれをチェックするとは思わなかった愚かなことです。しかし、問題は文字列/文字の場合でした。ここでのiSeriesは入力時に大文字をほとんど処理しますが、jt400.jarを使用しているため、Javaアプリで小文字を読み取り、それらのバイト相当をiSeriesに送信すると思います。 RPGプログラムのDB読み取りで一致します。私たちのiSeriesの担当者は、このプログラムを変更して、入ってくるすべてのものを「上位に」変更したので、問題を回避しました。iSeriesではほとんどのことが自動的に「アッパー」になるため、問題はないと想定しました。私たちが間違っていたと思います。

于 2010-12-17T13:42:15.007 に答える