ランタイム PSB および PCB のための EGL サポート
- EGL のターゲットが IMS™ BMP または IMS/VS である場合
- コードが DL/I データベースにアクセスする場合。これは、ターゲット・システムが CICS®、 IMS/VS、IMS BMP、 または z/OS® バッチの場合に可能です。
- コードから GSAM ファイルにアクセスする場合。これは、ターゲット・システムが IMS BMP または z/OS バッチの場合に可能です。
組織のプログラム仕様ブロック (PSB) およびプログラム連絡ブロック (PCB) にアクセス可能な COBOL プログラムを生成するには、必要に応じて EGL プログラム要素をカスタマイズします。それらのブロックは、ランタイム PSB およびランタイム PCB と呼ばれます。
- PSB レコード・パーツを定義します。このパーツには、IMS メッセージ・キュー、DL/I データベース、または GSAM ファイルにアクセスする際に使用される PCB レコードのセットが含まれます。
- このプログラムで、以下のようにして PSB および PCB 情報を使用可能にします。
- PSB レコード・パーツに基づくレコードを宣言します。
- プログラム・プロパティー @dli のプロパティー・フィールド psb を、PSB レコードの名前に設定します。その構文について詳しくは、値の設定ブロックを参照してください。
- IO_ PCBRecord
- 入出力 PCB との対話に使用されます。入出力 PCB は、プログラムまたは端末からの入力、および (入力が端末からの場合には) 同じ端末への出力を許可します。入出力 PCB は、IMS の他の機能、例えばバッチ・プログラムのチェックポイントと再始動などの機能へのアクセスも提供しています。
- ALT_PCBRecord
- 入出力 PCB 以外のテレプロセシング PCB を参照するために使用されます。
このタイプのレコードは、別のトランザクションと関連するメッセージ・キューや、入出力 PCB と関連する端末以外のデバイスと関連するメッセージ・キューへの出力の書き込みを、コードによって行えるようにします。ランタイム PCB の種類は、以下のいずれかです。
- 代替 PCB。この場合、メッセージはコミットが行われた場合にのみ、その宛先に送信されます。
- 特別代替 PCB。この場合、メッセージはコミットまたはロールバックが行われたかどうかに関係なく、その宛先に送信されます。
- DB_PCBRecord
- データベース PCB の参照に使用されます。データベース PCB は、プログラムからアクセス可能な DL/I データベースを表します。 ランタイム・データベース PCB は、アクセス可能なデータ、および有効なアクセス・タイプを指定します。
- GSAM_PCBRecord
- GSAM PCB への参照に使用されます。GSAM PCB は、z/OS バッチまたは IMS BMP プログラムが、ルート専用の DL/I データベースとして働くシリアル・ファイルにアクセスする場合に使用されます。
- CICS
- PSB レコード・プロパティー defaultPSBName の値は、デフォルトでランタイム PSB の名前になります。EGL はその名前を、システム変数 dliLib.psbData の psbName フィールドに入力しますが、このライブラリー・フィールドには別の値を割り当てることができます。
プログラムが DL/I データベースに対して入出力操作を試行すると、psbName の値によって、どのランタイム PSB を使用するかが決まります。システム変数 dliLib.psbData には 2 番目のフィールド psbRef があります。このフィールドの初期値はゼロです。これは、スケジュールに入っている PSB がないことを示します。 最初の DL/I I/O が発生すると、EGL ランタイムは PSB スケジュール呼び出しを発行します。 この呼び出しは、以下のアクションを実行します。
- dliLib.psbData.psbName の値を使用して、ランタイム PSB をスケジュールに入れます。
- dliLib.psbData.psbRef を PSB にアクセスできるアドレスに設定します。
注: dliLib.psbData.psbRef にいかなる値を割り当てるロジックも作成しないでください。呼び出し中は、変数 dliLib.psbData を使用して PSB を渡すことができます (実際には、名前とそれに関連するアドレスを渡します)。
転送中のランタイムの詳細な振る舞いは、その転送がどのように行われるかによって異なります。- 転送が、returning 文節を指定した show ステートメント、または transfer to transaction ステートメントによって行われる場合、転送中にコミット点が発生するために、スケジュールに入っている PSB が終了し、PSB はターゲット・プログラムに渡されません。
- 転送が transfer to program ステートメントによって行われる場合、デフォルトの振る舞いは、PSB がスケジュールに入っているかどうかによって異なります。
- PSB がスケジュールに入っていない場合、コミット点は発生しません。
- PSB がスケジュールに入っている場合、転送中にコミット点が発生するため、その PSB は終了し、PSB はターゲット・プログラムに渡されません。
ただしこのケースでは、別の結果になる可能性もあります。
その結果には、転送元プログラムが CICS 用に生成された場合と IMS/VS 用に生成された場合の振る舞いの違いを最小限に抑えられるという利点があります。
このような結果になるのは、以下の 4 つの条件がすべて満たされた場合です。
- ターゲット・システムが z/OS CICS である。
- ターゲット・プログラムが、EGL によって生成されている。
- ビルド記述子オプション synchOnPgmTransfer が NO に設定されている。
- 転送元プログラムの PSB レコードで参照されているデフォルトの PSB が、ターゲット・プログラムの PSB レコードで参照されているデフォルトの PSB と同じである。
この場合、コミット点は発生せず、EGL はスケジュールに入っている PSB をターゲット・プログラムに渡します。
注: デフォルトの PSB は defaultPSBName プロパティーの値です。この値は、プログラムの PSB レコードの基本である PSB レコード・パーツで設定されます。 プロパティーのデフォルト値は、レコード・パーツの名前です。PSB レコードの例については、DLISegment ステレオタイプを参照してください。
DB PCB は、ランタイム PSB で有効です。
- IMS BMP
- ランタイム JCL の PSB パラメーターは、ジョブ・ステップ全体を通じて使用されるランタイム PSB を識別します。この JCL はデプロイメント時にカスタマイズ可能ですが、EGL は、PSB レコード・プロパティー defaultPSBName の値を割り当てて、ランタイム JCL の PSB パラメーターのデフォルト値を生成します。IMS BMP の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
- ゼロ (最初の) 位置に入出力 PCB。 バッチ指向 BMP を生成している場合でも、PSBGEN ジョブの開発時には、IMS システム・プログラマーが CMPAT を YES に設定していることを確認してください。
- 代替 PCB (通常は 2 番目の位置にあります)。
- 特別代替 PCB (通常は 3 番目の位置にあります)。
DB および GSAM PCB も有効です。
- IMS/VS
- IMS システム定義の規則により、メインプログラムの名前は確実にランタイム PSB の名前になります。
この名前は、トランザクション全体を通じて使用可能です。IMS/VS の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
- ゼロ (最初の) 位置に入出力 PCB。 IMS システム・プログラマーは、PSBGEN ジョブの開発時に CMPAT を YES に設定することができますが、このアクションはオプションです。
- 代替 PCB (通常は 2 番目の位置にあります)。
- 特別代替 PCB (通常は 3 番目の位置にあります)。
DB PCB も有効です。
ビルド記述子オプション workDBType の値が DLI (デフォルト) の場合は、EGL 作業データベース用のランタイム DB PCB の 1 つを設定してください。これは、ランタイム PSB レコード内の ELAWORK として、または EGL PCB レコードの名前として識別されます。注: ランタイム PSB レコード内の最後のデータベース PCB は、ELAWORK として指定することをお勧めします。これによって、SQL 作業データベースに変更しても、その PCB を簡単に除去することができます。 - z/OS バッチ
- ランタイム JCL の PSB パラメーターは、ジョブ・ステップ全体を通じて使用されるランタイム PSB を識別します。この JCL はデプロイメント時にカスタマイズ可能ですが、EGL は、PSB レコード・プロパティー defaultPSBName の値を割り当てて、PSB パラメーターのデフォルト値を生成します。
z/OS バッチの場合、EGL では最初のランタイム PCB は入出力 PCB である必要があります。PSBGEN ジョブの開発時には、IMS システム・プログラマーが CMPAT を YES に設定していることを確認してください。
EGL ではさらに、任意のタイプの 2 つの追加 PCB が、ランタイム PSB 内に存在している必要があります。DB および GSAM PCB は、代替 PSB と同様に有効です。 コードで代替 PSB を使用することはできません。しかしその一方、有効というのは、z/OS バッチおよび IMS BMP で同じランタイム PSB を使用できるということです。
EGL は、初期の 2 つまたは 3 つの入出力 PCB およびテレプロセシング PCB が PSB レコードで宣言されていても、ランタイム PSB に存在していない場合には、初期の PCB に合わせて調整を行います。 この調整により、環境が異なっていても同じプログラムを生成することができます。 例えば、CICS に関連して、初期入出力 PCB レコードと代替 PCB レコードがコード内に存在していても、EGL ランタイムはこれらを無視します。
PSB レコード・パーツに対する要件
- 前に説明したように、ターゲット・システムが、PSB レコード・パーツでどの PCB が必要となるかに影響すること。
- プログラム・プロパティー @dli のプロパティー・フィールド callInterface (AIBTDLI または CBLTDLI) の値も PSB レコード・パーツの要件に影響すること。
callInterface が AIBTDLI の場合
- IMS/VS、IMS BMP、または z/OS バッチの場合、ランタイム PSB 内の最初の PCB は、入出力 PCB である必要があります。 IMS は常に、入出力 PCB の名前として名前 IOPCB を使用します。
- IMS/VS および IMS BMP の場合、EGL は他の必須 PCB に以下の名前を使用します。
- 代替 PCB には ELAALT。
- 特別代替 PCB には ELAEXP。
- IMS/VS 環境で EGL 作業データベースとして DL/I データベースを使用している場合は ELAWORK。この場合は、EGL PCB レコードにデータベースの階層情報を含める必要はありませんが、IMS システム・プログラマーは、後で示すように、ランタイム PSB を定義する際にマクロ ELAPCB を使用する必要があります。(生成時に、ビルド記述子オプション workDBType のデフォルト値を受け入れて、作業データベースが DL/I データベースであることを示してください。)
それらの PCB の名前は、以下のいずれかの方法で指定できます。- IMS システム・プログラマーに、EGL 必須の PCB 名を、ランタイム PSB を作成する PSBGEN ジョブで指定するよう依頼する。
次の例は、ラベルを使用して代替 PCB の名前を提供し、PCBNAME パラメーターを組み込んで特別代替 PCB および作業データベース PCB の名前を提供します。
ELAALT PCB TYPE=TP,MODIFY=YES PCB TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=ELAEXP ELAPCB LABEL=ELAWORKこの場合、PSB レコード・パーツに PCB レコードを組み込む必要はありません。
- IMS プログラマーが EGL で必要とされる名前とは異なる名前を使用している場合は、PSB レコード・パーツに必須 PCB レコードを組み込み、EGL に必要な名前とランタイム PSB 内の名前を関連付ける必要がある。例えば、ランタイム PSB に以下の PCB が含まれているとします。
PCB TYPE=TP,MODIFY=YES,PCBNAME=MYALTPCB PCB TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=MYEXPPCB ELAPCB LABEL=MYWORKDBこの場合、PSB レコード・パーツには、以下のように PCB レコードが組み込まれます。Record MYPSB type PSBRecordPart ELAALT ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYALTPCB"}}; ELAEXP ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYEXPPCB"}}; ELAWORK DB_PCBRecord {@PCB {pcbType = PCBKind.DB, PCBName = "MYWORKDB"}}; end
callInterface フィールドが AIBTDLI に設定されている場合は、プログラムで使用される PCB レコードと、EGL に必要な名前と異なるランタイム名を持ついずれかの必須 PCB のみを宣言する必要があります。 この規則は、メインプログラムと呼び出し先プログラムに適用されます。
callInterface が CBLTDLI の場合
callInterface フィールドを CBLTDLI に設定すると、指定されたランタイム PCB へのアクセスは、名前ではなくアドレスで行われます。
- PSB レコードには、ランタイム PSB 内の PCB の数を超える PCB レコードを含めることはできませんが、それよりも少ない数は含めることができます。
- 各 PCB レコードの位置は、関連するランタイム PCB の位置に一致する必要があり、その PCB と同じタイプである必要があります。
ターゲット・システムが IMS/VS で、EGL 作業データベースとして DL/I データベースを使用している場合は、EGL PCB レコードにデータベースの階層情報を含める必要はありませんが、IMS システム・プログラマーは、ランタイム PSB を定義するときにマクロ ELAPCB を使用する必要があります。(生成時に、ビルド記述子オプション workDBType のデフォルト値を受け入れて、作業データベースが DL/I データベースであることを示してください。)
- 呼び出し先プログラムに PSB レコードを渡すと、ランタイム PSB へのアクセスに使用されるアドレスが渡されます。メインプログラムの場合と同様に、最低でも PSB レコード・パーツの最初の部分をセットアップする必要があります。その中には、入出力 PCB、代替 PCB、および特別代替 PCB (特定の環境で使用されている場合) の PCB レコード、および呼び出し先プログラムで必要となる他の PCB レコードも同様に含まれます。さらに、プログラム・プロパティー @dli のプロパティー・フィールド psbParm もセットアップする必要があります。
- PCB レコードを呼び出し先プログラムに渡すと (これを推奨します)、各ランタイム PCB へのアクセスに使用されるアドレスが渡されます。この場合も、少なくとも入出力 PCB、代替 PCB、および特別代替 PCB (特定の環境で使用される場合) をセットアップする必要があります。ただし、これらの PCB 以外で、宣言する必要があるのは、呼び出し先プログラムで必要となる PCB レコードのみです。また、プログラム・プロパティー @dli のプロパティー・フィールド pcbParms もセットアップする必要があります。
プロパティー pcbParms および psbParm を呼び出し先プログラムで指定すると、前者のプロパティー内の PCB 固有のアドレスが、後者の PCB プロパティー内の等価なアドレスを上書きします。渡された PSB は無視されます。
- 2 番目の PCB レコードは代替 PCB を参照します。
- 3 番目の PCB レコードは、特別代替 PCB を参照します。
2 番目のレコード以外のレコードの名前として ELAALT を使用するか、または 3 番目のレコード以外のレコードの名前として ELAEXP を使用すると、その名前が優先されます。EGL は、そのように指定された PCB レコードは適切なタイプのランタイム PCB を参照していると想定します。