我相信你会想要两件事,这取决于你想要界面的用户友好程度。
唯一索引
在设置表中的列上添加一个多列唯一索引,在这些列中,您不希望在另一行中重复这些值的组合。可以在原始帖子的评论中阅读 KFleschner 提供的链接中的操作方法,或查看此问题的第二个答案,其中有一个屏幕截图与步骤:我们可以在 MS 访问数据库上创建多列唯一索引吗?. 这将不允许“设置”表中的重复项。
例如,如果您的设置和实验是针对计算机设备的,并且您有一个包含以下列的设置表:
设置ID、RAM_GB、CPU_GHz
然后您的主键将是 (SettingID) 并且您的多列唯一索引将打开 (RAM_GB, CPU_GHz),因为您只想要一个具有相同 RAM 容量和 CPU 速度的记录。
在数据库语言中,您的主键 SettingID 将被称为代理键。而新的多列唯一索引将是所谓的自然键。两者都可用于标识唯一行,但主键(代理键)用于任何外键关系,例如 Experiments 表中的 SettingID。
这本身将防止重复问题,因为它将在数据库级别强制执行。但是,它不会自动使您的表单跳转到具有匹配自然键的记录。相反,Access 会向用户发出一条消息,提示您输入了违反索引的记录。但仅此而已。用户将不得不取消新记录并自己去寻找匹配的记录。
更新事件前
Before Insert 事件在新记录输入的第一个字符时触发。有关详细信息,请参阅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]
并且[CPU_GHz]
是您的多列唯一索引的列。
[SettingID]
是主键中的列。
根据您的需要调整列名等,然后您还可以提示并自动导航到现有记录。