CLLE から RPGLE を呼び出す場合、パックされた数値フィールドを渡す必要がありますか? または、それらを文字パスに変換し、RPG で数値に変換します。前者が推奨される場合、これはどのように行われますか?
2 に答える
パックされた数値を 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を参照してください。