Normalerweise enthalten Kombinationsfelder nur die Einträge einer Tabelle oder Abfrage als Datensatzherkunft. Manchmal wollen Sie dem Benutzer aber mit dem Kombinationsfeld noch mehr Funktionen bieten. Zum Beispiel wollen Sie vielleicht den Text
Wenn Sie in einem Kombinationsfeld die Daten einer Abfrage oder Tabelle zur Auswahl anbieten wollen, gelingt das ganz einfach durch Einstellen weniger Eigenschaften. Die wichtigste ist dabei die Eigenschaft Datensatzherkunft, der Sie den Namen der zu verwendenden Tabelle oder der Abfrage zuweisen oder der für die Sie direkt einen SQL-Ausdruck hinterlegen.
Dann verwenden Sie beispielsweise einen Ausdruck wie den folgenden, den Sie leicht über den Abfrage-Generator der Eigenschaft Datensatzherkunft zusammenstellen können:
SELECT tblKunden.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKunden ORDER BY [Nachname] & ", " & [Vorname];
Wenn Sie nun noch die Eigenschaft Spaltenanzahl auf 2 und die Eigenschaft Spaltenbreiten auf 0cm einstellen, wird auch nur der Inhalt des zweiten Feldes im Kombinationsfeld angezeigt, nicht aber der Primärschlüsselwert aus dem ersten Feld. Dieser wird allein als Wert der gebundenen Spalte genutzt (siehe Bild 1).
Bild 1: Einfache Auswahl
Hier haben wir die beiden Felder Nachname und Vorname, getrennt durch ein Komma, zu einem neuen Feld namens Kunde zusammengefasst, damit beide Feldinhalte sowohl in der Auswahlliste als auch als ausgewählter Eintrag angezeigt werden (siehe Bild 2).
Bild 2: Anzeige des gewählten Eintrags
Eintrag hinzufügen
Nun wollen wir dem Benutzer deutlich machen, dass er in diesem Feld einen Eintrag auswählen soll. Dazu soll das Feld einen Eintrag mit dem Text
Dazu wollen wir per UNION-Abfrage einen Eintrag voranstellen. Die UNION-Abfrage führt zwei einzelne SELECT-Abfragen zusammen und sieht wie folgt aus:
SELECT 0 AS KundeID, ''<Auswählen>'' AS Kunde FROM tblKunden UNION SELECT tblKunden.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKunden ORDER BY [Nachname] & ", " & [Vorname];
Damit erhalten wir beim Aufklappen des Kombinationsfeldes, das wir als neues Kombinationsfeld namens cboAuswaehlen angelegt haben, allerdings direkt die erste Fehlermeldung (siehe Bild 3). Wir müssten also noch die Felder Nachname und Vorname in den ersten SELECT-Ausdruck übernehmen, damit die Sortierung funktioniert.
Bild 3: Fehlermeldung durch die ORDER BY-Klausel
Das lässt sich allerdings leicht beheben, indem wir einfach in der vom Abfragegenerator erzeugten ORDER BY-Klausel [Nachname] & „, “ & [Vorname] durch das weiter vorn aus diesen Feldern zusammengesetzte Feld Kunde ersetzen:
SELECT 0 AS KundeID, ''<Auswählen>'' AS Kunde FROM tblKunden UNION SELECT tblKunden.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKunden ORDER BY Kunde;
Damit erhalten wir dann auch wie in Bild 4 das angestrebte Zwischenergebnis – der Eintrag
Bild 4: Anzeige des Eintrags
als Standardwert
Wenn das Kombinationsfeld nun gleich beim Anzeigen den Eintrag
Private Sub Form_Load() Me!cboAuswaehlen = Me!cboAuswaehlen.ItemData(0) End Sub
Dann erscheint der
Bild 5: Anzeige des Eintrags
Dadurch, dass wir als Wert des Feldes KundeID für den
Private Sub Form_Load() Me!cboAuswaehlen = 0 End Sub
Und dass der Eintrag
Sortierung nach dem Primärschlüsselwert
Wenn Sie etwa das Feld AnredeID in einem Kombinationsfeld namens cboAnredeID auf die gleiche Weise abbilden wollen – also etwa wie in Bild 6 -, können Sie die Sortierung auch anders erzeugen.
Bild 6: Auswählen von Anreden
In diesem Fall verwenden wir die folgende Datensatzherkunft:
SELECT 0 AS AnredeID, ''<Auswählen>'' AS Anrede FROM tblAnreden UNION SELECT tblAnreden.AnredeID, tblAnreden.Anrede FROM tblAnreden ORDER BY AnredeID;
Der Unterschied ist, dass wir hier nach dem Feld AnredeID sortieren und nicht nach dem Feld Anrede. Der Grund ist, dass wir die Werte dieser Tabelle direkt in der gewünschten Reihenfolge eingegeben haben und daher eine Sortierung nach dem Primärschlüsselwert möglich ist. Auch hier können wir dann direkt den Wert des Kombinationsfeldes auf 0 einstellen:
Private Sub Form_Load() Me!cboAnreden = 0 End Sub
Datensatzherkunft leer
Es kann sein, dass Sie diese Konstellation für eine leere Kundentabelle verwenden. Wenn Sie das Formular dann öffnen, zeigt das Kombinationsfeld überhaupt keinen Eintrag an – auch der Eintrag
Bild 7: UNION mit einer leeren Tabelle zeigt keine Datensätze.
Das ist übrigens ein Unterschied zu dem Fall, wo die zweite Abfrage lediglich keinen Wert zurückliefert, die referenzierte Tabelle aber bereits Datensätze enthält. Wenn tblKunden nicht leer ist, wir aber als Kriterium 1=2 definieren, wird nur der Eintrag
SELECT 0 AS KundeID, ''<Auswählen>'' AS Kunde FROM tblKunden UNION SELECT tblKunden.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKunden WHERE 1=2 ORDER BY Kunde;
Wie aber zeigen wir nun den Eintrag
Wir brauchen also nur einen anderen Tabellennamen anzugeben, zum Beispiel MSysObjects – diese Tabelle ist in einer Access-Anwendung immer vorhanden:
SELECT 0 AS KundeID, ''<Auswählen>'' AS Kunde FROM MSysObjects UNION SELECT tblKundenLeer.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKundenLeer ORDER BY Kunde;
Damit gelingt dann auch die Anzeige des Eintrags
Bild 8: UNION mit einer leeren Tabelle zeigt den Eintrag
Wenn Sie auch für den Fall sichergehen wollen, dass Sie einmal die Daten aus den Tabellen etwa einer SQL Server-Datenbank beziehen, können Sie auch eine Hilfstabelle namens tblKombihelfer anlegen, die wie in Bild 9 aufgebaut ist.
Bild 9: Entwurf der Hilfstabelle tblKombihelfer
In der Tabelle tblKombihelfer legen wir dann die verschiedenen benötigten Einträge an (siehe Bild 10). In der UNION-Abfrage fügen wir dann die entsprechenden Einträge zur Datensatzquelle des Kombinationsfeldes hinzu:
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