Hat jemand eine Idee! Meine VBA-Programm für Login funktioniert nicht.
An der Stelle "dbOpenSnapshot" kommt eine Fehlermeldung "Variable nicht definiert" woran kann es de liegen? wenn möglich mit einem VBA-Beispiel habe selbst nicht so viel Ahnung von VBA.
Danke in Voraus.
Mein VBA
Option Compare Database
Option Explicit
Private Sub cmdLogin_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
rs.FindFirst "UserID='" & Me.txtBenutzername & "'"
If rs.NoMatch = True Then
Me.lblFalscherBenutzer.Visible = True
Me.txtBenutzername.SetFocus
Exit Sub
End If
Me.lblFalscherBenutzer.Visible = False
If rs!Kennwort <> Me.txtKennwort Then
Me.lblFalschesPasswort.Visible = True
Me.txtPasswort.SetFocus
Exit Sub
End If
Me.lblFalschesPasswort.Visible = False
'Set ByPassKeyPrompt
If rs!Benutzergruppen_ID = 3 Then
Dim prop As Property
On Error GoTo SetProperty
Set prop = CurrentDb.CreateProperty("AllowBypassKey", dbBoolean, False)
CurrentDb.Properties.Append prop
'Set Property
If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", vbYesNo, "Allow Bypass") = vbYes Then
CurrentDb.Properties("AllowBypassKey") = True
Else
CurrentDb.Properties("AllowBypassKey") = False
End If
End If
DoCmd.OpenForm "Übersicht"
DoCmd.Close acForm, "Me.Name"
End Sub
Hallo,
es kann sein:
dass hier kein expliziter DAO-Verweis verwendet wird: Dim rs As DAO.Recordset
dass ein anderer Verweis gebrochen, bzw. nicht vorhanden ist: VBA-Editor/Extras/Verweise auf Hinweise checken und korrigieren.
Weiterhin den Verweis auf die passende DAO-Library setzen, falls nicht geschehen.
Unter VBA-Editor/Debuggen/Kompilieren den gesamten Code kompilieren und evtl. Fehler elimininieren.
Dazu vorab in JEDEN(!) Modulkopf Option Explicit einfügen, sofern nicht vorhanden.
btw:
If rs!Kennwort <> Me.txtKennwort Then
Access ist zunächst nicht case-sensitive. Ein solcher Vergleich mach keinen Unterschiede zwischen Groß- und Kleinschreibung. Schau dazu die Strcomp()-Funktion in der VBA-Hilfe an, um einen Binär-Vergleich zu realisieren.
Hallo Franz,
Danke für die schnelle Antwort. Ich habe jetzt auch mit Dim rs As DAO.Recordset versucht und kriege die Fehlermeldung, dass "Benutzerdefinierter Typ nicht definiert". Im Moment weis ich nicht weiter.
Zitat von: Viki am Februar 16, 2017, 10:44:38
Ich habe jetzt auch mit Dim rs As DAO.Recordset versucht und kriege die Fehlermeldung, dass "Benutzerdefinierter Typ nicht definiert".
Wie bereits von Franz geschrieben:
Im VBA-Editor, Menü "Extras"->"Verweise". Dort einen Verweis auf die "Microsoft DAO 3.6 Object Library" setzen.
Hallo Viki,
zu den Verweisen siehe auch:
http://www.donkarl.com?FAQ7.1 (http://www.donkarl.com?FAQ7.1)
Falls du mit den Verweisen nicht zurechtkommst, erstelle eine neue Datenbank, und importiere alle Objekte aus der alten Datenbank.
Gruß
Josef
Hallo zusammen,
es funktioniert, tatsächlich lag es an der DAO-Funktion und derer Aktivierung.
Hallo zusammen,
brauche nochmals Hilfestellung. Habe den geposteten VBA-Code:
Private Sub cmdLogin_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
rs.FindFirst "UserID='" & Me.txtBenutzername & "'"
If rs.NoMatch = True Then
Me.lblFalscherBenutzer.Visible = True
Me.txtBenutzername.SetFocus
Exit Sub
End If
Me.lblFalscherBenutzer.Visible = False
If rs!Kennwort <> Me.txtKennwort Then
Me.lblFalschesPasswort.Visible = True
Me.txtPasswort.SetFocus
Exit Sub
End If
Me.lblFalschesPasswort.Visible = False
'Set ByPassKeyPrompt
If rs!Benutzergruppen_ID = 3 Then
Dim prop As Property
On Error GoTo SetProperty
Set prop = CurrentDb.CreateProperty("AllowBypassKey", dbBoolean, False)
CurrentDb.Properties.Append prop
'Set Property
If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", vbYesNo, "Allow Bypass") = vbYes Then
CurrentDb.Properties("AllowBypassKey") = True
Else
CurrentDb.Properties("AllowBypassKey") = False
End If
End If
DoCmd.OpenForm "Übersicht"
DoCmd.Close acForm, "Me.Name"
End Sub
in eine neu Datenbank eingefügt und ie Variable "Microsoft DAO 3.6 Object Library" angewählt.
bekomme in der Zeile "CurrentDb.Properties("AllowBypassKey") = True" und in der Zeile "CurrentDb.Properties("AllowBypassKey") = False" einen "Laufzeitfehler 3270" Eigenschaft nicht gefunden.
Was könnte das Problem sein? denn die selbe Codierung funktioniert in der Kopie der selben Datenbank.
Viele Grüße
Hi,
ZitatWas könnte das Problem sein?
nimm die Fehlermeldung wörtlich und gehe davon aus, dass die Eigenschaft (noch) nicht vorhanden ist und daher zunächst einmal erstellt werden muss.
Dies betrifft etliche Datenbank- und Objekt-Eigenschaften, die nicht von vornherein definiert sind, weil sie standardmäßig keinen Wert haben.
Hier sollte eigentlich die "CreateProperty"-Methode helfen. Dein Code ist allerdings nicht fehlerfrei kompilierbar - da die Sprungmarke der Fehlerbehandlung nicht definiert ist - und daher grundsätzlich fragwürdig.
Um hier helfen zu können, müsste man schon den Real-Code kennen!
Hier der überarbeitete Code:Private Sub cmdLogin_Click()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot, dbReadOnly)
rs.FindFirst BuildCriteria()"UserID", dbText, Me.txtBenutzername)
If rs.NoMatch Then
Me.lblFalscherBenutzer.Visible = True
Me.txtBenutzername.SetFocus
Exit Sub
Else
Me.lblFalscherBenutzer.Visible = False
End If
'nix gut - Kennworte im Klartext kann jeder auslesen
If StrComp(rs!Kennwort, Me.txtKennwort, vbBinaryCompare) <> 0 Then
Me.lblFalschesPasswort.Visible = True
Me.txtPasswort.SetFocus
Exit Sub
Else
Me.lblFalschesPasswort.Visible = False
End If
'Set ByPassKey
If rs!Benutzergruppen_ID = 3 Then
If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", _
vbYesNo, "Allow Bypass") = vbYes Then
SetPropertyDAO(CurrentDb, AllowBypassKey, vbBoolean, True)
CurrentDb.Properties("AllowBypassKey") = True
Else
CurrentDb.Properties("AllowBypassKey") = False
End If
End If
DoCmd.OpenForm "Übersicht"
DoCmd.Close acForm, Me.Name
End Sub
'Quelle: http://allenbrowne.com/tips.html
'am besten in ein allgemeines Modul auslagern
Public Function SetPropertyDAO( _
obj As Object _
, strPropertyName As String _
, intType As Integer _
, varValue As Variant _
, Optional strErrMsg As String _
) As Boolean
On Error GoTo ErrHandler
'Purpose: Set a property for an object, creating if necessary.
'Arguments: obj = the object whose property should be set.
' strPropertyName = the name of the property to set.
' intType = the type of property (needed for creating)
' varValue = the value to set this property to.
' strErrMsg = string to append any error message to.
If HasProperty(obj, strPropertyName) Then
obj.Properties(strPropertyName) = varValue
Else
obj.Properties.Append obj.CreateProperty(strPropertyName, _
intType, varValue)
End If
SetPropertyDAO = True
ExitHandler:
Exit Function
ErrHandler:
strErrMsg = strErrMsg & obj.Name & "." & strPropertyName & _
" not set to " & varValue & _
". Error " & Err.Number & " - " & Err.Description & vbCrLf
Resume ExitHandler
End Function
Private Function HasProperty( _
obj As Object _
, strPropName As String _
) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant
On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function
PS: statt das Passwort in Klartext zu speichern, sollte besser eine Kryptologische Hashfunktion (https://de.wikipedia.org/wiki/Hashfunktion#Kryptologische_Hashfunktionen) verwendet werden. Mögliche Umsetzungen findest Du z. Bsp. unter Visual Basic for Applications/String Hashing in VBA (https://en.wikibooks.org/wiki/Visual_Basic_for_Applications/String_Hashing_in_VBA).
Ich danke Euch beiden (Lachtaube und MaggieMay) das ergerliche ist, dass es in einer Datenbank funktioniert und in der Anderen nicht. Ich kenne mich auch viel zu wenig mit der VBA aus.
> Deinen Code (Lachtaube) habe ich getestete und hatte auch Fehlermeldungen...mmm
bei "rs.FindFirst BuildCriteria()"UserID", dbText, Me.txtBenutzername)" habe auch die Klammer zugefügt als auch gelöscht dennoch Fehler bei "BuildCriteria()".
Des Weiteren verstehe ich den unteren Code-Teil nicht:
'Quelle: http://allenbrowne.com/tips.html
'am besten in ein allgemeines Modul auslagern
Public Function SetPropertyDAO( _
obj As Object _
, strPropertyName As String _
, intType As Integer _
, varValue As Variant _
, Optional strErrMsg As String _
) As Boolean
On Error GoTo ErrHandler
'Purpose: Set a property for an object, creating if necessary.
'Arguments: obj = the object whose property should be set.
' strPropertyName = the name of the property to set.
' intType = the type of property (needed for creating)
' varValue = the value to set this property to.
' strErrMsg = string to append any error message to.
If HasProperty(obj, strPropertyName) Then
obj.Properties(strPropertyName) = varValue
Else
obj.Properties.Append obj.CreateProperty(strPropertyName, _
intType, varValue)
End If
SetPropertyDAO = True
ExitHandler:
Exit Function
ErrHandler:
strErrMsg = strErrMsg & obj.Name & "." & strPropertyName & _
" not set to " & varValue & _
". Error " & Err.Number & " - " & Err.Description & vbCrLf
Resume ExitHandler
End Function
Private Function HasProperty( _
obj As Object _
, strPropName As String _
) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant
On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function
Eigentlich habe ich schon eine Tabelle mit zwei Ribbons erstellt in der ein Ribbon die
XML-Codierung enthält. Das Ganze habe ich von "Steve Bishop" https://www.youtube.com/watch?v=i1n7H686bWI
Gruß Viki
Wie Du richtig bemerkt hast, war mein Code fehlerhaft. Hier eine Überarbeitung.Private Sub cmdLogin_Click()
Dim rs As DAO.Recordset, strCriteria As String
If IsNull(Me.txtBenutzername) Then
MsgBox "Es ist kein Benutzer eingetragen."
Exit Sub
End If
strCriteria = BuildCriteria("UserID", dbText, Me.txtBenutzername)
Set rs = CurrentDb.OpenRecordset("tblBenutzer", dbOpenSnapshot)
If rs.RecordCount = 0 Then
MsgBox "Es sind keine Benutzer angelegt."
GoTo Cleanup
End If
rs.FindFirst strCriteria
If rs.NoMatch Then
Me.lblFalscherBenutzer.Visible = True
Me.txtBenutzername.SetFocus
GoTo Cleanup
Else
Me.lblFalscherBenutzer.Visible = False
End If
'nix gut - Kennworte im Klartext kann jeder auslesen
If StrComp(Nz(rs!Kennwort), Nz(Me.txtKennwort), vbBinaryCompare) <> 0 Then
Me.lblFalschesPasswort.Visible = True
Me.txtPasswort.SetFocus
GoTo Cleanup
Else
Me.lblFalschesPasswort.Visible = False
End If
'Set ByPassKey
If rs!Benutzergruppen_ID = 3 Then
If MsgBox("Willst du wirklich den Bypass-Key aktivieren?", _
vbYesNo, "Allow Bypass") = vbYes Then
SetPropertyDAO(CurrentDb, AllowBypassKey, vbBoolean, True)
CurrentDb.Properties("AllowBypassKey") = True
Else
CurrentDb.Properties("AllowBypassKey") = False
End If
End If
DoCmd.OpenForm "Übersicht"
DoCmd.Close acForm, Me.Name
Cleanup:
rs.Close
End SubIm zweiten Teil wird der Wert einer Eigenschaft einer Datenbank-Eigenschaft zugewiesen. Sollte die Eigenschaft nicht existieren, so wird sie zuvor erstellt.