ファイル状態コードは、この COBOL システムでプログラムが実行したファイル操作の成否を示すために使用します。
ファイル状態コードの詳細なリストについては、ヘルプトピック 『ファイル状態コード』を参照してください。
ファイル状態は、ファイル操作結果 (成功、または、エラーの発生など) を示す 2 バイトのコードです。 エラーが発生した場合は、ファイル状態にはエラー原因も表示されます。
ファイルにファイル状態データ項目が定義されている場合は、ファイルに入出力操作 (OPEN、CLOSE、READ、WRITE、REWRITE、START、および DELETE) を行うたびに、ランタイム システムがファイル状態のデータ項目を更新し、操作結果を示します。
ファイル状態データ項目を定義するかどうかは選択できます。ファイル状態データ項目が宣言されていない場合に、重大なファイルエラーが発生すると、COBOL ランタイム システムはエラー メッセージを表示し、プログラムを中断します。
入出力操作が行われるたびに、ファイル状態データ項目を調べ、操作が成功したかどうかを確認してください。 たとえば、プログラムがディスクに書き込みを行っているときには、WRITE 操作を完了できる十分なディスク領域がない場合もあります。ファイル状態データ項目を定義していない場合に、ディスク容量が不足すると、ランタイム システムはエラー番号を表示し、プログラムを中断します。(書き込み中のファイルについて) ファイル状態のデータ項目を定義してある場合には、ファイル状態データ項目が更新され、プログラムの実行が継続されます。プログラムはファイル状態データ項目を調べ、ディスクがいっぱいであると判断すると、適切な措置を講じることができます。
ファイルに対して SELECT 句で FILE STATUS IS を指定し、作業場所節でファイル状態のデータ項目を定義すると、プログラムの各ファイルに、関連付けられたファイル状態のデータ項目を設定できます。
select in-file assign to "user.dat" file status is ws-file-status. ... working-storage section. 01 ws-file-status pic xx.
各ファイルで別個のデータ項目を使用することも、複数のファイルで 1 つのデータ項目を使用することも可能です。
ファイル状態は、2 バイトのコードです。拡張ファイル状態コード以外のファイル状態の規則では、データ項目は英数字 2 文字 (PIC XX) で指定します。 拡張ファイル状態コードの場合は、2 番目のバイトにはバイナリの数字が格納されます。
ファイル状態データ項目に格納された最初のバイトは、状態キー 1 と呼ばれ、入出力操作の結果として次のいずれかの状態を示します。
値 | 状態 |
---|---|
0 | 操作の成功 |
1 | ファイルの終わり |
2 | 無効なキー |
3 | 永続的なエラー |
4 | 論理エラー (入出力操作の順序が不適切) |
9 | COBOL ランタイム システム エラー メッセージ |
ファイル状態データ項目の最初のバイトが 9 以外である場合には、2 番目のバイト (状態キー 2 と呼ばれる) は英数字になります。
ファイル状態データ項目の最初のバイトが 9 である場合には、2 番目のバイトは、ランタイム システム エラーコードを含むバイナリフィールドになります。
次のコード例は、ファイル状態の確認方法を示します。まず、最初のバイト (状態キー 1) を調べ、より詳細な情報が必要な場合に 2 番目のバイト (状態キー 2) を確認します。
select recseq assign to "recseq.dat" file status is ws-file-status organization is record sequential. ... file section. fd recseq record contains 80 characters. 01 recseq-fd-record pic x(80). ... working-storage section. 01 ws-file-status. 05 status-key-1 pic x. 05 status-key-2 pic x. 05 binary-status redefines status-key-2 pic 99 comp-x. ... procedure division. ... perform check-status. ... check-status. evaluate status-key-1 when "0" next sentence when "1" display "ファイルの末尾に到達しました。" perform check-eof-status when "2" display "無効なキー" perform check-inv-key-status when "3" display "永続的エラー" perform check-perm-err-status when "4" display "論理エラー" when "9" display "ランタイム システム エラー" perform check-mf-error-message end-evaluate. ... check-eof-status. if status-key-2 = "0" display "論理レコードがありません。" end-if. ... check-inv-key-status. evaluate status-key-2 when "2" display "重複キーを作成しようとしています。" when "3" display "レコードが見つかりません。" end-evaluate. ... check-perm-err-status. if status-key-2 = "5" display "ファイルが見つかりません。" end-if. ... check-mf-error-message. evaluate binary-status when 002 display "ファイルを開けません。" when 007 display "ディスク領域が不足しています。" when 013 display "ファイルが見つかりません。" when 024 display "ディスクエラー" when 065 display "ファイルがロックされています。" when 068 display "レコードがロックされています。" when 039 display "レコードが一致しません。" when 146 display "現在のレコードがありません。" when 180 display "ファイル形式が正しくありません。" when 208 display "ネットワークエラー" when 213 display "ロックが多すぎます。" when other display "エラー状態ではありません。" display binary-status end-evaluate.
この COBOL システムでは、ファイル状態の規則を数多くサポートしています。 各規則では、コードを個別に定義していますが、規則の間で重複するものもあります。
サポートされている規則を次に示します。
ANSI'85 の操作用に読み込まれた標準システムを使用している場合は、デフォルトでは、ANSI'85 ファイル状態コードが作成されます。
コンパイラ指令 NOANS85 でプログラムをコンパイルする場合は、ANSI'74 ファイル状態コードが作成されます。
ANSI'74 ファイル状態コードが作成されている場合に ANSI'85 構文を使用するには、NOANS85 コンパイラ指令を ANS85"SYNTAX" に置き換えてください。
エミュレーションを行うために、ANSI'85 と ANSI'74 以外のファイル状態コードが返されるように設定できます。この設定を行うには、次の手順を実行します。
コンパイラ | CONVERTSTATUS= |
---|---|
Ryan MacFarland COBOL | rmstat |
IBM メインフレーム COBOL | hoststat |
Microsoft COBOL V2 | msstat |
CONVERTSTATUS パラメーターは、ファイル ハンドラー構成ファイル extfh.cfg に追加できます。詳細については、『ファイル ハンドラーの構成』の章を参照してください。
コンパイラ | オブジェクト |
---|---|
Ryan MacFarland COBOL | rmstat.obj |
IBM メインフレーム COBOL | hoststat.obj |
Microsoft COBOL V2 | msstat.obj |
注:Microsoft COBOL V2 ファイル状態コードのリストについては、ヘルプトピック 『Microsoft COBOL V2 のファイル状態コード』を参照してください。
ANSI'74 と ANSI'85 のファイル状態規則は、拡張ファイル状態コードで拡張されます。拡張ファイル状態コードでは、ファイル状態の最初のバイトが "9" になります。 2 番目のバイトはバイナリ (COMP-X) の数字で、ランタイム システム エラー番号と同じになります。
拡張ファイル状態コードは、9/nnn のように表示されます。nnn は 2 番目のバイトのバイナリの数字を指します。
たとえば、ディスクにファイルを書き込んでいるときにディスク容量が足りなくなった場合は、ANSI'74 ファイル状態は "30" になります。これは、次に示すエラー メッセージに変換されます。
永続的エラー。これ以外の情報はありません。
このエラー メッセージは非常に一般的です。"永続的エラー" は、ディスクに障害がある、またはディスクドライブのふたが開いていることを示します。この COBOL システムでは、包括的なファイル状態を返すのではなく、拡張ファイル状態 9/007 を返します。最初のバイトの文字 "9" と 2 番目のバイトのバイナリ値 7 を合わせると、「ディスクがいっぱいです。」という意味になります。
ANSI'74 または ANSI'85 のファイル状態コードを使用している場合に、より具体的な拡張ファイル状態があると、ランタイム システムは拡張ファイル状態コードを返します。詳細については、ヘルプトピック 『拡張ファイル状態コード』を参照してください。
次のコード例は、標準のファイル状態を拡張ファイル状態として使用できるように再定義する方法を示します。この例では、入力ファイルが存在しないことが想定されています。そのため、OPEN INPUT 文を実行すると、9/013 (「ファイルが見つかりません。」) というファイル状態が返されます。
select in-file assign to "user.dat". file status is file-status. ... working-storage section. 01 file-status. 05 status-key-1 pic x. 05 status-key-2 pic x. 05 status-key-2-binary redefines status-key-2 pic 99 comp-x. ... procedure division. open input in-file if file-status not = "00" if status-key-1 = "9" if status-key-2-binary = 13 display "ファイルが見つかりません。" ...
拡張ファイル状態コードを表示するには、最大値 255 を格納できる大きさの表示フィールドにファイル状態データ項目の 2 番目のバイトを移動する必要があります。
select in-file assign to "user.dat" file status is file-status. ... working-storage section. 01 ans74-file-status. 05 status-key-1 pic x. 05 status-key-2 pic x. 05 status-key-2-binary redefines status-key-2 pic 99 comp-x. 01 display-ext-status 05 filler pic xx value "9/" 05 display-key 2 pic 999 ... procedure division. open input in-file if file-status not = "00" display "エラー。ファイル状態 =" with no advancing if status-key-1 = "9" move status-key-2-binary to display-key-2 display display-ext-status else display file-status end-if end-if