Ungebundene Listen und Kombis mit Daten füllen

Im Beitrag “Daten in ungebundenen Formularen bearbeiten” haben wir gezeigt, wie man die Daten einer Tabelle in einem ungebundenen Formular darstellt und dieses zum Bearbeiten und Anlegen von Datensätzen verwendet. Wenn wir dies konsequent umsetzen wollen, benötigen wir auch eine Möglichkeit, um Daten in Listenform anzuzeigen. Die Datenblatt- oder Endlosansicht fallen aus, also müssen wir uns um Alternativen kümmern. Für die mehrspaltige Listenansicht bietet Access das Listenfeld. Und für die Auswahl von Daten aus Lookup-Tabellen steht das Kombinationsfeld zur Verfügung. Beide sind jedoch, wie auch Formulare, für die Bindung an Tabellen oder Abfragen optimiert. Ungebundene Daten müssen wir dort erst einmal einpflegen. Auf welche Arten das gelingt, zeigt dieser Beitrag.

Listen- oder Kombinationsfeld

Die folgenden Informationen beziehen sich jeweils auf Listen- und Kombinationsfelder, wenn nicht anders angegeben.

Techniken zum Füllen von Kombinations- und Listenfeldern ohne Datenbindung

Wenn wir Kombinations- oder Listenfelder an Tabellen oder Abfragen binden, brauchen wir nur noch festzulegen, aus welchen Feldern der Datensatzherkunft die anzuzeigenden Daten stammen und welches Feld als gebundene Spalte genutzt werden soll. Der Rest funktioniert fast automatisch.

Wenn wir jedoch nicht auf die Datenbindung setzen können, brauchen wir alternative Techniken. Davon gibt es gleich drei, von denen zwei offensichtlich sind und eine nicht. Und von den beiden offensichtlichen können wir auch nur eine für unsere Zwecke nutzen. Bei den offensichtlichen Möglichkeiten reden wir von denen, die neben dem Eintrag Tabelle/Abfrage für die Eigenschaft Herkunftstyp zur Verfügung stehen (siehe Bild 1).

Einstellungen für die Eigenschaft Herkunftstyp

Bild 1: Einstellungen für die Eigenschaft Herkunftstyp

Dabei handelt es sich um die Folgenden:

  • Wertliste: Ist dieser Eintrag aktiviert, können wir für die Eigenschaft Datensatzherkunft eine durch Semikola separierte Liste von Einträgen angeben. Standardmäßig landet jeder Eintrag in einer eigenen Zeile. Wenn wir die Eigenschaft Spaltenanzahl auf einen anderen Wert als 1 einstellen, werden entsprechend viele Einträge in einer Zeile dargestellt – mehr dazu weiter unten in einem Beispiel.
  • Feldliste: Wenn wir den Wert Feldliste auswählen, müssen wir für die Eigenschaft Datensatzherkunft den Namen einer Tabelle oder Abfrage hinterlegen. Das Listenfeld zeigt dann die Feldnamen der angegebenen Tabelle oder Abfrage an. Diese Variante ist für uns in diesem Fall uninteressant.

Weitere Variante: Callback-Funktion

Und es gibt noch eine Möglichkeit, die wir später betrachten werden: Dabei handelt es sich um die sogenannte Callback-Funktion. Dies ist eine Funktion, mit der wir definieren, welche Daten im Kombinations- oder Listenfeld enthalten sein sollen.

Der wesentliche Unterschied ist, dass wir mit dieser Methode mehr Einträge zu einem Kombinations- oder Listenfeld hinzufügen können als mit einer Wertliste. Diese Technik schauen wir uns in einem weiteren Beitrag namens Ungebundene List- und ComboBox per Callback (www.access-im-unternehmen.de/1443).

Kombinationsfeld per Wertliste füllen

Im ersten Beispiel schauen wir uns an, wie wir ein Kombinationsfeld über eine Wertliste mit den Daten einer Tabelle füllen. Wir wollen dabei extra eine Tabelle mit wenigen Datensätzen nutzen wie die Tabelle tblAnreden (siehe Bild 2).

