Zum Inhalt dieser Seite

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.

Nach oben3.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 nur fctFillField eingetragen (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.

Nach oben3.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.

Nach oben3.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.

Nach oben3.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.

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

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

Home