このトピックは、以下の場合に適切なタスクに関係します。
- EGL 生成のターゲットが IMS™ BMP または IMS/VS である
- ターゲット・システムが CICS®、IMS/VS、IMS
BMP、または z/OS® バッチである
場合に可能なように、コードが DL/I データベースにアクセスしている
- ターゲット・システムが IMS
BMP または z/OS バッチである
場合に可能なように、コードが GSAM ファイルにアクセスしている
前のケースでは、組織のプログラム仕様ブロック (PSB) およびプログラム連絡
ブロック (PCB) にアクセスできる COBOL プログラムを生成するために、
必要に応じて EGL プログラム・エレメントをカスタマイズします。
これらのブロックは、今後はランタイム PSB およびランタイム PCB といいます。
まず、データベース PCB レコード (存在する場合) で参照する DLISegment レコード・
パーツを定義します。その後の主な作業内容は次のとおりです。
- PSB レコード・パーツを定義する。定義するパーツには、IMS メッセージ・キュー、DL/I データベース、または GSAM ファイルへの
アクセス時に使用される PCB レコード・セットが含まれます。
- プログラムで、PSB および PCB の情報を使用可能にする。
- PSB レコード・パーツに基づいたレコードを宣言する。
- プログラム・プロパティー @DLI のプロパティー・
フィールド psb を PSB レコードの名前に設定する。構文の詳細については、
『値の設定ブロック』を参照してください。
それぞれの PCB レコードは、次の事前定義された PCB レコード・パーツの
いずれかに基づいています。
- IO_ PCBRecord
- I/O PCB と対話するために使用されます。プログラムまたは端末からの入力を
可能にして、(入力が端末からの場合は) 同じ端末への出力を可能にします。
また、I/O PCB は、チェックポイント、およびバッチ・プログラムの再開などの
他の IMS 機能への
アクセスを提供します。
- ALT_PCBRecord
- I/O PCB 以外のテレプロセシング PCB を参照するために使用されます。
このタイプのレコードを使用すると、コードでは、別のトランザクション
または I/O PCB に関連付けられている端末以外のデバイスに関連するメッセージ・
キューへの出力を書き込むことができます。ランタイム PCB は、以下のいずれかの
種類となります。
- 代替 PCB。この場合には、コミットが発生したときのみ出力が発生します。
- 特別代替 PCB。この場合には、コミットまたはロールバックが発生したかどうかに
関係なく出力が発生します。
- DB_PCBRecord
- データベース PCB を参照するために使用されます。これは、プログラムから
アクセス可能な DL/I データベースを表します。ランタイム・データベース PCB は、
アクセスできるデータおよび有効なアクセスのタイプを指定します。
- GSAM_PCBRecord
- GSAM PCB を参照するために使用されます。これは、z/OS バッチまたは IMS BMP プログラムが、root-only DL/I データベースとして
振る舞うシリアル・ファイルにアクセスするときに使用されます。
次のリストは、それぞれのターゲット・システムでのランタイム PSB の詳細を
示します。
- CICS
- PSB レコード・プロパティー defaultPSBName の
値は、(デフォルトでは) ランタイム PSB の名前です。EGL は、システム変数 DLILib.psbData の
psbName フィールドにこの名前を入れますが、このライブラリー・フィールドには
別の値を割り当てることができます。プログラムが DL/I データベースに対して
入出力 (I/O) 操作を行おうとすると、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 を渡す」(実際には、名前と関連するアドレスを渡す) ことができます。
ただし移動時には、スケジュールされた PSB は、コミット点が発生した場合のみ
終了します。
- PSB が転送プログラムにはスケジュールされるが、受信プログラムには
スケジュールされない場合、transfer 文に関してコミット点が
常に存在します。
- 同様に、転送プログラムと受信プログラムに関して異なる PSB が
スケジュールされる場合、transfer 文に関してコミット点が
常に存在します。
- 2 つのプログラムに関して同じ PSB がスケジュールされる場合は、transfer 文の
振る舞いはさまざまです。
- transfer 文の形式が transfer to transaction の
場合は、コミット点が存在します。
- transfer 文の形式が transfer to program の
場合は、ビルド記述子オプション synchOnPgmTransfer が、コミット点が
存在するかどうかを判別します。
- 転送プログラムに PSB がスケジュールされていない場合、
コミット点は transfer to transaction 型の transfer 文に
関して常に存在しますが、transfer to program 型の transfer 文に
関しては存在しません。
DB PCB は、ランタイム PSB で有効です。
- IMS BMP
- ランタイム JCL の PSB パラメーターは、ジョブ・ステップを通じて使用される
ランタイム PSB を識別します。デプロイメント時に JCL をカスタマイズすることは
できますが、EGL は、PSB レコード・プロパティー defaultPSBName の値を
割り当てることによって、ランタイム JCL でデフォルトの PSB パラメーター値を
生成します。
IMS BMP の場合は、EGL は、最初の
ランタイム PCB に次のものがあることを必要とします。
- I/O PCB (IMS システム・プログラマーが、PSBGEN の
作成時に CMPAT を YES に設定していることを確認してください)
- 代替 PCB
- 特別代替 PCB
DB および GSAM PCB も有効です。
- IMS/VS
- IMS システム定義の
規則は、メインプログラムの名前が、トランザクションを通じて使用可能な
ランタイム PSB の名前になるようにします。
IMS/VS の場合は、EGL では、
最初のランタイム PCB には次のものがある必要があります。
- I/O PCB (IMS システム・プログラマーが、PSBGEN の
作成時に CMPAT を YES に設定していることを確認してください)
- 代替 PCB
- 特別代替 PCB
DB PCB も有効です。
ビルド記述子オプション
workDBType の
値が DLI (デフォルトと同じ) である場合は、名前 ELAWORK によって識別される EGL 作業
データベースのランタイム DB PCB のいずれかを設定します。
ELAWORK データベースの階層情報を含める必要はありません。
注: SQL 作業データベースに変更することに決定した場合に、ランタイム PSB の
最後のデータベース PCB を簡単に除去できるように、この PCB を ELAWORK として
指定することをお勧めします。
- z/OS バッチ
- ランタイム JCL の PSB パラメーターは、ジョブ・ステップを通じて使用される
ランタイム PSB を識別します。デプロイメント時に JCL をカスタマイズすることは
できますが、EGL は、PSB レコード・プロパティー defaultPSBName の値を
割り当てることによって、デフォルトの PSB パラメーター値を生成します。
z/OS バッチの
場合は、EGL では、最初のランタイム PCB を I/O PCB にする必要があります。
さらに EGL では、任意のタイプの 2 つの追加の PCB がランタイム PSB に
存在している必要があります。
代替 DB、および GSAM PCB が有効です。
EGL は、PSB レコードで宣言され、ランタイム PSB に存在しない、最初の 2 つ
または 3 つの I/O およびテレプロセシング PCB のために調整を行います。
この調整によって、異なる環境で同じプログラムを生成できるようになります。
例えば、CICS に
関して、EGL ランタイムは、最初の I/O および代替 PCB レコードがコード内に
存在する場合、これらを無視します。