導入
ファイルが存在しなかったり、ディスクの空き容量が足りなかったりすると、OPEN・READ・WRITEは失敗することがあります。COBOLでは、こうしたファイル操作の成否を FILE STATUS という仕組みで確認できます。
説明
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO "sales.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS WS-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD SALES-FILE.
01 SALES-RECORD PIC X(20).
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC X(2).
PROCEDURE DIVISION.
OPEN INPUT SALES-FILE.
IF WS-FILE-STATUS NOT = "00"
DISPLAY "ファイルを開けませんでした。ステータス: "
WS-FILE-STATUS
STOP RUN
END-IF.
FILE STATUS IS WS-FILE-STATUS.… SELECT文に追加すると、ファイル操作(OPEN/READ/WRITE/CLOSEなど)のたびに、その結果を示す2桁のコードがWS-FILE-STATUSに自動的に設定されるようになります。"00"… 正常終了を表す、最も基本的なステータスコード。
代表的なFILE STATUSコードは次のとおりです。
| コード | 意味 |
|---|---|
00 | 正常終了 |
10 | ファイルの終わりに達した(READのAT ENDと連動) |
23 | 指定したキーのレコードが見つからない(索引編成ファイルなどで) |
35 | OPEN INPUTしようとしたファイルが存在しない |
37 | ファイルを開くパーミッションがない、など |
FILE STATUSを毎回チェックする習慣を付けておくと、「ファイルが見つからないのに気づかずそのまま処理を続けてしまう」といった事故を防げます。特に本番のバッチ処理では、エラーを検知したら安全に処理を止める(あるいはログに記録して次の対応につなげる) ことが重要です。
*> READでもFILE STATUSを確認する典型パターン
READ SALES-FILE.
EVALUATE WS-FILE-STATUS
WHEN "00"
DISPLAY "読み込み成功"
WHEN "10"
DISPLAY "ファイルの終わりです"
WHEN OTHER
DISPLAY "予期しないエラー: " WS-FILE-STATUS
STOP RUN
END-EVALUATE.
第3章のEVALUATE文が、ここでもエラーハンドリングの整理に活躍していますね。FILE STATUSは、次章で学ぶ索引編成ファイルの INVALID KEY とあわせて、実務のCOBOLプログラムでは欠かせないエラーハンドリングの基本です。
試すには
存在しないファイル名を ASSIGN TO に指定して OPEN INPUT した場合、WS-FILE-STATUS にどんなコード(35など)が入るか、環境があれば実際に試してみましょう。FILE STATUSを見ずに処理を進めてしまうと、どんな問題が起きそうか考えてみるのも良い練習です。