Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
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 Bild 1 aus.
Bild 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 Bild 2 aus.
Bild 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.
Die folgende Zuweisung des Wertes [Event Procedure] an die Eigenschaft OnUnload bewirkt nichts anderes, als wenn Sie von Hand den Wert [Ereignisprozedur] in das entsprechende Eigenschaftsfeld eintragen würden – allerdings muss sich die passende Ereignisprozedur im gleichen Klassenmodul wie die Deklaration der Objektvariablen befinden (also in dem des Suchformulars). Dort legen Sie auch die benötigte Ereignisprozedur an, die schlicht das Suchformular schließt:
Private Sub frmParent_Unload(Cancel As Integer) DoCmd.Close acForm, Me.Name End Sub
Besonderheiten beim Anlegen der Felder zur Eingabe der Kriterien
Bevor wir uns um den Code kümmern, der die eingegebenen Kriterien auswertet, legen wir erstmal die zur Eingabe benötigten Steuerelemente an. Es gibt vier Möglichkeiten (dies ist erweiterbar, aber wir wollen nicht den Rahmen dieses Beitrags sprengen):
- Einfache Textfelder, in die der Benutzer Kriterien mit Platzhaltern wie Sternchen (*) und Fragezeichen () eingeben kann
- Kombinationsfelder, die eine Auswahl aller in einem Textfeld vorkommenden Einträge anbieten
- Kombinationsfelder, die alle Einträge eines zu durchsuchenden Kombinationsfeldes anbieten
- Kombinationsfelder, welche die beiden Werte eines Ja/Nein-Feldes anbieten
Es gibt ein paar kleine Regeln für das Anlegen dieser Felder: Text- und Kombinationsfelder, die Suchkriterien für Textfelder aufnehmen, sollen das Präfix txt besitzen (also die ersten beiden Einträge der obigen Liste). Kombinationsfelder für die Auswahl von Werten aus Kombinationsfeldern sollen das Präfix cbo erhalten (für Combobox). Und solche, die sich auf Ja/Nein-Felder beziehen, beginnen mit chk (für Checkbox). Der Teil des Steuerelementnamens hinter dem Präfix muss genau mit dem Feldnamen übereinstimmen. Im Falle der Artikel-Tabelle sieht dies so aus:
- txtArtikelID: Textfeld zur Eingabe von Artikelnummern aus dem Feld ArtikelID oder Teilen davon als Text
- txtArtikelname: wie txtArtikelID, nur für das Feld Artikelname
- txtLiefereinheit: Kombinationsfeld zur Auswahl der Werte des Feldes Liefereinheit
- cboLieferant, cboKategorie: Auswahl der Werte der verknüpften Tabellen tblLieferanten und tblKategorien, die in der Tabelle tblArtikel als Nachschlagefelder Lieferant und Kategorie abgebildet sind
- chkAuslaufartikel: Kombinationsfeld, dass die beiden Werte Ja und Nein anbietet und damit die Tabelle nach dem Inhalt des Ja/Nein-Feldes Auslaufartikel filtert
Insgesamt werden die Steuerelemente zur Eingabe der Suchkriterien im Entwurf des Formulars wie in Bild 3 angeordnet.
Bild 3: Formular zur Eingabe von Suchkriterien in der Entwurfsansicht
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo
Hallo Andre,
ich habe heutedieses Formular in mein momentanes DB-Projekt eingebunden …
Es hat einen Fehler verursacht: Bei der Aktion “Abbrechen” – wenn ggf. noch etwas im Formular steht.
Abhilfe: Schaltfläche “Abbrechen”: Die Prozedur “cmdFilterLeeren_Click” mit eingebaut – VOR dem Schließen:
Private Sub cmdAbbrechen_Click()
Call cmdFilterLeeren_Click
DoCmd.Close acForm, Me.Name
End Sub
Ich muss im Hautformular auch nach Zahlen(werte) suchen (Zahlenbereiche: Von bis) – dieser Code gibt es leider nicht her ;-( …
Viele Grüße
Susanne
Hallo Susanne,
wenn Du das hier liest, schreibe mir gern eine Mail an support@minhorst.com.
Danke – André