Home > Artikel > Ausgabe 3/2018 > Mehrere Datensätze im Register-Steuerelement

Mehrere Datensätze im Register-Steuerelement

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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.

Suchfeld und Listenfeld zur Ausgabe der Suchergebnisse

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.

Datensatzherkunft des Listenfeldes

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.

Beispiel für die Suche nach bestimmten Kunden

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.

Das Formular mit dem Registersteuerelement für die Anzeige der Kunden

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).

Manuelles Hinzufügen von Registersteuerseiten

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.

Die Registerseiten sind vollständig mit Unterformularen gefüllt.

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

Dadurch ist der Bereich, in dem das Formular normalerweise mindestens eine Registerseite anzeigen sollte, nach dem Öffnen des Formulars zunächst leer.

Kunden anzeigen

Das wollen ändern, nachdem der Benutzer per Doppelklick auf einen der Einträge im Listenfeld den ersten anzuzeigenden Kunden ausgewählt hat. Zuvor benötigen wir jedoch noch das Unterformular, das wir den Unterformular-Steuerelementen auf den einzelnen Registerseiten zuordnen wollen. Dieses Formular statten wir mit der Tabelle tblKunden als Datenherkunft aus und fügen ihm alle Felder dieser Tabelle hinzu. Das Unterformular sieht dann wie in Bild 7 aus.

Unterformular mit den Kundendetails

Bild 7: Unterformular mit den Kundendetails

Kundendetails im Register einblenden

Nun wollen wir testweise erst einmal die Daten des aktuell doppelt im Listenfeld angeklickten Kunden im Unterformular auf der ersten Seite des Registersteuerelements anzeigen. Dazu hinterlegen wir für die Ereigniseigenschaft Beim Doppelklicken des Listenfeldes die Ereignisprozedur aus Listing 2.

Private Sub lstKunden_DblClick(Cancel As Integer)

     Me!sfm01.SourceObject = "sfmKundendetails"

     Me!sfm01.Form.RecordSource = "SELECT * FROM tblKunden WHERE KundeID = " & Me!lstKunden

     Me!regKunden.Pages(0).Visible = True

     Me!sfm01.Visible = True

     Me!regKunden.Pages(0).Caption = Me.lstKunden.Column(2)

End Sub

Listing 2: Anzeige eines ersten Datensatzes im Register-Steuerelement

Diese stellt zunächst mit der Eigenschaft SourceObject das auf der ersten Registerseite mit dem Unterformular-Steuerelement anzuzeigende Formular auf sfmKundendetails ein. Die Eigenschaft RecordSource des Form-Objekts des Unterformular-Steuerelements füllen wir mit einer Abfrage, welche den aktuell im Listenfeld markierten Kunden liefert.

Dann machen wir die erste Registerseite durch Einstellen der Eigenschaft Visible für Pages(0) auf den Wert True sichtbar. Gleiches erledigen wir für die Eigenschaft Visible des Unterformular-Steuerelements.

Schließlich legen wir als Überschrift der ersten Registerseite den Wert der zweiten Spalte des Listenfeldes fest (Column(2)). Dazu weisen wir diesen Wert der Eigenschaft Caption der Seite Pages(0) des Registersteuerelements zu.

Das Ergebnis finden Sie nach einem Doppelklick auf einen der Einträge im Listenfeld in Bild 8. Die Beschriftung der ersten Registerseite weist den korrekten Kundennamen auf, das Unterformular ist eingeblendet und liefert den gewünschten Datensatz.

Anzeige eines ersten Datensatzes auf der ersten Registerseite

Bild 8: Anzeige eines ersten Datensatzes auf der ersten Registerseite

Unterformulare dynamisch füllen

Das war nur eine Fingerübung, denn wir haben ja nur das Unterformular auf der ersten Registerseite gefüllt. In der Tat wollen wir nun Folgendes erreichen:

  • Wenn der Benutzer doppelt auf einen Eintrag im Listenfeld klickt und es sind noch Registerkarten frei, soll der entsprechende Eintrag auf der freien Registerkarte erscheinen.
  • Wenn der Benutzer doppelt auf einen Eintrag klickt und es sind bereits alle Registerkarten belegt, soll die aktuelle Registerkarte ersetzt werden. Alternativ könnte man auch die Registerkarte füllen, die als erste auf einen Kundendatensatz eingestellt wurde, aber das wäre möglicherweise etwa unübersichtlich für den Benutzer.
  • Wir wollen auch noch eine Möglichkeit schaffen, mit welcher der Benutzer den aktuell angezeigten Kunden wieder ausblenden kann. Das erledigen wir mit einer Schaltfläche außerhalb des Registersteuerelements.

Kunden merken?

Gegebenenfalls fügen wir auch noch eine Funktion hinzu, mit der die zuletzt angezeigten Kunden beim Schließen des Formulars gespeichert werden. Dann können diese beim nächsten Öffnen wieder angezeigt werden. Dazu benötigen wir dann noch eine entsprechende Tabelle. Zuerst wollen wir jedoch das Füllen und Leeren der zehn Registerseiten mit Kundendaten realisieren.

Mehrere Kunden anzeigen

Dazu verwenden wir zunächst die neue Version für die Prozedur lstKunden_DblClick aus Listing 3. Hier durchlaufen wir eine For...Next-Schleife von 1 bis 10 und prüfen dabei jeweils, ob die Seite mit dem Index von i - 1 sichtbar ist. Falls nicht, füllen wir die Eigenschaft SourceObject des Unterformular-Steuerelements mit dem Namen, der sich aus der Zeichenkette sfm und dem Index i im Format "00" zusammensetzt – also beispielsweise sfm01 oder sfm02. Dann stellt sie die Datenherkunft des Unterformulars auf die bereits weiter oben verwendete Abfrage ein. Außerdem blendet die Prozedur die Seite mit dem Index i - 1 und das Unterformular mit dem oben angegebenen Namen ein. Neu ist die folgende Anweisung, die dafür sorgt, dass die Überschrift der Registerseite auf den Inhalt der dritten Spalte des Listenfeldes eingestellt wird – also auf den Inhalt des Feldes Firma des Kundendatensatzes. Sobald in der Schleife eine noch leere Registerseite gefunden wurde, verlässt die Prozedur die For...Next-Schleife mit der Exit For-Anweisung.

Private Sub lstKunden_DblClick(Cancel As Integer)

     Dim i As Integer

     For i = 1 To 10

         If Me!regKunden.Pages(i - 1).Visible = False Then

             Me("sfm" & Format(i, "00")).SourceObject = "sfmKundendetails"

             Me("sfm" & Format(i, "00")).Form.RecordSource = "SELECT * FROM tblKunden WHERE KundeID = " & Me!lstKunden

             Me!regKunden.Pages(i - 1).Visible = True

             Me("sfm" & Format(i, "00")).Visible = True

             Me!regKunden.Pages(i - 1).Caption = Me!lstKunden.Column(2)

             Me!regKunden = i - 1

             Exit For

         End If

     Next i

End Sub

Listing 3: Füllen mehrerer Registerseiten

Dies funktioniert auch recht gut, wenn Sie nacheinander einige Einträge des Listenfeldes doppelt anklicken. Sobald Sie jedoch eine bestimmte Anzahl markiert haben, passen die Beschriftungen nicht mehr in die Registerreiter-Leiste des Register-Steuerelements (siehe Bild 9)

Das Register wird immer breiter.

Bild 9: Das Register wird immer breiter.

Registerreiter-Leiste reparieren

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!