ListView-Steuerelemente unterstützen im Gegensatz zum Listenfeld sogar den Einsatz von Drag and Drop. Damit können Sie nicht nur Einträge von einem ListView-Steuerelement zum nächsten ziehen, sondern auch die Reihenfolge der Einträge eines ListView-Steuerelements einstellen. Im ersten Teil dieser Mini-Artikelreihe zeigen wir, wie Sie Datensätze zwischen zwei ListView-Steuerelementen hin- und herziehen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1212_ListView.mdb.
Von ListView zu ListView per Drag and Drop
Einträge von einem ListView-Steuerelement zum nächsten Ziehen und fort fallenlassen – und umgekehrt Wozu soll das gut sein Nun: Beispielsweise können Sie so die Zuordnung von Elementen in einer m:n-Beziehung verwalten. Das Hauptformular zeigt dann die Datensätze der einen Seite der Beziehung an, die beiden ListView-Steuerelemente die diesem Datensatz zugeordneten und die nicht zugeordneten Datensätze der anderen Seite der Beziehung.
Die bisher in den Beispielen zum ListView-Steuerelement verwendeten Tabellen der Südsturm-Beispieldatenbank enthalten leider nur eine einzige m:n-Beziehung (zwischen den Bestellungen und den Artikeln). Diese ist leider nicht für dieses Beispiel geeignet, da ja hier noch einige weitere Daten wie Menge, Einzelpreis et cetera verwaltet werden müssen.
Also fingieren wir einfach ein geeignetes Beispiel. Die Tabelle tblArtikel enthält bislang ein Fremdschlüsselfeld, mit dem der Lieferant des Artikels eingestellt werden kann. Der Nachteil dieser Verknüpfung ist, dass Sie für jeden Artikel nur einen einzigen Lieferanten bestimmen können. In der Praxis gibt es jedoch meist noch weitere Lieferanten, die herangezogen werden, wenn der erste Lieferant nicht liefern kann oder ein anderer Lieferant einen günstigeren Preis anbietet.
Wir benötigen also eine Tabelle, mit der Sie einem Artikel einen oder mehrere Lieferanten zuordnen können. Diese sieht wie in Bild 1 aus und enthält neben dem Primärschlüsselfeld noch zwei weitere Felder namens ArtikelID und LieferantID. Für diese beden Felder legen Sie außerdem einen zusammengesetzten Schlüssel fest, dessen Eigenschaft Eindeutig den Wert Ja erhält. Damit stellen Sie sicher, dass jeder Lieferant jedem Artikel nur einmal zugeordnet werden kann.
Bild 1: Tabelle zur Herstellung einer m:n-Beziehung
Nun müssen Sie noch festlegen, dass die beiden Felder nur die Primärschlüsselwerte der Tabellen tblArtikel und tblLieferanten annehmen können. Dazu öffnen Sie das Beziehungen-Fenster von Access und fügen die drei Tabellen tblArtikel, tblLieferanten und tblArtikelLieferanten hinzu. Ziehen Sie das Feld ArtikelID der Tabelle tblArtikel auf das gleichnamige Feld der Tabelle tblArtikelLieferanten. Erledigen Sie das Gleiche für das Feld LieferantID.
Anschließend legen Sie die Beziehungseigenschaften fest (siehe Bild 2). Aktivieren Sie die Optionen Mit Referentieller Integrität und Löschweitergabe an verwandte Datensätze. Damit stellen Sie erstens sicher, dass die Fremdschlüsselfelder ArtikelID und LieferantID nur Werte aufnehmen können, die im Primärschlüsselfeld der jeweils verknüpften Tabelle enthalten sind. Außerdem werden Datensätze in der Tabelle tblArtikelLieferanten automatisch gelöscht, wenn ein verknüpfter Datensatz der Tabellen tblArtikel oder tblLieferanten entfernt wird.
Bild 2: Festlegen der Beziehungen zwischen den Tabellen der m:n-Verknüpfung
Aber ist das überhaupt in Ordnung Was geschieht, wenn ich alle Datensätze der Tabelle tblLieferanten lösche, die einem Artikel zugeordnet sind – diese besitzt dann ja keinen Lieferanten mehr Kein Problem: Das Fremdschlüsselfeld LieferantID der Tabelle tblArtikel legt ja den standardmäßig zu verwendenden Lieferanten fest.
Die entsprechende Verknüpfung ist nicht mit Löschweitergabe ausgestattet. Der Versuch, einen Lieferanten zu löschen, der noch über das Fremdschlüsselfeld der Tabelle tblArtikel mit einem Artikel verknüpft ist, führt zu einem Fehler.
Erste Daten hinzufügen
Die Tabelle tblArtikelLieferanten soll alle möglichen Lieferanten eines Artikels anzeigen. In der Tabelle tblArtikel gibt es bereits ein Fremdschlüsselfeld LieferantID, welches den aktuellen Lieferanten festlegen. Natürlich soll dieser Lieferant auch in der Tabelle tblArtikelLieferanten auftauchen.
Wie erledigen wir diese Aufgabe Alle entsprechenden Kombinationen aus ArtikelID und LieferantID manuell in die Tabelle übertragen Natürlich nicht! Diese Aufgabe erledigen wir mit einem Einzeiler über den Direktbereich. Dieser sieht wie folgt aus:
CurrentDb.Execute "INSERT INTO tblArtikelLieferanten(ArtikelID, LieferantID) SELECT ArtikelID, LieferantID FROM tblArtikel", dbFailOnError
Sie lösen hiermit eine Aktionsabfrage aus, die für jeden Datensatz der Tabelle tblArtikel die Inhalte der Felder ArtikelID und LieferantID in die entsprechenden Felder der Tabelle tblArtikelLieferanten einträgt. Das Resultat sieht später wie in Bild 3 aus.
Bild 3: Die Tabelle tblArtikelLieferanten mit den Standardlieferanten eines jeden Artikels
Formular aufbauen
Das Formular soll zunächst jeweils einen Datensatz der Tabelle tblArtikel anzeigen. Dazu erstellen Sie ein neues Formular in der Entwurfsansicht und stellen die Eigenschaft Datenherkunft auf die Tabelle tblArtikel ein. Anschließend ziehen Sie die beiden Felder ArtikelID und Artikelname sowie LieferantID in den Detailbereich des Formulars und speichern es unter dem Namen frmArtikelLieferanten (siehe Bild 4).
Bild 4: Das Formular zeigt einige Daten der Tabelle tblArtikel an.
Danach legen Sie zwei ListView-Steuerelemente namens lvwLieferantenZugeordnet und lvwLieferantenNichtZugeordnet an (siehe Bild 5). Die Einstellung der Eigenschaften dieser beiden Steuerelemente nehmen wir wiederum per VBA beim Laden des Formulars vor.
Bild 5: Formular mit den beiden ListView-Steuerelementen
Die dazu notwendige Prozedur wird durch das Ereignis Beim Laden ausgelöst. Hinterlegen Sie für die entsprechende Eigenschaft den Wert [Ereignisprozedur] und klicken Sie auf die Schaltfläche mit den drei Punkten neben der Eigenschaft, um die Ereignisprozedur anzulegen. Ergänzen Sie diese im nun erscheinenden VBA-Editor wie in Listing 1.
Dim WithEvents objLvwLieferantenZugeordnet As MSComctlLib.ListView Dim WithEvents objLvwLieferantenNichtZugeordnet As MSComctlLib.ListView Private Sub Form_Load() Set objLvwLieferantenZugeordnet = Me!lvwLieferantenZugeordnet.Object Set objLvwLieferantenNichtZugeordnet = Me!lvwLieferantenNichtZugeordnet.Object With objLvwLieferantenZugeordnet .View = lvwReport .Appearance = ccFlat .BorderStyle = ccNone .FlatScrollBar = True .ColumnHeaders.Clear .ColumnHeaders.Add , , "Lieferant zugeordnet", Me!lvwLieferantenZugeordnet.Width End With With objLvwLieferantenNichtZugeordnet .View = lvwReport .Appearance = ccFlat .BorderStyle = ccNone .FlatScrollBar = True .ColumnHeaders.Clear .ColumnHeaders.Add , , "Lieferant nicht zugeordnet", Me!lvwLieferantenNichtZugeordnet.Width End With End Sub
Listing 1: Einrichten der beiden ListView-Steuerelemente
Im Kopf des Moduls Form_frmArtikelLieferanten deklarieren Sie zunächst zwei Objektvariablen für die beiden ListView-Steuerelemente mit dem Schlüsselwort WithEvents. Dies ist nötig, damit wir auf die Ereignisse dieser Nicht-Standard-Steuerelemente von Access zugreifen können.
Die folgende Prozedur weist diesen Variablen die entsprechenden Steuerelemente zu. Danach stellt sie einige Eigenschaften ein, die das Aussehen beeinflussen. Außerdem fügt sie jedem Steuerelement eine überschrift hinzu und stellt die Breite so ein, dass die einzige Spalte die komplette Breite des Steuerelements ausfüllt.
Datenherkunft für die ListView-Steuerelemente
Anschließend benötigen wir zwei Abfragen, welche die Daten für die beiden ListView-Steuerelemente liefern. Die Abfrage für das ListView-Steuerelement lvwLieferantenZugeordnet ist die einfachere der beiden Abfragen. Sie enthält die beiden Tabellen tblArtikelLieferanten und tblLieferanten. Die Tabelle tblLieferanten steuert das Feld Firma bei, die Tabelle tblArtikelLieferanten die beiden Felder LieferantID und ArtikelID. Das Feld LieferantID dient später zum Füllen der Key-Eigenschaft der ListView-Elemente, das Feld Firma liefert den in der einzigen Spalte anzuzeigenden Wert und das Feld ArtikelID hilft dabei, die zum aktuell im Formular angezeigten Artikel gehörenden Datensätze dieser Abfrage zu filtern (siehe Bild 6).
Bild 6: Datenherkunft für das erste ListView-Steuerelement zur Anzeige der zugeordneten Lieferanten
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: