ファイル状態

ファイル状態コードは、この 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 の操作用に読み込まれた標準システムを使用している場合は、デフォルトでは、ANSI'85 ファイル状態コードが作成されます。

ANSI'74 ファイル状態

コンパイラ指令 NOANS85 でプログラムをコンパイルする場合は、ANSI'74 ファイル状態コードが作成されます。

ANSI'74 ファイル状態コードが作成されている場合に ANSI'85 構文を使用するには、NOANS85 コンパイラ指令を ANS85"SYNTAX" に置き換えてください。

ファイル状態の規則

エミュレーションを行うために、ANSI'85 と ANSI'74 以外のファイル状態コードが返されるように設定できます。この設定を行うには、次の手順を実行します。

  1. CONVERTSTATUS ファイルハンドラ構成オプションを使用して、返される状態値をマップするために呼び出されるプログラムの名前を指定します。 このプログラム名は、コンパイラのタイプによって異なります。
    コンパイラ CONVERTSTATUS=
    Ryan MacFarland COBOL rmstat
    IBM メインフレーム COBOL hoststat
    Microsoft COBOL V2 msstat

    CONVERTSTATUS パラメータは、ファイルハンドラ構成ファイル extfh.cfg に追加できます。詳細については、『ファイルハンドラの構成』の章を参照してください。

  2. リンク付きのアプリケーションを作成している場合は、オブジェクトをアプリケーションにリンクします。 リンクするオブジェクトは、コンパイラによって異なります。
    コンパイラ オブジェクト
    Ryan MacFarland COBOL rmstat.obj
    IBM メインフレーム COBOL hoststat.obj
    Microsoft COBOL V2 msstat.obj
  3. コンパイルする際には、次のコンパイラ指令を使用します。
    • NOANS85
    • COBFSTATCONV

注: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
関連情報
はじめに
ファイル編成
ファイル名
ファイルの共有
ファイルハンドラの構成
ファイルハンドラおよびソート API
データとキーの圧縮
ファイル操作のトレース