MS Access 03使用是/否数据类型查询

时间:2011-01-19 22:25:25

标签: ms-access

我在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

3 个答案:

答案 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所建议的方式,但我对所有复杂的来回感到困惑!