外部システムやCSV・Excelから日付を取り込むときは、値が8桁でも実在する日付とは限りません。たとえば 20230229 や 20240431 は日付として不正です。ABAPでは汎用モジュール DATE_CHECK_PLAUSIBILITY を使い、日付の妥当性を確認できます。
DATE_CHECK_PLAUSIBILITYで確認できること
DATE にABAPの日付型(TYPE d)を渡します。妥当な日付なら sy-subrc = 0、存在しない日付なら例外 PLAUSIBILITY_CHECK_FAILED を受けて sy-subrc = 1 で判定できます。TYPE d の変数に代入できたことだけでは、実在する日付と確認したことにはなりません。
このチェックは暦上の妥当性を調べるためのものです。会社の営業日・祝日判定や、伝票転記期間の確認には別の判定が必要です。結果は sy-subrc で分岐し、0 は有効、1 は PLAUSIBILITY_CHECK_FAILED、2 はその他の例外として扱います。「0以外はすべて不正日付」とまとめず、想定外のエラーを区別しましょう。
ABAPコード例:外部入力の日付をチェックする
次の例は、外部から受け取った8桁の値を想定しています。先に入力形式と未設定値を確認し、その後に汎用モジュールを呼び出します。
REPORT zdate_check_sample.
DATA lv_input TYPE string VALUE '20240229'.
DATA lv_date TYPE d.
START-OF-SELECTION.
"外部入力の形式を先に確認する
IF strlen( lv_input ) <> 8 OR lv_input CN '0123456789'.
WRITE: / 'YYYYMMDDの8桁数字で指定してください。'.
RETURN.
ENDIF.
lv_date = lv_input.
IF lv_date IS INITIAL.
WRITE: / '日付が未設定です。'.
RETURN.
ENDIF.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = lv_date
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
CASE sy-subrc.
WHEN 0.
WRITE: / lv_input, 'は有効な日付です。'.
WHEN 1.
WRITE: / lv_input, 'は存在しない日付です。'.
WHEN OTHERS.
WRITE: / '日付チェックでエラーが発生しました。'.
ENDCASE.
入力値が 20240229 ならうるう日のため有効です。20230229 に変更すると、暦上存在しない日付として処理されます。sy-subrc は汎用モジュールの直後に判定してください。後続の処理によって値が変わる可能性があります。
判定前に確認したい入力例
20240229:有効。2024年はうるう年です。20230229:不正。2023年の2月は28日までです。20240431:不正。4月は30日までです。00000000:未設定値として、業務上の必須・任意に応じて先に扱いを決めます。2024/02/29:そのままではYYYYMMDDの8桁形式ではありません。書式を変換してから日付チェックを行います。
実務での使い分けと注意点
選択画面の TYPE d の日付項目では、SAP標準の入力チェックが働きます。一方、ファイルや外部インターフェースから受け取る文字列には、その画面チェックは働きません。自分のプログラムで YYYYMMDD の形式、初期値、暦上の妥当性を順に確認します。入力が任意なら初期値を許容するかを仕様で決め、必須ならエラーとして扱います。
複数行の取込処理では、不正日付の行番号と元の入力値をエラーログに残すと修正しやすくなります。曜日や月末日を計算する処理は、日付チェックに通った値に対して実行してください。
CDS・ABAP SQLで判定したい場合
この汎用モジュールはABAPプログラム内で使う例です。CDSやABAP SQLの式で日付を判定する要件では、対応する環境なら日付関数 DATS_IS_VALID も選択肢になります。こちらは有効な日付に 1、無効な日付に 0 を返す関数で、DATE_CHECK_PLAUSIBILITY の sy-subrc とは判定方法が異なります。使用可能なリリースと実行場所を確認して使い分けてください。
まとめ
DATE_CHECK_PLAUSIBILITY は、日付型の値が暦上存在するかを確認する汎用モジュールです。外部入力では、書式・初期値を先に確認し、呼び出し直後の sy-subrc で結果を分岐させましょう。
参考・関連記事
- ABAPで西暦を和暦に変換する方法|CONVERSION_EXIT_JPDAT_OUTPUT — 妥当な日付を帳票用に和暦表示するときに。
- ABAPで日付から曜日を取得する方法|DAY_IN_WEEKの使い方とコード例 — 妥当性を確認した日付の曜日を求めます。
- 指定日の月初日・月末日を取得する汎用モジュール:HR_JP_MONTH_BEGIN_END_DATE — 月次処理の日付計算に役立ちます。
- 汎用モジュール一覧 — その他の日付関連機能を探せます。