Formulare und Datenbanken automatisch schließen

Datenbank

Solange in Access ein Formular geöffnet ist, wird der aktuell bearbeitete Datensatz für jeden weiteren Zugriff gesperrt. Außerdem sind Änderungen an Tabellen nicht möglich. Der Datensatz erst wieder freigegeben, wenn der Anwender den Datensatz wechselt oder das Formular bzw. die Datenbank schließt. Auf diese Weise stellt Access sicher, dass in Mehrbenutzerumgebungen ein Datensatz nicht von mehreren Anwendern gleichzeitig bearbeitet wird und sich die Änderungen womöglich gegenseitig überschreiben. Gleichzeitig unterbindet Access Änderungen am Entwurf von Tabellen, während sich noch Datensätze in Bearbeitung befinden, und verhindert so, dass sie aufgrund von Strukturoder Feldänderungen nicht mehr gespeichert werden können und verloren gehen.

Diese eigentlich sehr sinnvolle Einrichtung hat auch einen Nachteil: Verlässt z. B. ein Mitarbeiter den Arbeitsplatz, um in die Mittagspause zu gehen oder sogar Feierabend zu machen, ohne die Datenbank mit ein oder mehreren geöffneten Formularen wieder zu schließen, bleibt nicht nur der aktuelle Datensatz gesperrt. An den entsprechenden Tabellen können auch keine Änderungen vorgenommen werden und die Mehrbenutzerdatenbank lässt sich nicht komprimieren oder reparieren.

Wir bieten Ihnen in diesem Beitrag eine effektive Lösung für dieses Problem. Dabei überwachen Sie die Aktivität in einem Formular und schließen es dann – optional zusammen mit der kompletten Datenbank –, wenn eine gewisse Zeit keine Tastatureingaben oder Mausbewegungen zu verzeichnen sind.

Inaktivität des Anwenders prüfen
Im ersten Schritt ist dafür zu sorgen, dass jeder Tastendruck und jede Mausbewegung das Setzen eines Aktivitätskennzeichens auslöst. Dieses Kennzeichen wird in bestimmten Abständen geprüft. Wurde es einige Zeit nicht verändert, hat der Anwender keine Eingaben vorgenommen oder die Maus nicht bewegt. Dann wird das Formular geschlossen bzw. die Datenbank beendet. Access stellt zur Erledigung solcher Aufgaben für Formulare einen Zeitgeber (Timer) zur Verfügung, der in bestimmten Abständen ein Ereignis auslöst. Dieser Zeitraum ist über die Eigenschaft „Zeitgeberintervall“ des Formulars in Tausendstelsekunden (Millisekunden) einstellbar. In der dazugehörigen Ereignisprozedur des Timers können Sie das erwähnte Aktivitätskennzeichen abfragen und bei Bedarf entsprechende Maß nahmen ergreifen.

Tastatur- und Mausaktionen festhalten
Wie aber können Sie nun feststellen, ob der Anwender mit einem Formular tatsächlich arbeitet? Zu diesem Zweck lassen sich die Ereignisse „Bei Taste“ und „Bei Mausbewegung“ aller Steuerelemente und des Formulars nutzen. Wann immer der Anwender eine Taste drückt oder die Maus bewegt, kann über diese Ereignisprozeduren festgehalten werden, dass eine Aktion stattgefunden hat. Wir verwenden dazu eine Funktion „TimeOut()“, die eine globale Variable „TimeoutFlag“ auf „1“ setzt und so signalisiert, dass eine Aktion stattgefunden hat. Diese Variable kann der Timer des Formulars regelmäßig prüfen und auf „0“ zurücksetzen. Steht die Variable beim nächsten Auslösen des Timer-Ereignisses immer noch auf „0“, hat der Anwender weder eine Taste gedrückt noch die Maus bewegt; das Formular wird geschlossen und die Datenbank ggf. verlassen. Wichtig: Der Timer eines Formulars ist Dreh- und Angelpunkt der Lösung. Dem entsprechend muss es in der betreffenden Datenbank ein Formular geben, das über seine Ereignisprozeduren die Aktivitäten des Anwenders registrieren kann. Für die Nutzung dieser Technik in Ihren Mehrbenutzerdatenbanken können wir nur bedingt eine vorbereitete Lösung liefern. Vielmehr müssen Sie die Steuerelemente in jedem Formular, das Datensätze oder Tabellen blockieren könnte, entsprechend anpassen. Das hört sich zunächst nach viel Aufwand an, aber glücklicherweise können Sie die meisten Einstellungen für mehrere markierte Steuerelemente ein einem Durchgang vornehmen:

  1. Öffnen Sie das gewünschte Formular im Entwurfsmodus, wechseln Sie mit Alt + F11 in die VBA-Entwicklungsumgebung und deklarieren Sie hier zunächst im allgemeinen Teil die globale Variable „TimeoutFlag“
    Dim TimeoutFlag As Integer

  2. Geben Sie anschließend die folgende Funktion ein:
    Function TimeOut()
    TimeoutFlag = 1
    End Function

  3. Diese Funktion ordnen Sie nun allen Steuerelementen in den Eigenschaften „Bei Taste“ und „Bei Mausbewegung“ zu. Markieren Sie dazu alle Steuerelemente gemeinsam mit gedrückter Umschalt-Taste und wählen Sie dann das Menü ANSICHT-EIGENSCHAFTEN an bzw. klicken Sie auf EIGENSCHAFTENBLATT. Im Eigenschaftenfenster können Sie die Ereignisprozeduren für alle Steuerelemente gemeinsam setzen, indem Sie hier jeweils „=TimeOut()“ eingeben.

  4. Öffnen Sie dann das Eigenschaftenfenster für das Formular, in dem Sie einen Doppelklick in den grauen Bereich unter dem Detailbereich ausführen. Die Eigenschaft „Tastenvorschau“ setzen Sie zunächst auf „Ja“. Tragen Sie dann in den Eigen schaften „Bei Taste“ und „Bei Mausbewegung“ ebenfalls „=TimeOut()“ ein.

  5.  Danach markieren Sie der Reihe nach Seiten-/Formularkopf und -fuß sowie Detailbereich und stellen hier die Eigenschaft „Bei Mausbewegung“ auf „=TimeOut()“.

