ListView aus Tabellen oder Abfragen füllen, Teil 1

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

In den Beiträgen „Listen anzeigen mit dem ListView“-Steuerelement (www.access-im-unternehmen.de/1572) und „Listen anzeigen mit dem ListView-Steuerelement“ (www.access-im-unternehmen.de/1572) haben wir die Grundlagen zum ListView-Steuerelement und die Programmierung per VBA erläutert. Dort haben wir das ListView-Steuerelement erst einmal nur mit einfachen Beispieldaten gefüllt. Im vorliegenden Artikel gehen wir einen Schritt weiter und ziehen als Datenquelle echte Daten aus Tabellen oder Abfragen heran. Die Besonderheit des ListView-Steuerelements gegenüber dem herkömmlichen Listenfeld ist dabei, dass dieses nicht einfach an eine Datenquelle gebunden werden kann. Stattdessen müssen wir jeden einzelnen Eintrag per VBA-Code einfügen. Wie das gelingt, zeigen wir auf den folgenden Seiten.

Datenquellen für das ListView-Steuerelement

Grundsätzlich bieten sich alle Tabellen oder Abfragen als Datenquellen für die Einträge von ListView-Steuerelementen an.

Während wir in der Datenblattansicht von Formularen aber sogar den Inhalt von Nachschlagefeldern wie Anrede, Kategorien et cetera einfach aus der Tabelle übernehmen können, müssen wir beim ListView-Steuerelement genau wie beim Listenfeld hier auf eine Abfrage zurückgreifen, welche nicht nur die Werte der jeweiligen Tabelle (wie zum Beispiel tblMitarbeiter) berücksichtigt, sondern wir müssen auch noch die Lookup-Tabellen mit weiteren anzuzeigenden Feldern zur Abfrage hinzufügen.

Sprich: Wir können nicht einfach den Inhalt eines Fremdschlüsselfeldes wie AnredeID im ListView-Steuerelement abbilden, da diese nur den enthaltenen Wert anzeigen würde, der den entsprechenden Datensatz in der Lookup-Tabelle referenziert.

Auch eventuelle Format-Einstellungen, die wir in der zugrunde liegenden Tabelle oder Abfrage vorgenommen haben, um beispielsweise Inhalte von Datum/Uhrzeit-Feldern darzustellen, müssen wir manuell nachbilden, da sonst nur die ursprünglichen Daten im ListView-Steuerelement erscheinen würden.

Mit diesen Informationen im Hinterkopf können wir gleich in das Füllen eines ListView-Steuerelements aus einer Tabelle oder Abfrage starten.

Icons je nach Datensatz

Ein feiner Vorteil des ListView-Steuerelements ist, dass wir die einzelnen Einträge mit Icons versehen können. Und dabei lassen sich sogar individuelle Icons je Datensatz realisieren. Nun stellt sich die Frage: Wenn wir beispielsweise Mitarbeiter in einem ListView-Steuerelement anzeigen, wozu benötigen wir dann Icons? Wir können damit beispielsweise verschiedene Status markieren. So ließen sich etwa Mitarbeiter, die zum aktuellen Zeitpunkt verfügbar sind, mit einem bestimmten Icon markieren.

Beispiel: Mitarbeitertabelle

In diesem Beitrag wollen wir die Daten einer Tabelle namens tblMitarbeiter samt Anreden aus der Tabelle tblAnreden, Abteilungen aus der Tabelle tblAbteilungen und Status aus der Tabelle tblStatus im ListView-Steuerelement anzeigen. Das Datenmodell der Anwendung sieht wie in Bild 1 aus.

Datenmodell der Beispieldatenbank

Bild 1: Datenmodell der Beispieldatenbank

Der Tabelle tblStatus haben wir gleich noch ein Feld namens Icon hinzugefügt, damit wir für die verschiedenen Status ein entsprechendes Icon im ListView-Steuerelement hinterlegen können (siehe Bild 2).

Daten der Tabelle tblMitarbeiter

Bild 2: Daten der Tabelle tblMitarbeiter

Abfrage zum Zusammenstellen der Daten für das ListView-Steuerelement

Wie eingangs erwähnt, können wir die Informationen wie die Anrede, den Status oder die Abteilung nicht im ListView-Steuerelement anzeigen, wenn wir nur die Felder der Tabelle tblMitarbeiter verwenden. Also erstellen wir eine Abfrage, die auch alle Lookup-Tabellen enthält und die wie in Bild 3 aussieht.

Entwurf der Abfrage mit allen Daten zu den Mitarbeitern

Bild 3: Entwurf der Abfrage mit allen Daten zu den Mitarbeitern

ListView-Steuerelement einrichten

