• ベストアンサー

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

お世話になります 訪問介護スケジュールのシステムを開発中です。 担当者が利用者のお世話を何日 何時~何時を登録する画面です。 担当者テーブル(担当者名)、利用者テーブル(利用者名)、計画テーブル(オート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

  • access 登録時の重複チェック

    ご存知の方、教えてください。 入金処理の画面を作成しています。 登録をするときに、すでに入金がされている場合は、「入金済です」とメッセージを出したいです。 登録をするテーブルは「家賃処理」のひとつです。 フィールド名は、「お客様ID」「金額」「消費税」「合計」「領収日」「年度」「月分」があります。 重複チェックをしたいのは、「お客様ID」「年度」「月分」です。 つまり、例えば「Aさんは、2006年6月分の家賃をすでに入金してくれて、処理をしたかどうか」をチェックしたいのです。 よろしくお願いします。

  • Accessでの重複データの確認方法

    Access2007です。 よろしくお願いします。 現在スケジュール管理を作成しております。 一日の様々な予定を横軸に登録していきます。 横軸は5分単位で9時から18時まであり、 例えばAという予定を30分で入れる場合は5分枠を6個使用して登録している状況になります。 それで、僕が今悩んでいるのは、、、 ある予定を変更しようとした時に当然他の予定とぶつかるかぶつからないかチェックをかけます。 そのチェックのかけかたで悩んでいます。 変更後の開始時間と終了時間をまたぐ他の予定があるかテーブルを参照しにいきますが、 当然いままさに変更しようとしている予定もヒットします。 この予定を除いて他にぶつかる予定があるかないか確認をしたいのですが、 どうしたらいいのか分かりません。 この説明で伝わっていますでしょうか。。。 どなたかお知恵を拝借できればと思います。 よろしくお願いします。

  • [Access]時間帯の重複チェック

    下記のようなテーブルがあって、時間帯がかぶっているレコードを クエリで抽出したいと考えております。 ≪tbl_配置一覧≫ ID  日付    勤務地  開始時間 終了時間  担当者 1  2009/9/2   東京   10:00  12:00  Aさん 2  2009/9/2   東京   13:00  14:00  Aさん 3  2009/9/2   神田   12:30  14:00  Bさん 4  2009/9/2   神田   09:00  11:00  Aさん ID1と4のように同じ担当者が時間帯がかぶる形で勤務予定となっている場合、このレコード二つをクエリで抽出したいと考えております。 いろいろ探して下記のようなSQL文を書いてみたのですが、どうもうまくいきません。 SELECT tbl_配置一覧.ID, tbl_配置一覧.日付, tbl_配置一覧.勤務地, tbl_配置一覧.開始時間, tbl_配置一覧.終了時間, tbl_配置一覧.担当者 FROM tbl_配置一覧, tbl_配置一覧 AS tbl_配置一覧_1 WHERE (((tbl_配置一覧.ID)<>[tbl_配置一覧_1].[id]) AND ((tbl_配置一覧.日付)=[tbl_配置一覧_1].[日付]) AND ((tbl_配置一覧.勤務地)=[tbl_配置一覧_1].[勤務地]) AND ((tbl_配置一覧.開始時間)<[tbl_配置一覧_1].[終了時間]) AND ((tbl_配置一覧.終了時間)>[tbl_配置一覧_1].[開始時間])) ORDER BY tbl_配置一覧.ID; 大変申し訳ないですが、ご教授よろしくお願いいたします。

  • ASPからSQLserverへの重複データ登録

    ASPで作成した画面からSQLserver2005にデータ登録を行う場合に重複データができてしまいます。 データを登録するテーブルは、主キーが設定されていません。 テーブルには本来ユニークとなる受付番号があり、画面にて登録を行う際に、画面の受付番号がテーブルに存在するか、SQLのSELECTで検索してチェックを行った後、存在しなければ登録(SELECTしてaddNew)を行っています。 このテーブルにデータ登録を行う画面は複数あり、どの画面も上記と同じ処理の流れになっています。 このような処理の流れの場合で、同一の受付番号のデータが登録されるのはどのような場合があるでしょうか。 思いつくのは、複数端末で同一受付番号を同時に登録した場合課と思うのですが、それ以外に可能性はありますでしょうか。 詳しい方、よろしくお願いします。

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • 重複項目を取り除くか、上手いソートがしたいです。。。

    こんにちは。よろしくお願いします。 現在、SQLServer2000のDBを使ってシステムを作っていますが、SQL文で詰まっています。 以下の条件で、どうすればよいのかご教授願えませんでしょうか? テーブル1 番号|授業名|  1| 数学|  2| 国語|  3| 社会|  4| 理科| テーブル2 番号|授業番号|授業日|開始時間|  1|   1| 2/22|  10:00|  2|   2| 2/22|  9:00|  3|   2| 2/22|  16:00|  4|   3| 2/23|  10:00|  5|   4| 2/23|  8:00|  6|   1| 2/23|  13:00|  7|   2| 2/23|  9:00|  8|   3| 2/23|  18:00| テーブル1の番号=テーブル2の授業番号。です。 上のようなテーブルから「それぞれの授業の中から、一番早く開始される順」に並び替えて1件だけ表示させたいのですがどうすればよいのでしょうか? 結果としては 番号|授業名|授業日|開始時間|  1| 国語| 2/22|  9:00|  2| 数学| 2/22|  10:00|  3| 理科| 2/23|  8:00|  4| 社会| 2/23|  10:00| としたいのですが、 Select テーブル1.授業名,Min(テーブル2.授業日) as 授業日,テーブル2.開始時間 from テーブル1 inner join テーブル2 on テーブル1.番号 = テーブル2.授業番号 group by テーブル1.授業名,テーブル2.授業日,テーブル2.開始時間 order by 授業日 とすると、開始時間でソートはかかりませんし、orderbyに入れるとgroupbyの関係で、全件出てきてしまい… 何かよい方法は無いでしょうか? 理想としては、Distinctは列の重複なので、項目の重複ができるような文があったり 何とかして開始時間でソートがかけられれば嬉しいのですが… どなたがご教授願えませんでしょうか。 よろしくお願いします。

  • Access チェックボックスでチェックしたデータのみフォームで表示

    いつもお世話になっております。 またも躓いてしまいました。宜しくお願い致します。 フォーム上でチェックボックスにチェックが入ったデータを、違うフォームで詳細表示させる処理が出来ずにいます。 手順としては (1)検索用フォーム「処理検索」で、「処理番号」または「件名」テキストボックスに条件を入力し、検索実行ボタンで検索開始 (2)「詳細表示」フォームに、(1)で検索した結果が、フォームビューで表示。その際、フォームの形式は、フォームヘッダーに「詳細表示」ボタンと、各データの項目名が置いてあり、詳細にチェックボックス・処理番号・年月日・件名のテキストボックスが置いてあります。 ☆簡易図☆ [詳細表示]←ボタン  詳細表示      処理番号  年月日 件名 -------------------------- [チェックボックス]|[処理番号]|[年月日]|[件名] (3)データを詳細表示したいものにチェックボックスでチェックマークを入れ(運用上のルールで1つ以上は選ばない事になっています)、詳細表示ボタンをクリックすると、チェックを入れたデータのみ、さらに詳しい「処理票 詳細情報」フォームが立ち上がる 「詳細表示」フォームから「処理票 詳細情報」フォームへ展開するにあたり、「Q詳細表示検索」クエリを作成し、チェックボックスの判定をするようにすれば良いのかと思ったので、下記のように作ってみたのですが、うまく展開できませんでした。 今回利用したもの ☆テーブル☆ ・メインデータ(詳細なデータが入っている) ・詳細表示(チェックボックス及び、処理番号・年月日・件名が入っている。メインデータの処理番号とリレーション) ☆クエリ☆ ・Q詳細表示検索 (詳細表示テーブルから「チェックボックス」と、他の項目はメインデータテーブルから必要分入っています。) ☆フォーム☆ ・F処理検索(処理番号・件名をあいまい検索で検索できるようにしてある) ・詳細表示(F処理検索の結果が、チェックボックス・処理番号・発生日・件名の項目でデータを一覧表示する) ・処理票 詳細情報(もっと詳しい情報を表示・項目数だと30項目程表示しています) ☆マクロ☆ ・詳細表示 フォーム名:処理票 詳細情報 ビュー:フォームビュー フィルタ名:Q 詳細表示検索 以上、宜しくお願い致します。

  • アクセスで

    アクセスでフォームが5つあるとします。(フォーム名は、1,2,3,4,5とします。)フォームにはすべて"開始年月日"と"終了年月日"の項目があり、5つのクエリの検索をそれぞれ入力する様になっています。 又、テーブル1があり、このテーブルは毎日データが追加されていきますが(1日50ほど)、追加されたデータは、その日のデータでは無く、2日前の物の場合もあれば、休みを挟んだりすると5日前の物の場合もあります。そのデータ自体の"年月日"フィールドがあります。 まず全てのフォームの"終了年月日"の項目の既定値をテーブル1の"年月日にする事"はできますか? そしてフォーム1で"開始年月日"と"終了年月日"を入力し確定した時に、その他のフォームを開くとフォーム1で入力した"開始年月日"と"終了年月日"が入力された状態にしたいのです。これは、フォーム1で"開始、終了年月日"を入力した場合だけでなく、どのフォームで"開始、終了年月日"を入力した場合でも、その他のフォームを開くと同じ"開始、終了年月日"がまず入力された状態になっていて変更し確定した場合は、他のフォームの"開始、終了年月日"も変更されているという様にしたいのです。 説明がうまくできなくてすいませんが、誰か教えて頂けないでしょうか?よろしくお願いします。

  • メールアドレス登録の重複をチェックするには?

    お世話になります。 http://www.webpower.jp/ 上記のサイトで配布されている、「ユーザー・マネージャー」と言うアクセス制限するユーザーを管理するCGIを使いたいと思っています。 http://www.webpower.jp/websofts/password_protection/user_manager/ このCGIは、重複ユーザーの登録をチェックする事はできるのですが、メールアドレスの重複チェックはできません。 すでに登録されているメールアドレスでの、ユーザー登録拒否するにはどうすればよいでしょうか。 「user.cgi」ファイルの、1416行目、1780行目あたりに「ユーザー名[$username]は既に登録されています。他のユーザー名を指定してください。」と、同じユーザー名での登録をチェックしている箇所があります。 --------------------------------------- while (<IN>) { my($username) = (split /$SP/, $_, 2)[0]; if ($SIO{'username'} eq $username) { push @err_msg, "<b>ユーザー名[$username]は既に登録されています。他のユーザー名を指定してください。</b>"; last; } } close IN; --------------------------------------- このあたりが怪しいと思い、いろいろと試してはみたのですが、perlの知識がないためにネットでsplit関数を調べて3時間ほどいろいろと試してみたのですが、うまくいきませんでした。 ユーザー情報が登録されているファイルには下記のように、ユーザー情報が記載されています。 ------------------------------------- test10(タブ)qWsI4uXjDR2gU(タブ)hogehoge@mail.goo.ne.jp(タブ)1196066232(タブ)1196066232(タブ)1196066232(タブ)0 test9(タブ)6VAGp2TV8SV4w(タブ)hogehoge2@mail.goo.ne.jp(タブ)1196066806(タブ)1196066806(タブ)1196066806(タブ)0 test11(タブ)I75tuntVNvzjk(タブ)hogehoge3@mail.goo.ne.jp(タブ)1196071653(タブ)1196071653(タブ)1196071653(タブ)0 ------------------------------------- 上記のように、タブ区切りになっています。 左から、ユーザー名、パスワード(暗号化されている)、メールアドレス、初回登録日時、最終更新日時、最終認証日時、認証回数となっています。 登録済みのメールアドレスを、ユーザー名と同じように重複して登録しないようにチェックしたいのですが、どのようにすれば良いでしょか。 ご教授をお願い致します。

  • サービス登録フォームで開始時間~終了時間の入力

    サービス登録フォームで開始時間~終了時間の入力 クエリを使って開始時間~終了時間の間(フォームで入力された) 働ける職員(T_職員勤務)から抽出してサービス登録フォームに 職員のIDをドロップダウンリストで 表示したいです。 T_職員勤務(テーブル) フィールド名 職員ID 日付 6:30-7:00 6:30-7:00 7:00-7:30 7:30-8:00 8:00-8:30 8:30-9:00 9:00-9:30 9:30-10:00 10:00-10:30 10:30-11:00 11:00-11:30 11:30-12:00 12:00-12:30 12:30-13:00 13:00-13:30 13:30-14:00 14:00-14:30 14:30-15:00 15:00-15:30 15:30-16:00 16:00-16:30 16:30-17:00 17:00-17:30 17:30-18:00 18:00-18:30 18:30-19:00 19:00-19:30 19:30-20:00 20:00-20:30 (6:30-7:00・・・・20:00-20:30のフィールドの値は勤務区分テーブルの勤務区分がはいります。) T_行く時間(テーブル) フィールド名 行く時間CD 利用者ID 職員ID 日付け 開始時間 終了時間 勤務区分(テーブル) フィールド名 勤務区分 区分名 0 休み 1 出勤 3 サービス (ヘルパーの勤務表なのでサービスは訪問介護のことです) T_行く時間(テーブル) 利用者IDは誰(利用者)のところに行くか 勤務区分 1と3の違い 出勤は誰をどの時間担当してもいい あとそれをT_行く時間テーブルに保存すると同時に T_職員勤務(テーブル)6:30-7:00~20:00-20:30のレコードの中の値を 開始時間~終了時間の間の時間帯の分、値を3にしたい 独学で少しやっているのですが、関数やプログラムの苦手な自分にはどう考えていいか エクセルと違うので 書き方がよく分かりません力を貸して ください。お願いします

専門家に質問してみよう