0

私は AS400 と RPG について非常に限られた (0) 知識しか持っていません。しかし、Java クラスから RPG プログラムを呼び出す必要があるという緊急の要件があります。そこで、JTOpen を通じてそれを実現できることがわかりました。しかし、私は ProgramParameter リストの宣言に行き詰まっています。私はRPGプログラムについて次の情報を持っています

プログラム名: ZM30000R パラメータ: 支店 7,0 (数値)
口座タイプ 2 (01-小切手、02 貯蓄)
口座番号 20 (文字)
エラー コード 7 (文字) DR/CR インジケータ 1 (文字 D、C)

しかし、入力と出力が何であるかについての手がかりはありません。ProgramParameterを宣言する方法。以下のようにしました。これらのシステムに接続できないため、同様にテストできません。

// Create AS400 Text objects for the different lengths
          // of parameters you are sending in.
          AS400Text branchTxt = new AS400Text(7);
          AS400Text accntTypeTxt = new AS400Text(2);
          AS400Text accntNumberTxt = new AS400Text(20);
          AS400Text errorCodeTxt = new AS400Text(7);
          AS400Text DCIndicatorTxt = new AS400Text(1);            

          // declare and instantiate  your parameter list.
          ProgramParameter[] parmList = new ProgramParameter[5];

          // assign values to your parameters using the AS400Text class to convert to bytes
          // the second parameter is an integer which sets the length of your parameter output
          parmList[0] = new ProgramParameter( branchTxt.toBytes(branch),7);
          parmList[1] = new ProgramParameter( accntTypeTxt.toBytes(accntTypeTxt),2);      
          parmList[2] = new ProgramParameter( accntNumberTxt.toBytes(accntNumberTxt),20);      
          parmList[3] = new ProgramParameter( errorCodeTxt.toBytes(""),7);      
          parmList[4] = new ProgramParameter( DCIndicatorTxt.toBytes(indicator),5);

どんな助けも本当に非常に役に立ちます。

よろしくお願いいたします。

スリニバス

4

4 に答える 4

4

まあ、パラメータの説明だけで手がかりがあります。支店、口座種別、口座番号はINです。金融予約または取引には、その情報が必要です。エラー コードは OUT のようです。金融システムに関する私の経験では、API が予約された金額を返すのは当然のことです。通常は記号を使用しますが、金融システムでは (D)ebit または (C)redit の方が適しています。

API は、金融システムの API である可能性が非常に高いです。それが本当なら、私は金額を逃しています。完全な説明がありますか?

最初のパラメータが数値であることに注意してください。あなたは運が悪い。iSeries と RPG は、数値の型についてあまり寛大ではありません。Bit、Zoned、Packed、Decimal、Integer、Float などから選択できます。RPG が ILE RPG ではなく本当に RPG である場合は、それを Zoned、Packed、および Byte に下げることができます。

あなたは iSeries にアクセスできると思います。その後、プログラムの呼び出し、デバッグ情報、およびダンプ情報を監視できます。「試行錯誤」をしなければならない場合に役立ちます。アクセスがなければ、道は非常に困難になります。プログラム呼び出しが成功しない場合、Java クラスでエラーが発生します。しかし、iSeries 自身からの情報がなければ、実際のエラーを特定することは困難です。したがって、アクセスは本当に必要です。

于 2010-01-20T21:09:18.750 に答える
3

あなたのサンプルはほとんど正しい軌道に乗っています。しかし、ブランチ パラメータは数値です。したがって、AS400Text の代わりに AS400ZonedDecimal を使用する必要があります。

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0)

RPG プログラムは、ゾーンではなくパックを想定している可能性があります。大したことではありません。代わりに AS400PackedDecimal を使用してください。

ProgramParameter オブジェクトを構築するとき、コンストラクターの要件は、それらがプログラムへの入力パラメーターであるか出力パラメーターであるかによって異なります。入力パラメータについては、toBytes() の結果を渡すだけです。長さを含める必要はありません。出力専用パラメーターの場合は、長さを渡すだけです。

情報が不足しているというロバートの答えには同意しますが、エラーコードの出力に関する彼の仮定は有効なようです。ただし、サンプルが値を渡すため、 DCIndicator パラメータが入力されていると思います。エラー コード パラメーターについては、プログラムの呼び出し後に、値を抽出して何かを行う必要があります。すでにわかっていることを踏まえて、プログラム呼び出しがどのように機能するかを次に示します。「MyLibrary」というライブラリ名を指定したことに注意してください。これは、例としての目的です。プログラム オブジェクトがどのライブラリにあるかを判断する必要があります。

ProgramCall pgm = new ProgramCall(as400, QSYSObjectPathName.toPath("MyLibrary","ZM30000R","PGM"), parmList);
if (pgm.run() == true) {
    String sErrorCode = (String) errorCodeTxt.toObject(parmList[3].getOutputData());

    //Do something with your output data.
}
else {
    AS400Message[] messageList = pgm.getMessageList();
    for (int i=0; i<messageList.length; i++) {
        String sMessageID = messageList[i].getID();
        String sMessageText = messageList[i].getText();

        //Do something with the error messages
    }
}

他に考慮すべきことは、ライブラリ リストです。RPG プログラムは、特定のライブラリーがライブラリー・リストにあることを期待していますか? その場合は、プログラムを呼び出す前に、CommandCalls を発行してライブラリーをライブラリー・リストに追加する必要があります。

于 2010-01-21T21:21:42.743 に答える
1

FWIW: IBM i のホスト プログラムとサービス プログラムは、ProgramCall.

コンパイラーは、PCML 文書も生成します。

詳しくは、 http://javadoc.midrange.com/jtopen/com/ibm/as400/data/ProgramCallDocument.htmlを参照してください。

于 2010-06-03T13:39:20.843 に答える
0

あなたが接続性を持っていない場合、あなたは本当に求められていることをすることができません。どのようにテストしますか?数値パラメータはありますか、それともすべて文字ですか?

于 2010-01-20T22:12:24.593 に答える