7.9.2 CALL についてのコメント/警告
プロセスまたはファンクションの呼び出し
- 別のプロセスまたはファンクションを呼び出すときは、パラメータを使用しないことを強くお勧めします。代わりに交換リストを使用してください。
- 別のLANSAプロセスを呼び出すときは、渡すパラメータの数およびタイプ(すなわち、数値か文字か)が、プロセスで要求されるものと正確に一致している必要があります。
- 呼び出されるプロセスまたはファンクションに渡すパラメータとして、フィールド名、英数字リテラル、数値リテラル、システム変数、またはプロセス・パラメータを使用できます。
- プロセスに数値パラメータが定義されている場合、これらのパラメータは常にパック10進数であることに注意してください。そのため、LANSAプロセスに渡す数値パラメータも、長さおよび小数点以下桁数が同じパック10進数である必要があります。この規則に従わないと、予期しない結果になる可能性があります。
- 同じ名前のフィールドが含まれる複数のデータ構造を同じファンクション内で使用すると、予期しない結果になる可能性があります。
- 現行リリースのLANSAでは、別のプロセスまたはファンクションに渡されたパラメータは、そのプロセスまたはファンクションから戻りません。ただし、CALLコマンドの直前にEXCHANGEコマンドを使用することで、ファンクションに情報を渡し、そのファンクションから情報を戻すことができます。この方法の詳細については、EXCHANGEコマンドのセクションを参照してください。
- PASS_DSパラメータで指定されたデータ構造によって参照される各物理ファイルは、操作可能な状態である必要があります。操作可能でないと、予期しない結果になります。
- 以下のように、コンパイル済みのRDMLファンクション(FUNCAなど)の実行中に、このファンクションからCALLコマンドを実行して、FUNCBという別のRDMLファンクションを呼び出すとします。
CALL PROCESS(TEST) FUNCTION(FUNCB)
この場合、実際には以下の処理が行われます。
____________
| |
|ファンクション|
| FUNCA |
|____________|
|
呼び出し
|
_____|______
| |
| プロセス |
| コントローラ |
| TEST |
|____________|
|
呼び出し
|
_____|______
| |
|ファンクション|
| FUNCB |
|____________|
- 特にプロセス・コントローラ TEST がコンパイル済みモードではなくインタープリタ・モードで実行されている場合に、以下の操作を行うと、この CALL 操作を大幅に高速化できます。
1. FUNCB (FUNCBであることに注意) にコマンド FUNCTION OPTIONS(*DIRECT) を組み込み、再コンパイルします。これにより、FUNCB でダイレクト・モードの呼び出しが可能になり、いかなる形でもFUNCBに影響しなくなります。
2. 以下のように、FUNCA 内のCALLコマンドを変更します。
CALL PROCESS(*DIRECT) FUNCTION(FUNCB)
次に、FUNCA を再コンパイルします。これにより、ファンクションFUNCBを、TESTというプロセス・コントローラからではなく、ダイレクト・モードで呼び出すよう指定されます。
これらの変更を行うと、CALL は以下のように動作します。
____________
| |
|ファンクション|
| FUNCA |
|____________|
|
呼び出し
|
_____|______
| |
|ファンクション|
| FUNCB |
|____________|
- このオプション (FUNCTION OPTIONS(*DIRECT) など) は、プロセス・メニューから直接アクセス可能なメイン制御ファンクションではなく、「サブルーチン」として使用することを想定したファンクション内で使用してください。このファンクションを呼び出すときは、必ずCALL PROCESS(*DIRECT) オプションを使用してください。
- このパフォーマンス上の利点は、FUNCB をプロンプト・ファンクションとして使用 (すなわち、F4=プロンプト・キー要求として機能) しても得られます。FUNCB にデータ・ディクショナリ内のフィールドを関連付けるときは、実際のプロセス名 (TEST) を指定するのではなく、プロセス名を *DIRECT として指定してください。
- すべてのファンクションで FUNCTION OPTIONS(*DIRECT) を指定しても問題ありません。このオプションを使用するファンクションとこのオプションを使用しないファンクションは同等であり、プロセス・メニューからこのようなファンクションへのアクセスに制約はありません。
- FUNCTION OPTIONS(*DIRECT) を使用しないファンクションでは、関連付けられる RPG プログラム、表示装置ファイル・オブジェクト、および多言語拡張プログラムの名前は、それぞれ F@innnnn、@innnnn、および F@innnnnML になります。ここで、"innnnn" は、LANSAによって割り当てられる内部ファンクション識別子です。この割り当てでは、ファンクション名が重複しないよう考慮されます。
- FUNCTION OPTIONS(*DIRECT) を使用するファンクションでは、結果的に生成されるオブジェクト名は、@fffffff、@fffffff、および @fffffffML です。ここで、fffffff は、ファンクションの名前 (1~7文字) です。そのため、FUNCTION OPTIONS(*DIRECT) を使用するときは、固有のファンクション名を使用する必要があります。
- *DIRECT 機能を使用する場合、いくつかの制約があります。
- FUNCA と FUNCB 間のすべての情報交換は、交換リストによって行う必要があります。パラメータはサポートされないため、使用できません。これは、すべての構文検査によって検査されます。
- ファンクション名 FUNCB は、区画内で固有である必要があります。これについても、すべての構文検査によって検査されます。
- FUNCB では、TRANSFER のような「回避的」制御コマンドは使用できません。これは、この構造では、要求を処理するためのプロセス・コントローラ (TEST) がないためです。そのため、必ず [キャンセル]/[メニュー] ファンクション・キーまたは CANCEL/MENU コマンド、[終了] ファンクション・キーまたは EXIT コマンド、あるいは RETURN コマンドを使用してください。
- FUNCB をアクション・バー・プロセスに含めないでください。このタイプのアクション・バー・ファンクションの呼び出しが使用されるのは稀です。アクション・バー・ファンクションから別のプログラムを呼び出す場合、呼び出されるプログラムでは、ユーザーとのやり取りを、アクション・バーの表示および処理を混乱させる可能性のある全画面表示の DISPLAYやREQUEST コマンドではなく、POP_UP で行ってください。
- FUNCB は、FUNCA の論理「サブルーチン」のように機能します。
- FUNCB には、特定の OPTIONS(*HEAVYUSAGE) または (*LIGHTUSAGE) ディレクティブが必要です。これが指定されていない場合、親プロセスTESTの使用オプションではなく、呼び出し元ファンクションの使用オプションが適用されます。
- CALL PROCESS(*DIRECT) オプションの導入により、以前は LANSA で推奨されていなかった大量の呼び出しが可能になりました。他のファンクションの大量呼び出しを実装するときは、交換リストのサイズを考慮してください。このような状況では、交換リストに多数のフィールドが存在すると、パフォーマンスのオーバーヘッドが生じる可能性があります。
交換オプションを使用する代わりに、ファンクション間でデータ構造 (CALL....PASS_DS(#dddddd)) を受け渡しするオプションを検討してください。
ユーザー・プログラムの呼び出し
- 呼び出されるプログラムまたはプロセスに渡すパラメータとして、フィールド名、英数字リテラル、数値リテラル、システム変数、またはプロセス・パラメータを使用できます。
- プログラムを保持するライブラリとして特別な値 *LIBL を指定する場合、そのプログラムがファンクションの実行時にユーザーのライブラリ・リストに含まれていなければなりません。
- パラメータが英数字の場合、パラメータは、常に、データ・ディクショナリまたは DEFINE コマンドで定義されている長さでユーザー・プログラムに渡されます。
- パラメータが数値の場合、パラメータは、NUM_LEN パラメータで定義されている長さのパック 10 進数フィールドで渡されます。デフォルト値 *ALL15 を指定すると、すべての数値パラメータが 15 桁のパック10 進数フィールドで渡されます。渡される小数点以下桁数は、フィールドおよびシステム変数におけるそれぞれのフィールド定義に従います。数値リテラルの場合、小数点以下桁数は、リテラルに指定された数に一致します(すなわち、12.34 はパック 10 進数 (15,2) として渡され、132 はパック 10 進数 (15,0) として渡されます)。
- *DEFINED を指定すると、すべての数値パラメータが、データ・ディクショナリまたは DEFINE コマンドで定義された長さと小数点以下桁数のパック 10 進数フィールドで渡されます。
- ユーザー・プログラムから戻されるパラメータは、パラメータがフィールドの場合のみファンクションにマッピングされます。これにより、ユーザー・プログラムでシステム変数、英数字リテラル、数値リテラル、またはプロセス・パラメータの内容を変更できなくなります。