Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

m:n-Beziehung per Listenfeld managen, Teil 2

Im zweiten Teil dieser Beitragsreihe füllen Sie das Formular zur Anzeige von m:n-Beziehungen per Listenfeld mit Leben. Dazu fügen Sie einige Schaltflächen hinzu, die zum Hin- und Herschieben der vorhandenen Einträge dienen und belegen auch die Doppelklick-Ereigniseigenschaft der Listenfelder mit entsprechenden Eigenschaften.

Teil 1: Anzeige der verknüpften Daten per Listenfeld

Teil 2: Hin- und Herschieben der Einträge der Listenfelder

Beispieldatenbank

Das nachfolgend beschriebene Beispielformular finden Sie in der Beispieldatenbank AccessSQLDotNet.mdb unter dem Formularnamen frmMZuNPerListenfeld.

Einträge per Doppelklick bewegen

Nachdem Sie im ersten Teil erfahren haben, wie Sie die beiden Listenfelder zum Anzeigen der gewünschten Daten bewegen, kümmern wir uns nun um das Hin- und Herschieben der Daten zwischen den Listenfeldern.

Dazu fügen Sie der Ereigniseigenschaft Beim Doppelklicken entsprechende Prozeduren hinzu. Die Prozedur zum Hinzufügen eines Eintrags in die Liste mit den der Publikation zugeordneten Kontakten sieht folgendermaßen aus:

Private Sub lstNichtImVerteiler_DblClick(Cancel As Integer)

    On Error Resume Next

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "INSERT INTO tblVerteiler(KontaktID, PublikationID) " _

        & "VALUES(" & Me.lstNichtImVerteiler & "," _

        & Me!PublikationID & ")"

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Die On Error Resume Next-Anweisung sorgt dafür, dass beim Doppelklick in den leeren Bereich des Listenfeldes nicht zu einem Fehler führt. Mit der Execute-Methode führt die Prozedur eine SQL-Anweisung aus, die der Tabelle tblVerteiler einen Eintrag mit der ID der aktuellen Publikation sowie der ID des im Listenfeld angeklickten Kontakts hinzufügt. Anschließend aktualisiert die Prozedur die beiden Listenfelder.

Um einen Eintrag vom linken in das rechte Listenfeld zu verschieben, ihn also aus der Tabelle tblVerteiler zu entfernen, müssen Sie die folgende Prozedur für das Ereignis Beim Doppelklicken des linken Listenfeldes anlegen:

Private Sub lstImVerteiler_DblClick(Cancel As Integer)

    On Error Resume Next

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "DELETE FROM tblVerteiler WHERE " _

        & "KontaktID = " & Me!lstImVerteiler _

        & " AND PublikationID = " & Me!PublikationID

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Einträge per Schaltfläche bewegen

Die gleiche Vorgehensweise lässt sich auch durch entsprechende Schaltflächen abbilden. Legen Sie dazu zunächst zwei Schaltflächen mit den Namen cmdAusVerteilerEntfernen und cmdZuVerteilerHinzufügen an.

Die Schaltflächen sollen - sofern vorhanden - den aktuell markierten Eintrag von der einen Liste zu anderen bewegen. Die Ereignisprozeduren sind mit denen für die Doppelklick-Ereignisse der Listenfelder identisch; Sie können diese in der Beispieldatenbank einsehen.

Alle Einträge hinzufügen oder entfernen

Um das Formular zu vervollständigen, fügen Sie noch zwei Schaltflächen zum Hinzufügen und Entfernen aller Kontakte aus der Verteilerliste der aktuellen Publikation hinzu. Mit diesen beiden Schaltflächen sieht das Formular nun wie in Abbildung 1 aus.

Die beiden Schaltflächen heißen cmdAlleAusVerteilerEntfernen und cmdAlleZuVerteilerHinzufügen.

Abbildung 1: Das fertige Verteiler-Formular

Fügen Sie der Schaltfläche cmdAlleAusVerteilerEntfernen die folgende Prozedur für die Ereigniseigenschaft Beim Klicken hinzu:

Private Sub cmdAlleAusVerteilerEntfernen_Click()

    On Error Resume Next

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "DELETE FROM tblVerteiler " _

        & "WHERE PublikationID = " & Me!PublikationID

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Die SQL-Anweisung zum Hinzufügen aller Kontakte zu der Verteilerliste einer Publikation sieht etwas anders aus, wie folgender Quellcode zeigt:

Private Sub cmdAlleZuVerteilerHinzufuegen_Click()

    Dim db As DAO.Database

    Set db = CurrentDb

    db.Execute "INSERT INTO tblVerteiler(PublikationID, KontaktID) " _

        & "SELECT " & Me.PublikationID & " AS PublikationID, " _

        & "KontaktID FROM tblKontakte"

    Me!lstImVerteiler.Requery

    Me!lstNichtImVerteiler.Requery

    Set db = Nothing

End Sub

Refactoring

Die in den beiden Teilen dieser Beitragsreihe vorgestellten Quellcodes enthalten eine Menge gemeinsamer Zeilen. Im Beitrag Refactoring: Methode extrahieren erfahren Sie, was hier zu tun ist.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.