Nun stellen wir die Eigenschaften des ListView-Steuerelements ein und legen die Spaltenüberschriften an. Das erledigen wir gleich beim Öffnen des Formulars im Ereignis Beim Laden. Dafür hinterlegen wir die Ereignisprozedur aus Listing 1. Die Prozedur deklariert eine Variable für das ListView-Objekt und füllt es anschließend. Dann stellt es verschiedene Eigenschaften für das ListView-Steuerelement ein – Ansicht, Rahmenart, Schriftart, ganze Zeile markieren und so weiter.

Private Sub Form_Load()
     Dim objListView As MSComctlLib.ListView
     
     Set objListView = Me.ctlListView.Object
     
     With objListView
         .Appearance = ccFlat
         .BorderStyle = ccNone
         .Font.Name = "Calibri"
         .Font.Size = 11
         .View = lvwReport
         .FullRowSelect = True
         .ColumnHeaders.Clear
         .ColumnHeaders.Add , "c1", "ID"
         .ColumnHeaders.Add , "c2", "Anrede"
         .ColumnHeaders.Add , "c3", "Vorname"
         .ColumnHeaders.Add , "c4", "Nachname"
         .ColumnHeaders.Add , "c5", "Telefon"
         .ColumnHeaders.Add , "c6", "E-Mail"
         .ColumnHeaders.Add , "c7", "Geburtstag"
         .ColumnHeaders.Add , "c8", "Abteilung"
         .ColumnHeaders.Add , "c9", "Status"
     End With
     
     Call ListViewFuellen
End Sub

Listing 1: Einrichten des ListView-Steuerelements

Anschließend leert es die Auflistung der Spaltenüberschriften, um eventuell bereits vorhandene Elemente zu löschen, und legt diese neu an. Dabei orientieren wir uns an den Bezeichnungen der Felder der zu verwendenden Abfrage qryMitarbeiter. Anschließend ruft sie die Prozedur ListViewFuellen auf, um die Daten aus der Tabelle einzufügen. Das erledigen wir in einer eigenen Prozedur, damit wir die Elemente auch nach dem Hinzufügen oder Löschen von Elementen aktualisieren können.

ListView-Steuerelement mit Mitarbeiterdaten füllen

Die Prozedur ListViewFuellen finden wir in Listing 2. Sie öffnet ein Recordset auf Basis der Abfrage qryMitarbeiter im Modus dbOpenSnapshot, weil wir nur lesenden Zugriff benötigen und dies performanter als dbOpenDynaset ist.

Private Sub ListViewFuellen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim objListView As MSComctlLib.ListView
     Dim objListItem As MSComctlLib.ListItem
     
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM qryMitarbeiter", dbOpenSnapshot)
     
     Set objListView = Me.ctlListView.Object
     objListView.ListItems.Clear
     
     Do While Not rst.EOF
         Set objListItem = objListView.ListItems.Add(, "a" & rst!MItarbeiterID, rst!MItarbeiterID)
         With objListItem.ListSubItems
             .Add , "b" & rst!MitarbeiterID, rst!Anrede
             .Add , "c" & rst!MitarbeiterID, rst!Vorname
             .Add , "d" & rst!MitarbeiterID, rst!Nachname
             .Add , "e" & rst!MitarbeiterID, rst!Telefon
             .Add , "f" & rst!MitarbeiterID, rst!EMail
             .Add , "g" & rst!MitarbeiterID, rst!Geburtsdatum
             .Add , "h" & rst!MitarbeiterID, rst!Abteilung
             .Add , "i" & rst!MitarbeiterID, rst!Status
         End With
         rst.MoveNext
     Loop
     rst.Close
     Set rst = Nothing
     Set db = Nothing
End Sub

Listing 2: Füllen des ListView-Steuerelements

Dann referenziert sie das ListView-Steuerelement und löscht eventuell vorhandene Einträge mit der Clear-Methode der ListItems-Auflistung.

Dann durchläuft sie die Datensätze des Recordsets in einer Do While-Schleife und legt zuerst das Hauptelement in der ersten Spalte an, hier gefüllt mit dem Feld MitarbeiterID. Dieses ListItem-Element referenzieren wir mit der Variablen objListItem, damit wir für dieses weitere Unterelemente für die weiteren Spalten hinzufügen können.

Diese fügen wir mit der Add-Methode der ListSubItems-Auflistung hinzu. Dabei vergeben wir für jede Spalte einen Key, der aus einem Buchstaben und dem Primärschlüsselwert besteht.

Wenn wir das Formular nun öffnen, finden wir die Ansicht aus Bild 4 vor. Für einen ersten Schuss nicht schlecht, aber das Erste, was uns nicht gefällt, sind die gleich breiten Spalten, die keine Rücksicht auf den Inhalt nehmen. Dem können wir jedoch Abhilfe schaffen. Dazu fügen wir einem neuen Modul namens mdlAPI den Code aus Listing 3 hinzu.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar