【COBOL学習|豆知識】COBOLの組込関数「INTEGER-OF-DAY」で日付の妥当性チェックをスマートに実装する

1. 導入:なぜ日付チェックが重要なのか

COBOLでの基幹システム開発において、日付データの扱いは避けて通れない道です。特に外部から受け取ったYYYYDDD形式(ユリウス日)のデータが、実在する日付かどうかの検証はシステムの安定稼働に直結します。従来はうるう年を考慮した複雑なロジックを自前で実装していましたが、組込関数「INTEGER-OF-DAY」を活用すれば、たった一行で堅牢なバリデーションが実現できます。

2. 基礎知識:INTEGER-OF-DAYとは

「INTEGER-OF-DAY」は、YYYYMMDD形式の日付を、西暦1年1月1日を1とした通算の整数値(整数日)に変換する関数です。しかし、この関数の隠れた重要機能として「バリデーション機能」があります。引数に渡した日付が暦として不正(例:13月や、367日目など)な場合、この関数は戻り値として「0」を返します。この挙動を利用することで、別途日付チェック専用のサブルーチンを用意せずとも、データ変換と検証を同時に行うことが可能です。

3. 実装・解決策

実装方法は非常にシンプルです。変換後の結果を保持する変数が「0」であるかどうかをIF文で判定するだけです。もし「0」であれば、それは入力値が暦として存在しないことを意味するため、エラー処理ルーチンへ分岐させます。

4. サンプルプログラム

以下は、入力されたユリウス日(YYYYDDD形式)を検証し、エラー判定を行うコード例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-VAL-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-DATE PIC 9(7) VALUE 2023400. > 不正な日付(400日目)
01 WS-RESULT-VAL PIC 9(9).

PROCEDURE DIVISION.
> 関数を実行し、戻り値をチェックする
COMPUTE WS-RESULT-VAL = FUNCTION INTEGER-OF-DAY(WS-INPUT-DATE).

IF WS-RESULT-VAL = 0 THEN
DISPLAY “エラー:入力された日付は妥当ではありません。”
PERFORM ERROR-ROUTINE
ELSE
DISPLAY “正常:日付は妥当です。通算日:” WS-RESULT-VAL
END-IF.

STOP RUN.

ERROR-ROUTINE.
> エラー時の処理をここに記述します
CONTINUE.

5. 応用・注意点

現場での実務における注意点は以下の2点です。

第一に、入力形式の厳密性です。
INTEGER-OF-DAYは、引数が正しい形式(YYYYDDD)で与えられていることを前提としています。もし桁数が足りなかったり、数字以外の文字が混入していたりする場合は、関数に渡す前にPIC句やNUMVAL関数等で型チェックを済ませておくのが安全です。

第二に、西暦の範囲です。
この関数は、1600年3月1日から8000年までの日付をサポートしています。それ以前の歴史的な日付を扱う場合には別のロジックが必要となるため、システムが扱う日付範囲を事前に確認してください。

この手法を知っておくと、コードの可読性が格段に向上し、バグの混入リスクも減らせます。ぜひ、保守現場のコード整理に役立ててください。

コメント

タイトルとURLをコピーしました