2009-10-07 149 views
3

我有一張表,假設它存儲工作人員姓名(這不是確切的情況,但概念相同),並且主鍵設置爲自動編號。當添加新成員時,我想檢查數據庫中是否存在該名稱,然後添加它,如果該名稱已存在,可能會出現錯誤。我如何從表格的正常添加表單中執行此操作?僅在Access 2007中不存在的情況下添加記錄

我試着爲它創建一個查詢,但這將無法正常工作,因爲窗體基於表而不能使用查詢作爲控件源。我在網上看到一些例子,說如何用VB代碼做這樣的事情,但是我不能讓它起作用,因爲它不是一個簡單的例子,有些行被遺漏了。

有沒有簡單的方法可以做到這一點?

回答

2

在表的設計視圖中,你可以做,沒有重複收錄

然後訪問本身會拒絕條目的名稱列。我認爲它會在拒絕輸入之前使用自動編號之一。

+0

如果你喜歡 – 2009-10-07 15:47:23

+0

,你可以捕獲錯誤(忘記實際錯誤號)並顯示自定義消息如果你使用這種技術,你將需要在組成用戶的所有列上創建一個多列索引名稱。這種方法的問題在於它是絕對的 - 永遠不會有兩個同名的用戶。在給出的例子中,這是不可取的。 – 2009-10-07 15:54:16

+0

你是正確的,它會「消耗」一個自動編號。 – 2009-10-07 20:33:40

2

在將數據插入數據庫之前,您正在處理預先限定記錄的問題。簡單和絕對的規則,你會從來沒有違反(從來沒有,永遠不會允許記錄具有相同的名稱)可以通過數據庫約束來處理 - 在這種情況下在AllowDuplicates設置爲No創建索引問題列

但是,在現實世界中,資格預審通常比較複雜。您可能需要簡單地警告的用戶可能重複,但允許他們添加記錄無論如何。而且,您可能需要檢查其他表格的某些情況,或者一次收集多個表格的信息。

在這些情況下,您需要編寫接口,以便它不直接綁定到表(在Access中,創建一個記錄源爲空的表單),收集各種控件中的信息,執行代碼檢查通常使用DCOUNT和DLOOKUP),然後使用DoCmd.RunSQL在代碼中發出一系列INSERT和UPDATE語句。

你可以偶爾使用一些技巧來避免不必要在前端編寫代碼,但更快而不是稍後你會遇到需要這種編碼級別的情況。

+0

DoCmd.RunSQL的問題是它忽略了任何錯誤。以下任何一項都會顯示查詢收到的任何錯誤消息。如果使用DAO,請使用Currentdb.Execute strSQL,dbfailonerror ..對於ADO使用CurrentProject.Connection.Execute strCommand,lngRecordsAffected,adCmdText然後可以刪除docmd.setwarnings行。 如果您打算使用docmd.setwarnings,請確保您將True語句放在任何錯誤處理代碼中。否則,奇怪的事情可能會在以後發生,特別是在您開發應用程序時。 – 2009-10-07 20:34:47

+0

我寫了一個函數,SQLRun(),作爲DoCmd.RunSQL的替代品。我也廣泛地發佈了它的各種版本(比別人更好!)。這只是CurrentDB.Execute的錯誤處理包裝。 – 2009-10-09 02:27:03

0

最好的解決方案是讓用戶輸入姓和名的幾個字符,並根據這些搜索條件顯示所有人的連續形式。還顯示相關信息,如中間名(如果有),電話號碼和地址,以清除潛在的重複項。然後,如果找不到重複,則可以添加該人員。

每個城鎮總會有兩個約翰史密斯或簡瓊斯。

我讀到了一個情況,兩個名字相同,姓名和出生日期相同的女性在醫院裏就診。真的很可怕。

1

我把我的投票放在使用未綁定的表單來收集必填字段並顯示可能的重複的一面。這裏有一個例子從最近的應用程序:

http://dfenton.com/DFA/examples/Dialogs/LHAAddCustomer.png

(我出去編輯真正的人的名字,並把在假的東西,和我的圖形程序的抗鋸齒是不同的ClearType的,因此古怪)

這裏的想法是,用戶將數據放入四個字段中的任何一個(不要求全部),然後單擊ADD按鈕。第一次,它填充可能的匹配。然後,用戶必須決定其中一個匹配項是否爲預期的人,然後再次單擊ADD(即使它是重複的也要添加它),或者單擊底部的按鈕以轉到選定的客戶。

彩色指標旨在傳達比賽的距離。在這種情況下,輸入的電子郵件地址與列出的第一個人完全匹配,並且電子郵件本身的完全匹配被視爲完全匹配。此外,在這個特定的應用程序中,客戶希望儘量減少在同一家公司輸入多個人(這是他們業務的性質),因此組織中的精確匹配被視爲部分匹配。

除此之外,還有使用Soundex,Soundex2和Simil的匹配,以及與Soundex/Soundex2/Simil結合的子字符串和子字符串。在這種情況下,第二個條目是重複的,但Soundex和Soundex2不能捕捉它,而Simil返回67%的相似度,並且我已將敏感度設置爲大於50%,因此「Wightman」顯示爲近似與「懷特曼」相匹配。最後一個。我不知道爲什麼最後兩個在列表中,但顯然有一些原因(可能是Simil和縮寫)。

我通過評分例程運行名稱,公司和電子郵件,然後使用組合計算最終得分。我將Soundex和Soundex2值存儲在每個人的記錄中。當然,Simil必須實時計算,但因爲Jet/ACE查詢優化器知道限制其他字段,因此調用Simil來減少大量數據集(這實際上是第一個應用程序我已經使用了Simil,迄今爲止它工作得很好)。

加載可能的匹配需要一點暫停,但速度並不是特別慢(這個版本取自的應用程序有大約8K個正在測試的現有記錄)。我爲一個在人員表中有25萬條記錄的應用程序創建了這個設計,並且在後端仍然是Jet時它工作得很好,並且在幾年前後端升級到SQL Server後仍然工作得很好。

0

這在SQL世界中被稱爲'UPSERT'。 ISO/ANSI SQL-99標準定義了一個MERGE語法,該語法最近被添加到SQL Server 2008中,並帶有對標準的專有擴展。幸運的是,這是SQL世界發展的方式,跟隨着MySQL的發展。

不幸的是,Access數據庫引擎是一個完全不同的故事。即使簡單的UPDATE也不支持SQL-92標量子查詢語法,而是擁有自己的專有任意(不可預知的?肯定未記錄的)結果。 Windows團隊對SQL Server試圖在Jet 4.0中修復此問題進行了嘗試。即使現在Access團隊擁有自己的ACE格式,他們似乎對修改SQL語法並不感興趣。所以他們擁抱標準SQL-99的產品的機會甚至是他們自己的替代構造是非常遙遠的:(

一個明顯的解決方法,假設性能不是問題(一如既往,需要測試) ,是做INSERT,忽略任何關鍵的失敗錯誤,然後立即做UPDATE即使你是(IMO非常可疑的)'自動編號PK在每個桌上'的說服,你應該有一個唯一的關鍵在你的自然鍵,所以一切都會好的。

0

感謝這裏的所有信息。這是很好的信息,我會使用它,因爲我是自學成才的。

我在這裏找到的最簡單的方法是在所有我想要的字段上使用索引(沒有重複項)。這裏的訣竅是使用多個索引(這基本上允許複合索引或由多個字段組成的「虛擬」索引)。

該方法可以在這裏找到:http://en.allexperts.com/q/Using-MS-Access-1440/Creating-Unique-Value-check.htm,但我會重複它的情況下,鏈接被刪除。

從Access幫助: 防止從重複的值被輸入到字段

創建使用要禁止重複值的字段的多字段索引的組合。完成定義索引後,請保持「索引」窗口打開。

怎麼樣?

  1. 在設計視圖中打開表格。
  2. 單擊工具欄上的索引。
  3. 在索引 名稱列的第一個空白行中,鍵入 索引的名稱。您可以在 之一的索引字段之後命名索引,或者使用 另一個名稱。
  4. 在「字段名稱」列中,單擊 箭頭併爲索引選擇 的第一個字段。
  5. 在字段名稱 列的下一行中,選擇索引爲 的第二個字段。 (在該行保留索引名稱 列空白。)重複 這一步,直到您選擇了 您希望在此索引中包含 的所有字段。默認排序順序爲 升序。在索引 窗口的 「排序順序」列中選擇降序,以按降序對相應的 字段的數據進行排序。
  6. 在索引 窗口的上半部分,單擊新的索引名稱。
  7. 在索引 窗口的下半部分,單擊唯一屬性 框,然後單擊是。

您現在應該可以不輸入索引中具有相同值的記錄。如果其中一個索引字段有一個空格(當您設置索引時有一個選項可以檢查/忽略空值),但是它對我無效,但我仍然可以輸入值,無論如何,我不會有空值。

相關問題