基本情報技術者 2016年 秋期 午前(科目A) 問24
問題文
次のような注文データが入力されたとき、注文日が入力日以前の営業日かどうかを検査するために行うチェックはどれか。

選択肢
ア:シーケンスチェック
イ:重複チェック
ウ:フォーマットチェック
エ:論理チェック(正解)
注文日が入力日以前の営業日かを検査するチェック【午前2 解説】
要点まとめ
- 結論:注文日が入力日以前の営業日かを判定するのは「論理チェック」で、業務ルールに基づく整合性検査です。
- 根拠:論理チェックは複数のフィールド間や業務ルールに関する条件(日時比較や営業日判定)を評価するために用います。
- 差がつくポイント:まず日付フォーマットを検証し型変換してから、平日/祝日判定や入力日との大小比較を行う点で正確さが求められます。
正解の理由
「注文日が入力日以前の営業日かどうか」を検査するには、単に形式や重複の検出では不十分で、業務上の意味(注文日の時点が許容範囲内か、かつ営業日であるか)を評価する必要があります。これは「論理チェック」に該当します。論理チェックはフィールド間の関係や業務ルール(例:注文日は入力日以下であること、かつ祝日や週末でないこと)を検証するもので、設問の趣旨に合致します。
よくある誤解
- 「文字型になっているからフォーマットチェックだけで良い」は誤りです。フォーマットチェックは日付形式の妥当性確認までで、業務ルール(営業日判定や入力日比較)は別の論理検査です。
- 「重複チェックやシーケンスチェックを使えば良い」と考える誤り。これらは伝票番号など一意性や順序に関する検査で、日付の業務的妥当性を評価できません。
- 「営業日の判定は単純な平日チェックだけでいい」とする誤り。祝日や特別休業日を考慮する必要があるケースが多く、業務カレンダーとの照合が必要です。
解法ステップ
- 注文日フィールドの形式をフォーマットチェックで検証し、正しい日付文字列か確認する。
- 正常なら文字列を日付型に変換する。失敗時は入力エラーにする。
- 注文日が「入力日」より前または同日かを比較する(<=)。
- 注文日が営業日かを判定する(曜日チェック+祝日/業務カレンダー照合)。
- 3または4に違反する場合は論理エラー(業務ルール違反)として扱う。
例(簡易な実装イメージ、Python):
from datetime import datetime, date
holidays = {date(2026,1,1), date(2026,12,25)} # 例:祝日一覧
def is_business_day(d: date) -> bool:
return d.weekday() < 5 and d not in holidays # weekday(): 0=Mon, 6=Sun
def validate_order_date(order_date_str: str, input_date: date) -> bool:
try:
od = datetime.strptime(order_date_str, "%Y-%m-%d").date()
except ValueError:
raise ValueError("日付フォーマットエラー")
if od > input_date:
return False
return is_business_day(od)
選択肢別の誤答解説
- ア: シーケンスチェック — 伝票番号などの連続性や順序を検査するもので、日付の業務妥当性確認には不適切です。
- イ: 重複チェック — 重複データ(一意性)の検出に用いるため、日付が入力日以前か・営業日かの判定とは無関係です。
- ウ: フォーマットチェック — 日付文字列が指定の形式かを確認するのみで、入力日との比較や営業日判定など業務ルールは評価できません。
- エ: 論理チェック — 正解。複数フィールドや業務ルールに基づく条件(注文日 ≤ 入力日、営業日であること)を検証できるため該当します。
補足コラム
- 実務では「注文日が営業日か」を判定するために、国定休日だけでなく会社独自の休業日や臨時休業も含む業務カレンダーを用います。
- 入力が文字型になっている場合は、フォーマットチェック→正規化(型変換)→論理チェックの順で段階的に検証するとエラー判定が明確になります。
- バッチ処理やDB制約で実装する場合、SQL側で日付比較とカレンダーテーブルを結合する方法が一般的です。またエラーメッセージは利用者が修正しやすい内容にします。
FAQ
Q: フォーマットチェックで日付形式が正しければ論理チェックは不要ですか?
A: 不要ではありません。フォーマットは形式的妥当性のみで、業務ルール(入力日比較や営業日判定)は別途論理チェックが必要です。
A: 不要ではありません。フォーマットは形式的妥当性のみで、業務ルール(入力日比較や営業日判定)は別途論理チェックが必要です。
Q: 営業日の判定はどう用意すれば良いですか?
A: 祝日表や会社の業務カレンダーをデータ化して参照します。季節変動や臨時休業は運用で更新する必要があります。
A: 祝日表や会社の業務カレンダーをデータ化して参照します。季節変動や臨時休業は運用で更新する必要があります。
Q: システムで自動化する際の注意点は?
A: タイムゾーンや日付境界、CSV等外部入力の文字コードやロケールを考慮し、単体テストで境界ケース(入力日と同日、週末、祝日)を網羅してください。
A: タイムゾーンや日付境界、CSV等外部入力の文字コードやロケールを考慮し、単体テストで境界ケース(入力日と同日、週末、祝日)を網羅してください。
関連キーワード: データ検証、論理チェック、営業日判定、日付フォーマット、業務ルール、入力バリデーション、バリデーション順序

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

