Situation:
Hallo zusammen,
vorab ich bin Access Laie.
Ich habe eine DB für Projekt eingebaut.
Die Vorstellung ist jetzt, dass nur einzelne User für ein bestimmtes Projekt Schreiberechte haben.
Es soll also quasi eine tbl entstehen, in der erfasst wird, welcher Projektleiter Schreiberechte zu welchem Projekt hat.
Was habe ich bisher gemacht:
Diesen Code eingebaut:
Private Sub Form_Open(Cancel As Integer)
Dim bAllow As Boolean
bAllow = (DCount("User", "tbUserRights", "User=""" & _
Environ("username") & """ And ProNr=" & Me.OpenArgs) > 0)
Me.AllowAdditions = bAllow
Me.AllowDeletions = bAllow
Me.AllowEdits = bAllow
End Sub
Diese Tabelle aufgebaut:
tbUserRights
ID = Autowert
User = kurzer Text
ProNr = Zahl
Daten:
User = m.mustermann
ProNr = 26
Fehler:
Möchte ich jetzt das Projekt 26 aufrufen, kommt folgende Fehlermeldung:
Laufzeitfehler '3075'
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'User = m.mustermann" And ProNr ='.
Kann mir jemand bitte helfen?
Das (https://www.ms-office-forum.net/forum/showthread.php?t=357464) nennt man Crossposting und wird hier und anferswo nur ungern gesehen.
Zitat von: Bass1980 am Januar 25, 2019, 14:46:08
bAllow = (DCount("User", "tbUserRights", "User=""" & _
Environ("username") & """ And ProNr=" & Me.OpenArgs) > 0)
[...]
Laufzeitfehler '3075'
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'User = m.mustermann" And ProNr ='.
Von dem Crosspost einmal abgesehen...
Die Fehlermeldung passt nicht zu dem hier gezeigten Code. Das erschwert die Problemdiagnose erheblich.
Tut mir leid, bin nur um eine schnelle Lösung bemüht. Sollte ich gegen irgendwelche Regeln verstoßen haben, bitte Post löschen!
@PhilS
Da muss es einen Zusammenhang geben, da die Fehlermeldung erst nach Einbau des o. g. VBA Codes kam..!!???
Zitat von: Bass1980 am Januar 25, 2019, 15:24:33
Da muss es einen Zusammenhang geben, da die Fehlermeldung erst nach Einbau des o. g. VBA Codes kam..!!???
Ja, klar, da gibt es einen Zusammenhang, das ist schon deutlich ersichtlich. - Nur, der von dir gezeigte Code kann nicht den dazu geposteten Fehler auslösen. Daher hast du entweder den Code oder die Fehlermeldung nicht korrekt wiedergegeben.
Da kann ich vorerst nur auf allgemeine Hinweise, wie mein
VBA-(SQL)-String Video-Tutorial für Anfänger (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=vba-sql-string-tutorial) verweisen.
Code:
Private Sub Form_Open(Cancel As Integer)
Dim bAllow As Boolean
bAllow = (DCount("User", "tbUserRights", "User=""" & _
Environ("username") & """ And PrjID=" & Me.OpenArgs) > 0)
Me.AllowAdditions = bAllow
Me.AllowDeletions = bAllow
Me.AllowEdits = bAllow
End Sub
Fehlermeldung:
Laufzeitfehler ,3075':
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'User="m.mustermann" AND PrjID=`.
.....
Jetzt nochmal explizit abgeschrieben bzw. kopiert und eingefügt.
Zitat von: Bass1980 am Januar 25, 2019, 16:08:52
Jetzt nochmal explizit abgeschrieben bzw. kopiert und eingefügt.
Und schon passt es auch zusammen.
Die Projektnummer wird in den OpenArgs nicht übergeben. Folglich ist die WhereCondition am Ende unvollständig.
Danke! Man beachte die Details.
Kannst Du mir evtl. weiterhelfen, wie ich die Projektnummer übergeben kann?
@bass1980
Schau dir die Parameter hinter "DoCmd.OpenForm" genauer an (OH).
I.Ü. reichen auch einfache Quotes für Strings
ZitatbAllow = (DCount("User", "tbUserRights", "User='" & _
Environ("username") & "' And PrjID=" & Me.OpenArgs) > 0)
gruss ekkehard
Hallo Ekkehard,
Danke für deine Hilfe.
Ich habe eine Projektliste als Endlosformular.
PrjID Adresse Feld 1 Feld 2 usw.
26 Bla bla
28 Bla bla
Auf dem Textfeld PrjID ist ein Makro beim Ereignis Klicken hinterlegt:
DoCmd.OpenForm "frm_prj", , , "PrjID=" & Me!PrjID, , acWindow normal
Danach dann der Code....
Private Sub Form_Open(Cancel As Integer)
Dim bAllow As Boolean
bAllow = (DCount("User", "tbUserRights", "User=""" & _
Environ("username") & """ And PrjID=" & Me.OpenArgs) > 0)
Me.AllowAdditions = bAllow
Me.AllowDeletions = bAllow
Me.AllowEdits = bAllow
End Sub
Was kann hier falsch sein?
Hallo!
Me.OpenArgs ist leer, da es bei Docmd.OpenForm nicht als Parameter übergeben wurde.
Meiner Meinung nach ist die Verwendung von Openargs für den Anwendungsfall auch gar nicht notwendig, da die PrjID im Formulardatensatz zur Verfügung steht.
Ich würde allerdings den Freischalt-/Sperr-Code als Reaktion von Form.Current und nicht von Form.Open laufen lassen.
mfg
Josef
Hallo Josef,
Danke für deinen Einwand!
D. h. ich streiche .OpenArgs aus dem Code und ersetze Privat Sub Form_Open durch Privat Sub Form_Current?
Hallo!
OpenArgs benötigst du nicht, da du mit me!PrjID direkt auf den Wert vom jeweiligen Datensatz im Forumular zugreifen kannst. Das hat dann den Vorteil, das die Einstellung der Rechte im Formular eigenständig laufen kann und nicht von außen ausgelöst werden muss.
Somit ist es egal, von wo aus du das Formular öffnest. Es wird immer der Code für die Bearbeitungsfreigabe laufen.
In Form_Current würde ich den Bearbeitungscode einbauen, damit man bei Bedarf einen anderen Datensatz laden kann, ohne vorher das Formular schließen zu müssen.
Als Anregung:
Private Sub Form_Current()
SetEditMode
End Sub
private sub SetEditMode()
Dim bAllow As Boolean
if Me.NewRecord then
' Wie sollen die Rechte eingestellt werden, wenn ein neuer Datensatz angelegt wird?
else
bAllow = (DCount("User", "tbUserRights", "User=""" & _
Environ("username") & """ And PrjID=" & Me!PrjID) > 0)
end if
Me.AllowAdditions = bAllow ' Was hat die jeweilige Projektrolle damit zu tun, ein neues Projekt zu erstellen?
Me.AllowDeletions = bAllow ' Bist du sicher, dass jemand (außer ein Admin) ein Projekt löschen können soll?
Me.AllowEdits = bAllow
SetControlLayout bAllow ' In dieser PRozedur würde ich es für den Anwender erkenntbar machen, ob er Bearbeitungsrechte hat.
end Sub
mfg
Josef
Hallo,
ab jetzt antworte ich nur noch hier zum Cross-Posted.
Zitat...1. Eine "billige" Lösung. Man schränkt Rechte über das Formular ein. Das kann man zwar relativ leicht umgehen (Zugriff über verknüpfte Tabellen, oder SQL, oder zurücksetzen per VBA). Kann aber den Zweck trotzdem erfüllen....
Auch das wird nicht einfach sein, denn es kommen erfahrungsgemäss schnell
"kleine Zusatzwünsche" nach.
Es wird schwierig für den TS sein, bei seinen momentan geringen Access- und VBAkenntnissen da sich etwas "zusammenschrauben" zu können,
selbst wenn man ihm die Codes vorgekaut übergeben wird.
Daher hab ich eine Beispiel DB, welche viel Vorgekautes schon beinhaltet und welche möglicherweise weiterhelfen könnte.
Ich werde aber nicht auf Diskussionen über diese DB eingehen.
https://www.ms-office-forum.net/foru...74#post1904474