m:n-Beziehung mit Drag and Drop per ListView

Wir haben uns bereits in einigen Beiträgen angesehen, wie man die Daten einer m:n-Beziehung mit zwei nebeneinander liegenden Listenfeldern verwalten kann. Das Hinzufügen oder Entfernen erfolgte dabei per Doppelklick auf den jeweiligen Eintrag oder über entsprechende Schaltflächen. Im Gegensatz zu Listenfeldern können wir im ListView-Steuerelement jedoch auch Drag and Drop einsetzen. Wie das grundlegend funktioniert, haben wir uns bereits im hinteren Teil des Beitrags „ListView-Steuerelement mit VBA programmieren“ (www.access-im-unternehmen.de/1573) angesehen. Im vorliegenden Beitrag schauen wir uns an, wie wir die Daten aus zwei ListView-Steuerelementen per Drag and Drop hin- und herschieben können.

Datenmodell des Beispiels

Als Beispiel wollen wir einen Verteiler für Newsletter verwenden. Wir benötigen also eine Tabelle mit den Empfängern des Newsletters, eine Tabelle für die einzelnen Newsletter und eine weitere, um die Empfänger den verschiedenen Newslettern zuordnen zu können.

Die erste Tabelle namens tblEmpfaenger enthält die Felder EmpfaengerID, Empfaenger und EMail (siehe Bild 1). Hier speichern wir die Empfänger für die Newsletter.

Die Tabelle tblEmpfaenger

Bild 1: Die Tabelle tblEmpfaenger

Die Newsletter wiederum speichern wir in der Tabelle tblNewsletter, die wir in Bild 2 sehen. Hier haben wir nur die wichtigsten Felder eingefügt, man könnte noch weitere Felder wie Versanddatum et cetera hinzufügen, wenn man die Anwendung in der Praxis nutzen möchte.

Die Tabelle tblNewsletter

Bild 2: Die Tabelle tblNewsletter

Zusätzlich zu den dazu notwendigen Tabellen tblNewsletter und tblEmpfaenger brauchen wir eine Tabelle zum Verknüpfen der Datensätze der beiden Tabellen namens tblVerteiler über eine m:n-Beziehung. Diese enthält neben dem Primärschlüsselfeld VerteilerID zwei weitere Felder, über die wir die Datensätze der Tabellen tblEmpfaenger und tblNewsletter miteinander verknüpfen. Dies realisieren wir über die beiden Felder EmpfaengerID und NewsletterID. In diesem Fall wollen wir keine Nachschlagefelder einrichten, da wir diese im zu erstellenden Formular nicht benötigen.

Damit jeder Empfänger nur einmal jedem Newsletter zugewiesen werden kann, haben wir außerdem einen eindeutigen Schlüssel über die beiden Felder EmpfaengerID und NewsletterID hinzugefügt (siehe Bild 3).

Die m:n-Verknüpfungstabelle tblVerteiler

Bild 3: Die m:n-Verknüpfungstabelle tblVerteiler

Stattdessen legen wir die Beziehungen direkt im Beziehungen-Fenster von Access an. Hier ziehen wir alle drei Tabellen der Anwendung hinein und verknüpfen diese wie in Bild 4. Für beide Beziehungen definieren wir referenzielle Integrität mit Löschweitergabe. Damit erreichen wir, dass beim Löschen eines Empfängers oder eines Newsletters auch die damit verknüpften Einträge der Tabelle tblVerteiler gelöscht werden.

Beziehungen zum Herstellen der m:n-Beziehung

Bild 4: Beziehungen zum Herstellen der m:n-Beziehung

Formular zum Zuordnen von Empfängern zu den Newslettern

Das Formular soll in zwei ListView-Steuerelementen die Empfänger und die Nicht-Empfänger der Newsletter anzeigen. Als Datensatzquelle des Formulars dient die Tabelle tblNewsletter. Das Formular zeigt beide Felder der Tabelle untereinander im Detailbereich an (siehe Bild 5).

Hinzufügen der Felder der Tabelle tblNewsletter

Bild 5: Hinzufügen der Felder der Tabelle tblNewsletter

Außerdem fügen wir zwei ListView-Steuerelemente namens lvwEmpfaenger und lvwKeinEmpfaenger hinzu.

Dazu betätigen wir den Befehl Formularentwurf|Steuerelemente|ActiveX-Steuerelemente. Dies öffnet den Dialog ActiveX-Steuerelemente einfügen, wo wie den Eintrag Microsoft ListView Control finden (siehe Bild 6).

Auswählen des ListView-Steuerelements

Bild 6: Auswählen des ListView-Steuerelements

