ANSI'74 および ANSI'85 のファイル状態規則は、拡張ファイル状態コードによって拡張されます。拡張ファイル状態コードでは、ファイル状態の最初のバイトが「9」という文字になります。2 番目のバイトはバイナリ (COMP-X) の数字で、ランタイム システム エラー番号と同じになります。
拡張ファイル状態コードは、9/nnn のように記述されます。nnn は 2 番目のバイトのバイナリの数字です。
たとえば、ディスクにファイルを書き込んでいる際にディスク容量が足りなくなった場合、ANSI'74 ファイル状態は「30」になります。これは、以下のエラー メッセージに変換されます。
Permanent error - no other information is available
このエラー メッセージは非常に概略的です。「Permanent error (永続的エラー)」は、ディスクに障害がある、またはディスク ドライブのトレイが開いていることを示します。そのため、この COBOL システムでは概略的なファイル状態を返すのではなく、拡張ファイル状態コード 9/007 を返します。最初のバイトの文字「9」および 2 番目のバイトのバイナリ値 7 を組み合わせると、「ディスクがいっぱいです」という意味になります。
このコードを 16 進数で表示する場合、ファイル状態コードは 3232 のような 16 進数値になります。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"
...
拡張ファイル状態コードを表示するには、以下のようにして、ファイル状態データ項目の 2 番目のバイトを、最大値 255 を格納できる大きさの表示フィールドに移動する必要があります。
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