新用户:)
我在下面的代码中遇到了关于DLookup的问题。该代码假设仅允许所选用户打开表单。用户在tbl中,并且On Error Resume Next代码正在运行,允许用户访问应用程序,但是当我注释On Error时,我得到运行时错误' 13':类型不匹配。我希望有人解释为什么它会因On Error注释而失败。我理解If语句需要一个条件来评估,那么如何获取用户名允许应用程序打开表单?
Private Sub Form_Open(Cancel As Integer)
On Error Resume Next
If DLookup("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") Then
Else
MsgBox "You do not have permission to access the application"
DoCmd.Close
End If
End Sub
答案 0 :(得分:2)
这真的不是这样做的方法,但我会解释它的作用。
DLookUp
从表中查找值。在您的情况下,它会从表CitrixID
中查找CitrixID
CitrixID
,其中If
等于用户名。然后它返回该用户名作为If
语句的条件。
True
语句要求条件为False
,Null
,On Error Resume Next
或数值(0 =假,所有其他数字为truthy)计为错误,而不是Windows用户名,这就是错误发生的原因。
如果您使用If
,如果DLookup
返回字符串,您实际上会跳转到Null
语句,因为这是下一件事。但是,如果它返回Null
,因为它无法找到该用户名,但不会触发错误,因为Public Sub TestIfResumeNext()
If Null Then
Debug.Print Null
End If
On Error Resume Next
If "A" Then
Debug.Print "A"
End If
If 1 Then
Debug.Print 1
End If
If 0 Then
Debug.Print 0
End If
If -1 Then
Debug.Print -1
End If
End Sub
是一个有效的值,会被转换为false。
一些示例代码可帮助您理解这一点:
"A"
由于错误捕获,1
和-1
会返回Null
,因为它们是真实的,但不是0
,因为这是有效的假法价值,而不是DLookUp
出于同样的原因。
如果您不想依赖此错误捕获行为,但希望保留其余逻辑,则只需将DCount
替换为0
即可。由于0
是假的,你甚至不需要检查它是否If DCount("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") Then
(但这样做是一种很好的做法)。
If DCount("[CitrixID]", "tbl_UserAccess", "[CitrixID] = " & "'" & Environ("username") & "'") <> 0 Then
或者,与比较
If Not
请注意,您现在可以使用If DCount = 0
或Else
缩短它并移除 public RequestCreator requestCreatorFromUrl(String picUrl) {
return Picasso.with(mCtx).load(picUrl);
}
答案 1 :(得分:1)
DLookup返回 Null 表示&#34;未找到&#34;所以你需要的只是检查:
Private Sub Form_Open(Cancel As Integer)
If IsNull(DLookup("[CitrixID]", "tbl_UserAccess", "[CitrixID] = '" & Environ("username") & "'")) Then
MsgBox "You do not have permission to access the application."
DoCmd.Close
End If
End Sub