0

我正在开发一个 MS-Access 数据库来跟踪姓氏和地址以及其他几条记录。我正在制作一张表格,并希望用户通过输入表格中的信息来更新它。我的问题是,如果发现重复项,我是否可以有几个关键项目会发出警告。主要是如果在姓氏和地址字段中发现重复项。我需要表格来接受重复项,因为获取信息的方式可能会出现重复项,但需要能够输入重复项并在输入数据时警告用户之前已经进行了类似的输入。

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

谢谢

4

4 回答 4

0

名称不是主键的好候选者,您似乎已将名称设置为其中一个表的主键。您应该使用更好的候选键(例如社会保险号)或创建一个代理键(如果需要,可以是人工的),除了作为您的表的键之外没有任何意义。

如果没有有关您的表结构的更多详细信息,就很难更具体。

于 2013-11-02T00:54:21.857 回答
0

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

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

于 2013-11-02T04:38:18.527 回答
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
于 2019-10-11T14:55:21.547 回答
-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
于 2013-11-02T04:47:38.780 回答