我相信您会想要两件事,具体取决于您想要界面的用户友好程度。
唯一索引
在“设置”表中的列上添加多列唯一索引,其中您不希望在另一行中重复它们的值组合。可以在原始帖子的评论中阅读 KFleschner 提供的链接,或者查看此问题的第二个答案,其中包含屏幕截图以及步骤:我们可以在 MS Access 数据库上创建多列唯一索引吗?。这将不允许“设置”表中存在重复项。
例如,如果您的设置和实验是针对计算机设备的,并且您有一个包含以下列的设置表:
设置 ID、RAM_GB、CPU_GHz
那么你的主键将是(SettingID),你的多列唯一索引将是(RAM_GB,CPU_GHz),因为你只想要一条具有相同RAM容量和CPU速度的记录。
在数据库语言中,您的主键,SettingID,将是所谓的代理键。新的多列唯一索引将被称为自然键。两者都可以用来标识唯一的行,但主键(代理键)是在任何行中使用的外键关系,例如实验表中的设置 ID。
这本身就可以防止重复问题,因为它将在数据库级别强制执行。但是,它不会自动使您的表单跳转到具有匹配自然键的记录。相反,Access 会通过一条消息提醒用户您输入的记录违反了索引。但仅此而已。用户必须取消新记录并自己去找匹配的记录。
更新前事件
插入前事件在新记录输入第一个字符时触发。看http://msdn.microsoft.com/en-us/library/office/ff835397.aspx了解详情。这太快了,您需要“更新前”事件。并将代码添加到事件中,如下所示:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Set rst = Me.RecordsetClone
rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz
If Not rst.NoMatch Then
Cancel = True
If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then
Me.Undo
DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
End If
End If
rst.Close
End Sub
这段代码假设了一些事情:
-
[RAM_GB]
and [CPU_GHz]
是多列唯一索引的列。
-
[SettingID]
是主键中的列。
根据您的需要调整列名称等,然后您还可以通过一种方式提示并自动导航到现有记录。