{"id":55001085,"date":"2017-06-01T00:00:00","date_gmt":"2020-05-14T13:42:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1085"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datensatzaenderungen_auf_einen_Blick","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/","title":{"rendered":"Datensatz&auml;nderungen auf einen Blick"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn der Benutzer &auml;nderungen an den in einem Formular angezeigten Daten vornimmt, sieht er nur noch die ge&auml;nderten Daten. Was aber, wenn er beispielsweise einen Wert in ein falsches Feld eingetragen hat &#8211; zum Beispiel indem er Vorname und Nachname vertauscht Dann m&ouml;chte er die &auml;nderung vermutlich r&uuml;ckg&auml;ngig machen. Aber wie, wenn er den vorherigen Wert nicht mehr in Erinnerung hat Also erleichtern wir ihm die Arbeit, indem wir die alten Werte neben den entsprechenden Textfeldern anzeigen.<\/b><\/p>\n<p>Die hier vorgestellte Technik bezieht sich nat&uuml;rlich auf Detailformulare &#8211; in der Datenblatt- oder Endlosansicht lassen sich Steuerelemente zur Anzeige der vorherigen Daten nur schlecht anzeigen. Wir beginnen also mit einem neuen, leeren Formular namens <b>frmDatensatz-aenderungenAufEinenBlick<\/b>, dessen Eigenschaft <b>Datenherkunft <\/b>wir mit dem Namen der Tabelle <b>tblKunden <\/b>f&uuml;llen.<\/p>\n<p>Diese finden Sie bereits in der Beispieldatenbank.<\/p>\n<p>Anschlie&szlig;end k&ouml;nnen Sie alle Felder dieser Tabelle aus der Feldliste in den Detailbereich der Entwurfsansicht des Formulars ziehen. Das Ergebnis sieht etwa wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_001.png\" alt=\"Entwurf des Ausgangsformulars\" width=\"549,6265\" height=\"327,2655\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Ausgangsformulars<\/span><\/b><\/p>\n<p>Damit das Formular die alten Werte der jeweiligen Felder anzeigen kann, f&uuml;gen wir f&uuml;r jedes Feld, das der Benutzer bearbeiten kann, ein weiteres Textfeld samt Bezeichnungsfeld hinzu. Die Bezeichnungsfelder erhalten jeweils den Text <b>Alt: <\/b>als Beschriftung. Die Textfelder benennen wir genauso wie die eigentlichen Textfelder &#8211; mit dem Unterschied, dass wir den Namen noch das Suffix <b>_Alt <\/b>anh&auml;ngen. Das Textfeld zur Anzeige des alten Wertes f&uuml;r das Feld <b>txtVorname <\/b>soll also <b>txtVorname_Alt <\/b>hei&szlig;en (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_002.png\" alt=\"Anlegen der Textfelder f&uuml;r die alten Werte\" width=\"649,559\" height=\"301,6946\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen der Textfelder f&uuml;r die alten Werte<\/span><\/b><\/p>\n<p>Hier haben wir nun bereits den Wert <b>Aktiviert <\/b>der Textfelder mit den vorherigen Werten auf <b>Nein <\/b>eingestellt, damit der Benutzer gleich erkennen kann, dass er hier keine Werte eingeben kann.<\/p>\n<p>Es fehlt noch eine Einstellung, denn die Textfelder sollen ja auch erst angezeigt werden, wenn der Benutzer einen anderen als den vorhandenen Wert eingegeben hat.<\/p>\n<p>Also stellen wir die Eigenschaft <b>Sichtbar<\/b> f&uuml;r die Textfelder auf der rechten Seite auf <b>Nein <\/b>ein (Sie k&ouml;nnen alle Textfelder markieren, indem Sie einen Rahmen aufziehen und dann die Eigenschaft f&uuml;r alle Textfelder gleichzeitig einstellen).<\/p>\n<p>Das Formular sieht nun in der Formularansicht vorerst wie in Bild 3 aus. Beim &auml;ndern eines der Eintr&auml;ge tut sich nat&uuml;rlich noch nichts, denn wir haben ja auch noch keinen entsprechenden Code hinterlegt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_003.png\" alt=\"Formular in der Formularansicht\" width=\"424,7115\" height=\"257,9346\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Formular in der Formularansicht<\/span><\/b><\/p>\n<h2>Code zum Einblenden und F&uuml;llen der Alt-Felder<\/h2>\n<p>Nun haben wir uns das so vorgestellt, dass wir einfach das Ereignis <b>Bei Ge&auml;ndert <\/b>f&uuml;r das jeweilige Steuerelement implementieren und daf&uuml;r die folgende Ereignisprozedur hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFirma_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> Me!txtFirma_Alt\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = Me!txtFirma.OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r das Feld <b>txtFirma <\/b>soll also eine Prozedur ausgel&ouml;st werden, welche die Eigenschaft <b>Visible <\/b>des Textfeldes <b>txtFirma_Alt <\/b>auf <b>True <\/b>einstellt und den Wert des Textfeldes <b>txtFirma_Alt <\/b>auf den alten Wert (<b>OldValue<\/b>) des Textfeldes <b>txtFirma<\/b>.<\/p>\n<p>Dies klappt allerdings nicht wie gew&uuml;nscht: Sobald Sie etwa ein Zeichen an den Inhalt des Textfeldes <b>txtFirma <\/b>anf&uuml;gen wollen (also ohne diesen zu markieren und zu &uuml;berschreiben), werden zwar die gew&uuml;nschten Aktionen f&uuml;r das Textfeld <b>txtFirma_Alt <\/b>durchgef&uuml;hrt, aber der Inhalt des Textfeldes <b>txtFirma <\/b>wird komplett durch das soeben eingegebene Zeichen &uuml;berschrieben (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_004.png\" alt=\"Verhalten bei Eingabe in ein Textfeld\" width=\"599,593\" height=\"254,7758\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Verhalten bei Eingabe in ein Textfeld<\/span><\/b><\/p>\n<p>Schauen wir uns an, was zu diesem unerwarteten Verhalten f&uuml;hrt. Ein kurzer Test, bei dem wir erst die erste, dann die zweite Anweisung innerhalb der Prozedur ausblenden, zeigt, dass die Zuweisung des alten Wertes an die <b>Value<\/b>-Eigenschaft von <b>txtFirma_Alt <\/b>daf&uuml;r sorgt, dass der alte Wert von <b>txtFirma <\/b>komplett &uuml;berschrieben wird.<\/p>\n<p>Hier geschieht Folgendes: Wenn Sie das erste Zeichen in das Textfeld <b>txtFirma <\/b>eingeben, wird bereits die Prozedur <b>txtFirma_Dirty <\/b>ausgel&ouml;st. Das Textfeld <b>txtFirma_Alt <\/b>wird eingeblendet und erh&auml;lt als Wert den alten Wert des ausl&ouml;senden Textfeldes. Bei einer solchen Zuweisung wird immer auch der Fokus auf das aufnehmende Feld verschoben!<\/p>\n<p>Der Fokus gelangt dann zwar wieder zum Feld <b>txtFirma <\/b>zur&uuml;ck, aber beim Eintritt in das Feld wird die Markierung so eingestellt, wie dies standardm&auml;&szlig;ig beim Eintritt in ein Feld vorgesehen ist.<\/p>\n<h2>Cursorverhalten bei Eintritt in Feld<\/h2>\n<p>Dieses Verhalten wird normalerweise Access-weit eingestellt, und zwar in den Optionen von Access. Hier finden Sie im Bereich <b>Clienteinstellungen <\/b>unter <b>Bearbeiten <\/b>die Eigenschaft <b>Cursorverhalten bei Eintritt in Feld <\/b>(s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_005.png\" alt=\"Option zum Einstellen des Verhaltens beim Eintritt in ein Feld\" width=\"649,559\" height=\"351,9557\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Option zum Einstellen des Verhaltens beim Eintritt in ein Feld<\/span><\/b><\/p>\n<p>Der Standardwert ist <b>Ganzes Feld markieren<\/b>, was hier auch geschehen ist und das beobachtete Verhalten verursacht (sollten Sie eine andere Einstellung vorfinden, haben Sie auch ein entsprechendes anderes Verhalten beobachten k&ouml;nnen).<\/p>\n<p>Wie k&ouml;nnen wir nun den Inhalt des Feldes transferieren, ohne dass nach dem Zur&uuml;cksetzen des Fokus auf das ausl&ouml;sende Feld wieder der komplette Inhalt markiert und ersetzt wird Hilft es eventuell, wenn wir die Einstellung f&uuml;r diese Aktion per Code &auml;ndern Wohl kaum, denn wir wissen ja nicht, an welcher Stelle der Benutzer die &auml;nderung durchgef&uuml;hrt hat. <\/p>\n<p>Die einzige M&ouml;glichkeit, die wir haben, ist, uns die aktuelle  Cursorposition zu merken und die L&auml;nge der Markierung und die Position vor der R&uuml;ckkehr des Fokus zum ausl&ouml;senden Feld wiederherzustellen.<\/p>\n<p>Dies erledigen wir, indem wir zun&auml;chst zwei Variablen zur Prozedur hinzuf&uuml;gen, mit denen wir die Position der Einf&uuml;gemarke sowie die Breite der Markierung speichern. Dann f&uuml;llen wir diese beiden Variablen mit den entsprechenden Werten f&uuml;r das Textfeld <b>txtFirma<\/b>. Anschlie&szlig;end folgen die bereits vorhandenen Anweisungen der Prozedur. Nach dem Verschieben des Fokus auf das Textfeld <b>txtFirma_Alt <\/b>und vor dem Erhalt des Fokus durch das Textfeld <b>txtFirma <\/b>stellen wir die Markierungsposition und -breite wieder her:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFirma_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     lngSelStart = Me!txtFirma.SelStart\r\n     lngSelLength = Me!txtFirma.SelLength\r\n     <span style=\"color:blue;\">With<\/span> Me!txtFirma_Alt\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = Me!txtFirma.OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me!txtFirma.SelStart = lngSelStart\r\n     Me!txtFirma.SelLength = lngSelLength\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nun erhalten wir das gew&uuml;nschte Verhalten, wie Bild 6 zeigt. Wir haben hier den Buchstaben <b>n <\/b>aus dem Firmennamen gel&ouml;scht, der anschlie&szlig;end genau wie erwartet angezeigt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_006.png\" alt=\"Gew&uuml;nschtes Verhalten\" width=\"499,6607\" height=\"243,4746\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Gew&uuml;nschtes Verhalten<\/span><\/b><\/p>\n<h2>&uuml;brige Felder mit Funktionalit&auml;t ausstatten<\/h2>\n<p>Nun wollen wir noch schnell die &uuml;brigen Felder mit der hier implementierten Funktion ausstatten. Dazu legen Sie einfach die leeren Prozeduren f&uuml;r das Ereignis <b>Bei Ge&auml;ndert <\/b>an und kopieren den Inhalt der weiter oben bereits vorgestellten Prozedur f&uuml;r das Feld <b>txtFirma <\/b>ein.<\/p>\n<p>Au&szlig;erdem passen Sie dort noch die Feldnamen an, indem Sie etwa f&uuml;r das Textfeld <b>txtVorname <\/b>jeweils <b>txtFirma <\/b>durch <b>txtVorname <\/b>und <b>txtFirma_Alt <\/b>durch <b>txtVorname_Alt <\/b>ersetzen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtVorname_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     lngSelStart = Me!txtVorname.SelStart\r\n     lngSelLength = Me!txtVorname.SelLength\r\n     <span style=\"color:blue;\">With<\/span> Me!txtVorname_Alt\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = Me!txtVorname.OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me!txtVorname.SelStart = lngSelStart\r\n     Me!txtVorname.SelLength = lngSelLength\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies m&uuml;ssen Sie nun nur noch f&uuml;r alle &uuml;brigen Felder durchf&uuml;hren und erhalten so einen sehr gut wartbaren Code. &auml;h &#8230; nein, doch nicht. Genau genommen haben wir nun eine ganze Reihe von Prozeduren erstellt, die alle das gleiche tun &#8211; mit dem Unterschied, dass jeweils zwei andere Textfelder referenziert werden.<\/p>\n<h2>Code optimieren<\/h2>\n<p>Eine erste M&ouml;glichkeit, den Code zumindest zuverl&auml;ssiger vervielf&auml;ltigen zu k&ouml;nnen, ist die folgende Variante, die wir f&uuml;r das Ereignis <b>Bei &auml;nderung <\/b>des Textfeldes <b>txtNachname <\/b>implementiert haben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtNachname_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTextfeld<span style=\"color:blue;\"> As String<\/span>\r\n     strTextfeld = \"txtNachname\"\r\n     lngSelStart = Me(strTextfeld).SelStart\r\n     lngSelLength = Me(strTextfeld).SelLength\r\n     <span style=\"color:blue;\">With<\/span> Me(strTextfeld & \"_Alt\")\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = Me(strTextfeld).OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me(strTextfeld).SelStart = lngSelStart\r\n     Me(strTextfeld).SelLength = lngSelLength\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Hier haben wir den Namen des betroffenen Textfeldes, n&auml;mlich <b>txtNachname<\/b>, in einer Variablen namens <b>strTextfeld <\/b>gespeichert. Danach haben wir alle Bez&uuml;ge auf dieses Steuerelement in der Prozedur, die etwa <b>Me!txtNachname <\/b>lauten, in <b>Me(strTextfeld) <\/b>ge&auml;ndert. F&uuml;r die Stellen, an denen es eine Referenz auf <b>Me!txtNachname_Alt <\/b>gibt, verwenden wir <b>Me(strTextfeld &#038; &#8222;_Alt&#8220;)<\/b>.<\/p>\n<p>Hier profitieren wir also davon, dass wir die Textfelder zum Anzeigen der alten Werte immer konsequent mit dem Suffix <b>_Alt <\/b>ausgestattet haben.<\/p>\n<p>Wir k&ouml;nnen den Inhalt der Prozedur nun also in die entsprechenden Prozeduren der &uuml;brigen Steuerelemente &uuml;bertragen und brauchen nur noch die Zeile <b>strTextfeld = &#8222;txtNachname&#8220; <\/b>an den Namen des jeweils aufrufenden Textfeldes anzupassen. Die Gefahr, beim Copy and Paste und beim anschlie&szlig;enden manuellen Anpassen Fehler in den Code einzubauen, sinkt so erheblich.<\/p>\n<h2>Ausgliedern in Funktion<\/h2>\n<p>Wir k&ouml;nnen den Code aber noch weiter vereinfachen &#8211; n&auml;mlich indem wir eine Prozedur anlegen, die den Namen des Textfeldes als Parameter erwartet und dann die Daten der Markierung des &uuml;bergebenen Textfeldes speichert, den alten Wert an das &auml;nderungstextfeld &uuml;bergibt und die Einf&uuml;gemarkierung wieder herstellt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Dirty(strTextfeld<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     lngSelStart = Me(strTextfeld).SelStart\r\n     lngSelLength = Me(strTextfeld).SelLength\r\n     <span style=\"color:blue;\">With<\/span> Me(strTextfeld & \"_Alt\")\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = Me(strTextfeld).OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me(strTextfeld).SelStart = lngSelStart\r\n     Me(strTextfeld).SelLength = lngSelLength\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Den Aufruf dieser Funktion tragen wir beispielsweise in die <b>Bei &auml;nderung<\/b>-Ereignisprozedur f&uuml;r das Textfeld <b>txtOrt <\/b>ein, wo wir den Namen des Textfeldes als Parameter &uuml;bergeben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtOrt_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty \"txtOrt\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und es geht mit noch weniger Aufwand. Die folgende ge&auml;nderte Version der Prozedur <b>Textbox_Dirty <\/b>verlangt noch nicht einmal mehr nach einen Parameter. Stattdessen ermittelt sie die betroffene Textbox &uuml;ber die Funktion <b>Screen.ActiveControl<\/b>, die immer einen Verweis auf das Steuerelement mit dem Fokus zur&uuml;ckliefert, und speichert dieses in der Variablen <b>txt<\/b>. Dann referenziert sie statt <b>Me(strTextfeld) <\/b>direkt die Variable <b>txt<\/b>. Die Referenz <b>Me(strTextfeld &#038; &#8222;_Alt&#8220;) <\/b>ersetzen wir durch <b>Me(txt.Name &#038; &#8222;_Alt&#8220;)<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Dirty()\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>, lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Set<\/span> txt = Screen.ActiveControl\r\n     lngSelStart = txt.SelStart\r\n     lngSelLength = txt.SelLength\r\n     <span style=\"color:blue;\">With<\/span> Me(txt.Name & \"_Alt\")\r\n         .Visible = <span style=\"color:blue;\">True<\/span>\r\n         .Value = txt.OldValue\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     txt.SelStart = lngSelStart\r\n     txt.SelLength = lngSelLength\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Aufruf reduziert sich somit um die Angabe des Parameters und kann in den <b>Bei &auml;nderung<\/b>-Ereignisprozeduren aller betroffenen Textfelder gleich aussehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtOrt_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der komplette Code f&uuml;r die Textfelder sieht also wie folgt aus &#8211; hinzu kommt nur die bereits oben vorgestellte Prozedur <b>Textbox_Dirty<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFirma_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtNachname_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtOrt_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtPLZ_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtStrasse_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtVorname_Dirty(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Dirty\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Wiederherstellung des alten Zustands durch den Benutzer<\/h2>\n<p>Manchmal &auml;ndert der Benutzer den Wert eines Textfeldes vielleicht mehrmals, ohne sich an der Anzeige des alten Wertes zu st&ouml;ren, und legt dabei den alten Wert des Textfeldes wieder fest. Ist dies der Fall, soll das Textfeld zur Anzeige des alten Wertes nat&uuml;rlich wieder ausgeblendet werden. Dies erreichen wir durch eine weitere Ereignisprozedur, die jeweils durch das Ereignis <b>Bei &auml;nderung <\/b>der Textfelder angelegt wird. F&uuml;r das Textfeld <b>txtFirma <\/b>sieht das etwa wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFirma_Change()\r\n     Textbox_Change\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie sehen schon: Wir geben uns gar nicht erst damit ab, den Code f&uuml;r jedes Textfeld einzeln zu hinterlegen, sondern rufen direkt eine Prozedur namens <b>Textbox_Change <\/b>auf, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Set<\/span> txt = Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span>Nz(txt.Text) = Nz(Me(txt.Name & \"_Alt\"))<span style=\"color:blue;\"> Then<\/span>\r\n         Me(txt.Name & \"_Alt\").Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me(txt.Name & \"_Alt\").Visible = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur referenziert wiederum &uuml;ber <b>Screen.ActiveControl <\/b>das aktive Steuerelement. Damit pr&uuml;ft es, ob der aktuelle Text des Steuerelements aus <b>txt <\/b>(<b>txt.Text<\/b>) mit dem Wert des Steuerelements aus <b>Me(txt.Name &#038; &#8222;_Alt&#8220;) <\/b>&uuml;bereinstimmt. Beide Ausdr&uuml;cke versehen wir dabei mit der Funktion <b>Nz<\/b>, um eventuell auftretende Nullwerte direkt in leere Zeichenketten umzuwandeln. Sind beide Ausdr&uuml;cke gleich, was beispielsweise geschieht, wenn Sie zuerst einen Buchstaben hinzuf&uuml;gen und diesen gleich wieder entfernen, dann soll das Textfeld aus <b>Me(txt.Name &#038; &#8222;_Alt&#8220;) <\/b>durch Einstellen von <b>Visible <\/b>auf den Wert <b>False <\/b>gleich wieder ausgeblendet werden. Sind die beiden Werte nicht gleich, was der Fall ist, wenn der Benutzer beispielsweise weitere Zeichen hinzugef&uuml;gt hat, dann stellt die Prozedur <b>Visible <\/b>auf <b>True <\/b>ein.<\/p>\n<h2>Unterschied zwischen Bei Ge&auml;ndert und Bei &auml;nderung<\/h2>\n<p>Der wichtigste Unterschied der beiden Ereignisse ist, dass <b>Bei Ge&auml;ndert <\/b>(<b>txtFirma_Dirty<\/b>) nur bei der ersten &auml;nderung nach dem Anzeigen eines Datensatzes ausgel&ouml;st wird. Dementsprechend lesen wir hier den alten Wert des Textfeldes ein und schreiben ihn in das <b>_Alt<\/b>-Textfeld. Das Ereignis <b>Bei &auml;nderung <\/b>(<b>txtFirma_Change<\/b>) wird bei jeder &auml;nderung des im Textfeld enthaltenen Textes ausgel&ouml;st. Damit k&ouml;nnen wir dann jederzeit vergleichen, ob sich der aktuelle Text vom Text zum Zeitpunkt der Anzeige des Datensatzes unterscheidet, und das <b>_Alt<\/b>-Textfeld ein- oder ausblenden.<\/p>\n<h2>Alt-Textfelder wieder ausblenden<\/h2>\n<p>Wenn der Benutzer die &auml;nderungen nun vor dem Speichern mit der Escape-Taste wieder r&uuml;ckg&auml;ngig macht oder den Datensatz speichert und etwa zu einem anderen Datensatz wechselt, sollen die Textfelder, welche die alten Werte anzeigen, wieder ausgeblendet werden. Die entsprechenden Codezeilen f&uuml;gen wir also zun&auml;chst f&uuml;r die Ereignisprozedur ein, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!txtFirma_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n     Me!txtVorname_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n     Me!txtNachname_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n     Me!txtStrasse_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n     Me!txtPLZ_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n     Me!txtOrt_Alt.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir stellen hier einfach die Eigenschaft <b>Visible <\/b>f&uuml;r alle sechs Textfelder zur Anzeige der alten Werte auf den Wert <b>False <\/b>ein.<\/p>\n<p>Das ging schnell, aber wenn Sie eine &auml;hnliche Funktion f&uuml;r weitere Formulare oder f&uuml;r Formulare mit sehr vielen Textfeldern einsetzen wollen, sollten Sie doch die Tatsache nutzen, dass wir f&uuml;r alle Textfelder zur Anzeige der alten Daten eine spezielle Benennungskonvention vorgenommen haben &#8211; n&auml;mlich das Anh&auml;ngen der Zeichenfolge <b>_Alt <\/b>an den Textfeldnamen, dessen alten Wert das Textfeld anzeigen soll. Also ersetzen wir die Anweisungen durch die in der folgenden Version der Prozedur <b>Form_Current<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     For Each ctl In Me.Controls\r\n         <span style=\"color:blue;\">If <\/span>ctl.ControlType = acTextBox<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Right<\/span>(ctl.Name, 4) = \"_Alt\"<span style=\"color:blue;\"> Then<\/span>\r\n                 ctl.Visible = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Steuerelemente des Formulars und pr&uuml;fen in einer ersten <b>If&#8230;Then<\/b>-Schleife, ob der Steuerelementtyp dem Wert <b>acTextBox <\/b>entspricht, also ob es sich um ein Textfeld handelt. Falls ja, pr&uuml;ft eine weitere <b>If&#8230;Then<\/b>-Bedingung, ob die letzten vier Buchstaben des Namens des Steuerelements <b>_Alt <\/b>lauten.<\/p>\n<p>Ist auch dies der Fall, haben wir es offensichtlich mit einem der Textfelder zur Anzeige der alten Werte zu tun und k&ouml;nnen die Eigenschaft <b>Visible <\/b>auf den Wert <b>False <\/b>einstellen.<\/p>\n<h2>R&uuml;cknahme von &auml;nderungen per Escape-Taste<\/h2>\n<p>Nun fehlt noch eine wichtige Aktion, die der Benutzer durchf&uuml;hren kann: Wenn er n&auml;mlich die Escape-Taste bet&auml;tigt, werden die bereits durchgef&uuml;hrten &auml;nderungen schrittweise r&uuml;ckg&auml;ngig gemacht. Im Beitrag <b>Undo-Ereignis und Undo per Escape im Griff <\/b>(<b>www.access-im-unternehmen.de\/1086<\/b>) finden Sie die Grundlagen zum Undo-Ereignis von Formularen und von gebundenen Steuerelementen. Wir entnehmen dort Folgendes:<\/p>\n<ul>\n<li>Beim ersten Bet&auml;tigen von Escape wird die &auml;nderung des aktuellen Textfeldes r&uuml;ckg&auml;ngig gemacht.<\/li>\n<li>Beim wiederholten Bet&auml;tigen von Escape werden alle alten Werte des nicht gespeicherten Datensatzes wieder hergestellt.<\/li>\n<\/ul>\n<p>Wir wollen also daf&uuml;r sorgen, dass beim Ausl&ouml;sen der <b>Undo<\/b>-Methode eines Textfeldes das dazugeh&ouml;rige <b>_Alt<\/b>-Textfeld wieder ausgeblendet wird und beim Ausl&ouml;sen der <b>Undo<\/b>-Methode des Formulars selbst alle <b>_Alt<\/b>-Textfelder verschwinden.<\/p>\n<p>F&uuml;r die einzelnen Textfelder hinterlegen wir f&uuml;r die Ereignisprozedur <b>Bei R&uuml;ckg&auml;ngig <\/b>jeweils eine Ereignisprozedur, die wie folgt aussieht und jeweils die Prozedur <b>Textbox_Undo <\/b>aufruft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFirma_Undo(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Undo\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtNachname_Undo(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Textbox_Undo\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n... weitere Undo-Ereignisprozeduren<\/pre>\n<p>Die Prozeduren rufen jeweils die Prozedur <b>Textbox_Undo <\/b>auf, welche wie folgt aussieht und einfach nur das Steuerelement, das aktuell den Fokus besitzt, mit der Variablen <b>txt<\/b> referenziert und dann ausblendet:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Undo()\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Set<\/span> txt = Screen.ActiveControl\r\n     Me(txt.Name & \"_Alt\").Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Fehlt noch das Ereignis <b>Bei R&uuml;ckg&auml;ngig <\/b>des Formulars. Wenn dieses durch das Bet&auml;tigen der Escape-Taste ausgel&ouml;st wird, werden alle Felder zur&uuml;ckgesetzt. Dementsprechend sollen auch alle <b>_Alt<\/b>-Textfelder ausgeblendet werden. Dies erledigen wir wieder durch eine Schleife &uuml;ber alle Steuerelemente des Formulars, die dann in zwei <b>If&#8230;Then<\/b>-Bedingungen erst die Textfelder und dann die Textfelder mit <b>_Alt <\/b>als letzte vier Buchstaben herausfiltert und schlie&szlig;lich das aktuelle Steuerelement ausblendet:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Undo(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     For Each ctl In Me.Controls\r\n         <span style=\"color:blue;\">If <\/span>ctl.ControlType = acTextBox<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Right<\/span>(ctl.Name, 4) = \"_Alt\"<span style=\"color:blue;\"> Then<\/span>\r\n                 ctl.Visible = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Wiederherstellen der alten Daten<\/h2>\n<p>Nun haben wir &uuml;ber die Escape-Taste die M&ouml;glichkeit, den Wert des aktuellen Textfeldes und die Werte aller Textfelder zur&uuml;ckzusetzen. Allerdings kann es ja auch sein, dass der Benutzer mittendrin einen Wert &auml;ndert und diesen sp&auml;ter zur&uuml;cksetzen m&ouml;chte. Wie wollen wir das realisieren Wollen wir neben jedem Textfeld noch eine Schaltfl&auml;che hinzuf&uuml;gen, mit welcher der Benutzer den Wert aus dem <b>_Alt<\/b>-Feld in das urspr&uuml;ngliche Textfeld &uuml;bertragen kann Nein, das w&auml;re doch etwas zu viel Aufwand.<\/p>\n<p>Aber wir k&ouml;nnen ja zwei Schaltfl&auml;chen unterbringen, mit welchen der Benutzer den Inhalt des aktuellen Feldes und die Inhalte aller Felder wieder herstellen kann. Letzteres wird zwar auch &uuml;ber die Escape-Taste abgedeckt, allerdings k&ouml;nnen wir nicht voraussetzen, dass jeder Benutzer genau wei&szlig;, welche Auswirkung die Bet&auml;tigung dieser Taste hat. Bild 7 zeigt das Formular mit den beiden neuen Schaltfl&auml;chen <b>cmdAktuellesZuruecksetzen <\/b>und <b>cmdAlleZuruecksetzen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_008.png\" alt=\"Schaltfl&auml;chen zum Zur&uuml;cksetzen eines und aller Felder\" width=\"424,7115\" height=\"249,9368\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Schaltfl&auml;chen zum Zur&uuml;cksetzen eines und aller Felder<\/span><\/b><\/p>\n<h2>Aktuelles Feld per Schaltfl&auml;che zur&uuml;cksetzen<\/h2>\n<p>Um das aktuelle Feld zur&uuml;ckzusetzen, soll der Benutzer auf die Schaltfl&auml;che <b>cmdAktuellesZuruecksetzen <\/b>klicken. Diese l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAktuellesZuruecksetzen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">Set<\/span> txt = Screen.PreviousControl\r\n     txt.Value = Nz(Me(txt.Name & \"_Alt\").Value)\r\n     Me(txt.Name & \"_Alt\").Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ermittelt das Textfeld, das vor dem Anklicken der Schaltfl&auml;che <b>cmdAktuellesZuruecksetzen<\/b> den Fokus besa&szlig;. Hier kommt die Funktion <b>Screen.Previous <\/b>zum Einsatz. Das so ermittelte Textfeld erh&auml;lt dann den Wert des zu diesem Textfeld passenden Textfeldes mit der Endung <b>_Alt<\/b>. Au&szlig;erdem blenden wir das entsprechende <b>_Alt<\/b>-Textfeld wieder aus.<\/p>\n<h2>Alle Felder per Schaltfl&auml;che zur&uuml;cksetzen<\/h2>\n<p>Wenn der Benutzer die Funktion der Escape-Taste zum Zur&uuml;cksetzen der Werte des nicht gespeicherten Datensatzes nicht kennt, k&ouml;nnen wir ihn unterst&uuml;tzen, indem wir eine Schaltfl&auml;che zum Zur&uuml;cksetzen des vollst&auml;ndigen Datensatzes bereitstellen. Diese ruft lediglich die Methode <b>Undo <\/b>des Formulars aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAlleZuruecksetzen_Click()\r\n     Me.Undo\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Problem bei neuen Datens&auml;tzen<\/h2>\n<p>Ein kleines Problem ergibt sich noch, wenn Sie nun einen neuen Datensatz anlegen und dann die ersten Werte in die Textfelder eingeben. Das Formular arbeitet wie erwartet, wenn es dann die <b>_Alt<\/b>-Textfelder einblendet, diese aber leer bleiben (s. Bild 8). Wollen wir dies wirklich auch beim Anzeigen eines neuen Datensatzes so anzeigen Wenn man einen Datensatz bearbeitet und ein Feld zuvor leer gewesen ist, macht es durchaus Sinn, das leere Feld anzuzeigen. Aber bei einem neuen, ungespeicherten Datensatz wollen wir daf&uuml;r sorgen, dass die leeren <b>_Alt<\/b>-Textfelder nicht angezeigt werden. Dazu sind zwei &auml;nderungen n&ouml;tig, zun&auml;chst in der <b>Textbox_Dirty<\/b>-Prozedur. Hier schlie&szlig;en wir alle Anweisungen mit Ausnahme der Deklaration in eine <b>If&#8230;Then<\/b>-Bedingung ein, deren Inhalt nur ausgef&uuml;hrt wird, wenn das Formular keinen neuen Datensatz enth&auml;lt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1085_009.png\" alt=\"Problem beim neuen Datensatz\" width=\"424,7115\" height=\"249,9368\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Problem beim neuen Datensatz<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Dirty()\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Gleiche erledigen wir f&uuml;r die Prozedur <b>Textbox_Change<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Textbox_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>txt<span style=\"color:blue;\"> As <\/span>TextBox\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit der hier beschriebenen Technik k&ouml;nnen Sie dem Benutzer die Eingabe in Formularen erleichtern, die regelm&auml;&szlig;ig &auml;nderungen an den bestehenden Datens&auml;tzen erfordern. Allerdings ist daf&uuml;r eine Menge Handarbeit erfordert. Wie Sie diese umgehen k&ouml;nnen, zeigen wir in weiteren Beitr&auml;gen in den folgenden Ausgaben.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SichtbareDatensatzaenderungen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/6EF2895F-8EA4-4373-AF45-B14725B29B57\/aiu_1085.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn der Benutzer &Auml;nderungen an den in einem Formular angezeigten Daten vornimmt, sieht er nur noch die ge&auml;nderten Daten. Was aber, wenn er beispielsweise einen Wert in ein falsches Feld eingetragen hat &#8211; zum Beispiel indem er Vorname und Nachname vertauscht Dann m&ouml;chte er die &Auml;nderung vermutlich r&uuml;ckg&auml;ngig machen. Aber wie, wenn er den vorherigen Wert nicht mehr in Erinnerung hat Also erleichtern wir ihm die Arbeit, indem wir die alten Werte neben den entsprechenden Textfeldern anzeigen.<\/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":[662017,66032017,44000023],"tags":[],"class_list":["post-55001085","post","type-post","status-publish","format-standard","hentry","category-662017","category-66032017","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>Datensatz&auml;nderungen auf einen Blick - 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\/Datensatzaenderungen_auf_einen_Blick\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datensatz&auml;nderungen auf einen Blick\" \/>\n<meta property=\"og:description\" content=\"Wenn der Benutzer &Auml;nderungen an den in einem Formular angezeigten Daten vornimmt, sieht er nur noch die ge&auml;nderten Daten. Was aber, wenn er beispielsweise einen Wert in ein falsches Feld eingetragen hat - zum Beispiel indem er Vorname und Nachname vertauscht Dann m&ouml;chte er die &Auml;nderung vermutlich r&uuml;ckg&auml;ngig machen. Aber wie, wenn er den vorherigen Wert nicht mehr in Erinnerung hat Also erleichtern wir ihm die Arbeit, indem wir die alten Werte neben den entsprechenden Textfeldern anzeigen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:42:27+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datensatz&auml;nderungen auf einen Blick\",\"datePublished\":\"2020-05-14T13:42:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/\"},\"wordCount\":3043,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/aa5a2cf9e74b4f668eed45aecd6247f5\",\"articleSection\":[\"2017\",\"3\\\/2017\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/\",\"name\":\"Datensatz&auml;nderungen auf einen Blick - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/aa5a2cf9e74b4f668eed45aecd6247f5\",\"datePublished\":\"2020-05-14T13:42:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/aa5a2cf9e74b4f668eed45aecd6247f5\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/aa5a2cf9e74b4f668eed45aecd6247f5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatzaenderungen_auf_einen_Blick\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datensatz&auml;nderungen auf einen Blick\"}]},{\"@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":"Datensatz&auml;nderungen auf einen Blick - 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\/Datensatzaenderungen_auf_einen_Blick\/","og_locale":"de_DE","og_type":"article","og_title":"Datensatz&auml;nderungen auf einen Blick","og_description":"Wenn der Benutzer &Auml;nderungen an den in einem Formular angezeigten Daten vornimmt, sieht er nur noch die ge&auml;nderten Daten. Was aber, wenn er beispielsweise einen Wert in ein falsches Feld eingetragen hat - zum Beispiel indem er Vorname und Nachname vertauscht Dann m&ouml;chte er die &Auml;nderung vermutlich r&uuml;ckg&auml;ngig machen. Aber wie, wenn er den vorherigen Wert nicht mehr in Erinnerung hat Also erleichtern wir ihm die Arbeit, indem wir die alten Werte neben den entsprechenden Textfeldern anzeigen.","og_url":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:42:27+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datensatz&auml;nderungen auf einen Blick","datePublished":"2020-05-14T13:42:27+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/"},"wordCount":3043,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5","articleSection":["2017","3\/2017","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/","url":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/","name":"Datensatz&auml;nderungen auf einen Blick - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5","datePublished":"2020-05-14T13:42:27+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/aa5a2cf9e74b4f668eed45aecd6247f5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datensatzaenderungen_auf_einen_Blick\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datensatz&auml;nderungen auf einen Blick"}]},{"@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\/55001085","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=55001085"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001085\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}