Formular automatisch schließen

Wenn Sie in Access ein Formular benutzen, ist der aktuell bearbeitete Datensatz für jeden anderen Zugriff gesperrt, bis der Datensatz gewechselt oder das Formular geschlossen wird. Dadurch stellt Access sicher, dass in Mehrbenutzerumgebungen nicht verschiedene Anwender den gleichen Datensatz bearbeiten und sich so die Änderungen gegenseitig überschreiben. Diese sinnvolle Einrichtung hat allerdings auch einen großen Nachteil: Geht der betreffende Mitarbeiter in ein Meeting oder in die Mittagspause, ohne das Formular zu schließen, so bleibt der aktuelle Datensatz gesperrt, bis er zurückkehrt und das Formular irgendwann schließt. Der Datensatz kann also so lange nicht von anderen Mitarbeitern bearbeitet werden. Im Folgenden zeigen wir Ihnen nun einen Mechanismus, der ein Formular automatisch schließt, wenn der Anwender eine gewisse Zeit keine Eingaben vornimmt oder die Maus nicht bewegt.

Nutzen Sie den Formular-Timer

Eine Lösung, die ein Formular automatisch bei Nichtbenutzung schließt, lässt sich relativ einfach realisieren, da Access für Formulare einen Zeitgeber (Timer) zur Verfügung stellt, der in bestimmten Abständen ein Ereignis auslöst. Dieser Zeitraum ist über die Eigenschaft „Zeitgeberintervall“ des Formulars in Tausendstel Sekunden einstellbar. In der dazugehörigen Ereignisprozedur des Timers können wir dann entsprechende Abfragen vornehmen und zum Beispiel das Formular schließen, sodass der aktuell gesperrte Datensatz wieder freigegeben wird. Dabei ist allerdings zu prüfen, ob der Anwender zwischendurch Eingaben vornimmt oder die Maus bewegt – es kann ja durchaus möglich sein, dass Änderungen an einem Datensatz länger als das eingestellte Zeitintervall dauern.

Wie kann man nun feststellen, ob der Anwender irgendetwas getan hat? Dazu werden die Ereignisse „Bei Taste“ und „Bei Mausbewegung“ aller Steuerelemente und des Formulars eingesetzt. Wann immer der Anwender eine Taste drückt oder die Maus bewegt, kann über diese Ereignisprozeduren festgehalten werden, dass eine Aktion stattgefunden hat. Das erfolgt am einfachsten über eine Funktion „TimeOut()“, die eine globale Variable „TimeoutFlag“ auf „1“ setzt und somit signalisiert, dass eine Aktion stattgefunden hat.

Diese Variable kann der Timer des Formulars regelmäßig prüfen und zurücksetzen. Steht die Variable dann irgendwann einmal auf „0“, so hat der Anwender weder eine Taste gedrückt noch die Maus bewegt, das Formular wird geschlossen. Wechseln Sie also in den VBA-Editor und legen Sie zunächst im allgemeinen Teil des Formulars die globale Variable „TimeoutFlag“ sowie die folgende Funktion an:

Dim TimeoutFlag As Integer
Function TimeOut ()
TimeoutFlag = 1
End Function

Den Aufruf dieser Funktion ordnen Sie nun allen Steuerelementen in den Eigenschaften „Bei Taste“ und „Bei Mausbewegung“ zu. Markieren Sie dazu alle Steuerelemente gemeinsam und wählen Sie dann das Menü ANSICHT-EIGENSCHAFTEN an. Im Eigenschaftenfenster können Sie dann die Ereignisprozeduren für alle Steuerelemente gemeinsam setzen. Geben Sie hier jeweils Folgendes ein:

=TimeOut()

Öffnen Sie anschließend das Eigenschaftenfenster für das Formular, indem Sie einen Doppelklick in den grauen Bereich unter dem Detailbereich ausführen, und tragen Sie hier bei den Ereignissen „Bei Taste“ und „Bei Mausbewegung“ Folgendes ein:

=TimeOut()