Formulare automatisch schließen
Mit diesen Anpassungen haben Sie nun sichergestellt, dass alle Anwenderaktionen entdeckt und über die Funktion „TimeOut() in der globalen Variablen „TimeoutFlag“ festgehalten werden. Wenn der Anwender nun in ein Feld klickt und eine Eingabe vornimmt oder die Maus über Felder und Formular bewegt, wird diese Aktion protokolliert. Beim Aufruf der Timer-Routine steht also jeweils eine „1“ in der globalen Variablen „Timeout- Flag“. Dazu gleich noch etwas mehr. Im nächsten Schritt muss zunächst noch die Timer-Routine eingerichtet werden:

  1. Stellen Sie die Eigenschaft „Zeitgeberintervall“ des Formulars auf „180000“ ein. Diese Angabe erfolgt in Millisekunden und bedeutet somit, dass die Ereignisprozedur des Timers alle drei Minuten aufgerufen wird.
  2. Stellen Sie die Eigenschaft „Bei Zeitgeber“ auf „Ereignisprozedur“ ein und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu starten. Hier geben Sie nun die folgenden Anweisungen ein: Private Sub Form_Timer()
    If TimeoutFlag = 0 Then
    DoCmd.Close acForm,
    Me.Name, acSaveNo
    End If
    TimeoutFlag = 0
    DoEvents
    End Sub

    Die Ereignisprozedur des Timers prüft hier zunächst, ob die Variable „TimeoutFlag“ auf „0“ steht. Ist das der Fall, hat der Anwender drei Minuten nichts getan und das Formular wird geschlossen. Ansonsten wird „TimeoutFlag“ zurück auf „0“ gesetzt. Bis zum nächsten Aufruf der Ereignisprozedur des Timers vergehen nun drei Minuten, in denen eventuell eine Aktion erfolgt und „TimeoutFlag“ wieder auf „1“ gesetzt wird.

Datenbank automatisch beenden
Möchten Sie nicht nur Formulare automatisch schließen, sondern auch die komplette Datenbank bei Inaktivität beenden, nutzen Sie ein Menüformular, das automatisch beim Start der Datenbank geöffnet wird und die Datenbank bei Inaktivität beendet:

 

  1. Setzen Sie zunächst die Eigenschaft „Zeitgeberintervall“ des Menüformulars auf „1800000“. Dieser Wert entspricht 30 Minuten. Bleibt das Menü also 30 Minuten ohne Aktivität des Anwenders an gezeigt, wird die Datenbank verlassen beziehungsweise Access beendet.
  2. Stellen Sie anschließend die Eigenschaft „Bei Deaktivierung“ des Formulars auf „[Ereignisprozedur]“ ein und geben dort folgende Anweisung ein: Diese Anweisung sorgt dafür, dass beim Aufruf eines anderen Formulars der Timer des Menüformulars aus geschaltet wird. Andernfalls würde das Menü irgendwann wegen vermeintlicher Inaktivität des Anwenders die Datenbank schließen und so die Arbeit im anderen Formular sabotieren.
  3. Stellen Sie die Eigenschaft „Bei Aktivierung“ des Formulars auf „[Ereignisprozedur]“ ein und geben Sie die folgende Anweisung ein: Diese Prozedur sorgt nun dafür, dass nach dem Schließen des anderen Formulars und damit bei der Aktivierung des Menüformulars der Timer wieder eingeschaltet wird und wieder alle 30 Minuten auf Inaktivität prüfen kann.
  4. Die Timer-Prozedur sieht in einem Menüformular folgendermaßen aus: Anstelle von „DoCmd.Close“ zum Schließen eines Formulars wird hier ein „DoCmd.Quit“ zum Beenden von Access und somit zum Schließen der Datenbank ausgeführt.

In der Beispieldatenbank wird diese Technik im Formular „Hauptmenü“ demonstriert. Zum Testen werden einfach mehrere Ins tanzen des Formulars „Kunden“ geöffnet. Der Timer-Intervall für das Menüformular ist auf 60 Sekunden eingestellt.