ランタイム PSB および PCB のための EGL サポート

このトピックは、以下の場合に適したタスクについて説明します。

組織のプログラム仕様ブロック (PSB) およびプログラム連絡ブロック (PCB) にアクセス可能な COBOL プログラムを生成するには、必要に応じて EGL プログラム要素をカスタマイズします。それらのブロックは、ランタイム PSB およびランタイム PCB と呼ばれます。

最初に、データベース PCB レコードがある場合には、そのレコードで参照する DLISegment レコード・パーツを定義します。次に、以下に示した主要タスクを実行します。
  1. PSB レコード・パーツを定義します。このパーツには、IMS メッセージ・キュー、DL/I データベース、または GSAM ファイルにアクセスする際に使用される PCB レコードのセットが含まれます。
  2. このプログラムで、以下のようにして PSB および PCB 情報を使用可能にします。
    • PSB レコード・パーツに基づくレコードを宣言します。
    • プログラム・プロパティー @dli のプロパティー・フィールド psb を、PSB レコードの名前に設定します。その構文について詳しくは、値の設定ブロックを参照してください。
各 PCB レコードは、以下の事前定義されている PCB レコード・パーツの 1 つに基づいています。
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 データベースとして働くシリアル・ファイルにアクセスする場合に使用されます。
以下のリストに、各ターゲット・システムにおけるランタイム PSB の詳細を示します。
CICS
PSB レコード・プロパティー defaultPSBName の値は、デフォルトでランタイム PSB の名前になります。EGL はその名前を、システム変数 dliLib.psbDatapsbName フィールドに入力しますが、このライブラリー・フィールドには別の値を割り当てることができます。 プログラムが 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 内に存在している必要があります。
  1. ゼロ (最初の) 位置に入出力 PCB。 バッチ指向 BMP を生成している場合でも、PSBGEN ジョブの開発時には、IMS システム・プログラマーが CMPAT を YES に設定していることを確認してください。
  2. 代替 PCB (通常は 2 番目の位置にあります)。
  3. 特別代替 PCB (通常は 3 番目の位置にあります)。

DB および GSAM PCB も有効です。

IMS/VS
IMS システム定義の規則により、メインプログラムの名前は確実にランタイム PSB の名前になります。 この名前は、トランザクション全体を通じて使用可能です。
IMS/VS の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
  1. ゼロ (最初の) 位置に入出力 PCB。 IMS システム・プログラマーは、PSBGEN ジョブの開発時に CMPAT を YES に設定することができますが、このアクションはオプションです。
  2. 代替 PCB (通常は 2 番目の位置にあります)。
  3. 特別代替 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 レコード・パーツの構造は、ランタイム PSB レコードの構造に密接に関連しており、他の 2 つの問題が影響しています。
  • 前に説明したように、ターゲット・システムが、PSB レコード・パーツでどの PCB が必要となるかに影響すること。
  • プログラム・プロパティー @dli のプロパティー・フィールド callInterface (AIBTDLI または CBLTDLI) の値も PSB レコード・パーツの要件に影響すること。

callInterface が AIBTDLI の場合

callInterface フィールドが AIBTDLI (デフォルト) に設定されている場合は、指定されたランタイム PCB へのアクセスは PCB 名により行われるため、プログラム内の PSB レコードの構造は、ランタイム PSB の構造を反映している必要はありません。ただし、EGL でランタイム PCB が使用可能になるようにしておく必要はあります。
  • 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 へのアクセスは、名前ではなくアドレスで行われます。

さまざまな環境で同じプログラムを生成できるようにするために、EGL が無視する入出力 PCB レコードと代替 PCB レコードを除き、メインプログラム内の PSB レコードの構造は、少なくともランタイム PSB 内の初期 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 は無視されます。

IMS/VS または IMS BMP 用に生成されるメインプログラムまたは呼び出し先プログラムの場合、デフォルトの振る舞いは以下のようになります。
  • 2 番目の PCB レコードは代替 PCB を参照します。
  • 3 番目の PCB レコードは、特別代替 PCB を参照します。

2 番目のレコード以外のレコードの名前として ELAALT を使用するか、または 3 番目のレコード以外のレコードの名前として ELAEXP を使用すると、その名前が優先されます。EGL は、そのように指定された PCB レコードは適切なタイプのランタイム PCB を参照していると想定します。


フィードバック