Access-o-Mania

Access-Forum => Access Programmierung => Thema gestartet von: fautec56 am Januar 12, 2018, 09:26:02

Titel: Gegenseitig sperren
Beitrag von: fautec56 am Januar 12, 2018, 09:26:02
Hallo zusammen,

Ich habe über ein Formular Zugriff auf eine Tabelle.
Auf dieses Furmular haben mehrere User Zugriff. Bis hierhin alles gut.

Jetzt habe ich aber das Problem, dass aus orgnisatorischen Gründen immer nur einer Daten ändern, bzw eingeben darf.

Das einfachste wäre den Zugriff über VBA eine abgefragte Variable als Sperre zu nutzen.

-Formular geöffnet Variable auf 1 und öffnen des Formulars nicht möglich.
-Formular geschlossen, Variable auf 0, Das Formular kann geöffnet werden.

Schön wäre, wenn bei der Sperre angezeigt wird, welcher User gerade darin arbeitet. Aber das wäre für den Anfang nicht wichtig.

Ich habe das eigentlich funktionsfähig! Aber immer nur für einen Arbeitsplatz. Wenn ich die Logik teste, funktioniert das.

Gehe ich aber auf einen zweiten PC und rufe das Formular auf, greift die Logik nicht. Der aktuelle Wert der Variable steht nicht zur Verfügung.

Irgenwas mache ich falsch. Wie kann ich die Variable

Dim m_sperre As Integer

an allen Arbeitsplätzen abfragen und mit 1 oder 0 aktualisieren?

Ich habe das zum Schluß über ein Modul Versucht, aber immer das gleiche Ergebnis.

Modul Sperre
-----------------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
Dim m_Sperre As Integer


Public Sub Probenbuchoeffnen()


If m_Sperre = 1 Then
MsgBox " Sperre: " & m_Sperre
MsgBox " Probenbuch schon geöffnet_"
DoCmd.Close acForm, "anmelden2"
End If

If m_Sperre = 0 Then
MsgBox " Sperre: " & m_Sperre
DoCmd.Close acForm, "anmelden2"
DoCmd.OpenForm "Probenbuch"
End If



End Sub

Public Function Probenbuchoffen(a)
m_Sperre = a
MsgBox " Sperre: " & m_Sperre
End Function

Public Function Probenbuchgeschlossen(b)
m_Sperre = b
MsgBox " Sperre: " & m_Sperre
DoCmd.Close acForm, "Probenbuch"
End Function



Die Zeilen mit der MsgBox habe ich eingefügt, um den Status anzuzeigen. DAs Benötige ich Später nicht mehr. Höchstens, um anzuzeigen, wer sperrt.

Da ich überwiegend mit Acces Abfragen aus dem SQL ziehe, bin ich leider mit diesen Dingen nicht so ganz auf Du und Du.
Würde mich freuen, wenn mir hier einen Lösungsansatz liefern könnte.

LG Reinhard

 
 
Titel: Re: Gegenseitig sperren
Beitrag von: MzKlMu am Januar 12, 2018, 09:34:41
Hallo,
wie ist denn die DB aufgebaut ?
Backend und Frontend ?
Und jeder User sein eigenes Frontend ?

In einer Mehrbenutzerumgebung sind bestimmte Dinge erst mal Voraussetzung.
Titel: Re: Gegenseitig sperren
Beitrag von: fautec56 am Januar 12, 2018, 09:39:23
Hm, ich denke, da fehlen mir die Informationen.

Ich habe nur ein Formular. Der Zugriff auf die Tabelle funktionier von mehrern Plätzen. Die Daten können von verschiedenn Arbeitsplätzen bearbeitet werden, auch von mehreren.

Aber ganau das will ich verhindern. Denn der User muß erst wissen was in der Datenbank steht, um zu entscheiden wie es weiter geht. Es darf in der Zeit nichtsgeändert werden. ( Eigentlich so, wie in Excel )

LG Reinhard
 
Titel: Re: Gegenseitig sperren
Beitrag von: PhilS am Januar 12, 2018, 10:03:28
Wie kann ich die Variable

Dim m_sperre As Integer

an allen Arbeitsplätzen abfragen und mit 1 oder 0 aktualisieren?
Gar nicht! Der Gültigkeitsbereich von Variablen ist (maximal) auf eine laufende Programminstanz beschränkt. Selbst auf ein und demselben Rechner kannst du nicht (ohne Weiteres) auf den Wert einer Variablen in einer anderen Access Instanz zugreifen.

Wenn Werte auf verschiedenen Rechnern zur Verfügung stehen sollen, musst du diese in eine Tabelle schreiben.

Ich habe kürzlich einen Text geschrieben, der sich mit dem Thema individuelle/benutzerdefinierte Datensatzsperren auseinandersetzt. - Allerdings auf Englisch. -> How to Implement a Queue Based Application (http://codekabinett.com/rdumps.php?Lang=2&targetDoc=queue-database-application-key-issues-solutions)
Titel: Re: Gegenseitig sperren
Beitrag von: Lachtaube am Januar 12, 2018, 10:06:39
Stelle in den Formular-Eigenschaften im Register Daten die Eigenschaft Datensatzsperrungen (https://msdn.microsoft.com/de-de/vba/access-vba/articles/form-recordlocks-property-access) nach Wunsch ein und/oder ändere die globalen Einstellungen in den Optionen (das gilt dann für alle Datenbanken).
Titel: Re: Gegenseitig sperren
Beitrag von: Wurliwurm am Januar 12, 2018, 10:07:17
Das was Du beschreibst, ist ein Standardproblem. Eine fertige Lösung gibt es in Access dafür nicht, es kennt auf Datensatzebene nur das optimistische Sperren, so das Konflikte erst beim Update auffallen und dann ggfalls das Update verworfen wird.

Als Lösung fällt mir nur eine Eigenentwicklung ein. Vielleicht eine Sperrtabelle, wo Sperrobjekt, Benutzer und Zeitstempel für einen Datensatz oder gleich eine ganze Tabelle vor dem Bearbeiten eingefügt und danach wieder aus der Sperrtabelle gelöscht werden. Wobei strenggenommen auch beim Schreiben in die Sperrtabelle wieder Sperrkonflikte auftreten können.

Wenn Du eine einigermaßen funktionierende einfache Lösing haben willst: Leg eine "Sperr"-Tabelle zentral im Backend an und frage beim Öffnen des Formulars diese ab. Bei existierendem Sperreintrag das Offenen abbrechen, sonst selber die Sperre setzen. Beim Schließen des Formulars wieder den Eintrag aus der Sperrtabelle löschen.