ファイル状態データ項目の定義

ファイルに対して 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 "end of file reached"
         perform check-eof-status
      when "2" 
         display "invalid key"
         perform check-inv-key-status
      when "3" 
         display "permanent error"
         perform check-perm-err-status
      when "4" 
         display "logic error"
      when "9" 
         display "run-time-system error"
         perform check-mf-error-message
     end-evaluate.
     ...
 check-eof-status.
     if status-key-2 = "0"
         display "no next logical record"
     end-if.
     ...
 check-inv-key-status.
     evaluate status-key-2
        when "2" display "attempt to write dup key"
        when "3" display "no record found"
     end-evaluate.
     ...
 check-perm-err-status.
     if status-key-2 = "5"
         display "file not found"
     end-if.
     ...
 check-mf-error-message.
     evaluate binary-status
      when 002 display "file not open       "
      when 007 display "disk space exhausted"
      when 013 display "file not found      "
      when 024 display "disk error          "
      when 065 display "file locked         "
      when 068 display "record locked       "
      when 039 display "record inconsistent "
      when 146 display "no current record   "
      when 180 display "file malformed      "
      when 208 display "network error       "
      when 213 display "too many locks      "
      when other 
         display "not error status " 
         display binary-status
     end-evaluate.