DLookup在Access 2010中使用IsNull和多个条件

时间:2013-04-29 03:25:34

标签: ms-access access-vba isnull filtered-lookup

基本上我试图找到用户当前是否在使用TimeIn创建新行之前已登录,但是在编写代码时,用户可以多次签入而不签出(TLog_TImeOut字段为空)。我的代码如下所示。

If Not IsNull(DLookup("[TLog_TimeIn]", "TIMELOG", "IsNull(TLog_TImeOut)= True And NetID =  '[TempVars]![CurrentID]'")) Then
MsgBox ("Please Check out!")
DoCmd.Close acForm, "CHECKIN", acSaveNo
Exit Sub
Else
   NetID = [TempVars]![CurrentID]
   TLog_TimeIn = Now()
   MsgBox ("Thanks for checking in!")
   DoCmd.Close acForm, "CHECKIN", acSaveYes
Exit Sub
End If

1 个答案:

答案 0 :(得分:3)

您的DLOOKUP应该更像这样:

If Not IsNull(DLookup("[TLog_TimeIn]", "TIMELOG", "TLog_TimeOut Is Null And NetID = '" & Forms![TempVars]![CurrentID] & "'")) Then

特别是你的情况 -

IsNull(TLog_TImeOut)= True And NetID =  '[TempVars]![CurrentID]'

应该像 SQL 语句中的WHERE条件一样对待。

首先,如果可能的话,您希望出于速度原因而避免使用Access函数(在这种情况下并不是很重要),因此使用Is Null优于IsNull(XXX)=True但特别是这部分:

NetID =  '[TempVars]![CurrentID]'

这会将NetID与字符串'[TempVar]![CurrentID]'进行比较,所以你想要的是像这样构建这个字符串:

NetID = '" & Forms![TempVars]![CurrentID] & "'"

(假设[TempVars]是一个用于保存变量值的隐藏表单),如果该表格上的CurrentID为BOB,则会产生:

NetID = 'BOB'

这就是你想要的。