- ベストアンサー
ACCESS・重複データ入力をエラーに
ACCESS2002です。 本日日付が規定値入力されるフォームがあります。基となっているテーブルの「日付」フィールドには主キーが設定されていて、同一日のデータを入力してもレコードとして保存されないようになっています。 しかし、保存の有無がテーブルを直接見ないと判断できないため、システムとしては大変不便です。 そこで、すでに同一日のレコードが存在する場合は、入力終了のボタンを押した時にでも、「すでに同一日での入力があります。このデータは保存されません。」といったメッセージが表示されるようにしたいんですが、どのようにすべきなのかが判りません。 皆さんの知恵をお貸し下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 こんな感じかな。 If DCount("日付", "テーブル名", "日付 = #" & Me!日付.Value & "#") > 0 Then MsgBox "すでに同一日での入力があります。このデータは保存されません。" Cancel = True Exit Sub End If DCount関数は、テーブルのある条件のレコード数をカウントする関数です。
その他の回答 (3)
' こんな感じでどうですか? ' Fld日付はテーブルの日付フィールド。 ' Me!日付はFormの日付コントロールです。 Private Sub 登録ボタン_Click() Dim myRS As ADODB.Recordset Dim myCN As New ADODB.Connection Dim SQL As String SQL = "SELECT Fld日付 FROM テーブル WHERE Fld日付 = #" & Me!日付 & "#" Set myCN = CurrentProject.Connection Set myRS = New ADODB.Recordset myRS.Open SQL, myCN, adOpenKeyset, adLockOptimistic If myRS.RecordCount > 0 Then MsgBox "すでに登録済みです。" Else '★★★ここに重複のなかった時の作業を書く★★★ End If myRS.Close Set myRS = Nothing myCN.Close Set myRS = Nothing End Sub
お礼
回答ありがとうございます。 お礼が遅くなって、本当にすみません。 maruru01さんの方法で動きました。 でも、oshiete_kunさんのお返事は別のシステムで活用できる気がするので、参考にさせていただきます。 ありがとうございました。
- maruru01
- ベストアンサー率51% (1179/2272)
>Cancel=Trueのところで「変数が定義されていません。」ってエラーになりました。 Cancelは、BeforeUpdateイベントプロシージャなどに、最初から用意されている引数です。 フォームのBeforeUpdateに記述すればそのまま使用出来ます。 別の場所(終了ボタンのクリックイベントなど)に記述する場合は、 Cancel = True の変わりに、保存をキャンセルする処理を記述して下さい。
お礼
再度回答くださってありがとうございます。 うまくできました。 お礼が遅くなってしまって本当にすみません。
- nika
- ベストアンサー率14% (66/470)
テーブル内の同一のデータの入力をさけるために、入力されたデータをテーブル内の検索にかけて、同じものがあるかを判断して、せっかく入力しても、保存されない。 効率的ではありませんね。毎回保存するたびに数万件あるテーブルをいちいち検索して保存するかどうか決めるわけですから。 それより、入力されたデータはすべて受け付けて、二重、三重入力されたレコードを探し、削除するような、メンテナンスをしたほうが、いいと思いますけど。 入力ミスが頻繁に起きるとすれば、業務事態を見直す。 年数回しか起きない入力ミスのために、毎回システムに負荷をかける。どっちがいいんでしょう。 これは、考え方の問題ですから、システム業務全体の見直しをおすすめします。
補足
さっそくの回答ありがとうございます。 拙い知識で作っているシステムなので、大したものではないんです。せいぜい200~300件程度のデータしか管理しないものですし、1日1回入力があるかどうか・・・っていうものなんです。 チェックをかけるとしても、そのテーブルの最終データとチェックすればいいだけなので、大した負荷にもならないかなと安易に考えました。 お話にあった効率的な方法もどうすればいいのかすぐには思いつきませんし・・・。 確かにおっしゃる通り、あんまり発生しない入力ミスのためにシステムに負荷をかけるのは得策じゃありませんね。
補足
さっそくの回答ありがとうございます。 書かれてある通り記述してみましたが、Cancel=Trueのところで「変数が定義されていません。」ってエラーになりました。 これはどんな定義をすればいいんでしょうか? そのあたりの知識があまりないんですが、よろしくお願いします。