IMS でのシリアル・ファイルおよび印刷ファイルの使用

シリアル・ファイルは、IMS/VS で IMS™ メッセージ・キューとして実装する必要があります。 IMS BMP のメッセージ・キュー、OS/VS ファイル、VSAM ファイル、または GSAM ファイルとして、シリアル・ファイルを実装することができます。 シリアル・ファイルは、z/OS® バッチの OS/VS ファイル、VSAM ファイル、または GSAM ファイルとして実装することができます。 以下に、シリアル・ファイルに GSAM ファイルまたはメッセージ・キューを使用することについて検討します。

IMS BMP 環境または z/OS バッチ環境で実行される EGL プログラムは、シリアル・ファイルを GSAM ファイルとして実装することができます。 GSAM ファイルとして実装するシリアル・ファイルに addget next、および close I/O 文を使用することができます。 以下に、GSAM と通常のシリアル・ファイルの処理との違いをリストします。 EGL では、GSAM レコードまたは長さが未定義のレコードについてレコード検索引数をサポートしていません。 シリアル・ファイルまたは印刷ファイルの GSAM ファイルとしての識別は、 生成中にリソース関連パーツを使用して、GSAM のファイル・タイプおよび PCB 名を指定して行います。
シリアル・ファイルを GSAM ファイルに関連付ける場合、以下の情報を組み込む必要があります。
リソース名
サンプル・ランタイム JCL で使用される 1 文字から 44 文字のデータ・セット名を示します。 サンプル・ランタイム JCL では、DD 名として、レコード定義に基づくファイル名を使用しています。
ファイル・タイプ
GSAM をファイル・タイプとして指定し、シリアル・ファイルまたはプリンター出力を GSAM ファイルと関連付けます。
PCB 名
GSAM ファイルと関連付けられているシリアル・ファイルの PCB 名を指定します。 指定しない場合、デフォルトは EGL PSB の最初の GSAM PCB です。

シリアル・ファイルをメッセージ・キューとして使用する

IMS/VS で実行されるオンライン・プログラムは、シリアル・ファイルを IMS メッセージ・キューとして実装します。 IMS BMP プログラムとして実行されるプログラムでも、シリアル・ファイルをメッセージ・キューとして実装できます。 出力ファイルには、add および get next I/O 文のほか、close も使用できます。 ターゲット・ランタイム環境として IMS/VS または IMS BMP を選択する場合、シリアル・ファイルまたは印刷ファイルを、メッセージ・キューに関連付けるものとして定義できます。 すべてのシリアル・ファイルおよび印刷ファイルを IMS/VS のメッセージ・キューと関連付ける必要があります。 単一の入力ファイルのみ、メッセージ・キューと関連付けることができます。

生成時にリソース関連パーツを使用し、ファイル・タイプおよび PCB 名を指定することによって、シリアル・ファイルまたは印刷ファイルをメッセージ・キューに関連付けることができます。 シリアル・ファイルをメッセージ・キューに関連付ける場合、以下のリソース情報を定義する必要があります。
リソース名

印刷ファイルまたはシリアル・ファイルのデータのために 1 文字から 8 文字の宛先 ID を示す必要があります。 その名前は、IMS 論理端末の ID または IMS システム定義で定義されるトランザクション・コードと一致する必要があります。

ファイル名は、メッセージ・キューのデフォルト・リソース名です。 リソース関連パーツでこのデフォルトをオーバーライドすることができます。

選択する PCB が変更可能代替または即時代替の PCB である場合、ファイルについては sysVar.resourceAssociation に値を設定し、プログラムにあるプリンターについては converseVar.printerAssociation に値を設定することで、実行時にデフォルト・メッセージ・キュー名をオーバーライドすることができます。 sysVar.resourceAssociation は、ローカル変数として処理されます。 あるプログラムのレコードに sysVar.resourceAssociation を設定しても、別のプログラムの sysVar.resourceAssociation には影響しません。add 文は、 そのプログラムの sysVar.resourceAssociation の設定によって識別されたメッセージ・キューに書き込みます。

メッセージ・キュー・タイプ
単一セグメント・メッセージ・キューまたは複数セグメント・メッセージ・キューを指定することができます。
単一セグメント・メッセージ・キュー (SMSGQ)
単一セグメント・メッセージ・キューでは、追加する各レコードや、シリアル・ファイルから (get next によって) 読み取る各レコードは、完全なメッセージです。 生成された COBOL プログラムは、単一セグメント・メッセージ・キューに追加されるレコード間で IMS PURG 呼び出しを実行します。 生成された COBOL プログラムは、それぞれの get next 文ごとに IMS get unique を発行します。
複数セグメント・メッセージ・キュー (MMSGQ)

複数セグメント・メッセージ・キューでは、シリアル・ファイルに対する一連の add は、各 add 文が単一メッセージのセグメント用であるかのように処理されます。 そのメッセージは、close 文が実行されるか、またはコミット点に到達するまで終了しません。生成された COBOL プログラムは、close 文のために IMS PURG 呼び出しを実行します。 ユーザーは次に、別のメッセージのセグメントの追加を開始し、終了することができます。 複数セグメント・メッセージ・キューは、印刷ファイルには無効です。

