{"id":55001575,"date":"2026-06-01T00:00:00","date_gmt":"2026-05-05T20:41:12","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1575"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/","title":{"rendered":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da\" width=\"1\" height=\"1\" alt=\"\"><b>Im ersten Teil dieser Beitragsreihe haben wir ein ListView-Steuerelement mit den Daten aus einer Mitarbeitertabelle gef&uuml;llt, Icons hinzugef&uuml;gt und eine Sortierfunktion implementiert. Im vorliegenden Beitrag bauen wir dieses Beispiel weiter aus: Wir zeigen, wie man dem ListView-Steuerelement neue Eintr&auml;ge hinzuf&uuml;gen und bestehende Eintr&auml;ge bearbeiten oder l&ouml;schen kann. Au&szlig;erdem erkl&auml;ren wir, wie man die Elemente auch nach numerischen Daten oder nach Datumsfeldern korrekt sortiert. Schlie&szlig;lich f&uuml;gen wir noch ein Kontextmen&uuml; hinzu, mit dem man den Status der Mitarbeiter anpassen kann.<\/b><\/p>\n<h2>R&uuml;ckblick auf Teil 1<\/h2>\n<p>Im ersten Teil dieser Beitragsreihe (www.access-im-unternehmen.de\/1574) haben wir zun&auml;chst eine Abfrage namens <b>qryMitarbeiter<\/b> erstellt, die alle ben&ouml;tigten Lookup-Tabellen &#8211; <b>tblAnreden<\/b>, <b>tblAbteilungen<\/b> und <b>tblStatus<\/b> &#8211; einbindet. Anschlie&szlig;end haben wir das <b>ListView<\/b>-Steuerelement in der Ereignisprozedur <b>Form_Load<\/b> eingerichtet und mit Spalten&uuml;berschriften versehen.<\/p>\n<p>Die Prozedur <b>ListViewFuellen<\/b> liest die Datens&auml;tze per Recordset aus und f&uuml;gt sie als <b>ListItem<\/b>&#8211; und <b>ListSubItem<\/b>-Objekte ein. Au&szlig;erdem haben wir per Windows-API-Aufruf die Spaltenbreiten automatisch an Inhalt und &Uuml;berschrift angepasst, f&uuml;r jeden Mitarbeiter ein statusabh&auml;ngiges Icon aus der Tabelle <b>MSysResources<\/b> eingeblendet und eine einfache Sortierfunktion per Klick auf den Spaltenkopf erg&auml;nzt. Bild 1 zeigt den Stand am Ende von Teil 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_03\/pic_1575_001.png\" alt=\"Aktueller Stand des ListView-Steuerelements\" width=\"700\" height=\"294,6992\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aktueller Stand des ListView-Steuerelements<\/span><\/b><\/p>\n<h2>Sortierung nach Zahlen- und Datumsfeldern<\/h2>\n<p>Im ersten Teil haben wir bereits eine Sortierfunktion eingebaut, die &uuml;ber einen Klick auf den jeweiligen Spaltenkopf ausgel&ouml;st wird. Dabei zeigte sich jedoch ein Problem: Zahlen und Datumsangaben werden lexikografisch sortiert, also wie Zeichenketten.<\/p>\n<p>Das f&uuml;hrt dazu, dass beispielsweise der Wert 10 vor dem Wert 2 erscheint und Datumsangaben nicht chronologisch, sondern nach ihrem Textwert geordnet werden.<\/p>\n<p>Um das zu beheben, ersetzen wir die eingebaute Sortierfunktion durch eigene Prozeduren, die Zahlen- und Datumswerte korrekt vergleichen.<\/p>\n<p>Als Basis dienen die API-Konstanten und die <b>SendMessage<\/b>-Deklaration aus Listing 1, die wir im allgemeinen Modul <b>mdlListViewTabellen2<\/b> ablegen.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Const LVM_FIRST<span style=\"color:blue;\"> As Long<\/span> = &H1000\r\n<span style=\"color:blue;\">Private <\/span>Const LVM_SORTITEMSEX<span style=\"color:blue;\"> As Long<\/span> = LVM_FIRST + 81\r\n#If VBA7 Then\r\n    <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function SendMessage Lib \"user32\" Alias \"SendMessageA\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>Ptr, _\r\n        ByVal wMsg<span style=\"color:blue;\"> As Long<\/span>, ByVal wParam<span style=\"color:blue;\"> As Long<\/span>Ptr, ByVal lParam<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n#Else\r\n    <span style=\"color:blue;\">Private <\/span>Declare Function SendMessage Lib \"user32\" Alias \"SendMessageA\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>, ByVal wMsg<span style=\"color:blue;\"> As Long<\/span>, _\r\n        ByVal wParam<span style=\"color:blue;\"> As Long<\/span>, ByVal lParam<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n#End If<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ben&ouml;tigte API-Deklarationen<\/span><\/b><\/p>\n<p>F&uuml;r die eigentliche Sortierung erweitern wir die Ereignisprozedur <b>ctlListView_ColumnClick<\/b> aus Teil 1.<\/p>\n<p>Nach dem Setzen von <b>SortKey<\/b> und <b>SortOrder<\/b> rufen wir eine eigene Prozedur <b>ListViewSortieren<\/b> auf, die den Vergleichstyp je Spalte festlegt (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_ColumnClick(ByVal ColumnHeader<span style=\"color:blue;\"> As Object<\/span>)\r\n    <span style=\"color:blue;\">Static <\/span>intAktuelleSortierspalte<span style=\"color:blue;\"> As Integer<\/span>\r\n    <span style=\"color:blue;\">Static <\/span>bolAufsteigend<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView\r\n    <span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object\r\n    objListView.SortKey = ColumnHeader.Index - 1\r\n    <span style=\"color:blue;\">If <\/span>intAktuelleSortierspalte = ColumnHeader.Index - 1<span style=\"color:blue;\"> Then<\/span>\r\n        bolAufsteigend = <span style=\"color:blue;\">Not<\/span> bolAufsteigend\r\n        objListView.SortOrder = Abs(bolAufsteigend)\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        objListView.SortOrder = lvwAscending\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    intAktuelleSortierspalte = ColumnHeader.Index - 1\r\n    <span style=\"color:blue;\">Call<\/span> ListViewSortieren(objListView, ColumnHeader.Index - 1, bolAufsteigend)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Angepasste ColumnClick-Prozedur<\/span><\/b><\/p>\n<p>Die Prozedur <b>ListViewSortieren<\/b> im Modul <b>mdlListViewTabellen2<\/b> verzweigt per <b>Select Case<\/b> je nach Spaltenindex in die passende Sortierprozedur: Index 1 (ID) landet in <b>ListViewSortNumerisch<\/b>, Index 7 (Geburtstag) in <b>ListViewSortDatum<\/b>, alle anderen Spalten nutzen weiterhin die eingebaute Textsortierung &uuml;ber <b>objLV.Sorted = True<\/b> (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ListViewSortieren(objLV<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView, intSpalte<span style=\"color:blue;\"> As Integer<\/span>, bolAufsteigend<span style=\"color:blue;\"> As Boolean<\/span>)\r\n    Select Case intSpalte\r\n        <span style=\"color:blue;\">Case <\/span>1 'ID: numerisch\r\n            <span style=\"color:blue;\">Call<\/span> ListViewSortNumerisch(objLV, intSpalte, bolAufsteigend)\r\n        <span style=\"color:blue;\">Case <\/span>7 'Geburtstag: Datum\r\n            <span style=\"color:blue;\">Call<\/span> ListViewSortDatum(objLV, intSpalte, bolAufsteigend)\r\n        <span style=\"color:blue;\">Case Else<\/span> 'alle anderen: Text\r\n            objLV.Sorted = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Verzweigung nach Spaltentyp<\/span><\/b><\/p>\n<p>Beide Sortierprozeduren arbeiten nach dem gleichen Prinzip: Sie vergleichen im Bubblesort-Durchlauf die Werte zweier benachbarter Zeilen direkt und tauschen bei Bedarf sofort deren Inhalte. Da die <b>Index<\/b>-Eigenschaft eines <b>ListItem<\/b>-Objekts schreibgesch&uuml;tzt ist, k&ouml;nnen wir die Reihenfolge der Eintr&auml;ge nicht durch Umsetzen von Indizes ver&auml;ndern. Stattdessen lassen wir die <b>ListItem<\/b>-Objekte an ihrer Position und schreiben nur die angezeigten Inhalte um &#8211; das Ergebnis ist dasselbe.<\/p>\n<h2>Routine zum Vertauschen von ListView-Eintr&auml;gen<\/h2>\n<p>Den Austausch &uuml;bernimmt die private Hilfsprozedur <b>ListViewZeilenTauschen<\/b>. Sie erh&auml;lt das <b>ListView<\/b>-Objekt sowie die Indizes der beiden zu tauschenden Zeilen. Zun&auml;chst speichert sie den <b>Text<\/b> der ersten Spalte von Zeile A in einer Hilfsvariablen, kopiert den Wert aus Zeile B nach A und schreibt den gespeicherten Wert nach B &#8211; der klassische Drei-Wege-Tausch. Anschlie&szlig;end wiederholt sie diesen Vorgang f&uuml;r jedes <b>ListSubItem<\/b> der Zeile. Da im <b>ListView<\/b>-Steuerelement auch das Icon je Zeile gespeichert ist, tauscht die Prozedur zuletzt noch den <b>SmallIcon<\/b>-Index, damit das Icon beim Umsortieren mitwandert und weiterhin zum jeweiligen Datensatz passt (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ListViewZeilenTauschen(objLV<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView, lngA<span style=\"color:blue;\"> As Long<\/span>, lngB<span style=\"color:blue;\"> As Long<\/span>)\r\n    <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n    strTemp = objLV.ListItems(lngA).Text\r\n    objLV.ListItems(lngA).Text = objLV.ListItems(lngB).Text\r\n    objLV.ListItems(lngB).Text = strTemp\r\n    For i = 1 To objLV.ListItems(lngA).ListSubItems.Count\r\n        strTemp = objLV.ListItems(lngA).ListSubItems(i).Text\r\n        objLV.ListItems(lngA).ListSubItems(i).Text = objLV.ListItems(lngB).ListSubItems(i).Text\r\n        objLV.ListItems(lngB).ListSubItems(i).Text = strTemp\r\n    <span style=\"color:blue;\">Next<\/span> i\r\n    'SmallIcon-Index ebenfalls tauschen\r\n    <span style=\"color:blue;\">Dim <\/span>lngIconA<span style=\"color:blue;\"> As Long<\/span>\r\n    lngIconA = objLV.ListItems(lngA).SmallIcon\r\n    objLV.ListItems(lngA).SmallIcon = objLV.ListItems(lngB).SmallIcon\r\n    objLV.ListItems(lngB).SmallIcon = lngIconA\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Hilfsprozedur zum Tauschen zweier ListView-Zeilen<\/span><\/b><\/p>\n<h2>Sortieren mit Bubblesort<\/h2>\n<p>Die Prozedur <b>ListViewSortNumerisch<\/b> implementiert den Bubblesort mit zwei verschachtelten Schleifen. Die &auml;u&szlig;ere Schleife &uuml;ber <b>i<\/b> l&auml;uft von 1 bis <b>lngAnzahl &#8211; 1<\/b> und steuert die Durchl&auml;ufe. Die innere Schleife &uuml;ber <b>j<\/b> l&auml;uft von 1 bis <b>lngAnzahl &#8211; i<\/b> &#8211; nach jedem Durchlauf steht der gr&ouml;&szlig;te noch unsortierte Wert am Ende, weshalb der Vergleichsbereich mit jedem Durchlauf um eine Position k&uuml;rzer wird. Im Schleifenrumpf lesen wir die Werte der beiden betrachteten Zeilen aus: Bei Spaltenindex 0 steht der Wert in <b>ListItems(j).Text<\/b>, bei allen anderen Spalten in <b>ListItems(j).ListSubItems(intSpalte).Text<\/b>. Beide Werte wandeln wir per <b>CLng<\/b> in ganzzahlige Werte um und vergleichen sie.<\/p>\n<p>Ist die Reihenfolge falsch &#8211; bei aufsteigender Sortierung also <b>lngA > lngB<\/b>, bei absteigender <b>lngA < lngB<\/b> &#8211; rufen wir <b>ListViewZeilenTauschen<\/b> auf (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ListViewSortNumerisch(objLV<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView, intSpalte<span style=\"color:blue;\"> As Integer<\/span>, bolAufsteigend<span style=\"color:blue;\"> As Boolean<\/span>)\r\n    <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>, j<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngAnzahl<span style=\"color:blue;\"> As Long<\/span>\r\n    lngAnzahl = objLV.ListItems.Count\r\n    'Bubblesort: Zeileninhalt direkt tauschen\r\n    For i = 1 To lngAnzahl - 1\r\n        For j = 1 To lngAnzahl - i\r\n            <span style=\"color:blue;\">Dim <\/span>lngA<span style=\"color:blue;\"> As Long<\/span>, lngB<span style=\"color:blue;\"> As Long<\/span>\r\n            <span style=\"color:blue;\">If <\/span>intSpalte = 0<span style=\"color:blue;\"> Then<\/span>\r\n                lngA = CLng(objLV.ListItems(j).Text)\r\n                lngB = CLng(objLV.ListItems(j + 1).Text)\r\n            <span style=\"color:blue;\">Else<\/span>\r\n                lngA = CLng(objLV.ListItems(j).ListSubItems(intSpalte).Text)\r\n                lngB = CLng(objLV.ListItems(j + 1).ListSubItems(intSpalte).Text)\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">If <\/span>bolAufsteigend<span style=\"color:blue;\"> Then<\/span>\r\n                <span style=\"color:blue;\">If <\/span>lngA &gt; lngB<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Call<\/span> ListViewZeilenTauschen(objLV, j, j + 1)\r\n            <span style=\"color:blue;\">Else<\/span>\r\n                <span style=\"color:blue;\">If <\/span>lngA &lt; lngB<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Call<\/span> ListViewZeilenTauschen(objLV, j, j + 1)\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Next<\/span> j\r\n    <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Numerische Sortierung<\/span><\/b><\/p>\n<p>Die Prozedur <b>ListViewSortDatum<\/b> ist identisch aufgebaut &#8211; der einzige Unterschied ist die Typumwandlung per <b>CDbl(CDate(&#8230;))<\/b>, da Access Datumsangaben intern als Gleitkommazahl speichert (siehe Klassenmodul Form_frmMitarbeiterImListView).<\/p>\n<p>Nach diesen Anpassungen liefert ein Klick auf den Spaltenkopf <b>ID<\/b> eine korrekte numerische Sortierung, und ein Klick auf <b>Geburtstag<\/b> eine chronologische.<\/p>\n<p>In Bild 2 sehen wir, dass die Sortierung nach dem Geburtstag nun funktioniert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_03\/pic_1575_002.png\" alt=\"Korrekte Sortierung nach dem Feld Geburtstag\" width=\"649,559\" height=\"395,0925\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Korrekte Sortierung nach dem Feld Geburtstag<\/span><\/b><\/p>\n<h2>Bearbeitungs-Dialog per Doppelklick &ouml;ffnen<\/h2>\n<p>Damit der Benutzer einen Mitarbeiterdatensatz direkt aus dem <b>ListView<\/b>-Steuerelement heraus bearbeiten kann, &ouml;ffnen wir per Doppelklick auf einen Eintrag ein Bearbeitungsformular. Das Formular <b>frmMitarbeiterDetail<\/b> ist an die Tabelle <b>tblMitarbeiter<\/b> gebunden und enth&auml;lt alle Felder des Datensatzes (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_03\/pic_1575_003.png\" alt=\"Das Formular zum Bearbeiten der Mitarbeiterdetails\" width=\"424,5589\" height=\"356,5206\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Formular zum Bearbeiten der Mitarbeiterdetails<\/span><\/b><\/p>\n<p>Die Eigenschaft <b>Automatisch zentrieren <\/b>stellen wir aus <b>Ja<\/b>, <b>Bildlaufleisten<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Datensatzmarkierer <\/b>auf <b>Nein <\/b>und <b>Zyklus <\/b>auf <b>Aktueller Datensatz <\/b>ein.<\/p>\n<p>Wir &ouml;ffnen es mit <b>DoCmd.OpenForm<\/b> und &uuml;bergeben die <b>MitarbeiterID<\/b> des angeklickten Eintrags als Filterargument.<\/p>\n<p>F&uuml;r das Doppelklick-Ereignis des <b>ListView<\/b>-Steuerelements hinterlegen wir die Ereignisprozedur aus Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_DblClick()\r\n    <span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView\r\n    <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n    <span style=\"color:blue;\">Dim <\/span>lngMitarbeiterID<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n    \r\n    <span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListView.SelectedItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n        strKey = objListItem.Key\r\n        lngMitarbeiterID = objListItem.ListSubItems(1).Text\r\n        DoCmd.OpenForm \"frmMitarbeiterDetail\", , , \"MitarbeiterID = \" & lngMitarbeiterID, acFormEdit, acDialog\r\n        <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmMitarbeiterDetail\") = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">Call<\/span> ListViewFuellen\r\n            objListView.ListItems(strKey).Selected = <span style=\"color:blue;\">True<\/span>\r\n            DoCmd.Close acForm, \"frmMitarbeiterDetail\"\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Bearbeitungsformular per Doppelklick &ouml;ffnen<\/span><\/b><\/p>\n<p>Sie ermittelt den aktuellen Eintrag und referenziert diesen mit <b>objListItem<\/b>. Mit <b>ListSubItems(1).Text <\/b>holt sie den Wert des Feldes <b>MitarbeiterID <\/b>und speichert diesen in der Variablen <b>lngMitarbeiterID<\/b>. Au&szlig;erdem speichern wir den Key des markierten Eintrag in der Variablen <b>strKey <\/b>zwischen.<\/p>\n<p>Diesen &uuml;bergeben wir beim &Ouml;ffnen des Formulars mit <b>DoCmd.OpenForm <\/b>&uuml;ber den Parameter <b>WhereCondition<\/b>. Au&szlig;erdem legen wir f&uuml;r den Parameter <b>WindowMode <\/b>den Wert <b>acDialog <\/b>fest, was daf&uuml;r sorgt, dass das Formular als modaler Dialog ge&ouml;ffnet wird und der aufrufende Code erst nach dem Schlie&szlig;en des Formulars weiterl&auml;uft.<\/p>\n<p>F&uuml;r die Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>des Formulars <b>frmMitarbeiterDetail <\/b>f&uuml;gen wir die folgende Ereignisprozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n    Me.Undo\r\n    DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n    <span style=\"color:blue;\">If <\/span>Me.Dirty = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        Me.Dirty = <span style=\"color:blue;\">False<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Schaltfl&auml;che <b>OK<\/b> macht das Formular unsichtbar und die aufrufende Prozedur l&auml;uft weiter. Sie pr&uuml;ft mit der Hilfsfunktion <b>IstFormularGeoeffnet<\/b>, ob das Formular noch ge&ouml;ffnet ist. Falls ja, aktualisiert sie die Anzeige des <b>ListView<\/b>-Steuerelements mit der Prozedur <b>ListViewFuellen<\/b>. Au&szlig;erdem selektiert sie den bearbeiteten Eintrag auf Basis des in <b>strKey <\/b>gespeicherten <b>Key<\/b>-Wertes erneut. Dann schlie&szlig;t sie das aktuell unsichtbare Formular <b>frmMitarbeiter <\/b>Details endg&uuml;ltig.<\/p>\n<h2>Neue Datens&auml;tze hinzuf&uuml;gen<\/h2>\n<p>Zum Hinzuf&uuml;gen eines neuen Mitarbeiters f&uuml;gen wir dem Formular eine Schaltfl&auml;che <b>cmdNeuerMitarbeiter<\/b> hinzu. Die Ereignisprozedur <b>cmdNeuerMitarbeiter_Click<\/b> &ouml;ffnet das Formular <b>frmMitarbeiterDetail<\/b> im Modus <b>acFormAdd<\/b>, sodass dort direkt ein neuer Datensatz angelegt werden kann (siehe Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeuerMitarbeiter_Click()\r\n    <span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView\r\n    <span style=\"color:blue;\">Dim <\/span>lngMitarbeiterID<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strKey<span style=\"color:blue;\"> As String<\/span>\r\n    \r\n    DoCmd.OpenForm \"frmMitarbeiterDetail\", , , , acFormAdd, acDialog\r\n    <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmMitarbeiterDetail\") = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n        lngMitarbeiterID = Forms!frmMitarbeiterdetail!MitarbeiterID\r\n        strKey = \"z\" & lngMitarbeiterID\r\n        DoCmd.Close acForm, \"frmMitarbeiterDetail\"\r\n        <span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object\r\n        <span style=\"color:blue;\">Call<\/span> ListViewFuellen\r\n        objListView.ListItems(strKey).Selected = <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Neuen Mitarbeiter anlegen<\/span><\/b><\/p>\n<p>Hat der Benutzer einen solchen angelegt und das Formular mit der Schaltfl&auml;che <b>OK <\/b>unsichtbar gemacht, liest die Prozedur die ID des neuen Mitarbeiter aus uns speichert sie in <b>lngMitarbeiterID<\/b>.<\/p>\n<p>Dann stellt sie den Index des neuen Eintrags zusammen, schlie&szlig;t das Formular, referenziert das <b>ListView<\/b>-Steuerelement und aktualisiert die enthaltenen Eintr&auml;ge. Dann selektiert sie den neu hinzugef&uuml;gten Mitarbeiter.<\/p>\n<h2>Eintr&auml;ge entfernen<\/h2>\n<p>Um einen Eintrag zu l&ouml;schen, f&uuml;gen wir dem Formular eine Schaltfl&auml;che <b>cmdLoeschen<\/b> hinzu. Die Ereignisprozedur pr&uuml;ft zun&auml;chst, ob ein Element im <b>ListView<\/b>-Steuerelement markiert ist. Falls ja, fragt sie den Benutzer per <b>MsgBox<\/b> ab, ob er den Eintrag wirklich l&ouml;schen m&ouml;chte. Bei Best&auml;tigung l&ouml;scht sie den Datensatz per SQL aus der Tabelle <b>tblMitarbeiter<\/b> und aktualisiert anschlie&szlig;end das <b>ListView<\/b>-Steuerelement (siehe Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdMitarbeiterLoeschen_Click()\r\n    <span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView\r\n    <span style=\"color:blue;\">Dim <\/span>objListItem<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListItem\r\n    <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> objListView = Me.ctlListView.Object\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListView.SelectedItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Set<\/span> objListItem = objListView.SelectedItem\r\n        lngID = CLng(objListItem.ListSubItems(1).Text)\r\n        <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Mitarbeiter wirklich l&ouml;schen?\", vbYesNo + vbQuestion) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n            CurrentDb.Execute \"DELETE FROM tblMitarbeiter WHERE MitarbeiterID = \" & lngID, dbFailOnError\r\n            <span style=\"color:blue;\">Call<\/span> ListViewFuellen\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Markierten Eintrag l&ouml;schen<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft, ob &uuml;berhaupt ein Eintrag markiert ist. In diesem Fall liest sie seine ID aus der ersten Spalte in die Variable <b>lngID <\/b>ein. Wenn der Benutzer die folgende Meldung mit Ja quittiert, wird der Eintrag aus der Tabelle tblMitarbeiter gel&ouml;scht und das <b>ListView <\/b>Steuerelement erneut gef&uuml;llt.<\/p>\n<h2>Status per Kontextmen&uuml; &auml;ndern<\/h2>\n<p>Als letztes Feature f&uuml;gen wir ein Kontextmen&uuml; hinzu, mit dem der Benutzer den Status eines Mitarbeiters direkt im <b>ListView<\/b>-Steuerelement anpassen kann, ohne das Detailformular zu &ouml;ffnen. Das Kontextmen&uuml; soll beim Rechtsklick auf einen Eintrag erscheinen und die verf&uuml;gbaren Statuswerte aus der Tabelle <b>tblStatus<\/b> als Men&uuml;eintr&auml;ge anbieten.<\/p>\n<p>Wir nutzen dazu die <b>CommandBars<\/b>-Auflistung von Office, wozu wir noch einen Verweis auf die Bibliothek Microsoft Office 16.0 Object Library hinzuf&uuml;gen m&uuml;ssen.<\/p>\n<p>Im Ereignis <b>Form_Load<\/b> erstellen wir das Kontextmen&uuml; einmalig und legen die Eintr&auml;ge dynamisch auf Basis der Tabelle <b>tblStatus<\/b> an (siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KontextmenueErstellen()\r\n    <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>Office.CommandBar\r\n    <span style=\"color:blue;\">Dim <\/span>cbrBtn<span style=\"color:blue;\"> As <\/span>Office.CommandBarButton\r\n    <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n    'Vorhandenes Men&uuml; l&ouml;schen\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    CommandBars(\"MitarbeiterStatus\").Delete\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    <span style=\"color:blue;\">Set<\/span> cbr = CommandBars.Add(\"MitarbeiterStatus\", msoBarPopup, , <span style=\"color:blue;\">True<\/span>)\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT StatusID, Status FROM tblStatus\", dbOpenSnapshot)\r\n    <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n        <span style=\"color:blue;\">Set<\/span> cbrBtn = cbr.Controls.Add(msoControlButton)\r\n        cbrBtn.Caption = rst!Status\r\n        cbrBtn.Tag = CStr(rst!StatusID)\r\n        cbrBtn.OnAction = \"=StatusSetzen(\" & rst!StatusID & \")\"\r\n        rst.Move<span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Loop<\/span>\r\n    rst.Close\r\n    <span style=\"color:blue;\">Set<\/span> rst = Nothing\r\n    <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Kontextmen&uuml; erstellen<\/span><\/b><\/p>\n<p>Dazu erg&auml;nzen wir den Aufruf von <b>KontextmenueErstellen<\/b> am Ende der Prozedur <b>Form_Load<\/b>.<\/p>\n<p>Die Prozedur durchl&auml;uft das Recordset auf Basis der Tabelle <b>tblStatus <\/b>und legt f&uuml;r jedes Element mit der <b>Add<\/b>-Methode ein neues Element im Kontextmen&uuml; namens <b>MitarbeiterStatus <\/b>an.<\/p>\n<p>Das Kontextmen&uuml; wird &uuml;ber das Ereignis <b>ctlListView_MouseUp<\/b> angezeigt, wenn die rechte Maustaste losgelassen wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ctlListView_MouseUp(ByVal Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n        ByVal Shift<span style=\"color:blue;\"> As Integer<\/span>, ByVal x<span style=\"color:blue;\"> As Long<\/span>, _\r\n        ByVal y<span style=\"color:blue;\"> As Long<\/span>)\r\n    <span style=\"color:blue;\">If <\/span>Button = 2<span style=\"color:blue;\"> Then<\/span>\r\n        If <span style=\"color:blue;\">Not<\/span> Me.ctlListView.Object.SelectedItem Is _\r\n                Nothing Then\r\n            CommandBars(\"MitarbeiterStatus\").ShowPopup\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktion <b>StatusSetzen<\/b> im Modul <b>mdlCommandbars<\/b> nimmt mit dem Parameter <b>lngStatusID <\/b>den im entsprechenden Wert f&uuml;r den im Kontextmen&uuml; ausgew&auml;hlten Eintrag entgegen.<\/p>\n<p>Dann referenziert sie das <b>ListView<\/b>-Steuerelement und liest die ID des aktuell markierten Eintrags aus, f&uuml;r den wir auch das Kontextmen&uuml; angezeigt haben.<\/p>\n<p>Dann aktualisiert sie mit einer <b>UPDATE<\/b>-Anweisung das Feld <b>StatusID<\/b> in der Tabelle <b>tblMitarbeiter<\/b> und ruft anschlie&szlig;end <b>ListViewFuellen<\/b> auf, damit der neue Status inklusive des aktualisierten Icons sofort sichtbar wird (siehe Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>StatusSetzen(lngStatusID<span style=\"color:blue;\"> As Long<\/span>)\r\n    <span style=\"color:blue;\">Dim <\/span>objListView<span style=\"color:blue;\"> As <\/span>MSComctlLib.ListView\r\n    <span style=\"color:blue;\">Dim <\/span>lngMitarbeiterID<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> objListView = Forms(\"frmMitarbeiterImListView\").ctlListView.Object\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objListView.SelectedItem Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        lngMitarbeiterID = CLng(objListView.SelectedItem.ListSubItems(1).Text)\r\n        CurrentDb.Execute \"UPDATE tblMitarbeiter SET StatusID = \" & lngStatusID _\r\n            & \" WHERE MitarbeiterID = \" & lngMitarbeiterID, dbFailOnError\r\n        Forms(\"frmMitarbeiterImListView\").ListViewFuellen\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Statuswert des markierten Eintrags setzen<\/span><\/b><\/p>\n<p>Testen wir das Kontextmen&uuml;: Ein Rechtsklick auf einen Mitarbeitereintrag &ouml;ffnet das Men&uuml; mit den Statuswerten aus der Tabelle <b>tblStatus<\/b> (siehe Bild 4). Nach der Auswahl wird das Icon in der ersten Spalte sofort auf das zum neuen Status geh&ouml;rende Symbol aktualisiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_03\/pic_1575_004.png\" alt=\"Anzeige des Kontextmen&uuml;s zum Einstellen des Status des Mitarbeiters\" width=\"700\" height=\"358,4775\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anzeige des Kontextmen&uuml;s zum Einstellen des Status des Mitarbeiters<\/span><\/b><\/p>\n<h2>Zusammenfassung<\/h2>\n<p>In diesem zweiten Teil der Beitragsreihe haben wir das <b>ListView<\/b>-Steuerelement aus Teil 1 um einige praxisrelevante Funktionen erweitert. Die Neuerungen im &Uuml;berblick:<\/p>\n<ul>\n<li>Zahlen- und Datumsfelder werden nun korrekt sortiert. Statt die eingebaute Textsortierung zu nutzen, vergleichen die neuen Prozeduren <b>ListViewSortNumerisch<\/b> und <b>ListViewSortDatum<\/b> die Werte direkt im Bubblesort-Durchlauf und tauschen Zeileninhalte samt der Status-Icons  &uuml;ber die Hilfsprozedur <b>ListViewZeilenTauschen<\/b>.<\/li>\n<li>Per Doppelklick auf einen Eintrag &ouml;ffnet sich das Detailformular mit dem gew&uuml;nschten Datensatz. Nach dem Schlie&szlig;en wird das <b>ListView<\/b>-Steuerelement automatisch aktualisiert.<\/li>\n<li>Neue Mitarbeiter lassen sich &uuml;ber eine Schaltfl&auml;che anlegen; auch hier sorgt der R&uuml;ckruf &uuml;ber <b>OpenArgs<\/b> f&uuml;r eine sofortige Aktualisierung.<\/li>\n<li>Eintr&auml;ge k&ouml;nnen nach einer Sicherheitsabfrage per Schaltfl&auml;che gel&ouml;scht werden.<\/li>\n<li>Der Status eines Mitarbeiters l&auml;sst sich bequem per Kontextmen&uuml; &auml;ndern, wobei das Icon in der ersten Spalte sofort aktualisiert wird.<\/li>\n<\/ul>\n<p>Damit ist das <b>ListView<\/b>-Steuerelement als vollwertiger Ersatz f&uuml;r das herk&ouml;mmliche Listenfeld in vielen Szenarien einsatzbereit.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ListViewSteuerelementAusTabellenOderAbfragenFuellen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/12ECE826-CD95-4B32-A8C4-6E51B0159256\/aiu_1575.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im ersten Teil dieser Beitragsreihe haben wir ein ListView-Steuerelement mit den Daten aus einer Mitarbeitertabelle gef&uuml;llt, Icons hinzugef&uuml;gt und eine Sortierfunktion implementiert. Im vorliegenden Beitrag bauen wir dieses Beispiel weiter aus: Wir zeigen, wie man dem ListView-Steuerelement neue Eintr&auml;ge hinzuf&uuml;gen und bestehende Eintr&auml;ge bearbeiten oder l&ouml;schen kann. Au&szlig;erdem erkl&auml;ren wir, wie man die Elemente auch nach numerischen Daten oder nach Datumsfeldern korrekt sortiert. Schlie&szlig;lich f&uuml;gen wir noch ein Kontextmen&uuml; hinzu, mit dem man den Status der Mitarbeiter anpassen kann.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662026,66032026,44000044],"tags":[],"class_list":["post-55001575","post","type-post","status-publish","format-standard","hentry","category-662026","category-66032026","category-AccessSteuerelemente"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2 - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2\" \/>\n<meta property=\"og:description\" content=\"Im ersten Teil dieser Beitragsreihe haben wir ein ListView-Steuerelement mit den Daten aus einer Mitarbeitertabelle gef&uuml;llt, Icons hinzugef&uuml;gt und eine Sortierfunktion implementiert. Im vorliegenden Beitrag bauen wir dieses Beispiel weiter aus: Wir zeigen, wie man dem ListView-Steuerelement neue Eintr&auml;ge hinzuf&uuml;gen und bestehende Eintr&auml;ge bearbeiten oder l&ouml;schen kann. Au&szlig;erdem erkl&auml;ren wir, wie man die Elemente auch nach numerischen Daten oder nach Datumsfeldern korrekt sortiert. Schlie&szlig;lich f&uuml;gen wir noch ein Kontextmen&uuml; hinzu, mit dem man den Status der Mitarbeiter anpassen kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-05T20:41:12+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2\",\"datePublished\":\"2026-05-05T20:41:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/\"},\"wordCount\":1909,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/8c209cce9516431090ab89c6108b29da\",\"articleSection\":[\"2026\",\"3\\\/2026\",\"Access-Steuerelemente\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/\",\"name\":\"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/8c209cce9516431090ab89c6108b29da\",\"datePublished\":\"2026-05-05T20:41:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/8c209cce9516431090ab89c6108b29da\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/8c209cce9516431090ab89c6108b29da\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2 - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/","og_locale":"de_DE","og_type":"article","og_title":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2","og_description":"Im ersten Teil dieser Beitragsreihe haben wir ein ListView-Steuerelement mit den Daten aus einer Mitarbeitertabelle gef&uuml;llt, Icons hinzugef&uuml;gt und eine Sortierfunktion implementiert. Im vorliegenden Beitrag bauen wir dieses Beispiel weiter aus: Wir zeigen, wie man dem ListView-Steuerelement neue Eintr&auml;ge hinzuf&uuml;gen und bestehende Eintr&auml;ge bearbeiten oder l&ouml;schen kann. Au&szlig;erdem erkl&auml;ren wir, wie man die Elemente auch nach numerischen Daten oder nach Datumsfeldern korrekt sortiert. Schlie&szlig;lich f&uuml;gen wir noch ein Kontextmen&uuml; hinzu, mit dem man den Status der Mitarbeiter anpassen kann.","og_url":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-05-05T20:41:12+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2","datePublished":"2026-05-05T20:41:12+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/"},"wordCount":1909,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da","articleSection":["2026","3\/2026","Access-Steuerelemente"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/","url":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/","name":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da","datePublished":"2026-05-05T20:41:12+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/8c209cce9516431090ab89c6108b29da"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/ListView_aus_Tabellen_oder_Abfragen_fuellen_Teil_2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ListView aus Tabellen oder Abfragen f&uuml;llen, Teil 2"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001575"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001575\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}