我有一张入住登记入住和退房表格。签出单位时,需要UserID
。重新检入该单元后,UserID
将更新为""
。我想阻止UserID
同时检出两个单元,但是如果我尝试将UserID
字段设为唯一字段,它会将空白计为重复项并且不允许它。
如何防止重复的UserID
条目?
答案 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的关系。如果签出了某些内容,则此表格中会有UnitId
和UserId
的记录。如果没有签出,则根本没有记录。这将允许您在UnitCheckout
表上放置一个可强制执行的唯一约束。