警告MS-Access中的重复项

时间:2013-11-02 00:50:43

标签: ms-access database-design

我正在使用MS-Access数据库来跟踪姓氏和地址以及其他一些记录。我正在创建一个表,并希望用户通过从表单输入信息来更新它。我的问题是我可以有几个关键项目,如果发现重复,将发出警告。主要是在姓氏和地址字段中找到重复项。我需要表单接受副本,因为如何获取信息重复是可能的,但需要能够输入副本并警告用户,同时输入已经进行了类似的先前条目的数据。

这在Access中是否可行,并且很容易实现许多不同的用户可能正在输入数据?我有一段时间没有使用Access,如果我没有使用正确的术语,我很抱歉,因为我还在学习Access的基础知识,因为我主要在Excel工作。 Excel是当前正在使用的解决方案,但很快就能找到更好的解决方案。

由于

4 个答案:

答案 0 :(得分:0)

名称不适合主键,并且您似乎已将名称设置为其中一个表的主键。您应该使用更好的候选密钥(例如社会保险号)或创建代理(如果您需要的话是人为的)密钥,除了作为您的餐桌的密钥之外没有其他意义。

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

答案 1 :(得分:0)

警告用户,但如果她愿意,可以让她继续?

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

一般而言,Access(以及通常的关系数据库)是关于防止首先输入重复数据。如果你只是想'警告',那么它将需要一些自定义代码。因此,该表称为Customers,它包含CustomerID(自动编号,主键)和LastName(文本)等字段。然后,该表单有一个名为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

通过将重复检查代码推送到通用帮助程序例程中,可以轻松地以相同方式处理其他关键字段:

Private Sub txtAddress_BeforeUpdate(Cancel As Integer)
  HandleKeyFieldBeforeUpdate txtAddress, Cancel
End Sub