7.6.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進数フィールドで渡されます。
· ユーザー・プログラムから戻されるパラメータは、パラメータがフィールドの場合のみファンクションにマッピングされます。これにより、ユーザー・プログラムでシステム変数、英数字リテラル、数値リテラル、またはプロセス・パラメータの内容を変更できなくなります。