Abschließend markieren Sie der Reihe nach Seiten-/Formular-Kopf und -Fuß sowie den Detailbereich und stellen hierfür die Ereignisse „Beim Klicken“ und „Bei Mausbewegung“ ebenfalls auf „Time- Out“. Auf diese Weise ist nun sichergestellt, dass alle Anwenderaktionen entdeckt und über die Funktion „TimeOut()“ in der globalen Variablen „TimeoutFlag“ festgehalten werden. Klickt der Anwender in ein Feld oder nimmt dort eine Eingabe/Änderung vor oder bewegt er die Maus über Felder und Formular, wird diese Aktion protokolliert. Beim Aufruf der prüfenden Timer-Routine steht also jeweils eine „1“ in der globalen Variablen „TimeoutFlag“. Erst wenn der Anwender mehr als 3 Minuten keine Aktion tätigt, wird das Formular automatisch geschlossen, weil „TimeoutFlag“ in diesem Fall auf „0“ steht.

Timer-Routine aktivieren

Dazu muss nun noch die Timer-Routine aktiviert werden. Stellen Sie die Eigenschaft „Zeitgeberintervall“ des betreffenden Formulars auf „30000“ (entspricht 3 Minuten). Das bedeutet, dass die Ereignisprozedur des Timers nun alle drei Minuten aufgerufen wird. Setzen Sie dann die Eigenschaft „Bei Zeitgeber“ auf „Ereignisprozedur“ und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu starten. Hier geben Sie folgende Anweisungen ein:

Sub Form_Timer ()
If TimeoutFlag = 0 Then
DoCmd.Close , , acSaveYes
TimeoutFlag = 0
End Sub

Die Ereignisprozedur des Timers prüft zuerst, ob die Variable „TimeoutFlag“ auf „0“ steht – wenn ja, hat der Anwender 3 Minuten nichts getan, das Formular wird geschlossen. Ansonsten setzen wir „TimeoutFlag“ zurück auf „0“. Bis zum nächsten Aufruf der Ereignisprozedur des Timers vergehen nun 3 Minuten, in denen eventuell eine Aktion erfolgt und dadurch „TimeoutFlag“ auf „1“ zurückgesetzt wird. Die Angabe des Parameters „acSaveYes“ sorgt dafür, dass Access ein eventuell geändertes Formular automatisch speichert. Andernfalls würde eine Abfrage, ob die Änderungen am Entwurf gespeichert werden sollen, das Schließen des Formulars und damit die Freigabe des gesperrten Datensatzes blockieren.

Wenn Sie Ihre Formulare mit diesem Mechanismus ausrüsten, werden Sie in Zukunft keine Probleme mehr mit Datensätzen haben, die aus Unachtsamkeit mehrere Stunden lang gesperrt sind und sich nicht mehr bearbeiten lassen.

Und noch ein Tipp: Informieren Sie die Anwender Ihrer Datenbank bitte darüber, dass Sie einen Mechanismus zum automatischen Schließen bei Inaktivität eingebaut haben. Das erspart Ihnen erfahrungsgemäß viele unnötige Support- Anfragen!

Geben Sie dem Anwender einen Hinweis

Sie können einen solchen Hinweis aber auch direkt in die Lösung integrieren. Dazu ist lediglich ein weiteres Formular „Hinweis“ notwendig. Dieses Formular enthält ein Bezeichnungsfeld mit dem Text „Ihr Formular wurde wegen Inaktivität automatisch geschlossen!“. Der Hinweis wird auffällig, beispielsweise in Fett, Rot und 14 Punkt großer Schrift, formatiert. Eine Schaltfläche OK erlaubt das Schließen dieses Hinweisfensters über die Ereignisprozedur „Beim Klicken“:

Private Sub btnClose_Click()
DoCmd.Close
End Sub

Damit dieser Hinweis nun nach dem automatischen Schließen eines Formulars bei einem Timeout angezeigt wird, muss die Timer-Routine wie folgt angepasst werden:

Private Sub Form_Timer()
If TimeoutFlag = 0 Then
DoCmd.Close , , acSaveYes
DoCmd.OpenForm „Hinweis“
End If TimeoutFlag = 0
End Sub