我在Access中有一个表格。
的 ACCESSKEY
AccessCardID
分布式(是/否)
在我的表单上是一个包含10张访问卡的组合框。我需要帮助设置查询,如果访客A获得访问卡#1,用户将只能从访客卡#2-#10中选择访客B,c等,直到访客A返回访问卡#1。 到目前为止,我的查询是
SELECT AccessCardID
FROM AccessKey
WHERE Distributed = False;
这是我更新后的新代码
Private Sub AccessKeyNo_AfterUpdate()
If MsgBox("Do you want to assign Access Key" & Me.AccessKeyNo & "?", _
vbYesNo) = vbYes Then
Me.GuestAccessKeyID = Me.AccessKeyNo
Me.MyCheckBox = Not IsNull(Me.GuestAccessKeyID)
Me.AccessKeyNo.Requery
End If
End Sub
我的新查询
SELECT AccessKey.AccessKeyID
FROM AccessKey LEFT JOIN Guest ON AccessKey.AccessKeyID=Guest.GuestAccessKeyID
WHERE (((Guest.GuestAccessKeyID) Is Null));
表单的On current
Private Sub Form_Current()
Me.MyCheckBox = Not IsNull(Me.GuestAccessKeyID)
If IsNull(Me![GuestID]) Then
DoCmd.GoToControl "GuestFirstName"
End If
End Sub
答案 0 :(得分:1)
为什么不在上面的查询中将Distributed设置为False,以便获得尚未分发的卡片列表。
答案 1 :(得分:0)
如果您不喜欢编写代码,可以使用子表单并将记录源设置为表AccessKey。或者你可以写一些代码,比如说:
Private Sub NameOfComboHere_AfterUpdate()
Dim db As Database
Dim strSQL As String
Set db = CurrentDb
If MsgBox("Do you want to assign " & Me.NameOfComboHere & "?", _
vbYesNo) = vbYes Then
strSQL = "UPDATE AccessKey SET Distributed = True " _
& "WHERE AccessCardID = " & Me.NameOfComboHere
db.Execute strSQL, dbFailOnError
If db.RecordsAffected = 1 Then
MsgBox Me.NameOfComboHere & " has been assigned."
End If
End If
Me.NameOfComboHere.Requery
End Sub
有一些笔记。这假设组合框具有AccessCardID的绑定列,并且AccessCardID是数字。它还假定您具有对Microsoft DAO 3.x对象库的引用。子表单可能是最好的选择。
基于评论的编辑
我们假设您在来宾表中有一个卡片ID,首先,为表格的当前事件添加一些代码:
Me.MyCheckBox = Not IsNull(Me.GuestAccessCard)
如果没有卡ID,则将复选框设置为false;如果存在ID,则设置为true。
您需要将组合框的查询更改为:
SELECT AccessCardID
FROM AccessKey
LEFT JOIN Guests
ON AccessKey.AccessCardID = Guest.GuestAccessCard
WHERE Guest.GuestAccessCard Is Null
然后将运行After Update事件:
Private Sub NameOfComboHere_AfterUpdate()
If MsgBox("Do you want to assign " & Me.NameOfComboHere & "?", _
vbYesNo) = vbYes Then
Me.GuestAccessCard = Me.NameOfComboHere
Me.MyCheckBox = Not IsNull(Me.GuestAccessCard)
''The data will have to be saved for the
''combo to update with the new data
If Me.Dirty Then Me.Dirty = False
Me.NameOfComboHere.Requery
End If
End Sub
当取消勾选复选框并重新查询组合时,不要忘记将GuestAccessCard设置为Null。
答案 2 :(得分:0)
我可能完全误解了这里的情况,但在我看来,你不希望在表格中有一个布尔字段用你的卡片来表明它是否被检出 - 你需要的只是你的一个字段客人表格,您输入卡号。然后,您可以根据正在使用的卡号来判断哪些卡可用左连接:
SELECT Cards.CardNumber
FROM Cards LEFT JOIN Guests ON Cards.CardNumber = Guests.CardNumber
WHERE Guests.CardNumber Is Null
这意味着只存储信息的一个地方(在Guests表中)。您还可以在Guests表中的CardNumber字段中放置一个唯一索引(允许Null),这样您就永远不会将同一张卡分配给两位来宾。
这可能是你做事的方式,也可能是Remou所建议的方式,但我对所有复杂的来回感到困惑!