Datenbanken und Formulare automatisch schließen

Datenbank

Es ist das klassische Problem in jeder Mehrbenutzerumgebung: Wichtige Anpassungen oder die regelmäßige Komprimierung können nicht vorgenommen wer den, weil irgendein Anwender die Datenbank einfach geöffnet lässt, während er vielleicht schon nach Hause gegangen ist oder für mehrere Stunden in einem Meeting sitzt. Wir haben die Lösung für genervte Datenbankadministratoren: Erweitern Sie Ihre Anwendungen um einen Mechanismus, der automatisch überwacht, ob noch Ein gaben in einem Formular erfolgen. Nach einer bestimmten Zeit ohne Aktionen wird Access vollautomatisch beendet.

Die Ursache für das Problem: Wenn Sie in Access ein Formular geöffnet haben, ist der aktuell bearbeitete Datensatz für jeden anderen Zugriff gesperrt. Außer dem sind mindestens eine oder (bei einem Formular, das auf einer Abfrage basiert) auch gleich mehrere Tabellen für Änderungen gesperrt. Diese Sperrungen werden erst aufgehoben, wenn der Datensatz gewechselt bzw. das Formular geschlossen wird. Access stellt so einerseits sicher, dass in Mehrbenutzerumgebungen und Front-End-/Back-End-Lösungen nicht verschiedene Anwender den gleichen Datensatz bearbeiten und sich so die Änderungen gegenseitig überschreiben.

Außerdem verhindert Access, dass Änderungen an Tabellen vorgenommen werden, während sich noch Datensätze in Bearbeitung befinden und eventuell aufgrund von Strukturänderungen nicht mehr gespeichert werden können.

Diese eigentlich sehr sinnvolle Einrichtung hat auch einen Nachteil: Verlässt beispielsweise ein Mitarbeiter den Arbeitsplatz, um in die Mittagspause zu gehen oder gar 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 sind keine Änderungen möglich und auch eine dazugehörige Back-End-Datenbank, lässt sich beispielsweise nicht komprimieren oder reparieren.

Im Folgenden möchten wir Ihnen eine pfiffige Lösung für dieses immer wieder auftauchende Problem zeigen. Dabei überwachen Sie die Aktivität in einem Formular und schließen es dann zusammen mit der kompletten Datenbank, wenn eine gewisse Zeit keine Tastatureingaben oder Mausbewegungen zu verzeichnen sind.

Im ersten Schritt müssen Sie dafür sorgen, dass bei jedem Tastendruck und jeder Mausbewegung sozusagen ein „Aktivitätskennzeichen“ gesetzt wird. Dieses Kennzeichen wird in bestimmten Abständen geprüft. Wurde es eine Zeit lang nicht aktualisiert, hat der Anwender keine Eingaben vorgenommen und das Formular wird geschlossen bzw. die Datenbank beendet.

So nutzen Sie den Formular-Timer

Access stellt 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.

Wie können Sie nun feststellen, ob der Anwender mit einem Formular tatsächlich arbeitet? Zu diesem Zweck 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 ei ne Aktion stattgefunden hat. Wir verwenden dazu eine Funktion „TimeOut()“, die eine globale Variable „TimeoutFlag“ auf „1“ setzt und so signalisiert, dass eine Aktion statt gefunden 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 verlassen.

Der Timer eines Formulars ist Dreh- und Angelpunkt der Lösung. Dementsprechend muss es in Ihren Datenbanken ein Formular geben, das die Aktivitäten des Anwenders registriert!

Individuelle Erweiterung Ihrer Datenbanken

Um die Lösung in Ihren Datenbanken ein zusetzen, müssen Sie die Steuerelemente in jedem Formular anpassen, das Datensätze oder Tabellen blockieren könnte.

Das hört sich zunächst nach viel Auf wand an, aber glücklicherweise können Sie die meisten Einstellungen für mehrere markierte Steuerelemente auf einmal vornehmen:

  1. Öffnen Sie das gewünschte Formular im Entwurfsmodus, starten Sie den VBA-Editor und deklarieren Sie hier zunächst im allgemeinen Teil die globale Variable „TimeoutFlag“:

    Dim TimeoutFlag As Integer

  2. Geben Sie dann 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 alle Steuerelemente gemeinsam und rufen Sie den Eigenschaftendialog auf. An dieser Stelle können Sie die Ereignisprozeduren für alle Steuerelemente gemeinsam setzen, indem Sie hier jeweils „=TimeOut()“ eingeben.
  4. Öffnen Sie anschließend das Eigenschaftenfenster für das Formular, in – dem Sie einen Doppelklick in den grauen Bereich unter dem Detail – bereich ausführen. Die Eigenschaft „Tastenvorschau“ setzen Sie zunächst auf „Ja“. Tragen Sie dann in den Eigenschaften „Bei Taste“ und „Bei Mausbewegung“ ebenfalls „=TimeOut()“ ein.
  5. Danach markieren Sie der Reihe nach Seiten-/Formularkopf und -fuß so wie Detailbereich und stellen hier die Eigenschaft „Bei Mausbewegung“ auf „=TimeOut()“.

