IMS でのシリアル・ファイルおよび印刷ファイルの使用
シリアル・ファイルは、IMS/VS では IMS™ メッセージ・キューとして実装する必要があります。IMS BMP の場合は、シリアル・ファイルはメッセージ・キュー、OS/VS ファイル、VSAM ファイル、または GSAM ファイルとして実装できます。 z/OS® バッチの場合は、シリアル・ファイルは OS/VS ファイル、VSAM ファイル、または GSAM ファイルとして実装できます。 以下では、GSAM ファイルまたはメッセージ・キューにシリアル・ファイルを使用する場合について論じます。
GSAM ファイルとしてのシリアル・ファイルの使用
- GSAM ファイルには DBD が必要です。
- GSAM ファイルは、IMS PSB に PCB を必要とします。この PCB は、IMS ランタイム PSB、および EGL PSB 定義で定義する必要があります。プログラムでは、PSB レコード・パーツに基づくレコード変数を宣言する必要があります。
- GSAM ファイルは DL/I 呼び出しにより読み取り/書き込みがされます。生成された COBOL プログラムは、要求された I/O ステートメントに基づいてこれを自動的に処理します。
- GSAM ファイルは、DL/I データベースと同じ方法で、チェックポイント指定され、再開されます。 ただし、GSAM ファイルをリカバリーするには、 基本チェックポイントに代えて、シンボリック・チェックポイントを使用し、再開する必要があります。
シリアル・ファイルまたは印刷ファイルを GSAM ファイルとして識別します。それには、生成中にリソース関連パーツを使用して、GSAM のファイル・タイプと PCB 名を指定します。
- リソース名
- サンプルのランタイム 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 の場合は、すべてのシリアル・ファイルと印刷ファイルをメッセージ・キューに関連付ける必要があります。メッセージ・キューに関連付けることができるのは、単一の入力ファイルだけです。
- リソース名
印刷ファイル・データまたはシリアル・ファイル・データの 1 文字から 8 文字の宛先 ID を示す必要があります。この名前は、IMS 論理端末の ID、または IMS システム定義で定義されているトランザクション・コードの ID に一致する必要があります。
ファイル名は、メッセージ・キューのデフォルトのリソース名です。リソース関連パーツ内のこのデフォルトは上書きできます。
選択した PCB が、変更可能な代替 PCB または特別代替 PCB の場合、プログラムで record.resourceAssociation (ファイルの場合) または converseVar.printerAssociation (プリンターの場合) の値を設定すると、実行時にデフォルトのメッセージ・キューを上書きできます。record.resourceAssociation は、ローカル変数として扱われます。あるプログラムでレコードに record.resourceAssociation を設定しても、別のプログラム内の record.resourceAssociation には影響しません。add ステートメントは、そのプログラムの record.resourceAssociation の設定値で識別されるメッセージ・キューに書き込まれます。
- メッセージ・キューのタイプ
- 単一セグメントのメッセージ・キューまたは複数セグメントのメッセージ・キューを指定できます。
- 単一セグメントのメッセージ・キュー (SMSGQ)
- 単一セグメントのメッセージ・キューの場合、追加するレコード、または (get next を使用して) シリアル・ファイルから読み取るレコードは、それぞれ完全なメッセージである必要があります。生成された COBOL プログラムは、単一セグメントのメッセージ・キューに追加されるレコード間で IMS PURG 呼び出しを発行します。生成された COBOL プログラムは、get next ステートメントごとに IMS get unique を発行します。
- 複数セグメントのメッセージ・キュー (MMSGQ)
複数セグメントメッセージ・キューの場合、シリアル・ファイルへの一連の追加は、各 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 名としては、入力 PCB に割り当てられている名前を指定する必要があります。入力 PCB は、入力に使用される唯一のメッセージ・キューです。シリアル入力ファイルを使用する場合は、メインのバッチ・プログラムまたは呼び出し先バッチ・プログラムを使用する必要があります。生成されたプログラムは、メインの textUI プログラムのすべての入出力 PCB ロジックを処理します。
シリアル出力ファイルには PCB 名を指定できます。PCB 名は、代替 PCB レコードに割り当てられている名前である必要があります。デフォルトの PCB 名は、PSB 内の最初の代替 PCB の名前です。出力を入出力 PCB に送信できるのは、以下のいずれかのシステム関数を使用した場合のみです。- vgLib.VGTDLI()
- dliLib.AIBTDLI()
- dliLib.EGLTDLI()
メッセージ・キューで使用するレコードの定義
メッセージ・キューに関連付けるシリアル・レコードを定義する場合は、プログラム・データのみを定義する必要があります。生成された COBOL プログラムでは、add ステートメントについて IMS メッセージ・ヘッダー (長さ、ZZ、 およびトランザクション・コード) を追加し、get next ステートメントについてはこれを除去します。
シリアル・ファイルの I/O ステートメントの結果の確認
- get next ステートメントの場合、レコードの状態は DL/I 状況コードに基づいて設定されます。生成されたプログラムが入出力 PCB に対して GU 呼び出しを発行すると、sysVar.sessionID および sysVar.userID フィールドが、入出力 PCB のユーザー ID フィールドを基に更新されます。このような更新は、複数セグメントのメッセージ・キュー (MMSGQ) として定義されているシリアル・ファイルに対して最初の get next ステートメントが発行されたとき、および単一セグメントのメッセージ・キュー (SMSGQ) に対して get next ステートメントが発行されるたびに行われます。EGL の sysVar.transactionID フィールドは、get next ステートメントが発行され、入出力 PCB に対して GU 呼び出しが行われるたびに、IMS メッセージ・ヘッダー内のトランザクション名に基づいて更新されます。
- add ステートメントまたは close ステートメントについては、 DL/I 状況コードに基づきレコードの状態が更新されます。
| EGL I/O エラー・コード | IMS メッセージ・キューの状況コード | 重大度 |
|---|---|---|
| endOfFile | QC | ソフト |
| noRecordFound | QD | ソフト |
| ioError | 非ブランクの任意の状況コード | ハードまたはソフト |
| hardIOError | QC、QD、CE、CF、CG、CI、CJ、CK、CL 以外の非ブランクの状況コード | ハード |
| EGL I/O エラー・コード | GSAM 状況コード | 重大度 |
| endOfFile | GB | ソフト |
| ioError | 非ブランクの任意の状況コード | ハードまたはソフト |
| hardIOError | GB 以外の非ブランクの状況コード | ハード |
メッセージ・キューとして印刷ファイルを使用
IMS/VS の場合は、印刷ファイルをメッセージ・キューに関連づける必要があります。IMS BMP の場合は、印刷ファイルをメッセージ・キューに関連付けることができます。印刷ファイルをメッセージ・キューに関連付ける方法は、シリアル・ファイルをメッセージ・キューに関連付ける方法と同じです。ただし、ファイル名が「printer」であるリソース関連で有効なファイル・タイプは SMSGQ のみです。IMS システム定義では、ランタイム環境で使用するメッセージ・キューの名前を論理端末として定義する必要があります。 converseVar.printerAssociation を使用すると、実行時にプリント出力先を変更できます。例えば、ユーザー ID、および各ユーザーが通常使用するプリンター ID のテーブルを定義することができます。converseVar.printerAssociation を設定すると、プリンター出力をプログラム・ユーザーに近いプリンターに送ることができます。