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

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2013.

Diesen Artikel jetzt als PDF plus Beispieldatenbank herunterladen?

Wenn Sie sich jetzt für den Newsletter anmelden, erhalten Sie in Kürze eine E-Mail mit dem Artikel im PDF-Format plus Beispieldatenbank.

Hier anmelden:1370291688

E-Mail:

Anrede:

Vorname:

Nachname:

Zusammenfassung

Erfahren Sie, wie Sie die Daten der n-Seite einer m:n-Beziehung wahlweise per VBA oder mit einer Abfrage in Listenform anzeigen.

Techniken

Abfragen, VBA, Kreuztabellenabfragen

Voraussetzungen

Access 2000

Beispieldateien

mnListe.mdb

Shortlink

www.access-im-unternehmen.de/884

m:n-Daten in einer Zeile anzeigen

André Minhorst, Duisburg

Für Daten mit einer m:n-Beziehung gibt es einige Beispiele: Fahrzeuge und ihre Ausstattungsmerkmale, Artikel und Kategorien, Mitarbeiter und Positionen et cetera. Üblicherweise stellt man diese mit mehreren Steuerelementen dar - etwa die Fahrzeuge im Hauptformular und die Ausstattung im Unterformular. Oder die Mitarbeiter landen im Hauptformular und zwei Listenfelder zeigen die zugeordneten und die nicht zugeordneten Abteilungen an. Was aber, wenn die Daten gar nicht bearbeitet, sondern nur angezeigt werden sollen - und dies möglichst noch in einer einzigen Zeile? Dann hilft die Lösung aus diesem Beitrag weiter.

Verknüpfte Daten nebeneinander

Ziel des Beitrags ist es, eine Darstellung wie in Abb. 1 zu erhalten. Die ersten paar Spalten sollen die herkömmlichen Felder der m-Tabelle der Verknüpfung liefern. Die folgenden Spalten sollen im Spaltenkopf den Inhalt und die Nummer anzeigen, also etwa Kategorie 1, Kategorie 2 et cetera. Darunter erscheinen schließlich die verknüpften Daten.

pic001.png

Abb. 1: Darstellung von per m:n-Beziehung verknüpften Daten in einer Zeile

Beispiel Artikel und Kategorien

Die beiden Tabellen tblArtikel und tblKategorien sind in der Südsturm-Beispieldatenbank eigentlich über das Fremdschlüsselfeld KategorieID der Tabelle tblArtikel verknüpft. Auf diese Weise lässt sich aber nur je eine Kategorie je Artikel festlegen. Was aber, wenn Sie die Kategorien etwas verfeinern möchten und ein Artikel mehreren Kategorien zugeteilt werden soll? In diesem Fall benötigen wir eine m:n-Verknüpfungstabelle, die alle denkbaren Kombinationen aus Artikeln und Kategorien speichern kann.

Im Beziehungen-Fenster sieht dies wie in Abb. 2 aus; dort können Sie auch erkennen, dass wir das Feld KategorieID aus der Tabelle tblArtikel entfernt haben.

pic002.png

Abb. 2: m:n-Beziehung zwischen Artikeln und Kategorien

Die Verknüpfungstabelle tblKategoriezuordnungen enthält drei Felder - das Primärschlüsselfeld sowie zwei Fremdschlüsselfelder, welche beliebige Kombinationen aus den Datensätzen der Tabellen tblArtikel und tblKategorien erlauben. Allerdings schränkt ein zusammengesetzter Index über diese beiden Felder die Werte dahingehend ein, dass jede Kombination aus Artikel und Kategorie nur einmal vorkommen darf.

Dazu legen Sie neben dem Primärindex einen weiteren Index an, der die betroffenen Felder enthält und dessen Eigenschaft Eindeutig auf Ja eingestellt wurde (s. Abb. 3).

pic003.png

Abb. 3: Jede Kombination aus Artikel und Kategorie ist nur einmal möglich.

