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

Und wenn dieser Wert für die Eigenschaft RowSource (Datensatzherkunft) wie oben beschrieben für alle Datensätze übernommen wird, entsteht das vorliegende Problem. Für den zweiten Datensatz der Abbildung, der im Feld HerstellerID den Wert 2 (BMW) verwendet, steht der Eintrag, den er im Kombinationsfeld cboModellID anzeigen möchte, einfach nicht zur Verfügung. Für den Einsteiger noch schwerer zu identifizieren wird dieses Verhalten, wenn das Kombinationsfeld für einige Datensätze gefüllt ist, für andere wiederum nicht. Auf den Zusammenhang muss man erstmal kommen.

Endlosansicht

Nur zum Nachweis, dass es auch in der Endlosansicht nicht anders ist, reichen wir noch das Formular frmFahrzeuge_Endlosansicht nach. Dort ist zu beobachten, dass beim öffnen logischerweise nur der erste Eintrag das passende Modell im Kombinationsfeld anzeigt. Interessant ist hier, dass dieser Wert bei der Auswahl etwa des Modells für den dritten Datensatz stehen bleibt (s. Bild 5). Dies ist aber wohl eher auf eine gewisse Trägheit von Access zurückzuführen.

Anzeige abhängiger Datensätze in der Endlosansicht

Bild 5: Anzeige abhängiger Datensätze in der Endlosansicht

Lösungsansatz

Es gibt verschiedene Ansätze, dieses Problem zu beheben. Richtig zufriedenstellend sind diese alle nicht. Wir stellen eine neue Variante vor: Dabei soll das Kombinationsfeld durch ein herkömmliches Textfeld ersetzt werden. Wenn der Benutzer auf das Feld klickt, soll ein Kontextmenü erscheinen, welches die zur Verfügung stehenden Werte anbietet. Nach der Auswahl eines der Einträge soll der Wert eingetragen werden.

Menüs programmieren

Um Menüs zu programmieren, was ab Access 2007 ja nur noch für Kontextmenüs unterstützt wird, benötigen Sie einen Verweis auf die Bibliothek Microsoft Office x.0 Library. Diesen fügen Sie über den Verweise-Dialog (VBA-Editor, Menüeintrag Extras|Verweise) wie in Bild 6 hinzu.

Hinzufügen eines Verweises auf die Office-Bibliothek

Bild 6: Hinzufügen eines Verweises auf die Office-Bibliothek

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