拡張ファイル状態コード

ANSI'74 と ANSI'85 のファイル状態規則は、拡張ファイル状態コードで拡張されます。拡張ファイル状態コードでは、ファイル状態の最初のバイトが "9" になります。2 番目のバイトはバイナリ (COMP-X) の数字で、ランタイム システム エラー番号と同じになります。

拡張ファイル状態コードは、9/nnn のように表示されます。nnn は 2 番目のバイトのバイナリの数字を指します。

たとえば、ディスクにファイルを書き込んでいる際にディスク容量が足りなくなった場合は、ANSI'74 ファイル状態は "30" になります。これは、次に示すエラー メッセージに変換されます。

Permanent error - no other information is available

このエラー メッセージは非常に一般的です。「永続的エラー」は、ディスクに障害がある、またはディスク ドライブのふたが開いていることを示します。この COBOL システムでは、包括的なファイル状態を返すのではなく、拡張ファイル状態 9/007 を返します。最初のバイトの文字 "9" と 2 番目のバイトのバイナリ値 7 を合わせると、「ディスクがいっぱいです。」という意味になります。

注:ファイル状態コードが適切に返される場合、9/nnn という形式になります (例:9/009)。

このコードが 16 進数で表示される場合、ファイル状態コードは 3232 のような数値になります。10 進数で表示される場合、このコードは 12850 という数値になります。10 進数で正しいランタイム システム エラーを判別するには、まず 10 進数値を 16 進数に変換してから、正しいエラー コードを取得する必要があります。

たとえば、ファイル状態の値が 14657 の場合、これは 10 進数値です。これを 16 進数に変換すると、3941 になります。ランタイム システムのエラー コードを調べるには、この数値の下 2 桁 (41) を 10 進数に変換する必要があります。これにより、拡張ファイル状態コードは「9/065」になり、エラー コードは COBRT065 (ファイルがロックされている) であるとわかります。

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 "File not found"
        ...

拡張ファイル状態コードを表示するには、最大値 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 "Error. File status =" 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