m:n-Beziehung per Listenfeld managen, Teil 1Es gibt eine Menge Möglichkeiten zur Verwaltung der Daten von m:n-Beziehungen. In dieser Beitragsreihe lernen Sie einige davon kennen. Den Start macht die Verwendung von Listenfeldern. Damit lassen sich die Einträge der n-Seite einer Beziehung des aktuell im Formular angezeigten Datensatzes der m-Seite hinzufügen und wieder davon entfernen, indem man die Einträge einfach zwischen zwei Listenfeldern hin- und herschiebt.

Teil 1: Anzeige der verknüpften Daten per Listenfeld
Teil 2: Hin- und Herschieben der Einträge der Listenfelder BeispieldatenbankDas nachfolgend beschriebene Beispielformular finden Sie in der Beispieldatenbank AccessSQLDotNet.mdb unter dem Formularnamen frmMZuNPerListenfeld.

Aufbau der BeziehungDas nachfolgende Beispiel basiert auf einer m:n-Beziehung zwischen Kontakten und Publikationen - der klassische "Verteiler"-Fall. Das Datenmodell sieht wie in Abbildung 1 aus. Die beiden Tabellen tblKontakte und tblPublikationen sind über die Tabelle tblVerteiler miteinander verknüpft. Damit jeder Kontakt jede Publikation nur einmal erhält, sind die beiden Felder der Tabelle tblVerteiler mit einem zusammengesetzten Primärschlüssel versehen.

Abbildung 1: Aufbau der m:n-Beziehung Datenverwaltung per ListenfeldDas zu erstellende Formular soll Publikationen anzeigen. Die Detailinformationen dazu bestehen lediglich aus dem Namen der Publikation, weitere Informationen lassen sich aber leicht hinzufügen. Stellen Sie dazu einfach die Datenherkunft des Formulars auf die entsprechende Tabelle ein und ziehen Sie die beiden Felder der Tabelle in den Formularentwurf. Viel wichtiger ist aber die Anzeige der mit der Publikation verknüpften Kontakte. Diese soll über zwei Listenfelder erfolgen, von denen eines die verknüpften und eines die übrigen Kontakte anzeigt.
Die beiden Listenfelder heißen lstImVerteiler und lstNichtImVerteiler. Das erste Listenfeld erhält folgenden Ausdruck als Datensatzherkunft:
SELECT tblKontakte.KontaktID, tblKontakte.Vorname, tblKontakte.Nachname, FROM tblKontakte INNER JOIN tblVerteiler ON tblKontakte.KontaktID=tblVerteiler.KontaktID WHERE tblVerteiler.PublikationID=Forms!frmVerteiler!PublikationID;
Wenn Sie der Tabelle tblVerteiler vorher manuell einen oder mehrere Einträge hinzugefügt haben, zeigt das Listenfeld diese bereits an - natürlich nur, wenn Sie die Eigenschaften Spaltenanzahl und Spaltenbreite auf entsprechende Werte eingestellt haben - etwa 3 und 0;2cm;2cm.
Das zweite Listenfeld soll alle Kontakte anzeigen, die nicht für die m:n-Beziehung ausgewählt sind. Die entsprechende Datensatzherkunft lässt sich ganz einfach herleiten: Sie enthält alle Einträge der Tabelle tblKontakte, die nicht im ersten Listenfeld angezeigt werden. Diese Einträge schließen Sie einfach durch eine entsprechende NOT IN-Klausel aus:
SELECT tblKontakte.KontaktID, tblKontakte.Vorname, tblKontakte.Nachname FROM tblKontakte WHERE tblKontakte.KontaktID Not In (SELECT tblKontakte.KontaktID FROM tblKontakte INNER JOIN tblVerteiler ON tblKontakte.KontaktID=tblVerteiler.KontaktID WHERE tblVerteiler.PublikationID=Forms!frmVerteiler!PublikationID);
Wenn Sie auch hier die Eigenschaften Spaltenanzahl und Spaltenbreiten entsprechend einstellen, sieht das Ergebnis wie in Abbildung 2 aus:
Abbildung 2: Die Listenfelder zeigen die mit der aktuellen Publikation verknüpften Datensätze an. |