Ms access MS Access中重复出现的警告

Ms access MS Access中重复出现的警告,ms-access,database-design,Ms Access,Database Design,我正在使用MS Access数据库来跟踪姓氏、地址和其他一些记录。我正在做一个表,并希望它被更新的用户输入信息的形式。我的问题是,我可以有几个关键的项目,如果发现重复会发出警告。主要是如果在姓氏和地址字段中发现重复项。我需要表单来接受副本,因为信息是如何获得的。副本是可能的,但需要能够输入副本,并在输入数据时警告用户之前已经输入了类似的条目 许多不同的用户可能正在输入数据,这是否可能在Access中实现且易于实现?我已经有一段时间没有使用Access了,如果我没有使用正确的术语,很抱歉,因为我仍

我正在使用MS Access数据库来跟踪姓氏、地址和其他一些记录。我正在做一个表,并希望它被更新的用户输入信息的形式。我的问题是,我可以有几个关键的项目,如果发现重复会发出警告。主要是如果在姓氏和地址字段中发现重复项。我需要表单来接受副本,因为信息是如何获得的。副本是可能的,但需要能够输入副本,并在输入数据时警告用户之前已经输入了类似的条目

许多不同的用户可能正在输入数据,这是否可能在Access中实现且易于实现?我已经有一段时间没有使用Access了,如果我没有使用正确的术语,很抱歉,因为我仍然在学习Access的基础知识,因为我主要在Excel中工作。Excel是目前正在使用的解决方案,但很快就会发现需要更好的解决方案


谢谢

名称不是主键的理想候选项,您似乎已将名称设置为某个表的主键。例如,您应该使用更好的候选密钥社会保险号,或者创建一个代理人工密钥,如果您希望密钥除了作为表的密钥之外没有其他意义


如果没有关于表结构的更多细节,就很难更具体。

警告用户,但如果用户愿意,允许她继续


如果是这样的话,一个关键的约束也就是约束。只需通过显式查询代码中的现有数据手动检查重复项。您可能希望为正在搜索的字段编制索引。

一般来说,Access和关系数据库首先要防止输入重复数据。如果您只想“警告”,那么需要一些自定义代码。因此,假设该表名为Customers,它包含CustomerID AutoNumber、primary key和LastName Text等字段。然后,表单有一个名为txtLastName的文本框,该文本框绑定到LastName字段。在这种情况下,您可以如下处理文本框的BeforeUpdate事件:

Option Compare Database
Option Explicit

Const DuplicateWarningTitle = "Duplicate Record"
Const DuplicateValueWarning = "A record already exists with " + _
  "the value you have entered. Are you sure you want to continue?"

Function GetSQLLiteral(Value As Variant) As String
  Select Case VarType(Value)
    Case vbNull
      GetSQLLiteral = "Null"
    Case vbString
      GetSQLLiteral = "'" + Replace(Value, "'", "''") + "'"
    Case Else
      GetSQLLiteral = CStr(Value)
  End Select
End Function

Sub HandleKeyFieldBeforeUpdate(Control As Access.TextBox, Cancel As Integer)
  Dim RS As DAO.Recordset
  Set RS = CurrentDb.OpenRecordset( _
    "SELECT 1 FROM Customers " + _
    "WHERE " + Control.ControlSource + " = " + GetSQLLiteral(txtLastName.Value) + _
    " AND CustomerID <> " & Me.CustomerID)
  If Not RS.EOF Then
    Select Case MsgBox(DuplicateValueWarning, vbExclamation + vbYesNo, DuplicateWarningTitle)
      Case vbYes
        ' just proceed
      Case vbNo
        Cancel = True
        Control.Undo ' if desired!
    End Select
  End If
End Sub

Private Sub txtLastName_BeforeUpdate(Cancel As Integer)
  HandleKeyFieldBeforeUpdate txtLastName, Cancel
End Sub

是的,您可以通过以下代码进行验证:

If Nz(DCount("FieldName", "table", "FieldName= '" & Me.FieldName.Value & "'"), 0) > 0 Then
     If MsgBox("The FieldName already exist", vbOKCancel, "Duplicate Warning") = vbCancel Then Cancel = True
         Me.Undo
         Exit Sub
     End If 
End If

@BrankoDimitrijevic-呃,至少我回答了这个问题,不像你。此外,上下文是Access,尤其是Access作为Excel的替换,因此使用临时参数化查询不是很方便,也不值得付出努力。无论如何,请告诉我你在想什么样的攻击?意外的攻击。您的程序应该可靠地处理每个用户的输入,但这里的情况并非如此。此外,绑定参数不仅仅与注入攻击有关——它们还可以提高性能。@BrankoDimitrijevic——比如什么?我坚持认为代码适合于上下文,但考虑到可用的工具,我真的看不出您所谓的性能改进会出现在哪里。我该如何在Access中测试此解决方案,或执行代码?@buzlink-不确定您的意思。您是在问如何在Access中创建事件处理程序,还是在问如何为Access项目创建单元测试?感谢您提供的几种解决方案。我发现这项工作可能不适合访问。不断有人警告我Access不是正确的程序。有人会建议使用更好的程序吗-ThanksI更愿意使用数字,但姓氏和街道地址是我能够获得的唯一一致的项目,以跟踪一个人作为副本。我想让该人在每次输入记录时运行一个报告,但希望有一个更简单的解决方案。当用户将记录输入Access时,它会让用户看到记录是否相似。
If Nz(DCount("FieldName", "table", "FieldName= '" & Me.FieldName.Value & "'"), 0) > 0 Then
     If MsgBox("The FieldName already exist", vbOKCancel, "Duplicate Warning") = vbCancel Then Cancel = True
         Me.Undo
         Exit Sub
     End If 
End If