3.4 Kombinationsfelder
Kombinationsfelder haben im Vergleich zu einfachen Textfeldern mehr Eigenschaften, die anfangs vielleicht etwas verwirrend sind und manchmal für den Anfänger zu unerwarteten Ergebnissen führen. Vor allem die Eigenschaft Gebundene Spalte hat schon so manchen zur Verzweiflung gebracht.
3.4.1 Herkunftstyp
Beim Anlegen des Kombinationsfeldes wird man bei aktiviertem Steuerelement-Assistenten gefragt, ob das Kombinationsfeld auf einer Abfrage bzw. Tabelle basieren soll, oder ob man selbst Werte eingeben möchte. Daraus ergeben sich dann die beiden Typen Tabelle/Abfrage oder Wertliste. Sonderfälle sind die Herkunftstypen Feldliste und eine "Callback"-Funktion.
- Tabelle/Abfrage: Zugriff auf eine Tabelle bzw. Abfrage (mittels gespeicherter Abfrage oder SQL-String).
- Wertliste: Zugriff auf eine festgelegte Auswahl, deren Werte durch Semikola getrennt werden. Durch Festlegen der Spaltenanzahl wird automatisch nach x Werten eine neue Zeile ("Datensatz") im Kombinationsfeld angelegt. Bei beispielsweise 2 Spalten und 6 Einträgen erhält man also 3 "Datensätze".
- Feldliste: Zugriff auf die Feld- oder Spaltennamen in einer Tabelle/Abfrage.
- Callback-Funktion: Falls man per VBA eine Wertliste generieren möchte, diese aber ab 2048 Zeichen abgeschnitten wird, kann man das Kombinationsfeld auch mit einer selbst erstellten Funktion befüllen. Im folgenden Beispielcode gibt es eine Funktion namens
fctData(), die durch Semikolon getrennte Werte liefert. Die Spaltenanzahl (cColumns) muss im Code angepasst werden, beim Herkunftstyp wird nurfctFillFieldeingetragen (ohne Gleichzeichen oder Klammern):
Public Function fctFillField(ctl As Control, ID As Long, lRow As Long, lCol As Long, s As Integer) Const cColumns = 4 Dim vRet As Variant Static vEntries As Variant 'fctData() liefert nur die Rohdaten und wird hier nicht aufgeführt: If IsEmpty(vEntries) Then vEntries = Split(fctData(), ";") Select Case s Case 0 'Initialisieren vRet = True Case 1 'Öffnen mit eindeutiger ID für das Listenfeld vRet = Timer Case 3 'Zeilenanzahl vRet = (UBound(vEntries) + 1) / cColumns Case 4 'Spaltenanzahl vRet = cColumns Case 5 'Spaltenbreiten (True, um nichts zu ändern) vRet = True Case 6 'Mit Daten befüllen vRet = vEntries(lRow * cColumns + lCol) Case 7 'Abschluss End Select fctFillField = vRet End Function
Empfehlenswert ist bis auf wenige Ausnahmen der Herkunftstyp Tabelle/Abfrage, da so Sortierungen leichter möglich sind, die Auswahl einfacher angepasst werden kann usw.
3.4.2 Datensatzherkunft
Je nachdem, was beim Herkunftstyp ausgewählt wurde, steht hier nur ein Tabellen-/Abfragename bzw. ein SQL-String (Herkunftstypen Tabelle/Abfrage bzw. Feldliste) oder eine durch Semikola getrennte Herkunft (Wertliste). Bei einer Callback-Funktion bleibt der Eintrag leer! Durch Anpassen des SQL-Strings mittels Aufruf des Abfrageeditors kann beim bereits empfohlenen Herkunftstypen "Tabelle/Abfrage" die Datensatzherkunft leicht eingeschränkt, sortiert oder anderweitig manipuliert werden. Beim Typ Wertliste muss die Anpassung ohne weitere Hilfsmittel vorgenommen werden.
3.4.3 Spaltenanzahl
Die Spaltenanzahl sollte immer mit der Datensatzherkunft korrespondieren. Das heisst, wenn eine Abfrage verwendet wird, die insgesamt 2 Spalten selektiert, so sollte hier auch 2 eingestellt werden.
3.4.4 Spaltenüberschriften
Standardmässig steht diese Eigenschaft auf "Nein". Wenn hier "Ja" eingestellt wird, erscheint oberhalb der Datensätze im Kombinationsfeld ein nicht selektierbarer Eintrag mit den Feldnamen. Bei einer Feldliste führt "Ja" dazu, dass der erste Feldname nicht ausgewählt werden kann, deshalb ist diese Einstellung eher nur für die Herkunftstypen Tabelle/Abfrage oder Wertliste bzw. bei einer Callback-Funktion sinnvoll.
3.4.5 Spaltenbreiten
Hiermit legt man fest, was das Kombinationsfeld beim Aufklappen und nach der Auswahl eines Wertes überhaupt anzeigt. Angenommen man hat eine Abfrage wie diese hier als Datensatzherkunft:
SELECT [tblArtikel].[idArtikel], [tblArtikel].[txtArtikel], [tblArtikel].[idArtikelGruppe] FROM tblArtikel ORDER BY [tblArtikel].[txtArtikel], [tblArtikel].[idArtikelGruppe];
und stellt nun die Spaltenbreiten auf 0cm;4cm;2cm, dann werden beim Aufklappen
das Feld idArtikel nicht zu sehen und nur die beiden folgenden Felder Spalten
txtArtikel und idArtikelgruppe sichtbar sein.
Nach der Auswahl und dem Zuklappen des Kombinationsfeldes wird nur noch das Feld
txtArtikel angezeigt. Oder allgemeiner formuliert: Die erste Spalte mit einer Breite >
0cm wird angezeigt. In der Klappliste können mehr als eine Spalte angezeigt werden, aber im zugeklappten
Kombinationsfeld wird immer nur der Wert aus der ersten Spalte der Klappliste angezeigt.
Der angezeigte Wert kann von dem tatsächlich zu speichernden Wert abweichen (s.
nächster Abschnitt: Gebundene Spalte).
3.4.6 Gebundene Spalte
Die gebundene Spalte gibt an, welcher Wert tatsächlich durch Auswahl eines Eintrages gespeichert wird.
Falls man dieselbe Datensatzherkunft wie unter Spaltenbreiten
aufgeführt verwendet, und die gebundene Spalte auf 1 steht, sowie die Spaltenbreiten auf
0cm;4cm;2cm eingestellt wurden, dann wird der Wert aus der ersten Spalte
idArtikel gespeichert und nicht der nachher angezeigte Wert
aus txtArtikel!
Um auf den angezeigten Wert aus der 2. Spalte zuzugreifen (also txtArtikel),
muss man z.B.mit VBA, wie unter FAQ 4.15 erläutert wird, mit
Me![KombinationsfeldName].Column(1) arbeiten (Column
fängt, wie fast alle Auflistungen, bei 0 an zu zählen).
