Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Projektdatenbank / Nur gewisse User dürfen in ihrem Projekt Daten ändern

Begonnen von Bass1980, Januar 25, 2019, 14:46:08

⏪ vorheriges - nächstes ⏩

Bass1980

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?

Lachtaube

Das nennt man Crossposting und wird hier und anferswo nur ungern gesehen.
Grüße von der (⌒▽⌒)

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Bass1980

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..!!???

PhilS

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 verweisen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Bass1980

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.



PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Bass1980

Danke! Man beachte die Details.
Kannst Du mir evtl. weiterhelfen, wie ich die Projektnummer übergeben kann?

Beaker s.a.

@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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Bass1980

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?


Josef P.

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

Bass1980

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?

Josef P.

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

derArb

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