{"id":55000942,"date":"2014-08-01T00:00:00","date_gmt":"2020-05-22T21:11:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=942"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Vorherige_Datensaetze_anzeigen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/","title":{"rendered":"Vorherige Datens&auml;tze anzeigen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In Detailformularen zeigen Sie Datens&auml;tze an, bearbeiten oder betrachten diese und schlie&szlig;en dann das Formular oder wechseln zum n&auml;chsten Datensatz. In vielen F&auml;llen m&ouml;chten Sie aber dann vielleicht noch einmal zu einem der zuvor bearbeiteten Datens&auml;tze &#8211; und gegebenenfalls wieder zur&uuml;ck. Solch eine Funktion bietet Access nicht, dort k&ouml;nnen Sie &uuml;ber die Navigationsschaltfl&auml;chen nur durch die Datens&auml;tze in der Reihenfolge der Datenherkunft springen. Wir statten in diesem Beitrag ein Formular mit einer Historie aus, wie Sie sie auch vom Internet-Browser kennen.<\/b><\/p>\n<p>Im Internet-Browser starten Sie beispielsweise mit einer Google-Suche, finden dann in der Ergebnisliste eine Seite und rufen diese dann auf. Dort f&auml;llt Ihnen ein weiterer Links ins Auge, den Sie sich anschauen. Sie entscheiden sich, dass Sie doch wieder zum vorherigen Link zur&uuml;ckwechseln m&ouml;chten. Bringt dieser nicht das gew&uuml;nschte Ergebnis, soll es wieder zur&uuml;ck zum Suchergebnis gehen, von wo Sie entweder den n&auml;chsten Treffer betrachten oder vielleicht sogar die Seite mit den folgenden Treffern aufrufen.<\/p>\n<p>Wie auch immer dies l&auml;uft: Die Vor- und Zur&uuml;ck-Tasten des Browsers nehmen Ihnen hier eine Menge Arbeit ab. Dabei bieten diese die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Sie klicken direkt auf die Vor- oder Zur&uuml;ck-Taste, um zur folgenden oder vorherigen Seite zu springen.<\/li>\n<li>Sie klicken auf die Pfeile und halten die Maustaste gedr&uuml;ckt. Der Internet-Explorer zeigt dann beispielsweise die Titel der zuletzt besuchten Seiten an (s. Bild 1).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_002.png\" alt=\"Historie im Internet-Explorer\" width=\"575\" height=\"348,0016\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Historie im Internet-Explorer<\/span><\/b><\/p>\n<li>Wenn Sie dort auf den Eintrag <b>Verlauf <\/b>klicken, k&ouml;nnen Sie sogar die zuletzt besuchten Seiten inklusive Datum aufrufen (s. Bild 2).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_003.png\" alt=\"Anzeige des Verlaufs\" width=\"450\" height=\"327,1962\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anzeige des Verlaufs<\/span><\/b><\/p>\n<\/ul>\n<p>Das sind interessante Aussichten &#8211; vor allem, wenn man sich vorstellt, dies etwa auf ein Kunden-Formular zu &uuml;bertragen und mal eben schnell die Kunden zu betrachten, die man zuletzt oder vor zwei Tagen bearbeitet hat.<\/p>\n<p>Also wollen wir uns nun an die Umsetzung dieser n&uuml;tzlichen Funktion f&uuml;r ein Access-Formular machen.<\/p>\n<p><b>Vorgaben<\/b><\/p>\n<p>Zuvor m&uuml;ssen wir noch ein paar Definitionen treffen, die sich auf das Verhalten der Schaltfl&auml;chen beziehen. Wenn Sie sich nur vorw&auml;rts durch die Kunden bewegen, ist es kein Problem &#8211; alle bisher besichtigten Kundendatens&auml;tze werden dann in der richtigen Reihenfolge in der Liste der zuvor betrachteten Kunden abgelegt.<\/p>\n<p>Was aber geschieht, wenn ich mich vom aktuellen Datensatz zu dem zuvor betrachteten Datensatz bewege und dann einen anderen Datensatz aufrufe als den, von dem ich gerade komme Sprich: Ich schaue mir erst Datensatz A an, dann Datensatz B, gehe zu Datensatz A zur&uuml;ck und rufe dann Datensatz C auf. Im Browser wird dies so gel&ouml;st, dass Datensatz B in diesem Fall aus der Reihenfolge verschwindet. Im Verlauf werden alle Seiten angezeigt. Dies wollen wir auch so umsetzen.<\/p>\n<p><b>Ausgangsformular<\/b><\/p>\n<p>Wir beginnen mit einem Formular, das wie in Bild 3 aussieht. Es verwendet die Tabelle <b>tblKunden<\/b> der Beispieldatenbank als Datenherkunft und zeigt alle Felder im Detailbereich an. Im Formularkopf haben wir ein Kombinationsfeld eingebaut, mit dem der Benutzer direkt zu jedem beliebigen Datensatz springen kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_001.png\" alt=\"Entwurf des Beispielformulars\" width=\"500\" height=\"533,1385\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf des Beispielformulars<\/span><\/b><\/p>\n<p>Das Kombinationsfeld hei&szlig;t <b>cboAuswahl <\/b>und soll immer beim Anzeigen eines Datensatzes direkt mit dem Datensatz gef&uuml;llt werden, der auch im Formular erscheint. Dazu m&uuml;ssen wir zun&auml;chst die Datensatzherkunft des Kombinationsfeldes auf die folgende Abfrage einstellen:<\/p>\n<pre>SELECT tblKunden.KundeID, tblKunden.Firma \r\nFROM tblKunden \r\nORDER BY tblKunden.Firma;<\/pre>\n<p>Damit das Kombinationsfeld nur den Inhalt des Feldes <b>Firma <\/b>anzeigt, aber nicht den des Feldes <b>KundeID<\/b>, stellen Sie die Eigenschaften <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein. Um das Kombinationsfeld beim Ausw&auml;hlen eines Datensatzes &uuml;ber die &uuml;brigen Elemente des Formulars wie etwa die Navigationsschaltfl&auml;chen mit dem Da-tensatz des Formulars zu synchronisieren, legen Sie die folgende Ereignispro-zedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cboAuswahl = Me!KundeID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese wird durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st.<\/p>\n<p>Nun m&uuml;ssen wir noch daf&uuml;r sorgen, dass das Formular auch nach der Auswahl eines Eintrags im Kombinationsfeld gleich den passenden Datensatz anzeigt. Dies erledigt die folgende Ereignisprozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAuswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst \"KundeID = \"  & Me!cboAuswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Vor-und-Zur&uuml;ck-Schaltfl&auml;che<\/b><\/p>\n<p>Wenn dies alles funktioniert, k&ouml;nnen wir uns der Erweiterung zuwenden. Dazu f&uuml;gen Sie neben dem Kombinationsfeld zwei Schaltfl&auml;chen hinzu, die Sie mit dem Kleiner- und dem Gr&ouml;&szlig;er-Zeichen als Beschriftung ausstatten. Die Schaltfl&auml;chen sollen <b>cmdVor <\/b>und <b>cmdZurueck <\/b>hei&szlig;en und jeweils eine eigene Ereignisprozedur beim Anklicken ausl&ouml;sen.<\/p>\n<p>Mit den Schaltfl&auml;chen sieht der Formularkopf nun wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_004.png\" alt=\"Kombinationsfeld zur Auswahl von Kunden-Datens&auml;tzen. Rechts die Schaltfl&auml;chen zum Vor- und Zur&uuml;ckbl&auml;ttern\" width=\"500\" height=\"370,3008\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Kombinationsfeld zur Auswahl von Kunden-Datens&auml;tzen. Rechts die Schaltfl&auml;chen zum Vor- und Zur&uuml;ckbl&auml;ttern<\/span><\/b><\/p>\n<p><b>Verlauf speichern<\/b><\/p>\n<p>Bevor wir uns an die Programmierung der Funktion f&uuml;r die Schaltfl&auml;chen begeben, m&uuml;ssen wir erst einmal eine M&ouml;glichkeit schaffen, die zuletzt besuchten Datens&auml;tze zu speichern. Dies wird ohne Zweifel eine Tabelle sein, da die Daten ja auch nach dem Schlie&szlig;en und erneutem &ouml;ffnen zur Verf&uuml;gung stehen sollen. Aber welche Felder ben&ouml;tigen wir in dieser Tabelle Die erste Frage, die sich stellt, ist die nach dem Prim&auml;rschl&uuml;sselfeld.<\/p>\n<p>Ben&ouml;tigen wir ein eigenes Prim&auml;rschl&uuml;sselfeld, wenn wir doch wahrscheinlich in einem Feld der Tabelle den Wert des Prim&auml;rschl&uuml;sselfeldes der Tabelle <b>tblKunden<\/b> speichern &#8211; also der Tabelle, f&uuml;r die wir die Zugriffe speichern m&ouml;chten Man k&ouml;nnte es tun, wenn man dieses Prim&auml;rschl&uuml;sselfeld zur Sortierung verwenden m&ouml;chte.<\/p>\n<p>Was aber ist, wenn man erst den Kunden A aufruft, dann Kunde B und Kunde C und schlie&szlig;lich wieder zu Kunde A zur&uuml;ckspringt Kunde A kann dann, wenn der Verlauf tats&auml;chlich in chronologischer Reihenfolge dargestellt werden soll, nicht mehr &uuml;ber den Prim&auml;rschl&uuml;sselwert an die richtige Position gebracht werden, da diese ja nicht ge&auml;ndert werden kann.<\/p>\n<p>Also vergeben wir keinen eigenen Autowert-Prim&auml;rschl&uuml;ssel f&uuml;r die Tabelle, sondern &uuml;bernehmen einfach den Prim&auml;rschl&uuml;ssel aus der Kundentabelle als eindeutiges Merkmal f&uuml;r die angezeigten Datens&auml;tze. Diesen ben&ouml;tigen wir dann sp&auml;ter auch, um einen der Kundendatens&auml;tze aus der Verlaufsliste heraus aufrufen zu k&ouml;nnen.<\/p>\n<p>Wie aber sortieren wir die Datens&auml;tze dann in chronologischer Reihenfolge, und wie bringen wir diese in Ordnung, wenn der Benutzer einen bereits im Verlauf befindlichen Kunden nochmals aufruft Zu diesem Zweck f&uuml;gen wir der Tabelle ein Feld namens <b>Zugriffszeit <\/b>hinzu. Diese nimmt Datum und Zeit des letzten Zugriffs auf diesen Datensatz auf.<\/p>\n<p>Auf diese Weise brauchen wir, wenn der Benutzer einen bereits in der Verlaufstabelle befindlichen Datensatz erneut aufruft, auch nur eine kleine &auml;nderung an diesem Datensatz vorzunehmen &#8211; n&auml;mlich den Wert im Feld Zugriffszeit zu aktualisieren.<\/p>\n<p>Wenn wir die Anzeige der Verlaufsliste dann absteigend nach dem Inhalt des Feldes Zugriffszeit sortieren, liefert diese immer die zuletzt verwendeten Datens&auml;tze zuerst.<\/p>\n<p>Die Tabelle zum Speichern des Verlaufs soll <b>tblVerlauf<\/b> hei&szlig;en und nimmt aktuell die Felder auf, die auch in der Entwurfsansicht in Bild 5 zu erkennen sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_005.png\" alt=\"Diese Tabelle speichert den Verlauf der zuletzt aufgerufenen Kunden.\" width=\"500\" height=\"322,7554\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Diese Tabelle speichert den Verlauf der zuletzt aufgerufenen Kunden.<\/span><\/b><\/p>\n<p>Noch nicht gesprochen haben wir &uuml;ber das letzte Feld dieser Tabelle namens <b>PopuplisteID<\/b>. Wir wollen ja wie im Internet Explorer sowohl eine Verlaufsliste mit der kompletten Historie der zuletzt aufgerufenen Kunden darstellen, aber auch Ziele f&uuml;r die beiden Schaltfl&auml;chen zum Anspringen des vorherigen und des n&auml;chsten Datensatzes speichern und diese auch in einem Popup-Listenfeld anzeigen. Letztere sollen allerdings nach dem Schlie&szlig;en des Formulars gel&ouml;scht und nach dem erneuten &ouml;ffnen und Ausw&auml;hlen von Datens&auml;tzen wieder gef&uuml;llt werden.<\/p>\n<p>F&uuml;r diese Liste wollen wir jeweils maximal sieben Eintr&auml;ge speichern. Wenn der Benutzer Kunde 1 ausw&auml;hlt, erh&auml;lt Kunde 1 in diesem Feld den Wert <b>0<\/b>. W&auml;hlt der Benutzer dann Kunde 2 aus, erh&auml;lt Kunde 1 den Wert <b>-1 <\/b>und Kunde 2 den Wert <b>0<\/b>. Folgt dann Kunde 3, erh&auml;lt Kunde 1 den Wert <b>-2<\/b>, Kunde 2 erh&auml;lt den Wert <b>-1 <\/b>und Kunde 3 den Wert <b>0<\/b>. Springt der Benutzer dann zu Kunde <b>2 <\/b>zur&uuml;ck, erh&auml;lt Kunde 1 den Wert <b>-1<\/b>, Kunde 2 den Wert <b>0 <\/b>und Kunde 3 den Wert <b>1 <\/b>im Feld <b>PopuplisteID<\/b>.<\/p>\n<p>Der aktuelle Kunde erh&auml;lt also immer den Wert <b>0<\/b>, die Liste wird immer in Richtung der positiven Zahlen erweitert. Was aber geschieht, wenn der Benutzer nun vom aktuellen Kunden (Nummer <b>0<\/b>) aus zum vorherigen Kunden springen kann (<b>-1<\/b>) und zum folgenden (<b>1<\/b>), aber einen neuen Kunden ausw&auml;hlt<\/p>\n<p>In diesem Fall wird der Pfad in Richtung positiver Zahlen gel&ouml;scht, der neue Kunde mit der Zahl <b>0 <\/b>und die &uuml;brigen mit <b>-1<\/b>, <b>-2 <\/b>und <b>-3 <\/b>versehen.<\/p>\n<p><b>Programmierung des Verlaufs<\/b><\/p>\n<p>Theoretisch h&ouml;rt sich das alles recht einfach an &#8211; in der Praxis ist es allerdings etwas komplizierter als erwartet.<\/p>\n<p>Vor allem solche Details wie das Einblenden der Popupliste nach l&auml;ngerem Dr&uuml;cken der beiden Schaltfl&auml;chen <b>cmdVorheriger <\/b>und <b>cmdNaechster<\/b> sind recht aufwendig zu programmieren.<\/p>\n<p><b>Die Popupliste<\/b><\/p>\n<p>Unter den Schaltfl&auml;chen <b>cmdVorheriger <\/b>und <b>cmdNaechster <\/b>m&uuml;ssen wir noch die Liste unterbringen, die beim l&auml;ngeren Dr&uuml;cken einer der beiden Schaltfl&auml;chen eingeblendet wird. Dies erledigen wir mit einem Listenfeld namens <b>lstPopupliste<\/b>, das wir wie in Bild 6 im Formular positionieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_006.png\" alt=\"Die Popupliste realisieren wir in Form eines Listenfeldes, das zun&auml;chst unsichtbar ist und nur bei Bedarf eingeblendet wird.\" width=\"450\" height=\"258,8929\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Popupliste realisieren wir in Form eines Listenfeldes, das zun&auml;chst unsichtbar ist und nur bei Bedarf eingeblendet wird.<\/span><\/b><\/p>\n<p>F&uuml;r dieses Listenfeld legen wir eine Datensatzherkunft namens <b>qryPopupliste <\/b>an.<\/p>\n<p>Diese sieht im Entwurf wie in Bild 7 aus und liefert alle Datens&auml;tze der Tabelle <b>tblVerlauf<\/b>, deren Feld <b>PopuplisteID <\/b>nicht leer ist &#8211; und zwar in absteigender Reihenfolge nach diesem Feld sortiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_011.png\" alt=\"Dies ist die Datensatzherkunft f&uuml;r die Popupliste.\" width=\"450\" height=\"290,6439\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Dies ist die Datensatzherkunft f&uuml;r die Popupliste.<\/span><\/b><\/p>\n<p><b>Popupliste beim Laden zur&uuml;cksetzen<\/b><\/p>\n<p>Wenn das Formular ge&ouml;ffnet wird, soll eine neue Historie der zuletzt verwendeten Datens&auml;tze geschaffen werden. Dies betrifft nicht den eigentlichen Verlauf in zeitlicher Abfolge &#8211; dieser soll immer erhalten bleiben.<\/p>\n<p>F&uuml;r die Auswahl eines der seit dem &ouml;ffnen des Formulars angezeigten Datens&auml;tze ist aber auch nur der Inhalt des Feldes <b>PopupListeID <\/b>der Tabelle <b>tblVerlauf <\/b>verantwortlich, sodass dieses Feld einfach nur beim Laden des Formulars geleert werden soll.<\/p>\n<p>Dies erledigt die Ereignisprozedur <b>Form_Load<\/b>, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird:<\/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;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"UPDATE tblVerlauf SET  PopuplisteID = NULL\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Speichern des aktuellen Datensatzes<\/b><\/p>\n<p>Die erste Aufgabe lautet, &uuml;berhaupt den aktuellen Datensatz in die Tabelle <b>tblVerlauf<\/b> einzutragen beziehungsweise die Position f&uuml;r die Anzeige in der Popup-liste der zuletzt verwendeten Datens&auml;tze zu speichern. Wann soll dieser &uuml;berhaupt gespeichert werden Direkt nach dem Anzeigen. Dies erledigen wir am einfachsten mit einer Ereignisprozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird.<\/p>\n<p>Diese Prozedur sieht wie in Listing 1 aus und stellt zun&auml;chst das Kombinationsfeld <b>cboAuswahl <\/b>auf den Datensatz ein, der auch im Formular angezeigt wird. Dann ruft sie eine Prozedur namens <b>VerlaufSpeichern <\/b>auf, welche den Prim&auml;rschl&uuml;sselwert und die Bezeichnung des aktuellen Datensatzes, hier den Wert des Feldes <b>Firma<\/b>, als Parameter erwartet. Diese Prozedur finden Sie in Listing 2: Sie legt einen neuen Datensatz in der Tabelle <b>tblVerlauf <\/b>an und tr&auml;gt dabei den Prim&auml;rschl&uuml;sselwert des Datensatzes (aus dem Parameter <b>lngPKID<\/b>), den Titel f&uuml;r die Anzeige im Popup-Listenfeld (aus <b>strTitel<\/b>) sowie Zeit und Datum ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>VerlaufSpeichern(lngPKID<span style=\"color:blue;\"> As Long<\/span>, strTitel<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     db.Execute \"INSERT INTO tblVerlauf(PKID, Titel, Zugriffszeit) VALUES(\" _\r\n         & lngPKID & \", ''\" & <span style=\"color:blue;\">Replace<\/span>(strTitel, \"''\", \"''''\") _\r\n         & \"'', \" & ISODatum(Now) & \")\", dbFailOnError\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3022<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"UPDATE tblVerlauf SET Zugriffszeit = \" & ISODatum(Now) _\r\n            & \" WHERE PKID = \" & lngPKID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Speichern des soeben aufgerufenen Datensatzes in der Tabelle tblVerlauf<\/span><\/b><\/p>\n<p>Sollte bereits ein Datensatz f&uuml;r diesen Kunden vorhanden sein, l&ouml;st der Versuch, diesen erneut anzulegen, den Fehler <b>3022 <\/b>aus. Diesen behandeln wir entsprechend, indem wir einfach dem bereits vorhandenen Datensatz den aktuelle Wert f&uuml;r Datum und Zeit zuweisen. Damit w&auml;re der aktuell ausgew&auml;hlte Datensatz also zumindest schon in der Tabelle <b>tblVerlauf <\/b>gespeichert.<\/p>\n<p>Die aufrufende Prozedur <b>Form_Current <\/b>blendet nun das Listenfeld <b>lstPopupliste <\/b>aus, da diese ja gegebenenfalls durch vorheriges Dr&uuml;cken einer der beiden Schaltfl&auml;chen <b>cmdVorheriger <\/b>oder <b>cmdNaechster <\/b>eingeblendet worden sein k&ouml;nnte. Dann ruft sie eine weitere Prozedur auf, die sich um das aktualisieren des Feldes <b>PopuplisteID <\/b>in der Tabelle <b>tblVerlauf <\/b>k&uuml;mmert &#8211; mehr dazu weiter unten.<\/p>\n<p>Schlie&szlig;lich sollen auch noch, wie beim Internet Explorer, die beiden Schaltfl&auml;chen <b>cmdVorheriger <\/b>und <b>cmdNaechster <\/b>aktiviert oder deaktiviert werden &#8211; je nachdem, ob in der Popupliste bereits Eintr&auml;ge stehen, die seit dem &ouml;ffnen des Formulars vor oder nach dem aktuellen Datensatz angezeigt wurden. Dazu pr&uuml;ft die Prozedur per <b>DLookup<\/b>-Funktion, ob die Tabelle <b>tblVerlauf <\/b>mindestens einen Datensatz enth&auml;lt, dessen Wert im Feld <b>PopuplisteID <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist. In diesem Fall blendet sie die Schaltfl&auml;che <b>cmdNaechster <\/b>ein, anderenfalls wird die Schaltfl&auml;che ausgeblendet. Gleiches geschieht wenige Zeilen danach mit der Schaltfl&auml;che <b>cmdVorheriger<\/b>.<\/p>\n<p><b>Popup-Liste aktualisieren<\/b><\/p>\n<p>Die Prozedur <b>PopuplisteAktualisieren <\/b>wird jeweils beim Anzeigen eines Datensatzes im Formular aufgerufen (s. Listing 3). Sie ermittelt zun&auml;chst die Anzahl der Eintr&auml;ge, die im Listenfeld <b>lstPopupliste<\/b> angezeigt werden sollen. Dies sind alle Datens&auml;tze der Tabelle <b>tblVerlauf<\/b>, f&uuml;r die im Feld <b>PopuplisteID<\/b> zuvor ein Zahlenwert hinterlegt wurde. Wenn das Formular soeben ge&ouml;ffnet wurde, ist dieser Wert <b>0<\/b> &#8211; daf&uuml;r hat die weiter oben beschriebene Prozedur <b>Form_Load <\/b>gesorgt, die das Feld <b>PopuplisteID <\/b>f&uuml;r alle Datens&auml;tze geleert hat.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>PopuplisteAktualisieren()\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>lngPositionDesAktuellenEintragsInPopupliste<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intDifferenz<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intAnzahlEintraege<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     intAnzahlEintraege = DCount(\"PKID\", \"tblVerlauf\", \"PopuplisteID IS NOT NULL\")\r\n     <span style=\"color:blue;\">If <\/span>intAnzahlEintraege = 0<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"UPDATE tblVerlauf SET PopuplisteID = 0 WHERE PKID = \" & Me!KundeID, dbFailOnError\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngPositionDesAktuellenEintragsInPopupliste = _\r\n             Nz(DLookup(\"PopuplisteID\", \"tblVerlauf\", \"PKID = \" & Me!KundeID), 99)\r\n         <span style=\"color:blue;\">If <\/span>lngPositionDesAktuellenEintragsInPopupliste = 99<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"UPDATE tblVerlauf SET PopuplisteID = NULL WHERE PopuplisteID &gt; 0\", dbFailOnError\r\n             db.Execute \"UPDATE tblVerlauf <span style=\"color:blue;\">Set<\/span> PopuplisteID = PopuplisteID - 1 &quot; _\r\n                &quot;WHERE PopuplisteID IS NOT NULL\"\r\n             db.Execute \"UPDATE tblVerlauf SET PopuplisteID = \" & DMax(\"PopuplisteID\", \"tblVerlauf\", _\r\n                 \"PopuplisteID IS NOT NULL\") + 1 & \" WHERE PKID = \" & Me!KundeID, dbFailOnError\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             intDifferenz = lngPositionDesAktuellenEintragsInPopupliste\r\n             db.Execute \"UPDATE tblVerlauf SET PopuplisteID = PopuplisteID - \" & intDifferenz _\r\n                 & \" WHERE PopuplisteID IS NOT NULL\", dbFailOnError\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\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 3: Aktualisieren der Werte f&uuml;r das Feld PopuplisteID der Tabelle tblVerlauf<\/span><\/b><\/p>\n<p>Wenn die Anzahl der Eintr&auml;ge also <b>0 <\/b>ist, wie es direkt nach dem &ouml;ffnen des Formulars der Fall ist, f&uuml;hrt die Prozedur gleich den <b>If<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung der Prozedur aus. Die einzige dort enthaltene Anweisung stellt den Wert des Feldes <b>PopuplisteID <\/b>f&uuml;r den aktuell angezeigten Datensatz auf den Wert <b>0 <\/b>ein. <b>0 <\/b>steht ja, wie weiter oben beschrieben, f&uuml;r den aktuell ge&ouml;ffneten Datensatz. In diesem Fall ist die Prozedur damit beendet. Die aufrufende Prozedur <b>Form_Current <\/b>pr&uuml;ft nun noch, ob eine der beiden Schaltfl&auml;chen <b>cmdVorheriger <\/b>oder <b>cmdNaechster <\/b>aktiviert wird werden muss, was aber nicht der Fall ist.<\/p>\n<p><b>Weiteren Datensatz ansehen<\/b><\/p>\n<p>Schauen wir uns an, was in der Prozedur <b>PopuplisteAktualisieren <\/b>geschieht, wenn der Benutzer nun einen weiteren Datensatz betrachtet. Dies l&ouml;st den <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung aus, denn nun gibt es ja bereits einen Datensatz, dessen Feld <b>PopuplisteID <\/b>gef&uuml;llt ist (hier mit dem Wert <b>0<\/b>). An dieser Stelle wissen wir noch nicht, dass bislang nur ein einziger Datensatz zur Popupliste hinzugef&uuml;gt wurde und dass der nun ausgew&auml;hlte Datensatz noch nicht dazugeh&ouml;rt. Daher pr&uuml;ft die Prozedur dies mit einem weiteren Aufruf der <b>DLookup<\/b>-Funktion, der diesmal untersucht, ob das Feld <b>PopuplisteID <\/b>f&uuml;r den aktuell im Formular angezeigten Datensatz bereits einen Wert enth&auml;lt. Ist dies nicht der Fall, liefert <b>DLook-up <\/b>den Wert <b>Null<\/b>, was durch die umschlie&szlig;ende <b>Nz<\/b>-Funktion in den Wert <b>99 <\/b>umgewandelt und in der Variablen <b>lngPositionDesAktuellenEintragsInPopupliste <\/b>gespeichert wird.<\/p>\n<p>Die nun folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob <b>lngPositionDesAktuellenEintragsInPopupliste <\/b>den Wert <b>99 <\/b>aufweist. In diesem Fall leert die Prozedur das Feld <b>PopuplisteID <\/b>f&uuml;r alle Datens&auml;tze, in denen dieses Feld einen Wert gr&ouml;&szlig;er als <b>0 <\/b>aufweist. Dies ist etwa f&uuml;r den Fall, dass der Benutzer Kunde 1, Kunde 2 und Kunde 3 aufruft, dann zu Kunde 2 zur&uuml;ckspringt und Kunde 4 aufruft &#8211; in diesem Fall soll Kunde 3 aus der Popupliste entfernt werden.<\/p>\n<p>Anschlie&szlig;end &auml;ndert die Prozedur den Wert des Feldes <b>PopuplisteID <\/b>f&uuml;r alle Datens&auml;tze, in denen dieses Feld nicht leer ist, indem es den Wert <b>1 <\/b>subtrahiert. F&uuml;r unseren zuvor angezeigten Datensatz &auml;ndert sich der Wert in diesem Feld also von <b>0 <\/b>auf <b>-1<\/b>. Dann stellt es den entsprechenden Wert f&uuml;r den aktuell angezeigten Datensatz in der Tabelle <b>tblVerlauf <\/b>auf den Wert <b>0 <\/b>ein. Der aktuelle Stand also: Ein Eintrag mit dem Wert <b>0<\/b>, einer mit <b>-1<\/b>. Schauen wir uns auf diese Weise noch die zwei weiteren Eintr&auml;ge an, weisen die vier Eintr&auml;ge die Werte <b>0<\/b>, <b>-1<\/b>, <b>-2 <\/b>und <b>-3 <\/b>im Feld <b>PopupListeID <\/b>der Tabelle <b>tblVerlauf <\/b>auf. Die Abfrage <b>qryVerlauf<\/b> zeigt diese Situation in Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_007.png\" alt=\"Vier Kunden mit dem Index f&uuml;r die Popup-Liste\" width=\"450\" height=\"179,8137\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Vier Kunden mit dem Index f&uuml;r die Popup-Liste<\/span><\/b><\/p>\n<p>Ausgehend davon soll nun einmal ein Datensatz ausgew&auml;hlt werden, der bereits im Verlauf enthalten ist. Dabei spielt es keine Rolle, ob Sie diesen &uuml;ber das Kombinationsfeld <b>cboAuswahl <\/b>ausw&auml;hlen oder &uuml;ber die Navigationsschaltfl&auml;chen des Formulars (sp&auml;ter kommen nat&uuml;rlich noch Prozeduren hinzu, mit denen Sie dies &uuml;ber die Schaltfl&auml;chen <b>cmdVorheriger <\/b>und <b>cmdNaechster <\/b>beziehungsweise &uuml;ber das Listenfeld <b>lstPopupliste <\/b>erledigen k&ouml;nnen).<\/p>\n<p>W&auml;hlen wir also nun beispielsweise den Datensatz aus, bei dem der Wert <b>-1 <\/b>im Feld <b>PopuplisteID <\/b>steht. Wir springen an dieser Stelle also quasi einen Datensatz zur&uuml;ck.<\/p>\n<p>Dies l&ouml;st wieder die Prozedur <b>Form_Current <\/b>aus, und diese startet die Prozedur <b>PopuplisteAktualisieren<\/b>. Wir ermitteln wieder den Wert des Feldes <b>PopuplisteID <\/b>des aktuellen Datensatzes und speichern diesen in der Variablen <b>lngPositionDesAktuellenEintragsInPopupliste<\/b>. Da dieser Wert nun nicht mehr <b>99<\/b>, sondern <b>-1 <\/b>betr&auml;gt, steuert die Prozedur in der inneren <b>If&#8230;Then<\/b>-Bedingung nun nicht den <b>If<\/b>-, sondern den <b>Else<\/b>-Teil an.<\/p>\n<p>Hier speichert die Prozedur den Wert von <b>lngPositionDesAktuellenEintragsInPopupliste <\/b>in der Variablen <b>intDifferenz<\/b>. <b>intDifferenz <\/b>enth&auml;lt also nun den Abstand des neu ausgew&auml;hlten Datensatzes von dem zuletzt ausgew&auml;hlten Datensatz. Dieser Wert wird ben&ouml;tigt, damit wir die Werte des Feldes <b>Popup-listeID <\/b>so verschieben k&ouml;nnen, dass der aktuell ausgew&auml;hlte Datensatz den Wert <b>0 <\/b>erh&auml;lt und alle anderen entsprechend angepasst werden. Dies erledigen wir in einer einzigen <b>UPDATE<\/b>-Anweisung, die f&uuml;r alle Datens&auml;tze, die &uuml;berhaupt einen Wert im Feld <b>PopuplisteID <\/b>eine Wert aufweisen, den in <b>intDifferenz <\/b>gespeicherten Wert subtrahiert.<\/p>\n<p>Das Ergebnis sieht nun wie in Bild 9 aus: Statt drei vorheriger Eintr&auml;ge gibt es nun zwei vorherige Eintr&auml;ge und einen folgenden Eintrag in der Tabelle.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_008.png\" alt=\"Der Kunde mit PKID = 3 ist nun der aktuell angezeigt Kunde.\" width=\"450\" height=\"179,8137\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Der Kunde mit PKID = 3 ist nun der aktuell angezeigt Kunde.<\/span><\/b><\/p>\n<p>Nun gibt es noch eine Konstellation, die wir beachten m&uuml;ssen. Was geschieht nun, wenn der Benutzer einen Datensatz ausw&auml;hlt, der noch nicht &uuml;ber das Feld <b>PopupListeID <\/b>als Eintrag der Popup-Liste markiert ist Der Plan ist, dass dieser Eintrag der neue aktuelle Eintrag wird. Die vom bisherigen aktuellen Eintrag aus als folgende Eintr&auml;ge markierten Datens&auml;tze sollen wegfallen, die &uuml;brigen werden entsprechend angepasst. Das Ergebnis soll wie in Bild 10 aussehen. Der Datensatz mit dem Wert <b>4 <\/b>im Feld <b>PKID <\/b>f&auml;llt weg, der neue Datensatz mit der <b>14 <\/b>erh&auml;lt den Wert <b>0 <\/b>im Feld <b>PopuplisteID <\/b>und bei den &uuml;brigen wird der Wert <b>1 <\/b>vom Feld <b>PopuplisteID <\/b>subtrahiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_009.png\" alt=\"Der bisher als folgender Datensatz markierte Kunde wird aus der Liste entfernt, die &uuml;brigen r&uuml;cken nach hinten.\" width=\"450\" height=\"179,8137\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Der bisher als folgender Datensatz markierte Kunde wird aus der Liste entfernt, die &uuml;brigen r&uuml;cken nach hinten.<\/span><\/b><\/p>\n<p>Dieser Fall wird ebenfalls im ersten Teil der inneren <b>If&#8230;Then<\/b>-Anweisung behandelt. <b>lngPositionDesAktuellenEintragsInPopupliste <\/b>erh&auml;lt hier den Wert <b>99<\/b>, da der Kunde ja noch nicht ausgew&auml;hlt wurde. Die erste der drei <b>UPDATE<\/b>-Anweisungen leert das Feld <b>PopuplisteID <\/b>f&uuml;r alle Datens&auml;tze, bei denen der Wert dieses Feldes gr&ouml;&szlig;er als <b>0 <\/b>ist. Die zweite stellt dieses Feld f&uuml;r den aktuellen Datensatz auf <b>0 <\/b>ein und zieht f&uuml;r alle &uuml;brigen Datens&auml;tze, deren Feld <b>PopuplisteID <\/b>nicht leer ist, den Wert <b>1 <\/b>ab.<\/p>\n<p><b>Vorherigen und n&auml;chsten Datensatz ausw&auml;hlen<\/b><\/p>\n<p>Damit haben wir bereits alle F&auml;lle abgedeckt und k&ouml;nnen uns nun um die Steuerelemente zum Ansteuern der als vorherige und n&auml;chste Datens&auml;tze markierten Kunden k&uuml;mmern.<\/p>\n<p>Dabei sind die Aktionen zum Ausw&auml;hlen des vorherigen und des n&auml;chsten Datensatzes sowie das Anzeigen der Liste der vorherigen und n&auml;chsten Datens&auml;tze eng miteinander verkn&uuml;pft.<\/p>\n<p>Der Hintergrund ist, dass Access kein Ereignis vorsieht, das reagiert, wenn man eine Schaltlf&auml;che eine gewisse Zeit gedr&uuml;ckt h&auml;lt. Genau dies ist aber das Ziel &#8211; wir wollen ja das Verhalten des Internet Explorers m&ouml;glichst genau nachstellen. Dazu soll ein einfacher Mausklick etwa auf die Schaltfl&auml;che <b>cmdVorheriger <\/b>den vorherigen Datensatz anzeigen. Ein l&auml;ngerer Klick hingegen soll das Listenfeld mit den zuletzt verwendeten Datens&auml;tzen einblenden (s. Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_942_010.png\" alt=\"Das Listenfeld zum Ausw&auml;hlen der vorherigen und der folgenden Datens&auml;tze in Aktion\" width=\"450\" height=\"414,5454\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Das Listenfeld zum Ausw&auml;hlen der vorherigen und der folgenden Datens&auml;tze in Aktion<\/span><\/b><\/p>\n<p>Warum ist dies so kompliziert Man k&ouml;nnte doch die Ereigniseigenschaft <b>Beim Klicken <\/b>nutzen, um direkt zum vorherigen oder folgenden zu springen und die Ereignisse <b>Bei Maustaste ab <\/b>und <b>Bei Maustaste auf <\/b>irgendwie nutzen, um das Listenfeld <b>lstPopupliste <\/b>einzublenden. Grunds&auml;tzlich ist das eine gute Idee, scheitert aber an den Eigenschaften der Ereignisse.<\/p>\n<p>Wenn wir eine der Schaltfl&auml;chen anklicken und schnell wieder loslassen, soll also nur das Ereignis ausgel&ouml;st werden, das wir f&uuml;r die Ereignisprozedur <b>Beim Klicken <\/b>hinterlegt haben. Erst, wenn wir die Schaltfl&auml;che l&auml;nger gedr&uuml;ckt halten, soll das Listenfeld eingeblendet werden (dies wollen wir in der Prozedur programmieren, die durch <b>Bei Maustaste ab <\/b>ausgel&ouml;st wird).  Wenn wir die Maustaste dann loslassen (l&ouml;st das Ereignis <b>Bei Maustaste auf <\/b>aus), soll nat&uuml;rlich nichts weiter geschehen, denn das Ziel ist ja schon erreicht &#8211; das Listenfeld wurde eingeblendet.<\/p>\n<p>Hier macht uns das Ereignis <b>Beim Klicken <\/b>einen Strich durch die Rechnung, denn dieses wird nat&uuml;rlich immer beim Loslassen der Schaltfl&auml;che ausgel&ouml;st &#8211; also auch, wenn wir die Schaltfl&auml;che l&auml;nger gedr&uuml;ckt gehalten haben, um das Listenfeld einzublenden.<\/p>\n<p>Also lassen wir die Ereignisprozeduren weg, die durch das Ereignis <b>Beim Klicken <\/b>ausgel&ouml;st werden, und verwenden lediglich die beiden Ereignisse <b>Bei Maustaste ab <\/b>und <b>Bei Maustaste auf<\/b>.<\/p>\n<p><b>Bei Zeitgeber<\/b><\/p>\n<p>Die n&auml;chste Frage ist, wie wir pr&uuml;fen, wie lange der Benutzer bereits die entsprechende Schaltfl&auml;che gedr&uuml;ckt h&auml;lt. Die erste Idee war, dazu den Zeitgeber des Formulars zu nutzen. Das klappt aber auch nicht, denn das Ereignis <b>Bei Zeitgeber <\/b>wird nicht ausgel&ouml;st, solange der Benutzer eine Schaltfl&auml;che gedr&uuml;ckt h&auml;lt. So sind wir dann bei der Prozedur gelandet, die Sie in Listing 4 finden.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVorheriger_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     bolVorheriger = <span style=\"color:blue;\">True<\/span>\r\n     Me!lstPopupliste.Visible = <span style=\"color:blue;\">False<\/span>\r\n     For i = 1 To 20\r\n         Sleep 10\r\n         DoEvents\r\n         <span style=\"color:blue;\">If <\/span>bolVorheriger = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">With<\/span> Me!lstPopupliste\r\n         .Value = Me!KundeID\r\n         .Height = Me!lstPopupliste.ListCount * 300\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Das Herunterdr&uuml;cken der Schaltfl&auml;che zum Anzeigen des vorherigen Datensatzes l&ouml;st diese Prozedur aus.<\/span><\/b><\/p>\n<p>Diese stellt zuerst den Wert der Variablen <b>bolVorheriger <\/b>auf den Wert <b>True <\/b>ein. Diese Variable soll sp&auml;ter auch noch von der Prozedur ausgelesen werden k&ouml;nnen, die durch das Ereignis <b>Bei Maustaste auf <\/b>ausgel&ouml;st wird. Daher deklarieren wir diese wie folgt im allgemeinen Teil des Klassenmoduls <b>Form_frmKunden <\/b>des Formulars:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolVorheriger<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Wo wir schon beim Deklarieren sind, legen wir auch gleich noch die entsprechende Variable f&uuml;r die Schaltfl&auml;che <b>cmdNaechster <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolNaechster<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Die Prozedur blendet nun zun&auml;chst das Listenfeld aus (sofern dieses &uuml;berhaupt eingeblendet war). Dies ist f&uuml;r den Fall vorgesehen, dass der Benutzer zuerst durch l&auml;ngeres Dr&uuml;cken der Schaltfl&auml;che das Listenfeld einblendet, sich dann aber entscheidet, keinen Eintrag &uuml;ber das Listenfeld auszublenden, sondern direkt &uuml;ber die Schaltfl&auml;che <b>cmdVorheriger <\/b>zum gew&uuml;nschten Datensatz zu springen. Dann durchl&auml;uft die Prozedur eine <b>For&#8230;Next<\/b>-Schleife, und zwar maximal 20 Mal. Im ersten Schritt ruft die Prozedur eine API-Funktion namens <b>Sleep <\/b>auf, die wie folgt im Kopf des Klassenmoduls deklariert wird:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds<span style=\"color:blue;\"> As Long<\/span>)<\/pre>\n<p>Dies f&uuml;hrt schlicht und einfach dazu, dass die Prozedur f&uuml;r zehn Millisekunden angehalten wird. Dann pr&uuml;ft die Prozedur, ob die Variable <b>bolVorheriger<\/b> den Wert <b>False <\/b>enth&auml;lt. Um es kurz zu machen: Wenn Sie die Maustaste nicht loslassen, ist dies nicht der Fall und die Prozedur l&auml;uft weiter.<\/p>\n<p>Dies tut sie maximal solange, bis die Schleife 20 Mal durchlaufen wurde. Dann haben wir 200 Millisekunden gewartet, wenn der Benutzer die Schaltfl&auml;che so lange herunterdr&uuml;ckt, soll das Listenfeld <b>lstPopupliste <\/b>eingeblendet werden. Dies erledigen die folgenden Anweisungen. Die erste stellt das Listenfeld auf den Datensatz ein, der aktuell im Formular angezeigt wird &#8211; dazu nutzt sie die <b>Value<\/b>-Eigenschaft des Listenfeldes. Die zweite legt mit der Eigenschaft <b>Height <\/b>die H&ouml;he des Listenfeldes fest, damit dieses genau die in der Datensatzherkunft enthaltene Anzahl Datens&auml;tze anzeigt. Dabei haben wir den Faktor nach Augenma&szlig; experimentell ermittelt. Schlie&szlig;lich blendet die Einstellung <b>True <\/b>f&uuml;r die Eigenschaft <b>Visible <\/b>das Listenfeld ein. Das war es schon &#8211; das Listenfeld wird nun unter der Schaltfl&auml;che <b>cmdVorheriger <\/b>eingeblendet.<\/p>\n<p>Wie nun k&ouml;nnen wir sicherstellen, dass beim Loslassen der Schaltfl&auml;che vor dem Ablauf von 200 Millisekunden das Listenfeld nicht eingeblendet und stattdessen einfach der vorherige Datensatz angezeigt wird<\/p>\n<p>Dies erledigen wir mit der Prozedur, die durch das Ereignis <b>Bei Maustaste auf <\/b>ausgel&ouml;st wird (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVorheriger_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     bolVorheriger = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!lstPopupliste.Visible = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         lngKundeID = DLookup(\"PKID\", \"tblVerlauf\", \"PopuplisteID = -1\")\r\n         Me.Recordset.FindFirst \"KundeID = \" & lngKundeID\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 5: Diese Prozedur folgt beim Loslassen der Schaltfl&auml;che cmdVorheriger.<\/span><\/b><\/p>\n<p>Diese Prozedur stellt zun&auml;chst die Variable <b>bolVorheriger <\/b>auf den Wert <b>False <\/b>ein. Dies sorgt dann auch beim Ablauf der Prozedur <b>cmdVorheriger_MouseDown <\/b>daf&uuml;r, dass die Abbruchbedingung innerhalb der Schleife wahr ist und diese Prozedur verlassen wird, ohne das Listenfeld <b>lstPopupliste <\/b>einzublenden.<\/p>\n<p>Damit die Prozedur <b>cmdVorheriger_MouseUp <\/b>&uuml;berhaupt ausgef&uuml;hrt wird, w&auml;hrend die Schleife in der Prozedur <b>cmdVorheriger_MouseDown <\/b>durchlaufen wird, bauen wir dort die Anweisung <b>DoEvents <\/b>ein. Anderenfalls w&uuml;rde die Prozedur <b>cmdVorheriger_MouseDown <\/b>immer zuerst bis zum Ende ausgef&uuml;hrt werden, bevor die Prozedur <b>cmdVorheriger_MouseUp <\/b>&uuml;berhaupt gestartet wird.<\/p>\n<p>Die Prozedur <b>cmdVorheriger_MouseUp <\/b>sorgt also zun&auml;chst daf&uuml;r, dass die Prozedur <b>cmdVorheriger_MouseDown <\/b>bis zum Ende ausgef&uuml;hrt wird.<\/p>\n<p>Dann pr&uuml;ft sie selbst, ob die Maustaste vielleicht solange gedr&uuml;ckt wurde, dass das Listenfeld mittlerweile sichtbar ist. In diesem Fall ist die Prozedur hiermit beendet, der Benutzer kann den gew&uuml;nschten Datensatz nun aus dem Listenfeld ausw&auml;hlen.<\/p>\n<p>Ist das Listenfeld aber noch nicht sichtbar, ermittelt die Prozedur den Prim&auml;rschl&uuml;sselwert des Kunden, der in der Tabelle <b>tblVerlauf <\/b>f&uuml;r das Feld <b>Popup-listeID <\/b>den Wert <b>-1 <\/b>enth&auml;lt und somit dem vorherigen Datensatz aus dem Listenfeld entspricht.<\/p>\n<p>Dieser wird dann &uuml;ber die <b>FindFirst<\/b>-Methode des <b>Recordset<\/b>-Objekts des Formulars ausgew&auml;hlt.<\/p>\n<p>Die beiden Prozeduren, welche die entsprechende Funktionalit&auml;t f&uuml;r die Schaltfl&auml;che <b>cmdNaechster <\/b>bereitstellen, finden Sie &uuml;brigens in Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNaechster_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     bolNaechster = <span style=\"color:blue;\">True<\/span>\r\n     Me!lstPopupliste.Visible = <span style=\"color:blue;\">False<\/span>\r\n     For i = 1 To 20\r\n         Sleep 10\r\n         DoEvents\r\n         <span style=\"color:blue;\">If <\/span>bolNaechster = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">With<\/span> Me!lstPopupliste\r\n         .Value = Me!KundeID\r\n         .Height = Me!lstPopupliste.ListCount * 300\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdNaechster_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     bolNaechster = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!lstPopupliste.Visible = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         lngKundeID = DLookup(\"PKID\", \"tblVerlauf\", \"PopuplisteID = 1\")\r\n         Me.Recordset.FindFirst \"KundeID = \" & lngKundeID\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: Die Prozeduren zum Einblenden der Popupliste oder Ausw&auml;hlen eines Datensatzes f&uuml;r die Schaltfl&auml;che cmdNaechster.<\/span><\/b><\/p>\n<p><b>Anzeigen des gew&auml;hlten Datensatzes<\/b><\/p>\n<p>Nun fehlt noch der letzte Schritt: Die Auswahl eines der Eintr&auml;ge aus dem Listenfeld.<\/p>\n<p>Wenn Sie einen der Eintr&auml;ge anklicken, l&ouml;st dies die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstPopupliste_Click()\r\n     Me.Recordset.FindFirst \"KundeID = \" _\r\n         & Me!lstPopupliste\r\n     Me!KundeID.SetFocus\r\n     Me!lstPopupliste.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies stellt das Formular auf den im Listenfeld angeklickten Datensatz ein und setzt den Fokus auf das Textfeld <b>KundeID <\/b>des Formulars.<\/p>\n<p>Dies ist n&ouml;tig, damit wir das Listenfeld <b>lstPopupliste <\/b>ausblenden k&ouml;nnen &#8211; anderenfalls w&uuml;rde dies einen Fehler liefern, weil Sie kein Element ausblenden k&ouml;nnen, w&auml;hrend es noch den Fokus besitzt.<\/p>\n<p>Der Rest wird &uuml;ber die bereits beschriebenen Ereignisprozeduren erledigt, vor allem durch die Prozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird.<\/p>\n<p><b>Restarbeiten<\/b><\/p>\n<p>Damit das Formular nach der Auswahl eines neuen Datensatzes aus dem Kombinationsfeld <b>cboAuswahl <\/b>den entsprechenden Datensatz anzeigt, hinterlegen sie f&uuml;r seine Ereigniseigenschaft <b>Nach Aktualisierung <\/b>die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAuswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst _\r\n         \"KundeID = \" & Me!cboAuswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich sorgt die Schaltfl&auml;che <b>OK <\/b>mit der folgenden <b>Beim Klicken<\/b>-Ereignisprozedur daf&uuml;r, dass das Formular wieder geschlossen wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Wenn Sie viel mit Datens&auml;tzen wie Kunden, Artikeln oder sonstigen Daten arbeiten, ist diese Erweiterung eines Formulars enorm hilfreich. Es geschieht doch recht oft, dass man von einem Datensatz zum n&auml;chsten wechselt, aber dann doch nochmal schnell zum zuvor verwendeten Datensatz zur&uuml;ck wechseln m&ouml;chte. Dies wird mit der hier vorgestellten L&ouml;sung sehr sch&ouml;n abgebildet.<\/p>\n<p>Die dazu angelegte Tabelle <b>tblVerlauf<\/b> wollen wir noch etwas ausgiebiger nutzen &#8211; n&auml;mlich, indem wir die komplette Liste der zuletzt verwendeten Datens&auml;tze in der Reihenfolge der Nutzung zur Auswahl anbieten.<\/p>\n<p>Dabei wollen wir, &auml;hnlich wie im Internet Explorer oder bei der Darstellung von Mails in Outlook, die Zeitr&auml;ume wie <b>Heute<\/b>, <b>Vor einem Tag<\/b>, <b>Vor zwei Tagen<\/b>, <b>Letzte Woche <\/b>et cetera verwenden. Wie dies gelingt, erfahren Sie im Beitrag <b>Auflistung nach Zeitr&auml;umen <\/b>(<b>www.access-im-unternehmen.de\/948<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VorherigenDatensatzAnzeigen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{2822CAAC-B857-4B38-B335-C579A0760A0A}\/aiu_942.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Detailformularen zeigen Sie Datens&auml;tze an, bearbeiten oder betrachten diese und schlie&szlig;en dann das Formular oder wechseln zum n&auml;chsten Datensatz. In vielen F&auml;llen m&ouml;chten Sie aber dann vielleicht noch einmal zu einem der zuvor bearbeiteten Datens&auml;tze &#8211; und gegebenenfalls wieder zur&uuml;ck. Solch eine Funktion bietet Access nicht, dort k&ouml;nnen Sie &uuml;ber die Navigationsschaltfl&auml;chen nur durch die Datens&auml;tze in der Reihenfolge der Datenherkunft springen. Wir statten in diesem Beitrag ein Formular mit einer Historie aus, wie Sie sie auch vom Internet-Browser kennen.<\/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":[662014,66042014,44000023],"tags":[],"class_list":["post-55000942","post","type-post","status-publish","format-standard","hentry","category-662014","category-66042014","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>Vorherige Datens&auml;tze anzeigen - 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\/Vorherige_Datensaetze_anzeigen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vorherige Datens&auml;tze anzeigen\" \/>\n<meta property=\"og:description\" content=\"In Detailformularen zeigen Sie Datens&auml;tze an, bearbeiten oder betrachten diese und schlie&szlig;en dann das Formular oder wechseln zum n&auml;chsten Datensatz. In vielen F&auml;llen m&ouml;chten Sie aber dann vielleicht noch einmal zu einem der zuvor bearbeiteten Datens&auml;tze - und gegebenenfalls wieder zur&uuml;ck. Solch eine Funktion bietet Access nicht, dort k&ouml;nnen Sie &uuml;ber die Navigationsschaltfl&auml;chen nur durch die Datens&auml;tze in der Reihenfolge der Datenherkunft springen. Wir statten in diesem Beitrag ein Formular mit einer Historie aus, wie Sie sie auch vom Internet-Browser kennen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:11:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Vorherige Datens&auml;tze anzeigen\",\"datePublished\":\"2020-05-22T21:11:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/\"},\"wordCount\":4858,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7e109838f004477aa08302ffd52eaf0b\",\"articleSection\":[\"2014\",\"4\\\/2014\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/\",\"name\":\"Vorherige Datens&auml;tze anzeigen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7e109838f004477aa08302ffd52eaf0b\",\"datePublished\":\"2020-05-22T21:11:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7e109838f004477aa08302ffd52eaf0b\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/7e109838f004477aa08302ffd52eaf0b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Vorherige_Datensaetze_anzeigen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vorherige Datens&auml;tze anzeigen\"}]},{\"@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":"Vorherige Datens&auml;tze anzeigen - 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\/Vorherige_Datensaetze_anzeigen\/","og_locale":"de_DE","og_type":"article","og_title":"Vorherige Datens&auml;tze anzeigen","og_description":"In Detailformularen zeigen Sie Datens&auml;tze an, bearbeiten oder betrachten diese und schlie&szlig;en dann das Formular oder wechseln zum n&auml;chsten Datensatz. In vielen F&auml;llen m&ouml;chten Sie aber dann vielleicht noch einmal zu einem der zuvor bearbeiteten Datens&auml;tze - und gegebenenfalls wieder zur&uuml;ck. Solch eine Funktion bietet Access nicht, dort k&ouml;nnen Sie &uuml;ber die Navigationsschaltfl&auml;chen nur durch die Datens&auml;tze in der Reihenfolge der Datenherkunft springen. Wir statten in diesem Beitrag ein Formular mit einer Historie aus, wie Sie sie auch vom Internet-Browser kennen.","og_url":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:11:36+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Vorherige Datens&auml;tze anzeigen","datePublished":"2020-05-22T21:11:36+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/"},"wordCount":4858,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b","articleSection":["2014","4\/2014","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/","url":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/","name":"Vorherige Datens&auml;tze anzeigen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b","datePublished":"2020-05-22T21:11:36+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/7e109838f004477aa08302ffd52eaf0b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Vorherige_Datensaetze_anzeigen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Vorherige Datens&auml;tze anzeigen"}]},{"@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\/55000942","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=55000942"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000942\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}