導入:なぜREWRITEをEND-REWRITEで囲むのか?
COBOLでファイル内のレコードを更新する際、皆さんは「どの範囲までが更新命令なのか」を明確にしていますか?かつてはREWRITE文の後にピリオドを打つだけで処理を完結させていましたが、これでは意図しない範囲まで命令が及んだり、エラー時の処理が複雑化したりする原因になります。今回紹介する「REWRITE … END-REWRITE」という構造化制御構文を使うことで、コードの可読性が劇的に向上し、バグの混入を防ぐことができます。
基礎知識:REWRITE文と構造化の重要性
REWRITE文は、オープンしたファイルから読み込んだ直後のレコードを、プログラム内のデータで上書きする命令です。ここで重要なのが「構造化」です。従来のCOBOLでは命令の終わりがピリオド(.)で決まっていましたが、これだと「どこで処理が完結したか」が見た目で分かりにくいという欠点がありました。END-REWRITEを明示することで、その命令がどこで終わるのかが明確になり、IF文などの他の制御構文と組み合わせても、処理のネスト(入れ子)構造が崩れにくくなります。
実装:REWRITEの範囲を限定するメリット
REWRITEをEND-REWRITEで囲む最大のメリットは、エラー判定の局所化にあります。例えば、更新が失敗した際に実行するINVALID KEY処理を、そのREWRITE文の中だけに閉じ込めることができます。これにより、プログラム全体がスッキリし、修正時に他のコードへ悪影響を与えるリスクを最小限に抑えられます。
サンプルプログラム:安全なレコード更新処理
以下のサンプルコードは、在庫ファイルを読み込み、特定の条件で更新を行う例です。そのままコピー&ペーストして、皆さんの環境で試してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. REWRITE-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STOCK-FILE ASSIGN TO ‘STOCK.DAT’
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS ITEM-CODE.
DATA DIVISION.
FILE SECTION.
FD STOCK-FILE.
01 STOCK-REC.
05 ITEM-CODE PIC X(5).
05 STOCK-QTY PIC 9(5).
PROCEDURE DIVISION.
- レコードの更新処理
REWRITE STOCK-REC
- 更新成功時の処理
NOT INVALID KEY
DISPLAY “更新完了: ” ITEM-CODE
- 更新失敗(キーが見つからない等)時の処理
INVALID KEY
DISPLAY “エラー: 更新できませんでした”
END-REWRITE.
- ここ以降はREWRITEの影響を受けないため安全です
STOP RUN.
応用・注意点:現場での活用テクニック
現場でこの書き方をする際に意識してほしいのは、「INVALID KEY」の活用です。END-REWRITEを使うことで、このINVALID KEYのブロックを非常に見やすく配置できます。
注意点として、古いコンパイラを使用している環境では、END-REWRITEがサポートされていない場合があります。もしコンパイルエラーになる場合は、お使いの環境が「COBOL 85」以降の標準仕様に対応しているか確認してください。また、REWRITEの直後には必ずピリオドを忘れないようにしましょう。構造化構文を使うことで、より堅牢で保守しやすいプログラムを目指していきましょう。

コメント