Kontextmenü statt Kombinationsfeld

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Kontextmenü statt Kombinationsfeld

Das Kombinationsfeld ist ein treuer Diener in fast allen Situationen. Manchmal allerdings kann man es nicht sinnvoll einsetzen – zum Beispiel in einem Formular in der Datenblattansicht oder Endlosansicht, wenn das Kombinationsfeld Daten anzeigen soll, die vom Wert eines anderen Kombinationsfeldes des gleichen Datensatzes abhängen. Aber es gibt eine Lösung – wenn auch nicht in Form eines Kombinationsfeldes. Wir zeigen die zur Auswahl stehenden Daten einfach per Kontextmenü an! Wie dies gelingt, zeigt der vorliegende Beitrag.

Problem: Abhängige Kombinationsfelder

Früher oder später stößt jeder Access-Entwickler auf das Problem, dass er abhängige Daten mit zwei Kombinationsfeldern darstellen soll – und zwar in der Endlos- oder Datenblattansicht eines Formulars.

Die Verwendung zweier abhängiger Kombinationsfelder in der Formularansicht ist kein Problem und wird vielfach genutzt. Dabei geht es darum, in einem ersten Kombinationsfeld einen Wert auszuwählen (beispielsweise eine Automarke) und in einem zweiten Kombinationsfeld, dem abhängigen Kombinationsfeld, nur noch diejenigen Einträge anzuzeigen, die zu dem im ersten Kombinationsfeld ausgewählten Eintrag passen (also etwa ein Fahrzeugmodell). Dazu wird nach dem Auswählen des Datensatzes im ersten Kombinationsfeld die Datensatzquelle im zweiten Kombinationsfeld so gefiltert, dass dieses nur noch die relevanten Einträge liefert.

In Endlos- oder Datenblattansichten taucht jedoch das Problem auf, dass die meisten Eigenschaften von Steuerelementen jeweils für alle angezeigten Datensätze gleich sind – und dazu gehört auch die Datensatzherkunft von Kombinationsfeldern. Welche Probleme das mit sich bringt, schauen wir uns gleich kurz an. Hier benötigen wir eine Alternative zur Auswahl der Daten für das abhängige Tabellenfeld.

Beispieltabellen

Zunächst schauen wir uns die Beispieltabellen an. Dazu greifen wir das bereits erwähnte Beispiel der Fahrzeuge auf (Tabellen siehe Bild 1). Die Fahrzeuge werden in der Tabelle tblFahrzeuge gespeichert. Zu jedem Fahrzeug können Sie einen Hersteller auswählen sowie ein Modell. Für beide haben wir entsprechende Lookup-Tabellen erstellt (tblHersteller und tblModell). Allerdings gibt es natürlich nicht jedes Modell bei jedem Hersteller. Deshalb fügen wir der Tabelle tblModelle noch ein Nachschlagefeld hinzu, welches die Auswahl des Herstellers ermöglicht, zu dem das Modell gehört.

Tabellen mit abhängigen Datensätzen

Bild 1: Tabellen mit abhängigen Datensätzen

In der Tabelle tblFahrzeuge kann man nun natürlich dennoch Kombinationen aus Hersteller und Modell auswählen, die gar nicht in der Tabelle tblModelle vorgesehen sind.

Abbildung in der Formularansicht

In der Formularansicht eines Formulars sieht das standardmäßig nicht anders aus. Hier wird das Kombinationsfeld zur Auswahl der Modelle nicht nach dem zuvor ausgewählten Hersteller gefiltert (s. Bild 2).

Auch das Kombinationsfeld zeigt ungefiltert alle Datensätze an.

Bild 2: Auch das Kombinationsfeld zeigt ungefiltert alle Datensätze an.

In dieser Ansicht lässt sich aber leicht Abhilfe schaffen. Dazu müssen wir lediglich die Datensatzherkunft des abhängigen Kombinationsfeldes anpassen.

Dies erledigen wir in einer einfachen Version an zwei Stellen – nämlich beim Anzeigen eines jeden Datenatzes sowie nach der Auswahl eines Eintrags des Kombinationsfeldes cboHerstellerID. Die durch diese beiden Ereignisse ausgelösten Prozeduren rufen jeweils eine weitere Prozedur namens cboModelleAktualisieren auf.

Diese prüft, ob das Steuerelement cboHersteller überhaupt einen Wert enthält. Falls ja, wird die Datensatzherkunft des zweiten Kombinationsfeldes cboModelle so eingeschränkt, dass es nur solche Einträge enthält, die zum entsprechenden Hersteller gehören. Anderenfalls soll das Kombinationsfeld cboModelle einfach alle Einträge anzeigen (s. Listing 1).

Private Sub cboHerstellerID_AfterUpdate()
     Call cboModelleAktualisieren
End Sub
Private Sub Form_Current()
     Call cboModelleAktualisieren
End Sub
Private Sub cboModelleAktualisieren()
     If Not IsNull(Me.cboHerstellerID) Then
         Me!cboModellID.RowSource = "SELECT * FROM tblModelle WHERE HerstellerID = " _
             & Nz(Me!cboHerstellerID)
     Else
         Me!cboModellID.RowSource = "SELECT * FROM tblModelle"
     End If
End Sub

Listing 1: Prozeduren zum Aktualisieren abhängiger Kombinationsfelder

Dies funktioniert auch wie gewünscht, wie Bild 3 zeigt.

Anzeige abhängiger Datensätze in Kombinationsfeldern

Bild 3: Anzeige abhängiger Datensätze in Kombinationsfeldern

Abhängige Kombinationsfelder im Datenblatt oder in der Endlosansicht

Nun schauen wir uns an, was nicht wie gewünscht funktioniert. Dabei geht es um die gleiche Konstellation, allerdings mit einer anderen Darstellung – nämlich der in Listenform.

Wir betrachten zuerst die Datenblattansicht, weil wir diese ganz schnell als Alternative zur aktuellen Formularansicht aufrufen können. Das Ergebnis gleich nach dem Anzeigen dieses Formulars in der Datenblattansicht sieht wie in Bild 4 aus. Merkwürdigerweise erscheint nur noch beim ersten Datensatz das zuvor festgelegte Modell. Was ist hier schiefgelaufen? Wurden die Daten gelöscht? Ein Blick in die zugrunde liegende Tabelle zeigt, dass dies nicht der Fall ist. (Übrigens lohnt sich ein Blick in die Tabellen immer, wenn scheinbar Daten aus Kombinationsfeldern verschwunden sind – meist sind Probleme mit der Datensatzherkunft schuld daran!)

Anzeige abhängiger Datensätze in der Datenblattansicht

Bild 4: Anzeige abhängiger Datensätze in der Datenblattansicht

In der Tat liegt das Problem darin, dass beim Anzeigen die Ereignisprozedur Form_Current ausgelöst wurde, die dann die Prozedur cboModelleAktualisieren aufgerufen hat. Diese sorgt dann dafür, dass die Datensatzherkunft des Kombinationsfeldes cboModelle mit dem folgenden Ausdruck gefüllt wird:

SELECT * FROM tblModelle ­WHERE HerstellerID = 1

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]