Suchformular für die Datenblattansicht

Access liefert zwar eine hilfreiche Suchfunktion, mit der Sie die in der Datenblattansicht angezeigte Daten sortieren oder filtern können, aber wirklich übersichtlich und intuitiv ist diese nicht. Also legen wir selbst Hand an und bauen uns ein eigenes Suchformular, dass die verschiedenen Steuerelementtypen der Datenblattansicht berücksichtig und dieses gleich entsprechend der definierten Suche filtert.

Als Beispiel für unsere Lösung dient die Artikel-Tabelle der Südsturm-Datenbank – unsere optimierte Nordwind-Datenbank aus dem Beitrag Südsturm, die bessere Beispieldatenbank (www.access-im-unternehmen.de/411). Diese Tabelle enthält die drei möglichen Steuerelementtypen, die üblicherweise in der Datenblattansicht von Formularen dargestellt werden, nämlich Textfelder, Kombinationsfelder und Kontrollkästchen.

Die Konfiguration für die Anzeige von Daten in der Datenblattansicht sieht üblicherweise so aus, dass es ein Hauptformular gibt, dass einige Steuerelemente wie beispielsweise eine Suchen-Schaltfläche und ein Unterformular mit den eigentlichen Daten enthält. Dies ist allein der Tatsache geschuldet, dass Formulare in der Datenblattansicht keinen Kopf- oder Fußbereich anzeigen, in dem man weitere Steuerelemente unterbringen könnte. Das in diesem Beitrag demonstrierte Beispiel sieht wie in Abb. 1 aus.

pic001.png

Abb. 1: Beispiel für das Durchsuchen eines Datenblatts mit einem zusätzlichen Suchformular

Unser Suchformular soll folgende Voraussetzungen erfüllen:

  • Es soll per Mausklick auf eine Schaltfläche erscheinen.
  • Es soll im Vordergrund bleiben, aber das Bearbeiten von Daten im aufrufenden Formular erlauben.
  • Es soll für jedes Feld der Datenblattansicht ein Suchfeld enthalten.
  • Die eingegebenen Suchkriterien werden mit dem Operatur Und verknüpft.
  • Ein Klick auf die Schaltfläche Suchen des Formulars aktualisiert das Datenblatt des aufrufenden Formulars.
  • Gleichzeitig bleibt das Suchformular geöffnet, damit der Benutzer leicht die Suchkriterien anpassen und die Suche erneut durchführen kann.
  • Die Schaltfläche Leeren setzt alle Suchfelder zurück und sorgt dafür, dass wieder alle Datensätze im Datenblatt erscheinen.
  • Das Suchformular soll automatisch geschlossen werden, wenn das aufrufende Formular geschlossen wird.

Anzeige der Daten in der Datenblattansicht

Das Formular frmArtikel enthält die Schaltfläche cmdSuchen und das Unterformularsteuerelement sfm. Die Eigenschaften Datenherkunft und Standardansicht des Unterformular sfmArtikel stellen Sie auf tblArtikel und Datenblatt ein.

Außerdem ziehen Sie alle gewünschten Felder ( in der Beispieldatenbank alle) in den Detailbereich des Formularentwurfs.

Einbinden des Unterformulars in das Hauptformular

Wenn Sie dem Hauptformular bereits ein Unterformularsteuerelement hinzugefügt haben, brauchen Sie nur noch dessen Eigenschaft Herkunftsobjekt auf sfmArtikel einzustellen. Im Entwurf sieht der aktuelle Stand nun wie in Abb. 2 aus.

pic002.png

Abb. 2: Entwurf von Haupt- und Unterformular für die zu durchsuchenden Daten

Wenn Sie der Schaltfläche cmdSuchen nun noch die folgende Ereignisprozedur unterjubeln, ist dieser Teil der Lösung bereits erledigt:

Private Sub cmdSuche_Click()
    DoCmd.OpenForm "frmSuche"
End Sub

Erstellen des Suchformulars

Das Suchformular heißt frmSuche und besitzt keine Datenherkunft und somit nur ungebundene Steuerelemente. Die drei Schaltflächen heißen cmdSuchen, cmdLeeren und cmdAbbrechen. Die Schaltfläche cmdAbbrechen hat die einfachste Aufgabe, die mit folgender Ereignisprozedur erledigt wird:

Private Sub cmdAbbrechen_Click()
    DoCmd.Close acForm, Me.Name
End Sub

Für zusätzlichen Komfort stellen Sie die Eigenschaft Abbrechen dieser Schaltfläche auf den Wert Ja ein. Dies löst obige Prozedur aus, wenn der Benutzer auf Escape tippt. Außerdem sorgen Sie mit Popup gleich Ja dafür, dass das Formular immer im Vordergrund bleibt.

Kein Suchformular ohne aufrufendes Formular

Der Rest ist weniger trivial, aber nach einmaliger Programmierung vielfältig einsetzbar. Wir beschäftigen uns zunächst damit, dass das Formular beim Schließen des aufrufenden Formulars automatisch mit geschlossen werden soll. Hier gibt es zwei Möglichkeiten:

  • Sie bringen direkt im Klassenmodul des aufrufenden Formulars ein Ereignis unter, dass beim Schließen desselbigen ausgelöst wird (Beim Schließen, Beim Entladen) und das Formular frmSuchen ebenfalls schließt. Nachteil: Sie müssen hier erst prüfen, ob dieses Formular überhaupt noch geöffnet ist, da das Schließen sonst einen Fehler hervorruft.
  • Sie jubeln dem aufrufenden Formular über seine Objektvariable ein Ereignis unter, das beim Schließen (also wiederum durch eines der Ereignisse Beim Schließen oder Beim Entladen) ausgelöst wird. Unterjubeln deshalb, weil es physisch im Klassenmodul des Suchformulars angelegt wird, aber auf die Ereignisse eines Objekts reagiert, dass auf das aufrufende Formular verweist. Im Prinzip ist das der gleiche Vorgang, aber Sie brauchen keine Prüfung mehr, ob das zu schließende Formular überhaupt geöffnet ist.

Wir verwenden die zweite Variante, wozu wir zunächst eine Objektvariable namens frmParent deklarieren:

Private WithEvents frmParent As Form

Durch die Deklaration mit dem Schlüsselwort WithEvents können wir uns überhaupt erst in die Ereigniskette dieses Formulars einklinken. frmParant werden wir gleich mit einem Verweis auf das aufrufende Formular füllen. Wir brauchen noch einen weiteren Objektverweis, und zwar für den Zugriff auf das zu durchsuchende Unterformular in der Datenblattansicht. Dieses referenzieren wir mit dieser Objektvariablen:

Private frmDatasheet As Form

Beide Objektvariablen füllen wir gleich beim Öffnen des Suchformulars frmSuche. Dazu verwenden wir die Prozedur, die durch das Ereignis Beim Öffnen ausgelöst wird:

Private Sub Form_Open(Cancel As Integer)
    Dim ctl As Control
    Set ctl = Screen.ActiveControl
    Set frmParent = ctl.Parent
    frmParent.OnUnload = "[Event Procedure]"
    Set frmDatasheet = frmParent!sfm.Form
End Sub

Die Prozedur ermittelt zunächst einen Verweis auf das aktive Steuerelement. Die Eigenschaft Screen.ActiveControl sollte hier tunlichst einen Verweis auf die Schaltfläche cmdSuchen zurückliefern. Über die Parent-Eigenschaft dieses Steuerelements erhalten wir einen Verweis auf das Formular, das dieses enthält. Das funktioniert auch, wenn das Formular mit der Schaltfläche cmdSuchen selbst als Unterformular in einem weiteren Unterformular untergebracht ist. Nur wenn die Schaltfläche und das Unterformular mit der Datenblattansicht nicht das gleiche übergeordnete Formular besitzen, müssen Sie diesen Code entsprechend umbauen.

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar