使用 BeforeChange Table 事件避免重复记录

Avoid Duplicate Records with BeforeChange Table Event

我在 MS Access 数据库中有一个情况,我必须根据三个属性的组合来防止重复记录:

因此,对于一种组合 (StudentNumber & ColleagueID),我有三种类型的出席:ABC

这是一个例子:

+---------------+-------------+---------------+
| StudentNumber | ColleagueID | AttendingType |
+---------------+-------------+---------------+
|           100 |          10 | A             |
|           100 |          10 | B             |
|           100 |          10 | C             |
|           100 |          11 | A             |
|           100 |          11 | B             |
|           100 |          11 | C             |
|           100 |          11 | C             |
+---------------+-------------+---------------+

所以最后一行是不可接受的。

有人知道吗?

如前所述,您可以选择所有 3 个作为 PK。或者您甚至可以在所有 3 列上创建唯一索引。这两个想法因此是无代码的。

最后但最不重要的一点是,您可以使用更改前宏,并在 table 中进行搜索(查找)以检查现有记录是否存在。到目前为止,根据您的信息,唯一索引可能是最省力的,并且不需要您将 PK 更改为所有 3 列(如前所述,这是另一种解决方案)。

所以,你可以考虑一个before change宏。并使用这个:

Lookup a Record in MyTable
   Where Condition = [z].[Field1]=[MyTable].[Field1] And 
                     [z].[Field2]=[MyTable].[Field2] And 
                     [z].[ID]<>[MyTable].[ID]
   Alias Z
   RaiseError   -123
   Error Description: There are other rows with this data

因此,您可以使用数据宏,使用更改前的 table 宏。确保您将查找代码的引发错误代码缩进 "inside"。并注意我们如何使用别名进行查找,因为 table 名称 (MyTable) 已经在上下文中,并且已经是当前数据行,所以我们使用 "z" 作为别名进行查找区分当前行和查找记录的行。

因此,从学习的角度来看,可以使用上面的 table 宏,但是简单地在所有 3 列上设置唯一索引可能会减少工作量和精力。