1. 導入:なぜ曜日判定が重要なのか
基幹システムのバッチ処理において、「特定の曜日だけ実行する処理」や「営業日カレンダーとの突き合わせ」は避けて通れません。COBOLの組込関数「FUNCTION DAY-OF-WEEK」は非常に便利ですが、他言語(JavaやPythonなど)の曜日判定仕様と混同すると、致命的なバグの原因となります。今回は、現場で安全に曜日を扱うためのマッピング手法を解説します。
2. 基礎知識:DAY-OF-WEEKの仕様
この関数は、引数に指定した日付(YYYYMMDD形式)に対し、整数値を返します。重要なのは、返却される値のルールです。
戻り値:1(月)〜 7(日)
多くのプログラミング言語では日曜を「0」や「1」とすることが多いですが、COBOLの標準仕様では「1=月曜」から始まり「7=日曜」で終わります。この「日曜が7である」という点が、条件分岐ミスを引き起こしやすいポイントです。
3. 実装・解決策:テーブルを活用した直感的な判定
if文で「IF WS-DAY = 7 THEN…」と書くことも可能ですが、可読性を高め、メンテナンスを容易にするために「テーブル(配列)」を用いたマッピングを推奨します。これにより、数値と曜日文字列を直感的に結びつけることができます。
4. サンプルプログラム
以下のコードは、現在日付から曜日を算出し、日本語の曜日名称に変換する実用的な例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. DAY-CHECK-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CURRENT-DATE PIC X(8).
01 WS-DAY-NUM PIC 9(1).
01 WS-DAY-TABLE.
05 FILLER PIC X(3) VALUE ‘月曜’.
05 FILLER PIC X(3) VALUE ‘火曜’.
05 FILLER PIC X(3) VALUE ‘水曜’.
05 FILLER PIC X(3) VALUE ‘木曜’.
05 FILLER PIC X(3) VALUE ‘金曜’.
05 FILLER PIC X(3) VALUE ‘土曜’.
05 FILLER PIC X(3) VALUE ‘日曜’.
01 WS-DAY-NAMES REDEFINES WS-DAY-TABLE PIC X(3) OCCURS 7 TIMES.
PROCEDURE DIVISION.
> システム日付の取得 (YYYYMMDD)
ACCEPT WS-CURRENT-DATE FROM DATE YYYYMMDD.
> 曜日の数値を算出 (1:月 ~ 7:日)
COMPUTE WS-DAY-NUM = FUNCTION DAY-OF-WEEK(WS-CURRENT-DATE).
> テーブル参照で曜日名称を表示
DISPLAY “今日は ” WS-DAY-NAMES(WS-DAY-NUM) ” です。”
GOBACK.
5. 応用・注意点:現場でのバグ回避
現場でよくある失敗は、外部インターフェースとの突き合わせです。例えば、他システムから送られてくるCSVデータが「日曜=0」という仕様だった場合、そのままのロジックで比較すると土日がズレてしまいます。
・定数化の徹底:プログラム内で直接数字(1や7)を記述せず、88レベルの条件名(例:88 IS-SUNDAY VALUE 7)を定義しておくと、後から仕様変更が入った際も修正箇所を最小限に抑えられます。
・日付の妥当性チェック:FUNCTION DAY-OF-WEEKに不正な日付(存在しない2月30日など)を渡すと、ランタイムエラーになる可能性があります。必ず事前にFUNCTION TEST-DATE-YYYYMMDDなどで日付の有効性をチェックする癖をつけましょう。

コメント