Die beiden ListView-Steuerelemente fügen wir unterhalb der bereits vorhandenen Steuerelemente ein und passen ihre Bezeichnungen an (siehe Bild 7).

Hinzufügen der ListView-Steuerelemente

Bild 7: Hinzufügen der ListView-Steuerelemente

Einstellungen für die ListView-Steuerelemente

In der Ereignisprozedur, die durch das Ereignis Beim Laden ausgelöst wird, wollen wir die Einstellungen für die beiden ListView-Steuerelemente vornehmen.

Den Großteil der Arbeit wollen wir jedoch in eine weitere Prozedur auslagern, weil die Befehle für beide ListView-Steuerelemente fast identisch sind. Zunächst jedoch deklarieren wir Objektvariablen für die beiden ListView-Steuerelemente im Kopf des Klassenmoduls des Formulars:

Dim objEmpfaenger As MSComctlLib.ListView
Dim objKeinEmpfaenger As MSComctlLib.ListView

Die Form_Load-Ereignisprozedur füllt diese mit Verweisen auf die Object-Eigenschaften der entsprechenden Steuerelemente und ruft für jedes die Prozedur ListViewEinstellen auf.

Dabei übergibt sie den Verweis auf das jeweilige ListView-Steuerelement und den Text, der im Spaltenkopf erscheinen soll:

Private Sub Form_Load()
     Set objKeinEmpfaenger = Me.lvwKeinEmpfaenger.Object
     Set objEmpfaenger = Me.lvwEmpfaenger.Object
     Call ListViewEinstellen(objKeinEmpfaenger, _
         "Nicht in Empfängerliste")
     Call ListViewEinstellen(objEmpfaenger, _
         "In Empfängerliste")
End Sub

Die Prozedur ListViewEinstellen nimmt diese Parameter entgegen und stellt einige Eigenschaften ein (siehe Listing 1).

Private Sub ListViewEinstellen(objListView As _
         MSComctlLib.ListView, strHeader As String)
     With objListView
         .View = lvwReport
         .BorderStyle = ccNone
         .Appearance = ccFlat
         .FullRowSelect = True
         .HideSelection = False
         .MultiSelect = True
         .Font.Name = "Calibri"
         .Font.Size = 11
         .OLEDragMode = ccOLEDragAutomatic
         .OLEDropMode = ccOLEDropManual
         .ColumnHeaders.Clear
         .ColumnHeaders.Add , "c1", strHeader
         .ColumnHeaders(1).Width = Me.lvwEmpfaenger.Width
     End With
End Sub

Listing 1: Einstellen der Eigenschaften für die ListView-Steuerelemente

Dazu gehören die Ansicht als lvwReport, das Ausblenden des Randes, das Umstellen von 3-D zum flachen Erscheinungsbild, das vollständige Markieren der markierten Zeile, das Sichtbarmachen der Markierung, auch wenn das ListView-Steuerelement nicht den Fokus hat, Einstellungen für die Schriftart und den Drag and Drop-Modus sowie das Einfügen einer Spaltenüberschrift.

Füllen der ListView-Steuerelemente beim Anzeigen

Die beiden ListView-Steuerelemente sollen im Ereignis Beim Anzeigen gefüllt werden. Zuvor legen wir jedoch noch zwei Abfragen an, die wir als Basis für das Füllen der ListView-Steuerelemente nutzen.

Abfrage für die Empfänger

Die erste Abfrage heißt qryEmpfaenger und enthält die beiden Tabellen tblEmpfaenger und tblVerteiler. Aus der Tabelle tblEmpfaenger fügen wir die beiden Felder EmpfaengerID und Empfaenger hinzu, aus der Tabelle tblNewsletter das Feld NewsletterID. Das Feld NewsletterID dient lediglich als Kriteriumsfeld. Hier legen wir als Vergleichswert einen Parameter namens prmNewsletterID fest (siehe Bild 8). Auf diese Weise liefert die Abfrage alle Empfänger, die dem mit dem Parameter prmNewsletterID zugewiesenen Newsletter zugeordnet sind.

Datenherkunft für das ListView-Steuerelement lvwEmpfaenger

Bild 8: Datenherkunft für das ListView-Steuerelement lvwEmpfaenger

Abfrage für die noch nicht zugeordneten Empfänger

Die zweite Abfrage ist etwas aufwendiger (siehe Bild 9). Sie enthält nur die Tabelle tblEmpfaenger und liefert die Werte der Felder EmpfaengerID und Empfaenger der Tabelle. Sie filtert die Empfänger, indem sie alle in einer Unterabfrage enthaltenen Empfänger ausschließt. Das Kriterium mit der Unterabfrage lautet:

Datenherkunft für das ListView-Steuerelement lvwKeinEmpfaenger

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