Kombinationsfeld mit Extraeinträgen

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 anzeigen, damit der Benutzer sieht, dass hier eine Auswahl vorzunehmen ist oder Sie möchten dem Benutzer mit einem Eintrag wie die Möglichkeit geben, direkt über die Auswahl dieses Eintrags ein Detailformular zur Eingabe eines neuen Datensatzes zu öffnen. Dieser Beitrag zeigt, wie das funktioniert und welche Herausforderungen es gibt, wenn das Kombinationsfeld sonst noch keine Daten anzeigt.

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

Einfache Auswahl

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

Anzeige des gewählten Eintrags

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 hinzufügen, der immer direkt beim Öffnen des Formulars angezeigt wird.

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.

Fehlermeldung durch die ORDER BY-Klausel

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 wird als erster Eintrag der Auswahlliste angezeigt.

Anzeige des Eintrags <Auswählen>” width=”424,7115″ height=”152,7926″/></p>
<p><b><span style=Bild 4: Anzeige des Eintrags

als Standardwert

Wenn das Kombinationsfeld nun gleich beim Anzeigen den Eintrag anzeigen soll, müssen Sie noch eine Ereignisprozedur anlegen, die dies beim Öffnen des Formulars einrichtet. Das erledigen wir mit der Ereigniseigenschaft Beim Laden, für die wir den Wert [Ereignisprozedur] einstellen und dann mit einem Klick auf die Schaltfläche mit den drei Punkten eine Ereignisprozedur erstellen, die wir wie folgt füllen:

Private Sub Form_Load()
     Me!cboAuswaehlen = Me!cboAuswaehlen.ItemData(0)
End Sub

Dann erscheint der -Eintrag auch direkt beim Öffnen des Formulars (siehe Bild 5).

Anzeige des Eintrags <Auswählen> gleich beim Öffnen des Formulars” width=”424,7115″ height=”167,0532″/></p>
<p><b><span style=Bild 5: Anzeige des Eintrags gleich beim Öffnen des Formulars

Dadurch, dass wir als Wert des Feldes KundeID für den -Eintrag die Zahl 0 angegeben haben, könnten wir die Anweisung auch wie folgt formulieren:

Private Sub Form_Load()
     Me!cboAuswaehlen = 0
End Sub

Und dass der Eintrag direkt als erster Eintrag des Kombinationsfeldes erscheint, ist auch kein Zufall: Wir haben extra das Kleiner-Zeichen als erstes Zeichen gewählt, weil es in der Sortierung nach dem ASCII-Code vor den Buchstaben liegt.

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.

Auswählen von Anreden

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 ist verschwunden (siehe Bild 7).

UNION mit einer leeren Tabelle zeigt keine Datensätze.

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 angezeigt:

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 an, auch wenn die Tabelle tblKunden keine Einträge enthält Das Problem ist genau genommen, dass wir auch im ersten Teil der UNION-Abfrage die Tabelle tblKunden als Datenquelle angegeben haben.

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 , obwohl die hier verwendete Tabelle tblKundenLeer keine Datensätze enthält (siehe Bild 8).

UNION mit einer leeren Tabelle zeigt den Eintrag <Auswählen>.” width=”424,7115″ height=”107,2591″ /></p>
<p><b><span style=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.

Entwurf der Hilfstabelle tblKombihelfer

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:

Datenblattansicht der Hilfstabelle tblKombihelfer

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