Beispieltabelle zum Füllen eines Kombinationsfeldes

Bild 2: Beispieltabelle zum Füllen eines Kombinationsfeldes

Wenn wir nur so wenige Datensätze haben und es sich auch noch um solche Datensätze handelt, die sich eigentlich nie ändern, könnte man versucht sein, diese einfach statisch für die Eigenschaft Datensatzherkunft einzustellen. Wenn man gleichzeitig die Eigenschaft Herkunftstyp auf Wertliste einstellt und die beiden Eigenschaften Spaltenanzahl auf 2 und Spaltenbreiten auf 0cm, werden die Daten genau angezeigt wie in einem an die Tabelle tblAnreden gebundenen Kombinationsfeld. Die Eigenschaft Datensatzherkunft füllen wir wie folgt (siehe Bild 3):

Einstellungen für ein statisch gefülltes Kombinationsfeld

Bild 3: Einstellungen für ein statisch gefülltes Kombinationsfeld

"1";"Herr";"2";"Frau"

Durch die Einstellung von Spaltenanzahl auf 2 werden jeweils zwei Elemente in einer Zeile angezeigt. Durch die Angabe des Wertes 0cm für die Eigenschaft Spaltenbreiten wird die erste Spalte dabei mit der Breite 0cm angezeigt und die zweite nimmt den Rest der Breite ein. Das Ergebnis sehen wir in Bild 4 – es sieht aus wie ein übliches gebundenes Kombinationsfeld.

Ungebundenes Kombinationsfeld mit Daten

Bild 4: Ungebundenes Kombinationsfeld mit Daten

Kombinationsfeld aus Recordset füllen

Wir wollen das Kombinationsfeld jedoch nicht statisch füllen, sondern auch für den Fall vorbereitet sein, dass die zugrunde liegende Tabelle nicht immer die gleichen Datensätze enthält.

Also fügen wir dem Formular ein weiteres Kombinationsfeld hinzu, dem wir diesmal den Namen cboAnredeRecordset geben.

Dabei behalten wir die Einstellung Wertliste für die Eigenschaft Herkunftsart bei, und auch die beiden Eigenschaften Spaltenanzahl und Spaltenbreiten belassen wir bei den Werten 2 und 0cm. Die Eigenschaft Datensatzherkunft lassen wir jedoch zunächst leer. Um diese zu füllen, legen wir eine VBA-Prozedur an, die wie in Listing 1aussieht.

Private Sub cboAnredeRecordsetFuellen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strWertliste As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblAnreden", dbOpenDynaset)
     Do While Not rst.EOF
         strWertliste = strWertliste & rst!AnredeID & ";''" & rst!Anrede & "'';"
         rst.MoveNext
     Loop
     Me!cboAnredenRecordset.RowSource = strWertliste
     rst.Close
     Set rst = Nothing
     Set db = Nothing
End Sub

Listing 1: Füllen der Wertliste beim Laden des Formulars

Sie wird wie folgt durch das Ereignis Bei Laden des Formulars ausgelöst:

Private Sub Form_Load()
     cboAnredeRecordsetFuellen
End Sub

Diese Prozedur erstellt ein Recordset auf Basis der Tabelle tblAnreden und durchläuft in einer Do While-Schleife alle Datensätze dieser Tabelle. Dabei fügt sie bei jedem Durchlauf der Schleife die Daten eines Datensatzes zu einer Variablen namens strWertliste hinzu. Nach dem Hinzufügen der Daten für den ersten Datensatz sieht der Inhalt von strWertliste beispielsweise wie folgt aus:

1;''Herr'';

Nach dem Durchlaufen aller beiden Datensätze erhalten wir fast den gleichen Inhalt wie beim vorherigen Beispiel – mit Ausnahme des abschließenden Semikolons:

1;''Herr'';2;''Frau'';

Dieses wirkt sich jedoch nicht auf die Darstellung aus, weshalb wir es nicht noch nachträglich entfernen.

Auch mit dieser Vorgehensweise sehen wir nach dem Öffnen des Formulars die beiden Einträge Herr und Frau im Kombinationsfeld cboAnredenRecordset.

Alternative Variante für das Hinzufügen per Recordset

Eine weitere Möglichkeit erlaubt das direkte Hinzufügen von Elementen zum Kombinationsfeld. Dabei verwenden wir die AddItem-Methode des Kombinationsfeldes. In einer weiteren Prozedur, die wir ebenfalls von der Ereignisprozedur Form_Load aus aufrufen, durchlaufen wir dabei ebenfalls eine Do…While-Schleife über alle Datensätze der Tabelle tblAnreden (siehe Listing 2). Diesmal stellen wir allerdings keine Liste in der Variablen strWertliste zusammen, sondern weisen jedes Element direkt mit der AddItem-Methode hinzu.

Private Sub cboAnredeRecordsetAddItemFuellen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strWertliste As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblAnreden", dbOpenDynaset)
     Do While Not rst.EOF
         Me!cboAnredenRecordsetAddItem.AddItem rst!AnredeID & ";''" & rst!Anrede & "''"
         rst.MoveNext
     Loop
     rst.Close
     Set rst = Nothing
     Set db = Nothing
End Sub

[

Listing 2: Füllen der Wertliste beim Laden des Formulars per AddItem

Wenn wir wie zuvor eine zweispaltige Darstellung erhalten wollen, bei der die erste Spalte mit der Breite 0cm ausgeblendet wird, müssen wir die Inhalte der beiden Felder AnredeID und Anrede jeweils mit einem einzigen Aufruf der AddItem-Methode hinzufügen, wobei wir beide durch ein Semikolon voneinander trennen und die Zeichenkette in Hochkommata einfassen.

Auch diese Methode liefert das gleiche Ergebnis wie die beiden zuvor beschriebenen. Wenn wir uns den Wert der Eigenschaft Datensatzherkunft per VBA im Direktbereich ausgeben lassen, erhalten wir übrigens das folgende Ergebnis:

  Screen.ActiveControl.RowSource
1;''Herr'';2;''Frau''

Die AddItem-Methode macht also nichts anderes als die Wertliste zu einer langen Zeichenkette zusammenzusetzen. Sie ermöglicht lediglich noch, über den zweiten Parameter den Index für die Position anzugeben, an welcher der neue Datensatz angelegt werden soll.

Hinweis zur Angabe der Spaltenzahl

Es gibt einen wichtigen Unterschied bei der Zuweisung der anzuzeigenden Daten für Listen, die entweder direkt durch die Zuweisung einer durch Semikola separierten Wertliste oder durch die Verwendung der AddItem-Methode gefüllt werden. Das lässt sich an einem Beispiel am besten verdeutlichen:

lst.RowSource = "1;''Wert 1'';2;''Wert 2"

Wenn wir hier die Eigenschaft Spaltenanzahl auf den Wert 1 einstellen, interpretiert Access jedes durch ein Semikolon getrenntes Element als Inhalt für eine Spalte. Das sieht dann so aus:

1
Wert 1
2 
Wert 2

Würden wir Spaltenanzahl auf 2 einstellen, landen jeweils zwei Werte in den beiden Spalten in einer Zeile.

Bei Verwendung von AddItem ist das etwas anders. Angenommen, wir stellen Spaltenanzahl auf 1 ein und weisen diesen Ausdruck per AddItem zu:

lst.AddItem 1;''Wert 1''

Dann verwendet Access tatsächlich nur den Wert vor dem ersten Semikolon, der zweite wird verworfen. Das Ergebnis lautet also:

1
2

Wir müssen also hier direkt die Spaltenanzahl korrekt einstellen.

Ansonsten werden die überzähligen Spalten beim Einlesen verworfen und können auch nicht durch anschließendes Ändern der Eigenschaft Spaltenanzahl zurückgeholt werden.

Grenzen von Wertlisten

Nun wollen wir herausfinden, wo die Grenzen von Wertlisten liegen. Dazu haben wir zunächst die Tabelle tblKunden mit einigen tausend Datensätzen gefüllt (siehe Bild 5).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar