2016-08-21 10 views
0

以下の質問を見てきましたが、投稿された回答は私にとってはうまくいかないようです。私の質問は本質的に同じですが、私は詳しく説明します。Access 2013での重複レコードの防止

Iは、以下との情報テーブルを更新する形態を有する:

​​

データベースは、フィールドのデフォルト値の設定に=日付()を介して自動的にDateEntered加算し、ありますCPDEAIDと呼ばれる主キー自動番号。

フォームには、に次のコードを追加しました。

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Set rst = Me.RecordsetClone 
    rst.FindFirst "[CPDEAID] <> " & Me.CPDEAID & " AND [Forename] = " & Me.Forename & " AND [Surname] = " & Me.Surname & " AND [EmailAddress] = " & Me.EmailAddress 
    If Not rst.NoMatch Then 
     Cancel = True 
     If MsgBox("This person already exists; would you like to go to the existing record?", vbYesNo) = vbYes Then 
      Me.Undo 
      DoCmd.SearchForRecord , , acFirst, "[CPDEAID] = " & rst("CPDEAID") 
     End If 
    End If 
    rst.Close 
End Sub 

ただし、これは機能しないようです。重複したレコードを作成しないようにデータベースを設定する唯一の方法は、複数列のインデックスを作成することですが、これはきれいなユーザーフレンドリーなフロントエンドがほしいから少し面倒です。

私はここで何か非常に単純なものがありますか?

Prevent Duplicate Records, Query Before Creating New Records

+0

マルチカラムインデックスが何を意味しているのかわからないので、少し面倒で、 "ユーザーフレンドリー"なフロントエンドを作れませんか?ユーザーに見せたくないという警告がポップアップ表示されますか? – Slai

+0

フィールドを主キーとして追加するか、複数列インデックスを設定します。重複が追加されようとしているときに生成されたエラー番号をトラップするか、「DCount」のように何個のレコードが存在するかを判断し、0より大きい場合はメッセージを表示します。 –

答えて

0

それはおそらくあなたがテキスト列を比較するSQL文字列を構築していますが、パラメータの周りの単一引用符を使用しないでください、あなたのrst.FindFirstでは動作しません。

しかし、SQLインジェクションの危険性があるため、ユーザーの入力でその操作を行うべきではありません。

代わりに、示さhereとしてパラメータクエリを使用するか、または標準モジュールに次のようにユーティリティ関数を使用します。

' DLookupPar: Look up a value with a parameterized query 
' The first 3 parameters are identical to DLookup, but in Criteria you can use parameters. 
' Then add the exact number of parameters as following arguments, in the exact order as used in <Criteria> 
' 
' Sample call: 
' varUserID = DLookupPar("UserID", "tUsers", "Username = [parUser] AND [Password] = [parPassword]", Me!Username, "aPassword") 
' 
Public Function DLookupPar(Expr As String, Domain As String, Criteria As String, ParamArray arParams() As Variant) As Variant 

    Dim db As DAO.Database 
    Dim qd As DAO.QueryDef 
    Dim rs As DAO.Recordset 
    Dim strSelect As String 
    Dim i As Long 

    strSelect = "SELECT " & Expr & " FROM " & Domain & " WHERE " & Criteria 
    'Debug.Print strSelect 

    Set db = CurrentDb 
    ' Create temporary querydef (no name) and set all parameters from arParams 
    Set qd = db.CreateQueryDef("", strSelect) 
    For i = LBound(arParams) To UBound(arParams) 
     qd.Parameters(i) = arParams(i) 
    Next i 

    Set rs = qd.OpenRecordset(dbOpenSnapshot) 
    If Not rs.EOF Then 
     ' Return the first and only column 
     DLookupPar = rs(0) 
    Else 
     DLookupPar = Null 
    End If 
    rs.Close 

End Function 

とフォームでこのようにそれを使用します。私は

Dim ID As Long 
Dim rs As Recordset 

ID = Nz(DLookupPar("CPDEAID", "yourTable", _ 
    "[CPDEAID] <> [parCPDEAID] AND [Forename] = [parForename] AND [Surname] = [parSurname] AND [EmailAddress] = [parEmailAddress]", _ 
    Me.CPDEAID, Me.Forename, Me.Surname, Me.EmailAddress), 0) 

If ID > 0 Then 
    ' MsgBox etc 
    Set rs = Me.RecordsetClone 
    rs.FindFirst "[CPDEAID] = " & ID 
    Me.Bookmark = rs.Bookmark 
    rs.Close 
End If 
関連する問題