设置:我正在创建一个ms访问数据库来记录我和其他人将要完成的实验结果。我创建了一个表单和一个子表单;主窗体包含有关设备设置的字段,子窗体包含有关设备设置的实验。链接主节点和链接子节点是SettingID。
问题:即使主[设置]表单中的字段仅限于组合框选择,仍有许多设置组合。因此,当用户在表单中输入信息时,他们可能没有意识到已经存在具有相同设置的记录,并且由于SettingID是自动编号,因此实际上它不是唯一记录。
问题:我想在BeforeInsert事件上运行查询,以检查在创建此记录之前是否存在具有相同设置的记录。如果记录不存在,则继续正常进行;如果确实存在,则提醒用户并将其带到该记录。我不知道如何做到这一点。我到目前为止所做的尝试并不值得一提,但我会继续尝试解决问题直到有人回答这篇文章。
答案 0 :(得分:3)
我相信你会想要两件事,这取决于你想要界面的用户友好程度。
在“设置”表中的列上添加多列唯一索引,在这些列中,您不希望在另一行中复制它们的值组合。可以阅读KFleschner在您原始帖子的评论中提供的链接中的内容,或查看此问题的第二个答案,其中包含截图以及步骤:Can we create multicolumn unique indexes on MS access databases?。这将禁止在“设置”表中重复。
例如,如果您的设置和实验是针对计算机装备的,并且您有一个包含以下列的“设置”表:
SettingID,RAM_GB,CPU_GHz
然后您的主键将是(SettingID),并且您的多列唯一索引将打开(RAM_GB,CPU_GHz),因为您只需要一个具有相同RAM容量和CPU速度的记录。
在数据库语言中,您的主键SettingID将是所谓的surrogate key。新的多列唯一索引将是所谓的natural key。两者都可用于标识唯一行,但主键(代理键)是任何foreign key关系中使用的,例如Experiments表中的SettingID。
这本身可以防止重复问题,因为它将在数据库级别强制执行。但是,它不会自动使您的表单跳转到具有匹配自然键的记录。相反,Access会向用户发出一条消息,告知您输入了违反索引的记录。但仅此而已。用户必须取消新记录,然后自己找到匹配的记录。
Before Insert事件触发新记录的第一个输入字符。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/office/ff835397.aspx。这太早了,您需要Before Update事件。并为此事件添加代码:
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]
是主键中的列。根据您的需要调整列名等,然后您还可以提示并自动导航到现有记录。