Auf diese Weise haben Sie nun sichergestellt, dass alle Anwenderaktionen entdeckt und über die Funktion „TimeOut() in der globalen Variablen „TimeoutFlag“ festgehalten werden. Klickt der Anwender in ein Feld, nimmt er eine Eingabe vor oder bewegt er die Maus über Felder und Formular, wird diese Aktion protokolliert. Beim Aufruf der Timer-Routine steht al so jeweils eine „1“ in der globalen Variablen „TimeoutFlag“.

Dazu gleich noch etwas mehr. Zu nächst muss aber die Timer-Routine aktiviert werden:

  1. Stellen Sie die Eigenschaft „Zeitgeberintervall“ des Formulars auf „180000“ (entspricht drei Minuten). Das bedeutet, dass die Ereignisprozedur des Timers alle drei Minuten aufgerufen wird.
  2. Markieren Sie bei der Eigenschaft „Bei Zeitgeber“ den Eintrag „Ereignisprozedur“ und klicken Sie auf die Schaltfläche mit den drei Punkten, um den VBA-Editor zu starten. Hier geben Sie folgende Anweisungen ein:Private Sub Form_Timer()
    If TimeoutFlag = 0 Then
    DoCmd.Close acForm,
    Me.Name, acSaveNo
    End If
    TimeoutFlag = 0
    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, das Formular wird geschlossen. Ansonsten wird „TimeoutFlag“ wieder auf „0“ zurückgesetzt. 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.

Wir haben für Sie eine Beispieldatenbank vorbereitet, in der wir diese Technik bereits umgesetzt haben. Testen Sie den Mechanismus im Formular „Kunden“. Das Timer-Intervall haben wir zum schnelleren Testen auf zehn Sekunden eingestellt, sodass das Formular nach dieser Zeit ohne Ein gaben automatisch geschlossen wird.

Access automatisch beenden

Auf Wunsch können Sie aber nicht nur das aktuelle Formular schließen, sondern auch die komplette Datenbank bei Inaktivität beenden. Hier könnte man das Menüformular nutzen, das automatisch beim Start der Datenbank geöffnet wird:

  1. Setzen Sie die Eigenschaft „Zeitgeberintervall“ des Formulars auf „1.800.000“. Dieser Wert entspricht 30 Minuten. Bleibt das Menü also 30 Minuten ohne Aktivität des Anwenders angezeigt, wird die Datenbank verlassen bzw. Access beendet.
  2. Stellen Sie die Eigenschaft „Bei Deaktivierung“ des Formulars auf „[Ereignisprozedur]“ ein und geben Sie dort folgende Anweisung ein:Private Sub Form_Deactivate()
    Me.TimerInterval = 0
    End Sub
    Diese Anweisung sorgt dafür, dass beim Aufruf eines anderen Formulars der Timer des Menüformulars ausgeschaltet wird. Andernfalls würde das Menü nach drei Minuten wegen Inaktivität die Datenbank schließen und so die Arbeit in anderen Formularen sabotieren.
  3. Stellen Sie die Eigenschaft „Bei Aktivierung“ des Formulars auf „[Ereignisprozedur]“ ein und geben Sie die folgende Anweisung ein:Private Sub Form_Activate()
    Me.TimerInterval = 1800000
    End Sub
    Diese Prozedur sorgt dafür, dass nach dem Schließen des anderen Formulars und damit bei der Aktivierung des Menüformulars der Timer wieder eingeschaltet wird und damit alle 30 Minuten auf Inaktivität prüfen kann.
  4. Die Timer-Prozedur ändern Sie folgendermaßen ab:Private Sub Form_Timer()
    If TimeoutFlag = 0 Then
    DoCmd.Quit
    End If
    TimeoutFlag = 0
    End Sub
    Anstelle von „DoCmd.Close“ zum Schließen eines Formulars führen wir hier ein „DoCmd.Quit“ zum Verlassen aus.

In unserer Beispieldatenbank wird diese Technik im Formular „Hauptmenü“ demonstriert. Das Timer-Intervall wurde auf 60 Sekunden eingestellt, da mit Sie das Ergebnis schneller testen können.