{"id":55001365,"date":"2022-06-01T00:00:00","date_gmt":"2022-05-31T18:39:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1365"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zuletzt_verwendete_Datensaetze_per_Listenfeld","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/","title":{"rendered":"Zuletzt verwendete Datens&auml;tze per Listenfeld"},"content":{"rendered":"<p><b>Eine sehr praktische Funktion findet sich in den Office-Anwendungen und auch in vielen anderen Produkten. Wo auch immer Dateien verwendet werden, finden Sie beim &Ouml;ffnen der jeweiligen Anwendung eine Liste der zuletzt verwendeten Dateien vor. Warum sollte man dies nicht auch in einer Access-Datenbank nutzen, um die zuletzt angezeigten Datens&auml;tze in Formularen zur Auswahl anzubieten Wenn Sie zum Beispiel eine Bestellverwaltung nutzen, k&ouml;nnte es sehr sinnvoll sein, die zuletzt angezeigten oder bearbeiteten Kunden in einer Schnellauswahl zum erneuten Aufrufen vorzufinden. Wie das gelingt und welche Erweiterungen dazu notwendig sind, zeigt der vorliegende Beitrag.<\/b><\/p>\n<h2>Feature wie unter Office<\/h2>\n<p>Wenn Sie mit Anwendungen wie Word, Excel oder Access arbeiten, kennen Sie die Anzeige der zuletzt verwendeten Dateien, die beim Starten der Anwendung &uuml;ber die jeweilige Verkn&uuml;pfung erscheint.<\/p>\n<p>Hier w&auml;hlen Sie immer aus den zuletzt verwendeten Dateien aus oder alternativ aus einer Liste von angehefteten Dateien, die unabh&auml;ngig davon, wann sie zuletzt benutzt wurden, angezeigt werden sollen.<\/p>\n<h2>Vorbereitungen<\/h2>\n<p>Wir wollen zun&auml;chst nur den ersten Teil auch f&uuml;r die Datens&auml;tze einer Tabelle realisieren, in diesem Fall f&uuml;r die Kunden einer Bestellverwaltung.<\/p>\n<p>Wir nutzen dazu wieder die Tabellen der Beispieldatenbank <b>S&uuml;dsturm<\/b>, wobei f&uuml;r uns die Tabelle <b>tblKunden <\/b>interessant ist.<\/p>\n<p>Als Basis dient das Formular <b>frmKundenZuletzt<\/b>, f&uuml;r dessen Eigenschaft <b>Datensatzquelle <\/b>wir die Tabelle <b>tblKunden <\/b>angeben.<\/p>\n<p>Aus der Feldliste ziehen wir alle Felder der Tabelle in den Detailbereich des Entwurfs des Formulars (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_001.png\" alt=\"Dieses Formular wollen wir mit einer Liste der zuletzt verwendeten Kunden ausstatten.\" width=\"649,559\" height=\"513,6765\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Dieses Formular wollen wir mit einer Liste der zuletzt verwendeten Kunden ausstatten.<\/span><\/b><\/p>\n<h2>Konzept f&uuml;r die Liste zuletzt verwendeter Datens&auml;tze<\/h2>\n<p>Bevor wir loslegen und dem Formular ein Listenfeld zur Anzeige der zuletzt verwendeten Datens&auml;tze hinzuf&uuml;gen, stellen wir ein paar grundlegende &Uuml;berlegungen an.<\/p>\n<h2>Welche Datens&auml;tze speichern wir in der Liste der zuletzt verwendeten Datens&auml;tze<\/h2>\n<p>Die erste Frage, die sich uns stellt, ist folgende: Zu welchen Datens&auml;tzen beziehungsweise wann soll ein Datensatz &uuml;berhaupt gespeichert und in der Liste der zuletzt verwendeten Datens&auml;tze angezeigt werden<\/p>\n<p>Es gibt verschiedene M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Jeder angezeigte Datensatz wird in der Liste gespeichert.<\/li>\n<li>Jeder bearbeitete Datensatz wird gespeichert.<\/li>\n<li>Jeder gezielt angezeigte Datensatz, beispielsweise durch das Anzeigen von einem &Uuml;bersichtsformular aus, wird gespeichert.<\/li>\n<li>Nur Datens&auml;tze, die explizit gespeichert werden sollen &#8211; beispielsweise &uuml;ber einen Klick auf eine entsprechende Schaltfl&auml;che &#8211; werden in die Liste &uuml;bernommen.<\/li>\n<\/ul>\n<p>Wir wollen im ersten Entwurf den ersten Ansatz umsetzen und alle Datens&auml;tze in der Liste der zuletzt angezeigten Datens&auml;tze speichern, die &uuml;berhaupt im Formular <b>frmKundenZuletzt <\/b>angezeigt wurden.<\/p>\n<h2>Wo sollen die Informationen &uuml;ber die zuletzt verwendeten Datens&auml;tze gespeichert werden<\/h2>\n<p>Die zweite Frage lautet: Wo wollen wir &uuml;berhaupt die Information speichern, welche Datens&auml;tze der Tabelle <b>tblKunden <\/b>zuletzt verwendet wurden<\/p>\n<p>Hier gibt es wiederum mindestens zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>In einer eigenen Tabelle, die wir beispielsweise <b>tblKundenZuletzt <\/b>nennen. Hier speichern wir Informationen wie den Namen und\/oder den Prim&auml;rschl&uuml;sselwert des jeweiligen Datensatzes. Die Liste zur Anzeige der zuletzt verwendeten Datens&auml;tze kann ihre Daten direkt aus dieser Tabelle beziehen.<\/li>\n<li>Direkt in der Tabelle <b>tblKunden<\/b>. Wir k&ouml;nnten ein eigenes Feld mit dem Datentyp <b>Datum <\/b>beispielsweise namens <b>ZuletztAngezeigt <\/b>anlegen, das wir immer aktualisieren, wenn der Datensatz angezeigt wurde. Die Liste soll dann die X zuletzt ge&ouml;ffneten Datens&auml;tze anhand dieses Feldes ermitteln.<\/li>\n<\/ul>\n<p>Hier w&auml;hlen wir ebenfalls den ersten Ansatz. Dies ist praktikabler, weil wir dann nicht den Entwurf der Tabelle <b>tblKunden <\/b>anpassen m&uuml;ssen. Gegebenenfalls handelt es sich bei dieser Tabelle um eine per ODBC eingebundene SQL Server-Tabelle und es ist gar nicht m&ouml;glich, diese Tabelle anzupassen. Au&szlig;erdem spricht f&uuml;r die Speicherung in einer eigenen Tabelle, dass diese im Frontend gespeichert werden kann und somit die zuletzt verwendeten Datens&auml;tze f&uuml;r den jeweiligen Benutzer sichert.<\/p>\n<h2>Anlegen der Tabelle zum Speichern der zuletzt angezeigten Datens&auml;tze<\/h2>\n<p>Die Tabelle wollen wir <b>tblKundenZuletzt <\/b>nennen. Wir k&ouml;nnten auch den Namen <b>tblZuletztGeoeffnet <\/b>oder &auml;hnlich verwenden, aber vielleicht wollen wir die gleiche Funktion auch noch f&uuml;r die Artikel hinzuf&uuml;gen &#8211; daher ist es sinnvoller, den Namen der betroffenen Elemente direkt im Tabellennamen anzugeben.<\/p>\n<h2>Welche Felder soll die Tabelle f&uuml;r die zuletzt angezeigten Datens&auml;tze enthalten<\/h2>\n<p>Nun wird es interessanter. Wenn es nur um die Anzeige der zuletzt verwendeten Eintr&auml;ge der Tabelle <b>tblKunden <\/b>geht, k&ouml;nnte man neben dem Prim&auml;rschl&uuml;sselfeld nur noch ein Feld mit der Bezeichnung des jeweiligen Elements, in diesem Falle der Kunden, anlegen. Allerdings wollen Sie den jeweiligen Kunden ja auch &uuml;ber das Listenfeld &ouml;ffnen, und dazu m&uuml;ssen wir genau wissen, um welchen Datensatz es sich handelt. Also ben&ouml;tigen wir auch noch den Prim&auml;rschl&uuml;sselwert aus der Tabelle <b>tblKunden<\/b>.<\/p>\n<p>Wenn wir aber den Prim&auml;rschl&uuml;sselwert und auch den Namen des Kunden aus der Tabelle <b>tblKunden <\/b>in der Tabelle <b>tblKundenZuletzt <\/b>speichern, laufen wir Gefahr, inkonsistente Daten anzuzeigen. Es kann n&auml;mlich sein, dass wir im Formular <b>frmKundenLetzte <\/b>den Namen eines Kunden &auml;ndern, nachdem wir diesen angezeigt haben.<\/p>\n<p>Dem k&ouml;nnen wir allerdings vorbeugen, indem wir im Formular <b>frmKundenLetzte <\/b>nicht nur eine Ereignisprozedur anlegen, die beim Anzeigen eines Kunden ausgel&ouml;st wird und dessen Daten in der Tabelle <b>tblKundenZuletzt<\/b> speichert, sondern auch noch eine, die beim &Auml;ndern eines Datensatzes ausgel&ouml;st wird und den aktuellen Kunden dann in der Tabelle <b>tblKundenZuletzt <\/b>&uuml;berschreibt.<\/p>\n<p>Und bei der Gelegenheit sollten wir auch im Hinterkopf behalten, dass der Benutzer ja auch einmal einen Kundendatensatz l&ouml;schen kann. Dieser soll dann selbstverst&auml;ndlich auch aus der Tabelle <b>tblKundenZuletzt <\/b>entfernt werden.<\/p>\n<h2>Entwurf der Tabelle tblKundenZuletzt<\/h2>\n<p>Also gestalten wir die Tabelle <b>tblKundenZuletzt<\/b> wie in Bild 2. Neben dem Prim&auml;rschl&uuml;sselfeld legen wir ein Feld an, das den gleichen Namen erh&auml;lt wie das Feld, aus dem die in der Liste der zuletzt ge&ouml;ffneten Eintr&auml;ge anzuzeigenden Werte stammen. F&uuml;r das Feld <b>KundeID<\/b>, welches den Prim&auml;rschl&uuml;sselwert der anzuzeigenden Eintr&auml;ge aus der Tabelle <b>tblKunden <\/b>aufnehmen soll, legen wir einen eindeutigen Index fest. Dieser sorgt daf&uuml;r, dass jeder Datensatz der Tabelle <b>tblKunden <\/b>nur einmal in der Tabelle <b>tblKundenZuletzt <\/b>referenziert werden kann. Sp&auml;ter nutzen wir das Ausl&ouml;sen eines Fehlers beim Hinzuf&uuml;gen eines Datensatzes mit einem bereits vorhandenem Wert in diesem Feld f&uuml;r unsere Zwecke &#8211; mehr dazu weiter unten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_002.png\" alt=\"Entwurf der Tabelle tblKundenZuletzt\" width=\"624,559\" height=\"390,8112\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblKundenZuletzt<\/span><\/b><\/p>\n<h2>Ben&ouml;tigen wir kein Feld in tblKundenZuletzt, das die Reihenfolge angibt<\/h2>\n<p>Wir k&ouml;nnten die Funktion mit noch mehr Features ausstatten und beispielsweise die Zeit anzeigen, wann der Datensatz zuletzt aufgerufen wurde. F&uuml;rs erste reicht es uns jedoch, einfach nur die zuletzt verwendeten Kunden so anzuzeigen, dass der zuletzt verwendete Kunde ganz oben erscheint. Ben&ouml;tigen wir dazu ein spezielles Feld Nein, wir k&ouml;nnen dazu das Prim&auml;rschl&uuml;sselfeld <b>KundeZuletztID <\/b>nutzen und einfach in absteigender Reihenfolge nach dem Inhalt dieses Feldes sortieren.<\/p>\n<h2>Prozedur erstellen, die den aktuellen Kunden zur Tabelle hinzuf&uuml;gt<\/h2>\n<p>Nachdem wir diese Tabelle erstellt haben, wollen wir dem Formular <b>frmKundeZuletzt <\/b>zuerst einmal eine Ereignisprozedur hinzuf&uuml;gen, die bei Anzeigen eines Kunden ausgel&ouml;st wird und welche die Daten f&uuml;r diesen Kunden in der Tabelle <b>tblKundenZuletzt <\/b>speichert. Erst danach f&uuml;gen wir das Listenfeld mit den Daten der Tabelle <b>tblKundenZuletzt <\/b>hinzu.<\/p>\n<p>Das passende Ereignis f&uuml;r unsere Zwecke hei&szlig;t <b>Beim Anzeigen<\/b>. Es wird sowohl beim Anzeigen des ersten Datensatzes beim &Ouml;ffnen des Formulars als auch beim Wechseln zu einem anderen Datensatz ausgel&ouml;st.<\/p>\n<p>Diese Prozedur f&uuml;llen wir mit dem Code aus Listing 1. Die Prozedur pr&uuml;ft zuerst, ob <b>KundeID <\/b>nicht den Wert <b>Null <\/b>hat, was der Fall ist, wenn der Datensatzzeiger auf einen neuen, leeren Datensatz verschoben wird. Diesen Fall m&uuml;ssten wir sp&auml;ter ber&uuml;cksichtigen, wenn wir uns um das Speichern beim &Auml;ndern eines Datensatzes k&uuml;mmern.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\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>strINSERT<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDELETE<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!KundeID)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strINSERT = \"INSERT INTO tblKundenZuletzt(Firma, KundeID) VALUES(''\" & <span style=\"color:blue;\">Replace<\/span>(Me!Firma, \"''\", \"''''\") & \"'', \" _\r\n             & Me!KundeID & \")\"\r\n         db.Execute strINSERT, dbFailOnError\r\n         Select Case Err.Number\r\n             <span style=\"color:blue;\">Case <\/span>Is = 3022\r\n                 strDELETE = \"DELETE FROM tblKundenZuletzt WHERE KundeID = \" & Me!KundeID\r\n                 db.Execute strDELETE, dbFailOnError\r\n                 db.Execute strINSERT, dbFailOnError\r\n             <span style=\"color:blue;\">Case <\/span>0\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n         <span style=\"color:blue;\">End Select<\/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 1: Prozedur zum Speichern der Daten f&uuml;r den aktuellen Datensatz in der Tabelle tblKundenZuletzt<\/span><\/b><\/p>\n<p>Danach deaktivieren wir die eingebaute Fehlerbehandlung mit <b>On Error Resume Next<\/b>. Das ist n&ouml;tig, damit wir versuchen k&ouml;nnen, den Datensatz mit dem entsprechenden Wert im Feld <b>KundeID <\/b>zur Tabelle <b>tblKundenZuletzt <\/b>hinzuzuf&uuml;gen. Ist bereits ein Datensatz mit diesem Wert f&uuml;r das Feld <b>KundeID <\/b>vorhanden, wird n&auml;mlich der Fehler mit der Nummer <b>3022 <\/b>ausgel&ouml;st. In diesem Fall wollen wir den vorhandenen Datensatz mit dem Wert aus <b>KundeID <\/b>aus der Tabelle <b>tblKundenZuletzt <\/b>l&ouml;schen und diesen erneut anlegen. Warum belassen wir diesen dann nicht einfach in der Tabelle Weil der Datensatz nun der zuletzt verwendeten Datensatz ist und da wir absteigend nach dem Inhalt des Feldes <b>KundeZuletztID <\/b>sortieren, m&uuml;ssen wir den Datensatz l&ouml;schen und wieder anlegen, um dieses entsprechend zu aktualisieren.<\/p>\n<p>In dem Fall, dass der Kunde noch nicht in der Liste enthalten ist, f&uuml;gen wir diesen einfach mit der Anweisung aus <b>strINSERT <\/b>zur Tabelle <b>tblKundenZuletzt <\/b>hinzu. F&uuml;r einen Beispieldatensatz sieht diese Anweisung etwa wie folgt aus:<\/p>\n<pre>INSERT INTO tblKundenZuletzt(Firma, KundeID) VALUES(''Centro comercial Moctezuma'', 13)<\/pre>\n<p>Falls tats&auml;chlich der Fehler <b>3022 <\/b>auftritt, den wir in einer <b>Select Case<\/b>-Bedingung &uuml;ber den Wert von <b>Err.Number <\/b>pr&uuml;fen, stellen wir eine <b>DELETE<\/b>-Anweisung zusammen, um den betroffenen Datensatz zu l&ouml;schen und diesen anschlie&szlig;end mit der Anweisung aus <b>strINSERT <\/b>erneut anzulegen. Die <b>DELETE<\/b>-Anweisung sieht f&uuml;r diese Fall wie folgt aus:<\/p>\n<pre>DELETE FROM tblKundenZuletzt WHERE KundeID = 13<\/pre>\n<p>Die <b>Select Case<\/b>-Bedingung enth&auml;lt noch zwei weitere Zweige. Der mit dem Wert <b>0 <\/b>ist f&uuml;r einen fehlerfreien Aufruf der <b>INSERT INTO<\/b>-Anweisung vorgesehen und erledigt nichts. Der <b>Else<\/b>-Zweig zeigt f&uuml;r alle anderen Fehler eine entsprechende Meldung an. Nachdem wir in die Formularansicht gewechselt sind und einige Datens&auml;tze durchlaufen haben &#8211; inklusive eines Sprungs zum Datensatz mit der Nummer <b>6 <\/b>am Ende &#8211; sieht die Tabelle <b>tblKundenZuletzt <\/b>wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_003.png\" alt=\"Einige zur Tabelle tblKundenZuletzt hinzugef&uuml;gte Datens&auml;tze\" width=\"499,5589\" height=\"349,6912\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Einige zur Tabelle tblKundenZuletzt hinzugef&uuml;gte Datens&auml;tze<\/span><\/b><\/p>\n<h2>Zuletzt verwendete Datens&auml;tze in Listenfeld anzeigen<\/h2>\n<p>Nun f&uuml;gen wir dem Formular <b>frmKundenZuletzt <\/b>auf der linken Seite ein Listenfeld namens <b>lstKundenZuletzt <\/b>hinzu. Zuvor verschieben wir die Textfelder des Formulars weiter nach rechts, damit genug Platz f&uuml;r das Listenfeld vorhanden ist. Das Ergebnis sehen Sie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_004.png\" alt=\"Entwurf des Formulars frmKundenZuletzt mit Listenfeld\" width=\"424,5589\" height=\"320,6936\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf des Formulars frmKundenZuletzt mit Listenfeld<\/span><\/b><\/p>\n<p>Das Listenfeld f&uuml;llen wir &uuml;ber die Eigenschaft <b>Datensatzherkunft <\/b>mit einer Abfrage, die auf der Tabelle <b>tblKundenZuletzt <\/b>basiert. Warum ben&ouml;tigen wir dazu eine Abfrage Weil wir die Datens&auml;tze absteigend nach dem Prim&auml;rschl&uuml;sselfeld <b>KundeZuletztID <\/b>sortieren wollen. Die Abfrage sieht in der Entwurfsansicht wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_005.png\" alt=\"Abfrage mit den Daten f&uuml;r das Listenfeld lstKundenZuletzt\" width=\"499,5589\" height=\"314,96\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Abfrage mit den Daten f&uuml;r das Listenfeld lstKundenZuletzt<\/span><\/b><\/p>\n<p>Sie enth&auml;lt alle Felder der Tabelle <b>tblKundenZuletzt <\/b>und sortiert die Datens&auml;tze absteigend nach dem Feld <b>KundeZuletztID<\/b>. Das Feld <b>KundeZuletztID <\/b>ben&ouml;tigen wir allerdings nur zum Sortieren, aber nicht f&uuml;r die Anzeige im Listenfeld. Also blenden wir es durch Entfernen des Hakens im Feld <b>Anzeigen <\/b>aus. Au&szlig;erdem wollen wir das Feld <b>KundeID <\/b>als erstes Feld zur&uuml;ckliefern und als zweites das Feld <b>Firma<\/b>. Warum, erl&auml;utern wir gleich im Anschluss.<\/p>\n<h2>Definition der Anzeige im Listenfeld<\/h2>\n<p>Die Abfrage liefert die beiden Felder <b>KundeID <\/b>und <b>Firma <\/b>zur&uuml;ck. Wir m&ouml;chten aber nur das Feld <b>Firma <\/b>anzeigen. Das Feld <b>KundeID <\/b>m&ouml;chten wir als gebundenes Feld nutzen. Deshalb stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_006.png\" alt=\"Einstellungen f&uuml;r die Spalten im Listenfeld\" width=\"424,5589\" height=\"326,0951\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Einstellungen f&uuml;r die Spalten im Listenfeld<\/span><\/b><\/p>\n<p>Dadurch wird die erste Spalte praktisch ausgeblendet und nur die zweite Spalte angezeigt. Das Ergebnis sehen Sie in Bild 7.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_007.png\" alt=\"Die Anzeige der zuletzt ge&ouml;ffneten Datens&auml;tze\" width=\"474,5589\" height=\"324,296\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Die Anzeige der zuletzt ge&ouml;ffneten Datens&auml;tze<\/span><\/b><\/p>\n<p>Hier sehen wir allerdings ein kleines Problem: Der erste Datensatz im Listenfeld erscheint gleich als <b>#Gel&ouml;scht<\/b>. Der Effekt tritt auf, weil dieser Datensatz derjenige ist, der gerade oben stand und auch als erster angezeigt wird. Diese Aktualisierung erledigt Access im Gegensatz zu den anderen, wie das Neuanlegen dieses Datensatzes, automatisch. Also f&uuml;gen wir der <b>Beim Anzeigen<\/b>-Prozedur noch eine Zeile hinzu, die das Listenfeld aktualisiert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!KundeID)<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n         Me!lstKundenZuletzt.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen Sie nun durch die Datens&auml;tze navigieren und das Listenfeld nimmt immer den aktuellen Datensatz als ersten Datensatz in die Liste auf.<\/p>\n<h2>Den aktuellen Datensatz sofort anzeigen<\/h2>\n<p>Hier stellt sich die Frage, ob der aktuelle Datensatz immer gleich beim Anzeigen im Formular auch an die erste Stelle in die Liste der zuletzt angezeigten Datens&auml;tze aufgenommen werden soll. Immerhin wird er ja gerade erst im Formular angezeigt, warum sollte man ihn dann direkt als ersten Datensatz in der Liste anzeigen<\/p>\n<p>Also pr&uuml;fen wir, ob wir das auch so umsetzen k&ouml;nnen, dass der Datensatz immer erst beim Anzeigen des n&auml;chsten Datensatzes in die Liste aufgenommen werden kann. Das gelingt zumindest nicht so einfach, denn im Gegensatz zu <b>Beim Anzeigen <\/b>gibt es kein Ereignis, dass beim Ausblenden eines Datensatzes ausgel&ouml;st wird.<\/p>\n<p>Wir m&uuml;ssten uns also &uuml;berlegen, welches Ereignis wir stattdessen nutzen k&ouml;nnen. Wir k&ouml;nnten zum Beispiel den Prim&auml;rschl&uuml;sselwert des aktuellen Datensatzes in einer Variablen speichern und diesen dann beim n&auml;chsten Aufruf von <b>Beim Anzeigen <\/b>als neuen zuletzt aufgerufenen Datensatz speichern.<\/p>\n<p>Das misslingt aber, wenn das Formular geschlossen wird, da dann kein weiterer Datensatz mehr angezeigt wird, und sp&auml;testens wenn man zwischendurch die Anwendung schlie&szlig;t, wird es aufwendig.<\/p>\n<p>Aber es gibt eine einfachere L&ouml;sung: Wir zeigen einfach alle Eintr&auml;ge der Tabelle mit Ausnahme des zuletzt hinzugef&uuml;gten Eintrags an! Das ist immer der aktuell sichtbare Eintrag, den wir einfach als Kriterium &uuml;ber die als Datensatzherkunft verwendete Abfrage ausschlie&szlig;en.<\/p>\n<p>Um dies zu erreichen, brauchen wir nur das Kriterium aus Bild 8 zum Formular hinzuzuf&uuml;gen. Dieses referenziert das Feld <b>KundeID <\/b>des aktuell im Formular <b>frmKundenZuletzt <\/b>angezeigten Datensatzes.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_008.png\" alt=\"Anpassen der Datensatzherkunft des Listenfeldes so, dass es den aktuell angezeigten Datensatz nicht enth&auml;lt.\" width=\"549,559\" height=\"316,1846\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Anpassen der Datensatzherkunft des Listenfeldes so, dass es den aktuell angezeigten Datensatz nicht enth&auml;lt.<\/span><\/b><\/p>\n<h2>Einen der zuletzt angezeigten Datens&auml;tze aufrufen<\/h2>\n<p>Ein passendes Ereignis, um einen der Datens&auml;tze aus dem Listenfeld <b>lstKundenZuletzt <\/b>im Formular anzuzeigen, ist das <b>Beim Doppelklicken<\/b>-Ereignis. F&uuml;r dieses hinterlegen wir die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKundenZuletzt_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strWhere<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!lstKundenZuletzt)<span style=\"color:blue;\"> Then<\/span>\r\n         strWhere = \"KundeID = \" & Me!lstKundenZuletzt\r\n         Me.Recordset.FindFirst strWhere\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur pr&uuml;ft zuerst, ob der aktuelle Wert im Listenfeld nicht <b>Null <\/b>ist. In diesem Fall soll nichts geschehen. Anderenfalls stellt die Prozedur eine <b>Where<\/b>-Bedingung zusammen, die anschlie&szlig;end der <b>FindFirst<\/b>-Methode des <b>Recordset<\/b>-Objekts des Formulars &uuml;bergeben wird.<\/p>\n<p>Diese sieht beispielsweise wie folgt aus:<\/p>\n<pre>KundeID = 10<\/pre>\n<p>Das Formular zeigt anschlie&szlig;end genau diesen Kunden an. Die vorher beschriebene Prozedur f&uuml;r das Ereignis <b>Beim Anzeigen <\/b>sowie die Anpassung der Abfrage, die wir als Datensatzquelle f&uuml;r das Formular verwenden, sorgen dann daf&uuml;r, dass der so aufgerufene Datensatz nicht in der Liste angezeigt wir.<\/p>\n<p>Im Detail wird dieser, wenn er bereits vorhanden ist, aus der Tabelle <b>tblKundenZuletzt <\/b>gel&ouml;scht und dann erneut eingef&uuml;gt. Dass die Abfrage f&uuml;r das Listenfeld den aktuell im Formular angezeigten Datensatz nicht anzeigt, erscheint dieser nicht im Listenfeld.<\/p>\n<h2>&Auml;nderungen der Bezeichnung in die Tabelle der zuletzt angezeigten Datens&auml;tze &uuml;bernehmen<\/h2>\n<p>Wenn der Benutzer den Inhalt des Feldes <b>Firma <\/b>der Tabelle <b>tblKunden<\/b> &auml;ndert und es in der Tabelle <b>tblKundenZuletzt <\/b>bereits einen Datensatz zu diesem Kunden gibt, dann m&uuml;sste die Firma auch in dieser Tabelle ge&auml;ndert werden.<\/p>\n<p>Dazu hinterlegen wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Formulars. Diese l&ouml;st den Code aus Listing 2 aus. Die Prozedur ruft einfach nur eine Routine namens <b>LetzteDatensaetzeAktualisieren <\/b>auf. Aber was tut diese Routine und wie sieht sie aus<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterUpdate()\r\n     LetzteDatensaetzeAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Anpassen der Bezeichnung des aktuellen Datensatzes in der Tabelle der zuletzt ge&ouml;ffneten Datens&auml;tze<\/span><\/b><\/p>\n<h2>Anweisungen von Form_Current in eigene Routine ausgliedern<\/h2>\n<p>Ganz einfach: Wenn der Benutzer einen Datensatz aktualisiert hat, soll genau das gleiche geschehen, als wenn ein Datensatz angezeigt wurde &#8211; der aktuelle Datensatz soll als neuer Datensatz in der Tabelle <b>tblKundenZuletzt <\/b>angelegt werden.<\/p>\n<p>Daher erstellen wir eine neue Prozedur namens <b>LetzteDatensaetzeAktualisieren <\/b>und f&uuml;gen dieser alle Anweisungen der Prozedur <b>Form_Current <\/b>hinzu, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird und die wir bereits weiter oben erl&auml;utert haben. <b>LetzteDatensaetzeAktualisieren <\/b>sieht also in gek&uuml;rzter Form wie folgt aus.<\/p>\n<p>Es gibt nur einen Unterschied zu der vorherigen Version &#8211; die Anweisung zum Aktualisieren des Listenfeldes haben wir aus der <b>If&#8230;Then<\/b>-Bedingung herausgenommen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>LetzteDatensaetzeAktualisieren()\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>strINSERT<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDELETE<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!KundeID)<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!lstKundenZuletzt.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Ereignisprozedur <b>Form_Current <\/b>passen wir dementsprechend wie folgt an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     LetzteDatensaetzeAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das war es schon: Wenn der Benutzer nun eine &Auml;nderung an einem Datensatz vornimmt und den Datensatz speichert, l&ouml;st dies das Ereignis <b>Nach Aktualisierung <\/b>auf, welches wiederum die Routine <b>LetzteDatensaetzeAktualisieren <\/b>aufruft.<\/p>\n<h2>Einen neuen, leeren Datensatz anzeigen<\/h2>\n<p>Wie aber reagiert die bisher erstellte Version darauf, wenn wir nach dem Anzeigen einiger Datens&auml;tze zu einem neuen, leeren Datensatz springen<\/p>\n<p>Wir leeren der besseren &Uuml;bersicht halber einmal die Tabelle <b>tblKundenZuletzt <\/b>und &ouml;ffnen das Formular erneut. Dies speichert direkt den Datensatz mit dem Wert <b>1 <\/b>im Feld <b>KundeID<\/b> in der Tabelle <b>tblKundenZuletzt<\/b>, zeigt diesen aber noch nicht an, da der aktuell im Formular angezeigte Datensatz ja nicht im Listenfeld erscheinen soll.<\/p>\n<p>Springen wir zum zweiten Datensatz, erscheint der erste Datensatz in der Liste, der zweite jedoch wie gew&uuml;nscht noch nicht. Dann klicken wir im Bereich der Navigationsschaltfl&auml;chen auf die Schaltfl&auml;che zum Anzeigen eines neuen, leeren Datensatzes.<\/p>\n<p>Das Ergebnis &uuml;berrascht: Das Formular zeigt zwar den gew&uuml;nschten neuen, leeren Datensatz an, aber das Listenfeld ist pl&ouml;tzlich leer! Das liegt aber nicht daran, dass die zugrunde liegende Tabelle leer ist, dort befinden sich die zwei zuvor angezeigten Datens&auml;tze.<\/p>\n<p>Der Grund, warum das Listenfeld keine Daten anzeigt, ist nicht so einfach zu finden. Um zu verstehen, was hier geschieht, schauen wir uns das Kriterium f&uuml;r die zugrunde liegende Abfrage an. Dieses lautet:<\/p>\n<pre>... WHERE KundeID&lt;&gt;[Forms]![frmKundenZuletzt]![KundeID]<\/pre>\n<p>In dem Moment, wo wir einen neuen, leeren Datensatz im Formular anzeigen, hat das Prim&auml;rschl&uuml;sselfeld <b>KundeID <\/b>der Tabelle <b>tblKunden <\/b>noch den Wert <b>Null<\/b>. Das Kriterium lautet also dann, wenn wir diesen Wert einsetzen:<\/p>\n<pre>... WHERE KundeID&lt;&gt;Null<\/pre>\n<p>Normalerweise w&uuml;rde man denken, dass dieses Kriterium alle Datens&auml;tze liefert, deren Feld <b>KundeID <\/b>einen Wert enth&auml;lt, der nicht gleich <b>Null <\/b>ist. Allerdings bildet die Abfrage aus dem Ausdruck <b>KundeID<>Null <\/b>den Wert <b>Null<\/b>. Das ist etwa so, als wenn Sie eine Zeichenkette und den Wert <b>Null<\/b> mit dem Plus-Operator verbinden wollen.<\/p>\n<p>Wann immer ein Element einer Verkettung den Wert <b>Null <\/b>hat, ist auch die Verkettung <b>Null<\/b>. Wir wollen noch versuchen, dies konkret nachzuweisen. Dazu erstellen wir eine neue, leere Abfrage und f&uuml;gen dem ersten Feld lediglich den folgenden Ausdruck zu:<\/p>\n<pre>Test: IstNull(123&lt;&gt;[Forms]![frmKundenZuletzt]![KundeID])<\/pre>\n<p>Wenn Sie diese Abfrage aufrufen, wenn im Formular <b>frmKundenZuletzt<\/b> ein neuer, leerer Datensatz mit dem Wert <b>Null <\/b>im Feld <b>KundeID <\/b>angezeigt wird, liefert sie das Ergebnis aus Bild 9. Das Ergebnis lautet <b>-1<\/b>, also ist <b>IstNull <\/b>wahr, also liefert <b>123<>Null <\/b>den Wert <b>Null<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_009.png\" alt=\"Ergebnis einer Abfrage mit einem Vergleich mit Null\" width=\"424,5589\" height=\"154,6082\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ergebnis einer Abfrage mit einem Vergleich mit Null<\/span><\/b><\/p>\n<p>Wie kommen wir aus diesem Dilemma wieder heraus Ganz einfach: Wir fassen einfach den Vergleichsausdruck wie in Bild 10 in die Funktion <b>Nz <\/b>ein, die den Wert <b>0 <\/b>zur&uuml;ckliefern soll, wenn der enthaltene Ausdruck den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_010.png\" alt=\"Entwurf einer Abfrage f&uuml;r die zuletzt angezeigten Kunden\" width=\"674,559\" height=\"342,6672\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Entwurf einer Abfrage f&uuml;r die zuletzt angezeigten Kunden<\/span><\/b><\/p>\n<p>Zeigt das Formular nun einen neuen, leeren Datensatz an, ist <b>KundeID <\/b>gleich <b>Null <\/b>und als Vergleichswert macht die Abfrage daraus <b>0<\/b>. Die Abfrage liefert dann alle Eintr&auml;ge zur&uuml;ck, deren Wert im Feld <b>KundeID<\/b> nicht den Wert <b>0 <\/b>hat, was allen bisher angelegten Eintr&auml;gen entspricht.<\/p>\n<p>Legen Sie dann einen neuen Datensatz an und speichern diesen, l&ouml;st dies das Ereignis <b>Nach Aktualisierung <\/b>aus, was wiederum die Prozedur <b>LetzteDatensaetzeAktualisieren <\/b>aufruft und den neuen Datensatz in die Tabelle <b>tblKundenZuletzt <\/b>eintr&auml;gt.<\/p>\n<h2>L&ouml;schen von Elementen aus der Tabelle der zuletzt aufgerufenen Datens&auml;tze<\/h2>\n<p>Eine weitere Aufgabe besteht darin, beim L&ouml;schen von Eintr&auml;gen in der Tabelle <b>tblKunden <\/b>auch eventuell vorhandene, passende Eintr&auml;ge aus der Tabelle <b>tblKundenZuletzt <\/b>zu l&ouml;schen.<\/p>\n<p>Daf&uuml;r gibt es verschiedene M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir gehen davon aus, dass Kunden nur &uuml;ber das Formular <b>frmKundenZuletzt <\/b>gel&ouml;scht werden k&ouml;nnen und verwenden dessen L&ouml;schen-Ereignisse, um direkt die Eintr&auml;ge der Tabelle <b>tblKundenZuletzt <\/b>mit zu l&ouml;schen.<\/li>\n<li>Wir rufen beim &Ouml;ffnen des Formulars <b>frmKundenZuletzt <\/b>eine Prozedur auf, die alle Eintr&auml;ge aus <b>tblKundenZuletzt <\/b>entfernt, zu denen es keinen passenden Eintrag mehr in der Tabelle <b>tblKunden <\/b>gibt. Wenn Sie diese Variante nutzen wollen, m&uuml;ssen Sie au&szlig;erdem die zuvor genannte Option nutzen, damit w&auml;hrend der Benutzung des Formulars gel&ouml;schte Kunden ebenfalls direkt aus der Liste gel&ouml;scht werden.<\/li>\n<li>Wir legen in der Tabelle <b>tblKunden <\/b>ein Datenmakro an, mit dem wir auf das L&ouml;schen von Eintr&auml;gen reagieren und eventuell vorhandene Eintr&auml;ge aus der Tabelle <b>tblKundenZuletzt <\/b>mit l&ouml;schen.<\/li>\n<li>Oder wir erstellen eine Verkn&uuml;pfung mit referenzieller Integrit&auml;t zwischen den beiden Tabellen <b>tblKunden <\/b>und <b>tblKundenZuletzt <\/b>und legen f&uuml;r die Beziehung au&szlig;erdem die L&ouml;schweitergabe fest. Dann w&uuml;rde das L&ouml;schen von Eintr&auml;gen aus der Tabelle <b>tblKunden <\/b>automatisch dazu f&uuml;hren, dass damit verkn&uuml;pfte Eintr&auml;ge aus der Tabelle <b>tblKundenZuletzt <\/b>ebenfalls gel&ouml;scht werden.<\/li>\n<\/ul>\n<p>Wir machen es uns einfach und gehen davon aus, dass die Kunden nur &uuml;ber das Formular <b>frmKundenZuletzt <\/b>bearbeitet werden k&ouml;nnen. Wobei das auch nicht so einfach ist, denn wir m&uuml;ssen noch beachten, ob die Option aktiviert ist, die zur Anzeige von Meldungen wie der aus Bild 11 f&uuml;hrt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_011.png\" alt=\"Meldung beim L&ouml;schen eines Datensatzes\" width=\"700\" height=\"129,3793\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Meldung beim L&ouml;schen eines Datensatzes<\/span><\/b><\/p>\n<p>Zusammengefasst ben&ouml;tigen wir nun Prozeduren f&uuml;r die Ereignisse <b>Beim L&ouml;schen<\/b> und <b>Nach L&ouml;schbest&auml;tigung <\/b>und noch eine Variable, die insgesamt wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>lngKundeDeleteID<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Delete(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>GetOption(\"Confirm Record Changes\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         KundeZuletztLoeschen Me!KundeID\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngKundeDeleteID = Me!KundeID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_AfterDelConfirm(Status<span style=\"color:blue;\"> As Integer<\/span>)\r\n     KundeZuletztLoeschen lngKundeDeleteID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Erl&auml;uterung, warum die zuvor angef&uuml;hrten Prozeduren so aussehen, beschreiben wir im Detail im Beitrag <b>L&ouml;schereignisse und -optionen im Zusammenspiel <\/b>(<b>www.access-im-unternehmen.de\/1366<\/b>).<\/p>\n<p>An dieser Stelle ist wichtig, dass entweder bei Ausbleiben der Best&auml;tigungsmeldung oder beim Erscheinen und Best&auml;tigen der Meldung die folgende Prozedur namens <b>KundeZuletztLoeschen <\/b>aufgerufen wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KundeZuletztLoeschen(lngKundeID<span style=\"color:blue;\"> As Long<\/span>)\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>strDELETE<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strDELETE = \"DELETE FROM tblKundenZuletzt  WHERE KundeID = \" & lngKundeID\r\n     db.Execute strDELETE, dbFailOnError\r\n     Me!lstKundenZuletzt.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese erh&auml;lt den Wert des Feldes <b>KundeID <\/b>als Parameter und stellt eine L&ouml;schabfrage zusammen, die beispielsweise wie folgt aussieht:<\/p>\n<pre>DELETE FROM tblKundenZuletzt WHERE KundeID = 123<\/pre>\n<p>Diese wird im Anschluss mit der <b>Execute<\/b>-Methode ausgef&uuml;hrt. Au&szlig;erdem wird das Listenfeld <b>lstKundenZuletzt <\/b>aktualisiert.<\/p>\n<h2>Maximale Anzahl zuletzt ge&ouml;ffneter Datens&auml;tze<\/h2>\n<p>Eine weitere Frage ist, wie viele Datens&auml;tze Sie im Listenfeld der zuletzt ge&ouml;ffneten Datens&auml;tze anzeigen wollen und ob Sie &uuml;berhaupt eine Begrenzung w&uuml;nschen.<\/p>\n<p>Die Folgefrage w&auml;re dann: Auf welche Weise schr&auml;nken wir die Anzeige ein Dazu g&auml;be es zwei Ideen:<\/p>\n<ul>\n<li>Wenn die Tabelle <b>tblKundenZuletzt <\/b>bereits die maximal gew&uuml;nschte Anzahl Eintr&auml;ge enth&auml;lt, l&ouml;schen wir den jeweils &auml;ltesten Eintrag aus der Tabelle.<\/li>\n<li>Wir l&ouml;schen keinen Eintrag aus <b>tblKundenZuletzt<\/b>, zeigen aber nur eine bestimmte Anzahl Datens&auml;tze im Listenfeld an.<\/li>\n<\/ul>\n<p>Wenn Sie die Anzahl nicht begrenzen wollen, ist die nat&uuml;rliche Grenze die Anzahl der vorhandenen Kunden &#8211; irgendwann hat der Benutzer diese vielleicht alle einmal durchgebl&auml;ttert und so sind sie dann alle in der Tabelle <b>tblKundenZuletzt <\/b>aufgef&uuml;hrt.<\/p>\n<p>Wir gehen allerdings davon aus, dass die Anzahl begrenzt sein soll, beispielsweise auf zehn. Die beiden vorgestellten Varianten schauen wir uns nacheinander an.<\/p>\n<h2>Alte Eintr&auml;ge l&ouml;schen, wenn maximale Anzahl erreicht ist<\/h2>\n<p>Diese L&ouml;sung w&uuml;rde etwa wie folgt aussehen &#8211; als Erstes deklarieren wir eine passende Konstante mit der Anzahl der maximal anzuzeigenden Datens&auml;tze:<\/p>\n<pre>Const clngAnzahlLetzteKunden<span style=\"color:blue;\"> As Long<\/span> = 5<\/pre>\n<p>Dann f&uuml;gen wir der Prozedur <b>LetzteDatensaetzeAktualisieren <\/b>einige Zeilen hinzu, die wie in Listing 3 aussehen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>LetzteDatensaetzeAktualisieren()\r\n     ...\r\n     <span style=\"color:blue;\">Do While<\/span> DCount(\"KundeZuletztID\", \"tblKundenZuletzt\") &gt; clngAnzahlLetzteKunden + 1\r\n         strDELETE = \"DELETE FROM tblKundenZuletzt WHERE KundeZuletztID = (SELECT TOP 1 KundeZuletztID \" _\r\n             & \"FROM tblKundenZuletzt)\"\r\n         db.Execute strDELETE, dbFailOnError\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!lstKundenZuletzt.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Erweiterung der Prozedur LetzteDatensaetzeAktualisieren zum Herausl&ouml;schen &uuml;berz&auml;hliger Eintr&auml;ge<\/span><\/b><\/p>\n<p>Hier durchlaufen wir eine <b>Do While<\/b>-Schleife solange, bis die Anzahl der in der Tabelle enthaltenen Eintr&auml;ge der Anzahl aus der Konstanten <b>clngAnzahlLetzteKunden <\/b>plus Eins entspricht. Plus Eins deshalb, weil der aktuell angezeigte Datensatz immer bereits in der Tabelle <b>tblKundenZuletzt <\/b>enthalten ist, aber nicht angezeigt wird.<\/p>\n<p>Die <b>DELETE<\/b>-Anweisung innerhalb der <b>Do While<\/b>-Schleife l&ouml;scht den aktuell ersten Datensatz der Tabelle <b>tblKundenZuletzt<\/b>, also den mit dem kleinsten Wert im Feld <b>KundeZuletztID <\/b>&#8211; und der sich somit am l&auml;ngsten in der Tabelle befindet. Die ID dieses Datensatzes ermittelt die folgende Unterabfrage:<\/p>\n<pre>SELECT TOP 1 KundeZuletztID FROM tblKundenZuletzt <\/pre>\n<p>Das einzige Problem dieser Vorgehensweise taucht auf, wenn Sie einen neuen, leeren Datensatz anzeigen. Dann sind sechs Datens&auml;tze in der Tabelle und alle werden angezeigt, weil der neue, leere Datensatz ja noch keinen Prim&auml;rschl&uuml;sselwert hat und dieser entsprechend nicht aus der Anzeige herausgefiltert wird.<\/p>\n<p>Um diesen kleinen Sch&ouml;nheitsfehler zu beheben, k&ouml;nnen Sie noch die nachfolgend beschriebene Technik hinzuf&uuml;gen.<\/p>\n<h2>Nur die x neuesten Eintr&auml;ge anzeigen<\/h2>\n<p>Um die nun beschriebene Anpassung unabh&auml;ngig von der vorherigen ausprobieren zu k&ouml;nnen, kommentieren wir die <b>Do While<\/b>-Schleife vor&uuml;bergehend wieder aus.<\/p>\n<p>Dann &ouml;ffnen Sie nochmals den Entwurf der Abfrage, die wir f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>des Listenfeldes hinterlegt haben. F&uuml;r diese zeigen Sie nun das Eigenschaftenblatt an.<\/p>\n<p>Wenn dieses noch nicht angezeigt wird, &ouml;ffnen Sie es mit einem Rechtsklick auf den grauen Hintergrund im oberen Bereich des Abfrageentwurfs und anschlie&szlig;ende Auswahl des Kontextmen&uuml;eintrags <b>Eigenschaften<\/b>.<\/p>\n<p>Hier stellen Sie nun die Eigenschaft <b>Spitzenwerte <\/b>auf <b>5 <\/b>ein &#8211; oder auf den jeweils gew&uuml;nschten Wert f&uuml;r die maximal anzuzeigenden Eintr&auml;ge (siehe Bild 12). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1365_012.png\" alt=\"Einstellen der maximalen Anzahl\" width=\"649,559\" height=\"335,2269\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Einstellen der maximalen Anzahl<\/span><\/b><\/p>\n<p>Da wir das Abfrageergebnis bereits absteigend nach dem Wert im Feld <b>KundeZuletztID <\/b>sortieren, erhalten wir genau die richtigen f&uuml;nf Eintr&auml;ge.<\/p>\n<p>Sie k&ouml;nnen die beiden vorgenannten Methoden kombinieren, um sowohl nur eine maximale Anzahl von Datens&auml;tzen im Listenfeld anzuzeigen als auch um die Menge der Datens&auml;tze in der Tabelle <b>tblKundenZuletzt <\/b>&uuml;berschaubar zu halten.<\/p>\n<p>Wenn Sie beide Methoden nutzen, bedenken Sie nur, dass Sie die maximale Anzahl gegebenenfalls an beiden Stellen, also sowohl f&uuml;r die Konstante im Code als auch f&uuml;r die Eigenschaft <b>Spitzenwerte<\/b> im Abfrageentwurf einstellen m&uuml;ssen.<\/p>\n<p>Sie k&ouml;nnen die Zeilen zum L&ouml;schen der &uuml;berz&auml;hligen Datens&auml;tze in der Tabelle <b>tblKundenZuletzt <\/b>nat&uuml;rlich auch nur einmal etwa beim &Ouml;ffnen oder Schlie&szlig;en des Formulars einf&uuml;gen, wenn Sie parallel &uuml;ber die Abfrage nur die f&uuml;r <b>Spitzenwerte <\/b>angegebene Menge an Datens&auml;tzen zur&uuml;ckliefern. In der Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, sieht dies beispielsweise wie in Listing 4 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\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>strDELETE<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> DCount(\"KundeZuletztID\", \"tblKundenZuletzt\") &gt; clngAnzahlLetzteKunden + 1\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         strDELETE = \"DELETE FROM tblKundenZuletzt WHERE KundeZuletztID = (SELECT TOP 1 KundeZuletztID \" _\r\n             & \"FROM tblKundenZuletzt)\"\r\n         db.Execute strDELETE, dbFailOnError\r\n         DoEvents\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: L&ouml;schen &uuml;berz&auml;hliger Eintr&auml;ge beim Laden des Formulars<\/span><\/b><\/p>\n<h2>Liste leeren<\/h2>\n<p>Um die Liste zu leeren, f&uuml;gen wir &uuml;ber der Liste noch eine Schaltfl&auml;che namens <b>cmdLeeren<\/b> hinzu. Diese f&uuml;hrt die folgende Prozedur aus und l&ouml;scht damit alle Eintr&auml;ge der Tabelle <b>tblKundenZuletzt<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLeeren_Click()\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>strDELETE<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strDELETE = \"DELETE FROM tblKundenZuletzt\"\r\n     db.Execute strDELETE, dbFailOnError\r\n     LetzteDatensaetzeAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie Sie ein Formular um ein Listenfeld erweitern, das die zuletzt angezeigten Datens&auml;tze des Formulars anzeigt. Dieses Feature ist sehr praktisch, wenn Sie zum Beispiel gerade Kundendaten eingeben und Ihnen auff&auml;llt, dass Sie beim vorher bearbeiteten Kunden noch eine &Auml;nderung vornehmen wollen &#8211; dann k&ouml;nnen Sie diesen per Doppelklick auf den passenden Eintrag im Listenfeld direkt anzeigen.<\/p>\n<p>Und da der zuvor betrachtete Kunde dann ganz oben in der Liste eingef&uuml;gt wird, k&ouml;nnen Sie genauso schnell wieder zu dessen Datensatz zur&uuml;ckspringen.<\/p>\n<p>Es gibt noch weitere Ideen, die wir in folgenden Beitr&auml;gen umsetzen werden. So lie&szlig;e sich beispielsweise die Liste der zuletzt verwendeten Kunden direkt in das Ribbon integrieren. Wie das gelingt, zeigen wir im Beitrag <b>Zuletzt verwendete Datens&auml;tze im Ribbon <\/b>(<b>www.access-im-unternehmen.de\/1371<\/b>).<\/p>\n<p>Au&szlig;erdem w&auml;re es praktisch, wenn man die hier vorgestellte Funktionalit&auml;t, die ja prinzipiell f&uuml;r alle m&ouml;glichen Formulare praktisch ist, in eine Klasse auslagern und flexibel einsetzen k&ouml;nnte.<\/p>\n<p>Auch dazu haben wir einen eigenen Beitrag namens <b>Zuletzt verwendete Datens&auml;tze per Klasse <\/b>(<b>www.access-im-unternehmen.de\/1374<\/b>) vorgesehen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ZuletztBenutzteDatensaetzePerListenfeld.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/83759D37-F2EB-4B20-85A7-FCCA7727EF4A\/aiu_1365.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine sehr praktische Funktion findet sich in den Office-Anwendungen und auch in vielen anderen Produkten. Wo auch immer Dateien verwendet werden, finden Sie beim &Ouml;ffnen der jeweiligen Anwendung eine Liste der zuletzt verwendeten Dateien vor. Warum sollte man dies nicht auch in einer Access-Datenbank nutzen, um die zuletzt angezeigten Datens&auml;tze in Formularen zur Auswahl anzubieten Wenn Sie zum Beispiel eine Bestellverwaltung nutzen, k&ouml;nnte es sehr sinnvoll sein, die zuletzt angezeigten oder bearbeiteten Kunden in einer Schnellauswahl zum erneuten Aufrufen vorzufinden. Wie das gelingt und welche Erweiterungen dazu notwendig sind, zeigt der vorliegende Beitrag.<\/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":[662022,66032022,44000023],"tags":[],"class_list":["post-55001365","post","type-post","status-publish","format-standard","hentry","category-662022","category-66032022","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Zuletzt verwendete Datens&auml;tze per Listenfeld - 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\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zuletzt verwendete Datens&auml;tze per Listenfeld\" \/>\n<meta property=\"og:description\" content=\"Eine sehr praktische Funktion findet sich in den Office-Anwendungen und auch in vielen anderen Produkten. Wo auch immer Dateien verwendet werden, finden Sie beim &Ouml;ffnen der jeweiligen Anwendung eine Liste der zuletzt verwendeten Dateien vor. Warum sollte man dies nicht auch in einer Access-Datenbank nutzen, um die zuletzt angezeigten Datens&auml;tze in Formularen zur Auswahl anzubieten Wenn Sie zum Beispiel eine Bestellverwaltung nutzen, k&ouml;nnte es sehr sinnvoll sein, die zuletzt angezeigten oder bearbeiteten Kunden in einer Schnellauswahl zum erneuten Aufrufen vorzufinden. Wie das gelingt und welche Erweiterungen dazu notwendig sind, zeigt der vorliegende Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-31T18:39:30+00:00\" \/>\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=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Zuletzt verwendete Datens&auml;tze per Listenfeld\",\"datePublished\":\"2022-05-31T18:39:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/\"},\"wordCount\":4856,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"3\\\/2022\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/\",\"name\":\"Zuletzt verwendete Datens&auml;tze per Listenfeld - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-05-31T18:39:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zuletzt verwendete Datens&auml;tze per Listenfeld\"}]},{\"@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":"Zuletzt verwendete Datens&auml;tze per Listenfeld - 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\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/","og_locale":"de_DE","og_type":"article","og_title":"Zuletzt verwendete Datens&auml;tze per Listenfeld","og_description":"Eine sehr praktische Funktion findet sich in den Office-Anwendungen und auch in vielen anderen Produkten. Wo auch immer Dateien verwendet werden, finden Sie beim &Ouml;ffnen der jeweiligen Anwendung eine Liste der zuletzt verwendeten Dateien vor. Warum sollte man dies nicht auch in einer Access-Datenbank nutzen, um die zuletzt angezeigten Datens&auml;tze in Formularen zur Auswahl anzubieten Wenn Sie zum Beispiel eine Bestellverwaltung nutzen, k&ouml;nnte es sehr sinnvoll sein, die zuletzt angezeigten oder bearbeiteten Kunden in einer Schnellauswahl zum erneuten Aufrufen vorzufinden. Wie das gelingt und welche Erweiterungen dazu notwendig sind, zeigt der vorliegende Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-05-31T18:39:30+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Zuletzt verwendete Datens&auml;tze per Listenfeld","datePublished":"2022-05-31T18:39:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/"},"wordCount":4856,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","3\/2022","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/","url":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/","name":"Zuletzt verwendete Datens&auml;tze per Listenfeld - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-05-31T18:39:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Zuletzt_verwendete_Datensaetze_per_Listenfeld\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Zuletzt verwendete Datens&auml;tze per Listenfeld"}]},{"@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\/55001365","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=55001365"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001365\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}