recordset.FindFirst und recordset.NoMatch

Moderator: ModerationP

recordset.FindFirst und recordset.NoMatch

Beitragvon Saturu » 11. Jun 2021, 18:18

Hallo,

ich bin dabei eine Benutzerabfrage zu erstellen. In einem Formular sollen Benutzername und Passwort eingegeben werden und dann mit den hinterlegten Daten in einer Tabelle tblBenutzer abgeglichen werden. Der Code scheint auch zu funktionieren, jedoch ist NoMatch immer "Wahr", auch wenn genau der eingebenene Benutzername in der tblBenutzer vorhanden ist.

Kann mir jemand sagen was ich falsch mache?

Code: Alles auswählen
Private Sub btnAnmelden_Click()
    Dim rs As Recordset
   
    Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
   
    'Datensatz suchen
    rs.FindFirst "BenutzerLogin="" & Me.txtBenutzerLogin&"""
   
    'Benutzer Login prüfen
    If rs.NoMatch = True Then
        Me.lblFalscherBenutzerlogin.Visible = True   'Hinweis auf falschen Benutzerlogin anzeigen
        Me.txtBenutzerLogin.SetFocus
        Exit Sub
    End If
    Me.lblFalscherBenutzerlogin.Visible = False     'Wenn der Benutzerlogin korrekt ist, den Hinweis auf falschen Benutzerlogin sicher ausblenden
   
    'Passwort prüfen
    If rs!BenutzerPasswort <> Me.txtBenutzerPasswort Then
        Me.lblFalschesPasswort.Visible = True       'Hinweis auf falsches Passwort anzeigen
        Me.txtBenutzerPasswort.SetFocus
        Exit Sub
    End If
   
    Me.lblFalschesPasswort.Visible = False          'Wenn das Passwort korrekt ist, den Hinweis auf falsches Passwort sicher ausblenden
   
    'Cleanup
    rs.Close
    Set rs = Nothing
   
    DoCmd.Close acForm, Me.Name 'Formular "Anmeldung" schließen

End Sub
Saturu
 

Re: recordset.FindFirst und recordset.NoMatch

Beitragvon knobbi38 » 11. Jun 2021, 19:12

Hallo Saturu,

1. dein FindString Arument dürfte nicht richtig sein, bzw. sogar einen Syntaxerror auslösen.
Setze das Argument besser in einer Variablen zusammen und übergebe diese dann an FindString. So kannst du vorher den String auf Korrektheit überprüfen. Anführungszeichen müssen in VBA normalerweise gedoppelt werden!

2. Ein Prüfung "rs.NoMatch = True" ist doppelt gemoppelt. Es reicht ein "if rs.NoMatch then"

3. Hier zeigt sich auch mal wieder, warum eine Prozedur nur einen Exit haben sollte. Nach den verschiedenen Exit Subs (BAD PRACTICE), wird das eigentlich dafür gedachte Cleanup überhaupt nicht mehr durchlaufen und das Recordset nicht geschlossen.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3331
Registriert: 02. Jul 2015, 14:23

Re: recordset.FindFirst und recordset.NoMatch

Beitragvon Saturu » 11. Jun 2021, 19:33

Hallo Ulrich,

vielen Dank für die schnelle Antwort.

Einen Syntaxerror bekomme ich nicht und die Anführungszeichen habe ich gedoppelt.

Wie mache ich das denn mit dem FindString?
Code: Alles auswählen
    findStr = ("BenutzerLogin=" & Me.txtBenutzerLogin)

    rs.FindFirst (findStr)


Führt zum Laufzeitfehler 3070.
Mit den Anführungszeichen wird anscheinend nicht der Inhalt von me.txt.BenutzerLogin, sondern das als Text übergeben.
Code: Alles auswählen
findStr =  "BenutzerLogin="" &Me.txtBenutzerLogin&"""


Kannst du mir da weiterhelfen?
Saturu
 

Re: recordset.FindFirst und recordset.NoMatch

Beitragvon Saturu » 11. Jun 2021, 20:00

Ich habe den Fehler noch gefunden. Das Problem waren die doppelten Anführungszeichen. Mit Hochkommata funktioniert es.

Code: Alles auswählen
    rs.FindFirst "BenutzerLogin='" & Me.txtBenutzerLogin & "'"
Saturu
 

Re: recordset.FindFirst und recordset.NoMatch

Beitragvon Marco PB » 14. Jun 2021, 13:31

Dein ... & Me.txtBenutzerLogin&""" müsste einen Syntaxfehler verursachen, denn es fehlt ein Leerzeichen zwischen txtBenutzerLogin[i] und &[/i], und noch eins vor dem dreifachen Anführungszeichen.
Das hat vielleicht mit deinem Problem zu tun, denn wenn es mit Hochkommata funktioniert, muss es mit doppelten Anführungszeichen auch funktionieren.
Es sei denn, schon der Benutzername an sich enthält ein Anführungszeichen.
Marco PB
 

Re: recordset.FindFirst und recordset.NoMatch

Beitragvon Marco PB » 14. Jun 2021, 14:22

Nachtrag: nein, das Problem war die falsche Anzahl Anführungszeichen, deshalb das permanente NoMatch. Korrekt muss ess heissen:
Code: Alles auswählen
rs.FindFirst  "BenutzerLogin=""" & me.txtBenutzerLogin & """"

also drei vorne und vier hinten, denn ein Gänsefüsschen zwischen Gänsefüsschen muss doppelt eingegeben werden.

Generell: wenn du so abenteuerliche Verkettungen fabrizierst und Probleme bekommst, lass dir immer das Ergebnis per MsgBox oder debug.print anzeigen, dann hättest du gleich gesehen, warum dein Ausdruck nicht matchen konnte.

Deshalb schreibe Ich immer diese Sachen so, dann ist es viel leichter zu verfolgen, was wirklich da passiert:
Code: Alles auswählen
dim Param as string
Param = "BenutzerLogin=""" & me.txtBenutzerLogin & """"
' debug.print Param
rs.FindFirst Param
Marco PB
 


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste