JavaからAS400 RPGを呼び出します
-
21-09-2019 - |
質問
AS400とRPGに関する非常に制限された(0)知識があります。しかし、JavaクラスからRPGプログラムを呼び出す必要がある緊急の要件があります。だから私はJTopenを通じてそれを達成できることを発見しました。しかし、私はProgramparameterリストを宣言することに固執しています。 RPGプログラムに関する次の情報があります
プログラム名:ZM30000Rパラメーター:ブランチ7,0(数値)
アカウントタイプ2(01-Cheque、02節約)
アカウント番号20(文字)
エラーコード7(文字)dr/cr indicater 1(文字D、c)
しかし、intputとoutputとは何かについての手がかりはありません。プログラムメーターを宣言する方法。以下のようにやった。これらのシステムに接続されていないため、テストすることもできません。
// 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);
どんなヘルプでも非常に便利です。
よろしくお願いします、
srinivas
解決
まあ、私はパラメーターの説明だけで手がかりを持っています。ブランチ、アカウントタイプ、アカウント番号があります。財務予約または取引にはその情報が必要です。エラーコードが表示されています。金融システムでの私の経験では、APIが金額の予約方法を返すことは合理的です。通常、サインを使用しますが、金融システムでは(d)ebitまたは(c)reditがより良い方法です。
APIは、金融システムのAPIである可能性が非常に高いです。それが本当なら、私は金額を逃しています。あなたは完全な説明を確かですか?
最初のパラメーターは数値であることに注意してください。あなたは幸運ではありません。 ISERIESとRPGは、数値のタイプをあまり寛容ではありません。ビット、ゾーン、パック、小数、整数、フロートなどから選択できます。 RPGがILE RPGではなくRPGの場合、それをゾーン、パック、バイトに倒すことができます。
私はあなたがISERIESにアクセスすると仮定します。次に、プログラムコール、情報のデバッグ、情報をダンプすることができます。 「試行錯誤」を行う必要がある場合に役立ちます。アクセスできない場合、道路は非常に困難になります。プログラムの呼び出しが成功しない場合、Javaクラスでエラーが発生します。しかし、Iseriesからの情報なしで実際のエラーを識別することは困難です。したがって、アクセスが本当に必要です。
他のヒント
サンプルは主に正しい軌道に乗っています。ただし、ブランチパラメーターは数値です。したがって、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を発行する必要があります。
FWIW:IBM Iホストプログラムとサービスプログラムを使用してPCMLを使用して電話をかける方がはるかに簡単です ProgramCall
.
コンパイラは、PCMLドキュメントを生成します。
見る http://javadoc.midrange.com/jtopen/com/ibm/as400/data/programcalldocument.html 詳細については。
接続性がない場合、尋ねられることは本当にできません。どのようにテストしますか?数値パラメーターはありますか、それともすべて文字ですか?