0

CLLE から RPGLE を呼び出す場合、パックされた数値フィールドを渡す必要がありますか? または、それらを文字パスに変換し、RPG で数値に変換します。前者が推奨される場合、これはどのように行われますか?

4

2 に答える 2

5

パックされた数値を CLLE から RPGLE に問題なく渡すことができます。

問題は、コマンド ラインから任意のプログラムを呼び出したり、プログラムを実行依頼して を介してバッチで実行したりするときに、SBMJOB cmd(CALL MYPGM)IBM i コマンド プロセッサが数値リテラルをpacked(15,5)として渡すことです。

call mypgm parm(10 15)

両方のパラメーターをpacked(15,5)として定義する必要があります。MYPGM が CL、CLLE、RPG、RPLE、または COBOL で作成されたかどうかは問題ではありません。

関連する問題は、リテラル値が 32 より長くない限り、文字リテラルが char(32) として渡され、指定されたサイズの文字変数として渡されることです。

これは、パラメーターがプログラムとの間で参照によって渡されるためです。呼び出し元がデータ用のストレージを確保し、そのストレージのアドレスが実際に渡されることを意味します。実際の値ではありません。そのため、コマンド プロセッサは必要なストレージを作成し、指定された値で初期化します。コマンド プロセッサは、プログラムで定義されたパラメータのサイズを知る方法がないため、定義されたデフォルトを使用し、呼び出されたプログラムの作成者がルールに従う必要があります。

これは、あらゆる種類のばかげた回避策につながります

call mypgm parm('0010' x'000F' 'AB                                      x')

上記

  • char(4) として 4 桁の数字を渡します
  • 16 進数リテラルを介して char(2) として 2 バイト整数を渡します
  • 40 文字の文字列を char(41) として渡します

ただし、最善の解決策は、コマンド ラインまたは 経由で呼び出したいプログラムのコマンド フロント エンドを作成することですSBMJOB CMD()。コマンドを定義すると、コマンド プロセッサはプログラムのパラメータの型とサイズを正確に認識します。

mycmd parm1(10) parm2(15) parm3('AB')

詳細については、Midrange.com wikiを参照してください。

于 2017-03-08T15:40:19.367 に答える