PDA

Vollständige Version anzeigen : Schreibgeschütztes Formular


PSViolon
04.05.2011, 10:50
Hallo,

ich öffne ein Formular folgendermaßen:
DoCmd.OpenForm stDocName, , , stLinkCriteria, acFormReadOnly

Leider kann ich wegen Readonly keine Auswahl mehr in den Listenfeldern treffen.

Gibt es da eine andere Möglichkeit? Schreibgeschützt, aber mit funktionsfähigen Listenfeldern.

SP17
04.05.2011, 10:59
Du kannst alle Felder, die nicht änderbar sein sollen, in den Eigenschaften auf "Gesperrt" setzen und das Formular dann "normal" öffnen.

PSViolon
04.05.2011, 11:03
Das möchte ich nur wenn es nicht anders geht, weil das Formular in anderen Fällen (Benutzerabhängig) natürlich auch Editierbar sein muss. (Hätte ich auch gleich schreiben könne:rolleyes: ).

Josef P.
04.05.2011, 11:05
Hallo!

Dann sperrst du die Steuerelemente nur, wenn keine Bearbeitung erlaubt ist.

Oder: Du hebst den Schutz (Form.AllowEdits=True/False) beim Wechsel auf das (vermutlich ungebundene) Listenfeld auf und setzt ihn wieder, wenn der Fokus vom Listenfeld entfernt wird.

mfg
Josef

PSViolon
04.05.2011, 12:09
Da muss ich wohl doch noch weiter ausholen:

Das Formular ist grundsätzlich zum Bearbeiten frei. Über eine Benutzerverwaltung sollen jedoch die Zugriffsrechte (Schreiben, Lesen und Garnix) gesteuert werden. Das Funktioniert auch so weit ganz gut, nur eben mit mit dem "bissle was dürfen" also dem Lesen nicht.

Das Form wird so geöffnet:
stDocName = "frmPrkt_HF"
stLinkCriteria = "[PID]=" & Me![PID]
strOpenKrit = ""

StartForm stDocName, stLinkCriteria, 1, strOpenKrit
Dann wird Global geprüft:
Public Function StartForm(stDocName As String, stLinkCriteria As String, stFormArt As String, strOpenKrit As String)

'Auslesen des Angemeldeten Benutzers
strWinUser = Environ("USERNAME")
'-----------------------------------------------------------

'Ermitteln der MAID
Dim strSQLMAID As String
Dim rstMAID As DAO.Recordset
strSQLMAID = "SELECT tblMitarbeiter.MAID " & _
"FROM tblMitarbeiter " & _
"WHERE tblMitarbeiter.WinName = '" & strWinUser & "'"

Set rstMAID = CurrentDb.OpenRecordset(strSQLMAID)
If rstMAID.RecordCount < 1 Then
MsgBox "Ihr Benutzername ist nicht registriert, wenden Sie sich bitte an den Administrator"
Exit Function
End If
strMAID = rstMAID.Fields(0).Value
'Debug.Print strSQLUser
'-----------------------------------------------------------

'Ermitteln um welche Formulargruppe es sich handelt
Dim strSQLFormGruppe As String
Dim rstForm As DAO.Recordset
strSQLFormGruppe = "SELECT tblFormulare.FORMGRID " & _
"FROM tblFormulare " & _
"WHERE tblFormulare.Formularname = '" & stDocName & "'"

Set rstForm = CurrentDb.OpenRecordset(strSQLFormGruppe)
If rstForm.RecordCount < 1 Then
MsgBox "Das Formular ist nicht freigegeben, wenden Sie sich bitte an den Administrator"
Exit Function
End If
strFormGruppe = rstForm.Fields(0).Value
'Debug.Print strSQLFormGruppe
'-----------------------------------------------------------

'Ermitteln der Rechte in der Formulargruppe
Dim strSQLRechte As String
Dim rstRechte As DAO.Recordset
strSQLRechte = "SELECT tblMitarbeiter_FrmGruppe.Rechte " & _
"FROM tblMitarbeiter_FrmGruppe " & _
"WHERE tblMitarbeiter_FrmGruppe.MAID = " & strMAID & " AND tblMitarbeiter_FrmGruppe.FORMGRID = " & strFormGruppe & ""

Set rstRechte = CurrentDb.OpenRecordset(strSQLRechte)
If rstRechte.RecordCount < 1 Then
strErlaubnis = 0
'Exit Function
Else
strErlaubnis = rstRechte.Fields(0).Value
End If
'-----------------------------------------------------------

'Formular entsprechend der Erlaubnis öffnen oder nicht

If strErlaubnis = 3 Then
If stFormArt = 1 Then
'Formular im normalen Modus öffnen, falls vorhanden mit selektierten Werten
DoCmd.OpenForm stDocName, , , stLinkCriteria
ElseIf stFormArt = 2 Then
'Formular mit neuem DS öffnen, nur hinzufügen
DoCmd.OpenForm stDocName, , , acNew, acFormAdd
ElseIf stFormArt = 3 Then
'Formular mit Mehrfachverwendung z.B. frmVerwaltung_Allgemein
DoCmd.OpenForm stDocName, , , stLinkCriteria, , , strOpenKrit
End If

ElseIf strErlaubnis = 2 Then
MsgBox "Sie haben Leserechte, es sind keine Änderungen möglich!"
DoCmd.OpenForm stDocName, , , stLinkCriteria, acFormReadOnly

ElseIf strErlaubnis = 1 Then
MsgBox "Sie haben keine Berechtigung das Formular zu öffnen!"

ElseIf strErlaubnis = 0 Then
MsgBox "Sie haben noch keine Rechte zugewiesen bekommen, bitte wenden Sie sich an den Administrator!"

End If
'-----------------------------------------------------------


rstMAID.Close
Set rstMAID = Nothing
rstForm.Close
Set rstForm = Nothing
rstRechte.Close
Set rstRechte = Nothing

In diesem Fall sollte das Ergebnis "nur Lesen" sein und damit alle Daten lesbar sind, sollte der User eben in den ungebundenen;) Listenfeldern ein Auswahl treffen können. Schreiben ist weiterhin verboten.

Wenn ich jetzt den Vorschlag: "Form.AllowEdits=True/False" nehme, bekomme ich dann ein Problem mit der Ausführung im "Schreibmodus" weil das "Fokusverlust-Ereignis" in diesem Fall das Formular sperren würde.

Oder muss ich dazu dann Teile der Erlaubnisabfrage wiederum ausführen?

Josef P.
04.05.2011, 12:38
Wenn ich jetzt den Vorschlag: "Form.AllowEdits=True/False" nehme, bekomme ich dann ein Problem mit der Ausführung im "Schreibmodus" weil das "Fokusverlust-Ereignis" in diesem Fall das Formular sperren würde.

Oder muss ich dazu dann Teile der Erlaubnisabfrage wiederum ausführen?
1x darfst du raten. ;)

Eine relativ einfache Variante:

Bei Fokuserhalt den wert von AllowEdits in ein Feld (Klassenvariable) zwischenspeichern: <code>m_AllowEdits = Me.AllowEdits</code>
Bei Fokusverlust diesen Wert wieder zurückschreiben: <code>Me.AllowEdits = m_AllowEdits</code>


mfg
Josef

PSViolon
04.05.2011, 13:22
Der Joseph weiss halt was ich brauche :grins:

Funktioniert einwandfrei!

Danke!