Wenn Sie etwa eine Kundendatenbank nutzen und während eines Tages Aktionen rund um die Pflege mehrerer Kunden ausführen, möchten Sie diese vielleicht nicht direkt nach dem Bearbeiten wieder schließen, sondern gegebenenfalls noch geöffnet lassen, weil noch zusätzliche Schritte nötig sind. Dieser Artikel zeigt, wie Sie Kunden in einem Hauptformular aus einer Liste mit Suchfunktion auswählen und die einzelnen Kundendatensätze dann in der Detailansicht in den Unterformularen eines Registersteuerelements anzeigen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1803_MehrereDatensaetzeImRegister.accdb.
Listenfeld mit Schnellsuche
Der oberen Teil unserer kleinen Beispiellösung soll ein Listenfeld enthalten, dass die Datensätze der Tabelle tblKunden liefert. Darüber legen wir ein Textfeld an, mit dem wir schnell nach den Namen der Kunden suchen und die Datensätze im Listenfeld dann filtern können – direkt bei Eingabe der einzelnen Buchstaben.
Dazu fügen wir dem Formular ganz oben ein Textfeld namens txtSuche hinzu. Darunter legen wir ein Listenfeld namens lstKunden an (siehe Bild 1). Damit die Größe des Listenfeldes beim ändern der Größe des Formulars angepasst wird, stellen wir seine Eigenschaften Horizontaler Anker und Vertikaler Anker auf Beide ein. Für das Formular legen wir für die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Bildlaufleisten und Trennlinien den Wert Nein und für Automatisch zentrieren den Wert Ja fest.
Bild 1: Suchfeld und Listenfeld zur Ausgabe der Suchergebnisse
Die Datensatzherkunft des Listenfeldes stellen wir auf die Abfrage aus Bild 2 ein. Diese liefert alle Datensätze der Tabelle tblKunden, allerdings nur die Felder KundeID, KundenCode, Firma und Kontaktperson. Die Sortierung erfolgt aufsteigend nach dem Feld Firma. Damit das Listenfeld nur den Inhalt ab den zweiten Feld der Datensatzherkunft anzeigt, stellen wir die Eigenschaft Spaltenanzahl auf 4 und die Eigenschaft Spaltenbreiten auf 0cm;2cm;5cm;5cm ein.
Bild 2: Datensatzherkunft des Listenfeldes
Dann hinterlegen wir für die Ereigniseigenschaft Bei änderung des Textfeldes txtSuche die Ereignisprozedur aus Listing 1. Die Prozedur trägt zunächst den aktuell im Textfeld txtSuche angezeigten Text in die Variable strSuche ein. Dann prüft sie, ob die Variable einen Suchbegriff mit einer Länge von mindestens einem Zeichen enthält. Ist das der Fall, setzt die Prozedur in der Variablen strKriterium einen Ausdruck zusammen, der die drei Felder Kundencode, Firma und Kontaktperson mit dem Ausdruck aus strSuche vergleicht und die einzelnen Kriterien mit dem OR-Operator verbindet. Dieses Kriterium tragen wir dann zusammen mit einem SQL-Ausdruck, der etwa dem Inhalt der ursprünglich als Datensatzherkunft für das Listenfeld verwendeten Abfrage entspricht, für die Eigenschaft RowSource des Listenfeldes lstKunden ein.
Private Sub txtSuche_Change() Dim strSuche As String Dim strSQL As String Dim strKriterium As String strSuche = Me!txtSuche.Text If Len(strSuche) > 0 Then strKriterium = "WHERE Kundencode LIKE '*" & strSuche & "*' OR Firma LIKE '*" & strSuche _ & "*' OR Kontaktperson LIKE '*" & strSuche & "*'" End If strSQL = "SELECT KundeID, KundenCode, Firma, Kontaktperson FROM tblKunden " & strKriterium & "ORDER BY Firma" Me!lstKunden.RowSource = strSQL End Sub
Listing 1: Prozedur zum Durchsuchen des Listenfeldes
Wenn der Benutzer beispielsweise nur den Buchstaben A in das Textfeld einträgt, erhält das Listenfeld die folgende Datensatzherkunft:
SELECT KundeID, KundenCode, Firma, Kontaktperson FROM tblKunden WHERE Kundencode LIKE '*A*' OR Firma LIKE '*A*' OR Kontaktperson LIKE '*A*'ORDER BY Firma
Das Zwischenergebnis sieht nun etwa wie in Bild 3 aus. Hier haben wir den Suchbegriff Restauran eingegeben, was alle Einträge liefert, die diesen Ausdruck in einem der drei Felder Kundencode, Firma oder Kontaktperson enthält.
Bild 3: Beispiel für die Suche nach bestimmten Kunden
Registersteuerelement hinzufügen
Nun wollen wir das Registersteuerelement hinzufügen, das die per Doppelklick ausgewählten Kunden auf jeweils einer Registerseite anzeigt. Dazu legen wir zuerst das Registersteuerelement wie in Bild 4 an und geben ihm den Namen regKunden.
Bild 4: Das Formular mit dem Registersteuerelement für die Anzeige der Kunden
Nun verhält es sich unter Access so, dass wir zur Laufzeit keine Steuer-elemente zu einem Formular hinzufügen können. Dies ist nur in der Entwurfsansicht möglich.
Es ist allerdings durchaus möglich, zur Laufzeit Registerseiten hinzuzufügen oder zu entfernen. Leider hilft uns das nicht weiter, wenn wir jedem Register ein Unterformular hinzufügen wollen, welches das Detailformular mit den Kundendaten enthält. Oder doch Wie wir dies nutzen können, schauen wir uns später noch an.
Gewünschte Anzahl der Register
Da wir Unterformulare nur zur Entwurfszeit zum Formular hinzufügen können, müssen wir uns überlegen, wieviele Kunden das Registeuersteuerelement gleichzeitig anzeigen können soll. Wir wollen uns auf die Zahl zehn beschränken. In mehr als zehn Kundendatensätzen wollen Sie vermutlich nicht gleichzeitig arbeiten. Also fügen wir dem Registersteuerelement manuell so viele Registerseiten hinzu, dass wir zehn Seiten erhalten. Dies erledigen Sie über den Kontextmenü-Eintrag Seiten einfügen des Registersteuerelements in der Entwurfsansicht des Formulars (siehe Bild 5).
Bild 5: Manuelles Hinzufügen von Registersteuerseiten
Hier wird schnell deutlich, dass sich das Registersteuerelement den für die Seitenüberschriften benötigen Platz schnell nimmt und das Steuer-element sowie das Formular verbreitert. Das können wir ändern, indem wir die Eigenschaft Mehrere Zeilen des Registersteuerelements auf Ja einstellen. Allerdings wirkt sich diese änderung offensichtlich nicht aus, wenn wir in der Entwurfsansicht arbeiten – die zweizeilige Anzeige wird nicht aktiviert, stattdessen wird das Steuer-element immer breiter, je mehr Registerseiten wir hinzufügen. Also beschränken wir die Breite des Registersteuerelement zunächst dadurch, dass wir die Beschriftungen der Registerseiten, die wir später ohnehin an den Kundendatensatz anpassen, auf einfache Zahlen von 1 bis 10 einstellen. Außerdem stellen wir die Eigenschaft Name gleich auf Werte von pge01 bis pge10 ein.
Unterformulare hinzufügen
Danach fügen wir jeder Registerseite ein Unterformular-Steuerelement hinzu. Hier ist es besonders wichtig, dass alle Unterformular-Steuerelemente die gleiche Position haben, damit diese nachher beim Hin- und Herschalten zwischen den Seiten nicht springen. Also legen wir das erste Unterformular-Steuerelement wie gewünscht an und merken uns die Werte der vier Eigenschaften Oben, Links, Höhe und Breite des ersten Unterformulars. Damit dieses aber überhaupt erst den vollständigen Platz der Registerseite einnimmt, stellen wir die Werte der vier genannten Eigenschaften auf die entsprechenden Werte der Registerseite ein.
Wenn wir dann das Unterformular-Steuerelement der ersten Registerseite kopieren und in die zweite Registerseite einfügen, landet dieses leider wieder an einer etwas anderen Stelle etwas weiter unten und etwas weiter links. Dadurch wird auch die Registerseite etwas größer und breiter. Diesmal brauchen wir allerdings nur die Eigenschaften Oben und Links einzustellen, damit das Formular die gleiche Position wie das auf der vorherigen Registerseite einnimmt. Am schnellsten kommen wir zum Ziel, wenn wir das Unterformular-Steuerelement mit angepasster Höhe und Breite von den ersten in die folgenden Registerseiten einfügen und dann per Copy and Paste auch die Werte der Eigenschaften Oben und Links übertragen. Außerdem stellen wir noch die Namen der Unterformular-Steuerelemente auf sfm01 bis sfm10 ein.
Zusätzlich stellen wir noch die Eigenschaft Rahmenart der Unterformular-Steuerelemente auf den Wert Transparent ein.
Das Ergebnis sieht dann zunächst wie in Bild 6 aus.
Bild 6: Die Registerseiten sind vollständig mit Unterformularen gefüllt.
Registerseiten ausblenden
Nun zeigt das Registersteuerelement nicht gleich beim öffnen des Formulars zehn Kunden-Datensätze an, sondern erst einmal keinen. Deshalb blenden wir die zehn Seiten auch zunächst einmal aus, indem wir ihre Eigenschaft Sichtbar auf den Wert Nein einstellen. Das erledigen wir allerdings nicht zu Fuß, sondern fügen der Prozedur, die durch das Ereignis Beim Laden des Formulars ausgelöst wird, die folgenden Zeilen hinzu:
Private Sub Form_Load() Dim i As Integer Me!txtSuche.SetFocus For i = 1 To 10 Me!regKunden.Pages(i - 1).Visible = False Next i End Sub
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: