2

设置:我正在创建一个 ms 访问数据库来记录我和其他人将要完成的实验结果。我创建了一个表单和一个子表单;主表单包含有关设备设置的字段,子表单包含该设备设置的实验。链接主节点和链接子节点是 SettingID。

问题:尽管主 [settings] 表单中的字段仅限于组合框选择,但仍有许多设置组合。因此,当用户在表单中输入信息时,他们可能没有意识到已经存在具有相同设置的记录,并且由于 SettingID 是自动编号,因此它看起来是唯一的记录,而实际上并非如此。

问题:我想对 BeforeInsert 事件运行查询,以在创建此记录之前检查是否存在具有相同设置的记录。如果记录不存在,则照常进行;如果确实存在,则提醒用户并将他们带到该记录。我不知道如何做到这一点。到目前为止我所做的尝试不值得一提,但我会继续尝试找出一些东西,直到有人回答这篇文章。

4

1 回答 1

3

我相信你会想要两件事,这取决于你想要界面的用户友好程度。

唯一索引

在设置表中的列上添加一个多列唯一索引,在这些列中,您不希望在另一行中重复这些值的组合。可以在原始帖子的评论中阅读 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

这段代码假设了一些事情:

  1. [RAM_GB]并且[CPU_GHz]是您的多列唯一索引的列。
  2. [SettingID]是主键中的列。

根据您的需要调整列名等,然后您还可以提示并自动导航到现有记录。

于 2013-01-30T22:22:13.420 回答