導入:なぜFORMAT句を使うのか?
COBOLのベテランとして長年現場を見てきましたが、日付処理ほど「バグの温床」になりやすい箇所はありません。昔ながらのPIC 9(8)で日付を管理していると、うるう年の判定や「翌月末」の計算、あるいは日付の妥当性チェックを行うたびに、複雑なロジックを自前で書く必要がありました。
COBOL 2002以降で導入されたFORMAT句を使えば、システムがその変数を「日付」として正しく認識してくれるため、面倒な計算や判定を言語側に任せることができます。これは保守性を高め、バグを未然に防ぐための非常に重要なステップです。
基礎知識:ネイティブな「日時型」とは
従来のCOBOLでは、日付は単なる数字(数値)や文字列の羅列に過ぎませんでした。そのため、コンピュータは「20231231」が日付であることを知らず、ただの「約2300万」という数値として扱っていました。
一方、FORMAT句を用いた定義は、その変数を「日付型(DATE型)」として宣言します。これにより、コンパイラは「これはYYYY-MM-DDという形式の日付である」と理解します。その結果、日付の比較や、特定の日付が正しいかどうかの検証が、非常に簡潔に記述できるようになります。
実装/解決策:FORMAT句の基本
定義方法は非常にシンプルです。データ項目を宣言する際に、PIC句の代わりにFORMAT句を指定するだけです。
05 WS-DATE FORMAT DATE “YYYY-MM-DD”.
これだけで、WS-DATEには「2023-10-27」のような形式の日付しか受け付けないという制約や、日付として比較するためのメタデータが付与されます。
サンプルプログラム
以下のコードは、FORMAT句を使って日付を定義し、値の代入と簡単なチェックを行う例です。そのままコピーして動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 日付型として定義(YYYY-MM-DD形式)
05 WS-START-DATE FORMAT DATE “YYYY-MM-DD”.
- 比較用の一時変数
05 WS-CHECK-DATE FORMAT DATE “YYYY-MM-DD”.
PROCEDURE DIVISION.
MAIN-LOGIC.
- 日付をセット(文字列として代入しても型変換されます)
MOVE “2023-01-01” TO WS-START-DATE.
DISPLAY “基準日: ” WS-START-DATE.
- 日付の比較(数値や文字列変換を意識せずに比較可能)
MOVE “2023-12-31” TO WS-CHECK-DATE.
IF WS-CHECK-DATE > WS-START-DATE THEN
DISPLAY “WS-CHECK-DATEの方が未来の日付です。”
END-IF.
- 妥当性チェック(コンパイラが日付として正しいか判断)
MOVE “2023-02-30” TO WS-CHECK-DATE.
IF WS-CHECK-DATE IS NOT VALID DATE THEN
DISPLAY “エラー:2023年2月30日は存在しません!”
END-IF.
STOP RUN.
応用・注意点:現場で役立つアドバイス
注意点として、FORMAT句で定義した変数は、従来のMOVE文だけでなく、日付専用の演算命令(DATEVALなど)と組み合わせることで真価を発揮します。
また、レガシーなシステム(PIC X(8)などで日付を保持している古いファイル)と連携する場合は、そのままでは代入できないことがあります。その際は、一度日付専用の変数に変換してから処理を行うようにしてください。
「型」を意識したプログラミングは、現代のCOBOL開発において最も効率的な自己防衛術です。ぜひ、新しいプログラムから積極的に取り入れてみてください。

コメント