• ベストアンサー

アクセスの データ登録時に重複チェックをしたい

お世話になります 訪問介護スケジュールのシステムを開発中です。 担当者が利用者のお世話を何日 何時~何時を登録する画面です。 担当者テーブル(担当者名)、利用者テーブル(利用者名)、計画テーブル(オートNo.形のID)...()内はキー項目 計画テーブルの項目は[日]、[担当者]、[利用者]、[開始時間]、[終了時間]です。 登録は、月と利用者に絞って作成されています。 この画面で、[開始時間]~[終了時間]の重複のチェックを 利用者のスケジュールと担当者のスケジュールの両方のチェックをかけたいのです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#79209
noname#79209
回答No.3

補足です。 利用者のスケジュールを加味するのを忘れてました。 Dim strCriteriaUser As String strCriteriaUser = BuildCriteria("利用者",dbText,"=" & Me.txt利用者) を追加し strCriteria = strCriteriaDate & " And " & strCriteriaTanto & " And ((" & strCriteriaStart & ") Or (" & strCriteriaEnd & ") Or (" & strCriteriaInclude1 & " And " & strCriteriaInclude2 & "))" を strCriteria = strCriteriaDate & " And " & strCriteriaTanto & " And " & strCriteriaUser & " And ((" & strCriteriaStart & ") Or (" & strCriteriaEnd & ") Or (" & strCriteriaInclude1 & " And " & strCriteriaInclude2 & "))" と変更してください。 あと、日、担当者、利用者をフォーム上のコントロールの内容で絞り込むクエリ(計画クエリ)を作成しておき、Dlookupの第二パラメータに指定して、 If Nz(DLookup("開始時間", "計画クエリ", strCriteria), "") = "" Then などとする方が多少高速かもしれません。

shinkami
質問者

お礼

ありがとうございます。 利用者と担当者は別にチェックをして、メッセージを変えます。

その他の回答 (2)

noname#79209
noname#79209
回答No.2

こんな風に作ってみました。 Private Function fncChkDoubleBooking() As Boolean Dim strCriteriaDate As String Dim strCriteriaTanto As String Dim strCriteriaStart As String Dim strCriteriaEnd As String Dim strCriteriaInclude1 As String Dim strCriteriaInclude2 As String Dim strCriteria As String strCriteriaDate = BuildCriteria("日", dbDate, "=" & Me.txt日) strCriteriaTanto = BuildCriteria("担当者", dbText, "=" & Me.txt担当者) strCriteriaStart = BuildCriteria("開始時間", dbDate, "between " & Me.txt開始時間 & " And " & Me.txt終了時間) strCriteriaEnd = BuildCriteria("終了時間", dbDate, "between " & Me.txt開始時間 & " And " & Me.txt終了時間) strCriteriaInclude1 = BuildCriteria("開始時間", dbDate, ">" & Me.txt開始時間) strCriteriaInclude2 = BuildCriteria("終了時間", dbDate, "<" & Me.txt終了時間) strCriteria = strCriteriaDate & " And " & strCriteriaTanto & " And ((" & strCriteriaStart & ") Or (" & strCriteriaEnd & ") Or (" & strCriteriaInclude1 & " And " & strCriteriaInclude2 & "))" strCriteria = Replace(strCriteria, Chr(34), Chr(39)) If Nz(DLookup("開始時間", "計画テーブル", strCriteria), "") = "" Then MsgBox "重複はありませんでした。" fncChkDoubleBooking = False Else MsgBox "重複しています !!" fncChkDoubleBooking = True End If End Function フォームの「登録」ボタンの「クリック時」イベント・プロシージャに If fncChkDoubleBooking = False Then 「計画テーブルへの登録処理」 End If とすれば宜しいかと... なお、時間のチェック方法にもっとスマートな方法があるかも知れません。

shinkami
質問者

お礼

ご丁寧回答ありがとうございます。このまま利用させて戴きます。

noname#79209
noname#79209
回答No.1

フォームをお使いなら、 そのフォームの関数プロシージャに重複チェックユーザー定義関数を作成し、 フォームの登録ボタンのクリックイベントに上記の重複チェックユーザー定義関数を呼び出し、 ダブっていればワーニングを表示するようにします。 具体的な重複チェックは、 > 利用者のスケジュールと担当者のスケジュールの両方のチェックをかけたいのです。 と言われていますが、 「計画テーブルには重複チェックをパスしたものしか登録しない」という前提としています。 ただし、担当者のスケジュールに、「休み」、「研修等での不在」などの個人スケジュール項目があると、別の話になりますので、これについては補足していただかないと... Dim blnDoubleBolling As Boolean If Nz(DLookUp("担当者","計画テーブル"."担当者名 = '" & txt担当者名 & "' And 利用者名 = '" & txt利用者名 & "' And 開始時間 = txt開始時間 And 終了時間 = txt終了時間),"") <> "" Then MsgBox "予約が重複しています" blnDoubleBooking = True Else 「計画テーブルへの追加ルーチン」 End If なお、開始時刻と終了時刻のデータ型がわかりませんので、1~24までの整数値として考えています。(「分」単位は使わないとして)

shinkami
質問者

補足

ありがとうございます。 すぐには理解出来ませんが、DlookUpを利用すればよいのですね、インターネットこれをキーワードとして見つけました。時間をかけて勉強します。 日付と時間のテーブルでの定義は [日付/時刻型]に設定しています、時間は30分刻みです。 時間の重複とは、特定日付内で[9:00~11:00]と「10:00~10:30]は重複としたいです。 担当者の他のスケジュールは無視します。

関連するQ&A