MMSGQ シリアル・ファイルに対して get next 文を発行すると、生成されたプログラムは IMS get unique 呼び出しを発行し、メッセージの最初のセグメントを取得します。 追加の get next 文の結果は、 メッセージの残りのセグメントを取得するための GN 呼び出しとなります。 メッセージのすべてのセグメントの最後で、生成された COBOL プログラムは noRecordFound レコード状態を設定します。スキャンニングを継続する場合は、生成されたプログラムは別の一連の get unique (GU) 呼び出しを開始し、その次に get next (GN) 呼び出しを実行します。メッセージが検出されなくなったら、生成されたプログラムは endOfFile 状態を戻します。

PCB 名

メッセージ・キューと関連付けられているシリアル・ファイルの PCB 名も指定する必要があります。 シリアル入力ファイルの PCB 名として、I/O PCB に割り当てられている名前を指定します。I/O PCB は、入力に使用される唯一のメッセージ・キューです。シリアル入力ファイルを使用する場合は、 メイン・バッチ・プログラムまたは呼び出し先バッチ・プログラムを使用する必要があります。 生成されたプログラムは、メイン・トランザクション・プログラムのすべての I/O PCB ロジックを処理します。

シリアル出力ファイルの PCB 名を指定することができます。 PCB 名は、代替 PCB レコードに割り当てられている名前でなければなりません。デフォルトの PCB 名は、PSB 内の最初の代替 PCB の名前です。I/O PCB への出力の送信は、以下のいずれかのシステム関数を使用してのみ行うことができます。
  • VGLib.VGTDLI()
  • DLILib.AIBTDLI()
  • DLILib.EGLTDLI()

メッセージ・キューで使用するレコードを定義する

メッセージ・キューと関連付けるシリアル・レコードを定義する際、定義する必要があるにはプログラム・データだけです。 生成された COBOL プログラムは、add 文のための IMS メッセージ・ヘッダー (長さ、ZZ、およびトランザクション・コード) を追加し、get next 文についてはそれを除去します。

シリアル・ファイル I/O 文の結果を確認する

シリアル・ファイルがメッセージ・キューまたは GSAM データベースと関連付けされると、 生成されたプログラムは DL/I 呼び出しを実行し、I/O 操作を実装します。DL/I 呼び出しが完了すると、Enterprise Developer Server for z/OS は以下の関数を実行します。
  • get next 文では、レコードの状態は DL/I 状況コードに基づいて設定されます。 生成されたプログラムが I/O PCB に GU 呼び出しを実行すると、sysVar.sessionID または sysVar.userID フィールドは I/O PCB のユーザー ID フィールドから更新されます。 これは、複数セグメント・メッセージ・キュー (MMSGQ) として定義されているシリアル・ファイルの最初の get next 文と、単一セグメント・メッセージ・キュー (SMSGQ) の各 get next 文で起こります。 EGL sysVar.transactionID フィールドは、I/O PCB の GU 呼び出しとなる各 get next 文の後の IMS メッセージ・ヘッダーにあるトランザクション名から更新されます。
  • add または close 文では、 レコードの状態は DL/I 状況コードに基づいて更新されます。
メッセージ・キューまたは GSAM のいずれかを呼び出す DL/I 呼び出しの後、DLIVar フィールドは更新されません。 これらのフィールドは、DL/I セグメント・レコードにアクセスする関数の場合にのみ、更新されます。これによって、 CICS® 一時データ・キュー用に作成されたプログラムまたは OS/VS シリアル・ファイルは、 IMS 環境においてファイルがメッセージ・キューまたは GSAM データベースに変更されるときに、 一貫して実行できるようにします。 I/O エラー値を確認して、ファイルの終わりに達していないか、またはシリアル・ファイルでエラーが発生していないか 判別してください。PCB からのより詳細な情報が必要な場合には、IO_PCBRecord または ALT_PCBRecord 内のフィールド名を使用します。例えば、PSB 変数 (名前は myPSB) で ALT_PCBRecord (名前は myAltPCB) を宣言し、リソース割り振りで PCB 名として myAltPCB を使用したとします。add 文の後に DL/I 状況コードを参照するには、myPSB.myAltPCB.statusCode を使用します。

メッセージ・キューとしての印刷ファイルの使用

IMS/VS では、印刷ファイルをメッセージ・キューを関連付ける必要があります。 IMS BMP では、印刷ファイルをメッセージ・キューを関連付けることができます。 シリアル・ファイルをメッセージ・キューに関連付けるのと同じ方法で、 印刷ファイルをメッセージ・キューに関連付けます。 ただし、ファイル名が printer というリソース関連パーツについては、有効 なファイル・タイプは SMSGQ のみです。IMS システム定義において、ランタイム環境で使用するメッセージ・キュー名 を論理端末として定義する必要があります。 converseVar.printerAssociation を使用すると、実行時のプリント出力先を変更することができます。 例えば、各ユーザーが通常使用するユーザー ID とプリンター ID のテーブルを定義できます。 converseVar.printerAssociation を設定することによって、プログラム・ユーザーの近くのプリンターにプリンター出力を送ることができます。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.