Sie können nun wie in Abb. 4 einige Beispieldatensätze für die Zuordnung von Artikeln zu Kategorien hinzufügen.

pic004.png

Abb. 4: Beispieldatensätze für die m:n-Beziehung

Liste per VBA erzeugen

Nun könnten Sie jedem Artikel per VBA eine entsprechende Liste der Kategorien hinzufügen - diese müsste jedoch regelmäßig aktualisiert werden. Die Liste soll in der Tabelle tblArtikel in einem weiteren Feld namens Kategorien gespeichert werden. Die VBA-Prozedur zum Füllen dieses Feldes sieht wie in Listing 1 aus.

Listing 1: Zusammenstellen der Kategorienliste per VBA

Public Sub KategorielisteSchreiben()

    Dim db As DAO.Database

    Dim rstArtikel As DAO.Recordset

    Dim rstKategorien As DAO.Recordset

    Dim strKategorien As String

    Set db = CurrentDb

    Set rstArtikel = db.OpenRecordset("SELECT * FROM tblArtikel", dbOpenDynaset)

    Do While Not rstArtikel.EOF

        strKategorien = ""

        Set rstKategorien = db.OpenRecordset("SELECT t2.Kategoriename FROM" _

            & "tblKategoriezuordnungen AS t1 INNER JOIN tblKategorien AS t2 ON t1.KategorieID = " _

            & "t2.KategorieID WHERE t1.ArtikelID = " & rstArtikel!ArtikelID, dbOpenDynaset)

        Do While Not rstKategorien.EOF

            strKategorien = strKategorien & ";" & rstKategorien!Kategoriename

            rstKategorien.MoveNext

        Loop

        If Len(strKategorien) > 0 Then

            strKategorien = Mid(strKategorien, 2)

        End If

        With rstArtikel

            .Edit

            !Kategorien = strKategorien

            .Update

        End With

        rstArtikel.MoveNext

    Loop

    Set db = Nothing

End Sub

Die Prozedur legen Sie in einem beliebigen Standardmodul an und starten diese nach dem Platzieren der Einfügemarke innerhalb der Prozedur mit der Taste F5.

Wenn Sie die Prozedur beispielsweise immer dann verwenden wollen, bevor die Artikeldaten in einem Formular angezeigt werden, rufen Sie es in der Ereignisprozedur auf, die durch das Ereignis Beim Laden des Formulars ausgelöst wird.

Die Prozedur selbst ist die einfachste Variante, um zum gewünschten Ergebnis zu kommen. Allerdings birgt das Ergebnis auch den Nachteil redundanter Daten in sich. Sobald einer der Artikel einer weiteren Kategorie zugeordnet wird oder eine Zuordnung entfällt, stimmen die Daten im Feld Kategorien nicht mehr.

Die Prozedur erstellt zunächst ein Recordset auf Basis der Tabelle tblArtikel. Per Do While durchläuft die Prozedur alle Datensätze der Tabelle tblArtikel in einer äußeren Schleife.

Innerhalb dieser Schleife erzeugt die Prozedur eine weitere Datensatzgruppe, die diesmal alle Datensätze der verknüpften Tabellen tblKategoriezuordnungen und tblKategorien enthält, bei denen das Feld ArtikelID mit der ID des aktuell in der äußeren Schleife bearbeiteten Artikel-Datensatzes übereinstimmt. Auch die Datensätze dieses Recordsets werden innerhalb einer Do While-Schleife durchlaufen. Dabei stellt die Prozedur in der Stringvariablen strKategorien eine per Semikola getrennte Liste der Kategorienamen zusammen.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Diesen Artikel jetzt als PDF plus Beispieldatenbank herunterladen?

Wenn Sie sich jetzt für den Newsletter anmelden, erhalten Sie in Kürze eine E-Mail mit dem Artikel im PDF-Format plus Beispieldatenbank.

Hier anmelden:

E-Mail:

Anrede:

Vorname:

Nachname:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.