IMS におけるシリアル・ファイルと印刷ファイルの使用

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

GSAM ファイルとしてのシリアル・ファイルの使用

IMS BMP または z/OS バッチ環境で実行する EGL プログラムは、シリアル・ファイルを GSAM ファイルとして実装できます。GSAM ファイルとして実装するシリアル・ファイルには、addget next、および close I/O ステートメントを使用できます。以下のリストに、GSAM ファイルの処理と通常のシリアル・ファイルの処理の違いを示します。
  • GSAM ファイルには DBD が必要です。
  • GSAM ファイルは、IMS PSB に PCB を必要とします。この PCB は、IMS ランタイム PSB、および EGL PSB 定義で定義する必要があります。プログラムでは、PSB レコード・パーツに基づくレコード変数を宣言する必要があります。
  • GSAM ファイルは DL/I 呼び出しにより読み取り/書き込みがされます。生成された COBOL プログラムは、要求された I/O ステートメントに基づいてこれを自動的に処理します。
  • GSAM ファイルは、DL/I データベースと同じ方法で、チェックポイント指定され、再開されます。 ただし、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 システム定義で定義されているトランザクション・コードの 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 ステートメントの結果の確認

シリアル・ファイルがメッセージ・キューまたは GSAM データベースに関連付けられている場合、生成されたプログラムは入出力操作を実装するために DL/I 呼び出しを発行します。DL/I 呼び出しが完了すると、Rational® COBOL Runtime for zSeries は以下の機能を実行します。
  • 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 状況コードに基づきレコードの状態が更新されます。
メッセージ・キューまたは GSAM に関連する DL/I 呼び出しの後に、dliVar フィールドは更新されません。 これらのフィールドは、DL/I セグメント・レコードにアクセスする関数の場合にのみ更新されます。これにより、CICS® 一時データ・キューまたは OS/VS シリアル・ファイル用に作成されたプログラムは、そのファイルが IMS 環境のメッセージ・キューまたは GSAM データベースに変更されても、整合性を維持したまま実行できます。 入出力エラー値を確認して、シリアル・ファイルで endOfFilenoRecordFound、またはその他のエラーが発生しているかどうかを判別してください。PCB からさらに詳細な情報を必要とする場合は、IO_PCBRecord または ALT_PCBRecord のフィールド名を使用します。PSB 変数 (名前は myPSB) が ALT_PCBRecord (名前は myAltPCB) を宣言して、リソース関連で myAltPCB を PCB 名として使用した状況を考えてみます。add ステートメントの後で DL/I 状況コードを参照するには、myPSB.myAltPCB.statusCode を使用します。
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 を設定すると、プリンター出力をプログラム・ユーザーに近いプリンターに送ることができます。


フィードバック