如何在访问表中允许多个空白记录,但没有重复记录?

时间:2018-02-07 15:47:19

标签: ms-access access-vba duplicates

我有一张入住登记入住和退房表格。签出单位时,需要UserID。重新检入该单元后,UserID将更新为""。我想阻止UserID同时检出两个单元,但是如果我尝试将UserID字段设为唯一字段,它会将空白计为重复项并且不允许它。

如何防止重复的UserID条目?

2 个答案:

答案 0 :(得分:1)

使用VBA函数规范化用户ID

Public Function NormalizeUserID(ByVal uid As Variant)
    uid = Replace(Nz(uid), " ", "")
    NormalizeUserId = LCase$(uid) 'Optional
End Function

这会删除所有空格并使用户ID为小写。如果您只想删除前导和尾随空格,请改用Trim。这取决于你。

Public Function NormalizeUserId(ByVal uid As Variant)
    uid = Trim(uid)
    NormalizeUserId = LCase(uid)
End Function

当用户在文本框的AfterUpdate事件中输入用户名时应用它

Private Sub txtUserId_AfterUpdate()
    me!txtUserId = NormalizeUserID(me!txtUserId)
End Sub

此外,请确保表中的UserId列具有唯一索引。

如果您希望在用户输入用户名时保留用户名,请在表格中使用2列:也许在已调用的UserIdDisplay和一个UserIdNormalized上。在表单中,您可以将文本框绑定到UserIdDisplay并将AfterUpdate更改为

Private Sub txtUserIdDisplay_AfterUpdate()
    me!UserIdNormalized = NormalizeUserID(me!txtUserIdDisplay)
End Sub

在表格中,为UserIdNormalized添加唯一索引。

注意:

最好将用户信息存储在单独的用户表中。您将创建一个以AutoNumber为主键的用户表,并将这两个用户ID列创建为具有唯一索引的文本列,如上所述。

在结帐表格中,您可以通过此AutoNumber链接用户(结帐表格需要Number Long字段来存储用户编号。

 tblUser                                 tblCheckout
+---------------------------------+     +==-----------------------+
| PK  UserID           AutoNumber |<-+  | PK  Id      AutoNumber  |
+---------------------------------+  |  +-------------------------+
|     UserIdDisplay    Text(20)   |  +--o FK  UserId  Number Long |
| UX  UserIdNormalized Text(20)   |     |     other columns ...   |
|     optional: username etc. ... |     +=========================+
+---------------------------------+

优点是每个用户只有一个用户记录,即使该用户进行了多次检出。用户可以更改其可见用户ID,而不会影响内部UserID。您可以存储其他用户信息(姓名,地址,电子邮件等)。

答案 1 :(得分:1)

不要将结帐状态存储在与项目相同的表格中。无论如何,这些在概念上是不同的。创建第二个表UnitCheckout,其PK为UnitId(或者您的单元表上的主键是什么)。这将是1:1的关系。如果签出了某些内容,则此表格中会有UnitIdUserId的记录。如果没有签出,则根本没有记录。这将允许您在UnitCheckout表上放置一个可强制执行的唯一约束。