Неправильное использование Null при использовании DLookup в MS Access - PullRequest
1 голос
/ 02 июня 2019

Я хочу установить доступ для входа пользователя в MS Access, что означает, что если пользователь войдет в систему как администратор, он покажет другую форму.

Я попытался получить userlevel, который является строкой и будет отображать такие вещи, как "Admin" или "User", но в нем указано:

Недопустимое использование Null

В этой строке:

UserLevel = DLookup("UserSecurity", "tblUser", "[UserLogin] = ' " & Me.txtLoginID.Value & "'")

Вот полный код:

Private Sub Command1_Click()
Dim UserLevel As String 'get the dlookup value
Dim TempPass As String

If IsNull(Me.txtLoginID) Then
   MsgBox "Please Enter Login ID", vbInformation, "Login Id Required"
   Me.txtLoginID.SetFocus

   ElseIf IsNull(Me.txtLoginPass) Then
       MsgBox "Please Enter Password", vbInformation, "Login password Required"
   Me.txtLoginPass.SetFocus
Else
'process the job
   If (IsNull(DLookup("UserLogin", "tblUser", "UserLogin ='" & Me.txtLoginID.Value & "'"))) Or _
   (IsNull(DLookup("password", "tblUser", "Password = '" & Me.txtLoginPass.Value & "'"))) Then
       MsgBox "Incorrect Password"
   Else
     TempPass = DLookup("password", "tblUser", "UserLogin = '" & Me.txtLoginID.Value & "'")

     UserLevel = DLookup("UserSecurity", "tblUser", "[UserLogin] = ' " & Me.txtLoginID.Value & "'")
     'get the usersecurity whcih indicate he is admin or user

   DoCmd.Close
        If UserLevel = "Admin" Then 'if admin then open employee form else open customer form
           'MsgBox "Login ID and password correct "
           DoCmd.OpenForm "Employee"
       Else
           DoCmd.OpenForm "CustomerForm"
       End If   
   End If
End If
End Sub

Я пытался использовать Nz(), но это дает мне нулевое значениечто приводит меня к форме клиента.

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Чтобы объяснить ошибку, которую вы получаете: это возникает, когда вы пытаетесь присвоить значение Null переменной, тип данных которой , а не a Variant, согласно документации MS

Вариант - это специальный тип данных, который может содержать данные любого типа [...] Вариант также может содержать специальные значения Пусто, Ошибка, Ничего и Нуль .

Эта ошибка возникает в вашем коде, потому что функция DLookup вернет Null, когда ни одна запись в домене не соответствует указанному аргументу критерия, и может быть сведена к следующим двум строкам:

Dim UserLevel As String
UserLevel = DLookup("UserSecurity", "tblUser", "[UserLogin] = ' " & Me.txtLoginID.Value & "'")

Я подозреваю, что это вызвано пробелом в аргументе вашего критерия:

"[UserLogin] = ' " & Me.txtLoginID.Value & "'"
                ^--------------------------------- HERE

Что, вероятно, должно быть:

"[UserLogin] = '" & Me.txtLoginID.Value & "'"

Тем не менее, вы все равно можете учесть случай, когда ни одна из записей не соответствует критериям, что может быть выполнено несколькими способами.

Вы можете использовать функцию Nz и затем проверить наличие пустой строки, например ::

UserLevel = Nz(DLookup("UserSecurity", "tblUser", "[UserLogin] = '" & Me.txtLoginID.Value & "'"), "")
Select Case UserLevel
    Case "Admin": DoCmd.OpenForm "Employee"
    Case "User" : DoCmd.OpenForm "CustomerForm"
    Case Else   : MsgBox "Invalid UserSecurity Value"
End Select

Или вы можете определить переменную UserLevel как Variant (следовательно, разрешить значение Null) и проверить, является ли такая переменная Null, используя функцию IsNull:

Dim UserLevel As Variant ' Or just "Dim UserLevel" since Variant is the default type
UserLevel = DLookup("UserSecurity", "tblUser", "[UserLogin] = '" & Me.txtLoginID.Value & "'")
If IsNull(UserLevel) Then
    MsgBox "Invalid UserSecurity Value"
ElseIf UserLevel = "Admin" Then
    DoCmd.OpenForm "Employee"
Else 
    DoCmd.OpenForm "CustomerForm"
End If
0 голосов
/ 02 июня 2019

Удалите пробел, который вы вставили в критерии, так:

UserLevel = DLookup("UserSecurity", "tblUser", "[UserLogin] = '" & Me.txtLoginID.Value & "'")
...