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.
Bild 1: Tabellen mit abhängigen DatensätzenIn 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).
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.
Bild 3: Anzeige abhängiger Datensätze in KombinationsfeldernAbhä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!)
Bild 4: Anzeige abhängiger Datensätze in der DatenblattansichtIn 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.