2010-10-24 46 views
0

我有一個子窗體(customersAnswersSub)內的主窗體(customersAnswers)。一旦有人進入一個新的customerAnswersSub條目 - 我想它首先檢查重複。MS Access - 檢查子表單之前輸入複製

它必須首先檢查4個不同的字段。

這是我到目前爲止。

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim rsGlobals As ADODB.Recordset 
    Dim sql 
    Set rsGlobals = New ADODB.Recordset 
    sql = "Select * From CustomerAnswerD where subscriptionNo=" & _ 
     Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    rsGlobals.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdText 
    If Not rsGlobals.BOF And Not rsGlobals.EOF Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

它沒有做任何事 - 只是坐在那裏。當我關閉表單時,它會彈出一個-id已經存在的框。

任何想法,我很沒有經驗,當談到Access VB。

謝謝

回答

1

它不會做任何事情 - 只是坐在那裏

只是檢查,因爲你說你沒有經驗與Access ......不會觸發形式更新事件,直到記錄保存嘗試。只要用戶將數據輸入到所有字段,這可能不會自動發生。但是,您可以通過導航到子窗體中的其他記錄或通過選擇記錄 - >從訪問保存記錄(2003)主菜單等方法觸發更新。

我沒有看到你的BeforeUpdate過程有什麼問題。仍然我會轉換它使用DCount()函數,而不是打開ADO記錄集。 (請參閱訪問幫助主題DCOUNT)

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim strCriteria As String 
    strCriteria = "subscriptionNo=" & Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    Debug.Print strCriteria 
    If Dcount("subscriptionNo", "CustomerAnswerD", strCriteria) > 0 Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

那假設你的表的subscriptionNo,期刊,體積和問題字段都爲數字數據類型。如果它們中的任何一個都是文本類型,則需要在strCriteria中將引號括起來。

我添加了Debug.Print strCriteria因此您可以在即時窗口中查看已完成的字符串表達式。您還可以通過複製該字符串並將其粘貼到作爲WHERE子句的新查詢的SQL視圖中來解決該已完成字符串的問題。

此外,請考慮在subscriptionNo,日記帳,卷和問題上爲您的CustomerAnswerD表設計添加唯一索引。這樣你就可以在不依賴你的表單的情況下執行唯一性。使用DCount函數或您的原始記錄集SELECT語句,該索引還將使您獲得更快的性能。

如果您保持原始記錄集方法,請在退出過程之前關閉記錄集並設置對象變量= Nothing。

+0

哦,哎呀。是的,這是一對夫婦的文字和數字字段。天啊。謝謝你的雙眼,但我很感激。 – Chasester 2010-10-25 13:47:39