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;

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar