我正在使用MS-Access数据库来跟踪姓氏和地址以及其他一些记录。我正在创建一个表,并希望用户通过从表单输入信息来更新它。我的问题是我可以有几个关键项目,如果发现重复,将发出警告。主要是在姓氏和地址字段中找到重复项。我需要表单接受副本,因为如何获取信息重复是可能的,但需要能够输入副本并警告用户,同时输入已经进行了类似的先前条目的数据。
这在Access中是否可行,并且很容易实现许多不同的用户可能正在输入数据?我有一段时间没有使用Access,如果我没有使用正确的术语,我很抱歉,因为我还在学习Access的基础知识,因为我主要在Excel工作。 Excel是当前正在使用的解决方案,但很快就能找到更好的解决方案。
由于
答案 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