CICS® 環境でセグメント化モードで実行すると良好に実行する一連の EGL プログラムがあります。
追加の利点は、これらのプログラムは、同じ機能をすべて含む単一の EGL プログラムよりも、保守、テスト、および拡張が容易であるということです。
下の図は、3 つのタスクを実行する 4 つの EGL プログラム間の関係を示しています。メニュー・プログラムの唯一の目的は、その他の 3 つのプログラムにアクセスすることです。ユーザーが希望するタスクを選択すると、メニュー・プログラムは、transfer to program ステートメントを使用して対応するプログラムに制御を転送します。メニュー・プログラムは、要求の定義を追加するための小さい作業用ストレージ・レコードを渡します。転送先プログラムは、必要なデータのプロンプトをユーザーに出し、必要に応じてタスクを実行し、transfer to program ステートメントを使用してメニュー・プログラムに戻ります。
図 1. transfer to program ステートメントを使用する階層構造
transfer to program ステートメントを使用すると、以下のセグメント化モードの制限が解決されます。
- チェーン内のすべてのプログラムがセグメント化されていなければ、呼び出し先プログラムをセグメント化モードで実行できない。
- プログラム制御が呼び出し側プログラムに戻されるため、呼び出し先プログラムは呼び出し側のリソースを解放しない。
- セグメント化された converse でのデータのロールイン/ロールアウトの量はかなり小さくなる。現在制御しているプログラムのみについてのみ、データ域が保存される。
IMS/VS 環境では、
transfer to program ステートメントは元のプログラムのストレージを解放しません。この例では、元のプログラムはメニュー・プログラムです。IMS™ 環境と CICS 環境の両方で実行するプログラムを作成する場合は、
transfer to program ステートメントまたは
transfer to transaction ステートメントのいずれかを使用できます。
IMS のみで実行するプログラムを作成する場合は、以下の理由で、
transfer to transaction ステートメントを使用してください。
- 転送元のプログラムのリソースを解放するため
- コミット点を発生させ、forUpdate ロックを解放するため
- 各プログラムが独自の DB2® プランおよび異なる PSB を持つことを許可するため
- 各プログラムが IMS システム定義内に異なるパフォーマンス・チューニング情報を持つことを許可するため
コミット点を発生させない場合、または両方のプログラムで同じ DB2 プランと PSB を使用する場合は、IMS 環境で
transfer to program ステートメントを使用してください。
セグメント化モードと非セグメント化モード間の動的な変更
注: この技法は、VisualAge® Generator 互換モードでのみサポートされます。新規プログラムには使用しないでください。
プログラムに
segmented プロパティーを指定する場合、
converse ステートメントを実行時に処理する方法のデフォルト・モードを設定します。
segmented プロパティーは、
converseVar.segmentedMode システム変数の値を以下のように初期化します。
- 0
- プログラムがセグメント化されていないことを示す
- 1
- プログラムがセグメント化されていることを示す
converseVar.segmentedMode システム変数を変更して、セグメンテーションを実行時に動的に制御できます。
converseVar.segmentedMode を 0 または 1 に設定することにより、次の
converse ステートメントのデフォルト値をオーバーライドできます。
各
converse ステートメントの前に、EGL は
converseVar.segmentedMode の値を検査し、以下のように
converse ステートメントを処理します。
- converseVar.segmentedMode が 1 に設定されている場合、EGL は converse ステートメントをセグメント化された converse として処理します。
- converseVar.segmentedMode が 0 に設定されている場合、EGL は converse ステートメントをセグメント化されていない converse として処理します。
converse ステートメントが正常に完了すると、EGL は converseVar.segmentedMode をプログラムの segmented プロパティーに基づくデフォルト値にリセットします。
converseVar.segmentedMode システム変数を使用すると、パフォーマンス、機能、およびターゲット・システムの相違の理由がある場合に、セグメント化モードとの間で切り替えることができます。セグメンテーションを制御するには、
converse ステートメントの前に以下のステートメントのいずれかを使用します。
converseVar.segmentedMode = 1; // force the next converse to be segmented
converseVar.segmentedMode = 0; // force the next converse to be nonsegmented
converse が実行されるたびに、実行後に converseVar.segmentedMode が生成済みのデフォルトにリセットされることに注意してください。
したがって、converseVar.segmentedMode は、特定の converse の動作をデフォルトの処理から変える場合にのみ使用してください。
注: IMS/VS 環境では、EGL は converseVar.segmentedMode システム変数の使用を無視します。IMS/VS 環境では、 converse ステートメントを含むすべてのプログラムはセグメント化モードで実行する必要があります。