【问题标题】:Preventing duplicate records in Access 2013防止 Access 2013 中的重复记录
【发布时间】:2016-12-28 08:11:06
【问题描述】:

我查看了以下问题,这正是我想要做的,但是发布的答案似乎对我不起作用。我的查询基本相同,但我会详细说明。

我有一个表格,它使用以下内容更新信息表:

Forename
Surname
EmailAddress

数据库还通过=Date()在字段的默认值设置中自动添加了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

【问题讨论】:

  • 我不确定你所说的多列索引是什么意思,使它有点凌乱并且不干净的“用户友好”前端?它是否会导致您不希望用户看到的弹出警告?
  • 添加字段为主键或设置多列索引。要么捕获即将添加重复项时产生的错误号,要么执行DCount 之类的操作来确定存在多少条记录,当它大于 0 时,显示消息。

标签: vba ms-access duplicates


【解决方案1】:

它可能不起作用,因为在您的rst.FindFirst 中,您构建了一个比较文本列的 SQL 字符串,但您没有在参数周围使用单引号。

但您也不应该在用户输入的情况下这样做,因为这有 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

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 2016-07-10
    • 2015-12-04
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多