{"id":55000276,"date":"2005-06-01T00:00:00","date_gmt":"2021-02-11T20:50:18","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=276"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Undo_in_Formularen_und_Unterformularen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/","title":{"rendered":"Undo in Formularen und Unterformularen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Andr&eacute; Minhorst, Duisburg<\/b><\/p>\n<p><b>Die Verwendung von Formularen und Unterformularen ist ein probates Mittel zur Darstellung von Daten aus 1:n- und m:n-Beziehungen. Dabei tritt immer wieder das &auml;rgernis zu Tage, dass Access von Haus aus keine M&ouml;glichkeit mitbringt, &auml;nderungen an den Daten im Unterformular in einem Schritt mit denen des Hauptformulars r&uuml;ckg&auml;ngig zu machen. Dieser Beitrag stellt eine L&ouml;sung vor, wie die Benutzer einer Datenbank dennoch mit einem Mausklick komplexe &auml;nderungen r&uuml;ckg&auml;ngig machen k&ouml;nnen.<\/b><\/p>\n<h3>Hinweis<\/h3>\n<p>Die Beispieldatenbanken zu diesem Beitrag hei&szlig;en Forms.mdb und FormsAndSubforms.mdb. Sie finden die Datenbanken auf der Heft-CD oder im Internet unter http:\/\/www.access-im-unternehmen.de unter dem Shortlink 276. N&uuml;tzliche Informationen gibt es im Beitrag Transaktionen in Access, Shortlink 275. <\/p>\n<p>Der Einsatz von Haupt- und Unterformularen ist durch die Verkn&uuml;pfung der Datenherk&uuml;nfte dieser beiden sehr hilfreich, erm&ouml;glicht er doch die Bearbeitung zusammenh&auml;ngender Daten wie beispielsweise Bestellungen und bestellter Artikel (siehe Bild 1).<\/p>\n<p><IMG height=\"270\" src=\"..\/fileadmin\/_temp_\/{150CDBE5-F617-4842-A9D2-D8977567E725}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:  Anzeige von Bestelldaten in Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Leider lassen diese Formulare eine sehr wichtige Eigenschaft vermissen: Sie bieten keine Undo-Funktion, die alle seit dem Anzeigen des Datensatzes im Hauptformular get&auml;tigten &auml;nderungen r&uuml;ckg&auml;ngig macht. Es reicht gerade zu einer Undo-Funktion f&uuml;r den im Hauptformular angezeigten Datensatz. Wenn man einmal versehentlich den Hauptformular-Datensatz wechselt und &auml;nderungen an den Datens&auml;tzen im Unterformular vornimmt, ist dort maximal der letzte bearbeitete Datensatz noch zu retten. Den Rest k&ouml;nnen Sie aus dem Ged&auml;chtnis reproduzieren.<\/p>\n<p>Wenn Sie nicht aus Sicherheitsgr&uuml;nden vor jeder Verwendung solcher Formulare eine Kopie der Datenbank anlegen m&ouml;chten, lesen Sie weiter: Zum Warmmachen erfahren Sie zun&auml;chst, wie Sie &auml;nderungen in einem einfachen Formular vom &ouml;ffnen des Formulars an verwerfen k&ouml;nnen, und dann geht es an die Unterformulare: Hier lernen Sie, wie Sie alle &auml;nderungen am aktuellen Datensatz des Hauptformulars und den verkn&uuml;pften Datens&auml;tzen des Unterformulars mit einem Mausklick r&uuml;ckg&auml;ngig machen &#8211; wenn Sie den Datensatz nicht zwischenzeitlich verlassen oder gespeichert haben.<\/p>\n<p>Abhilfe schafft die Verwendung so genannter Transaktionen, mit denen man eine Abfolge von Datenbankaktionen zusammenfassen und entweder komplett &uuml;bernehmen oder wieder verwerfen kann.<\/p>\n<h3>Hinweis<\/h3>\n<p>Der Beitrag Transaktionen in Access in der vorliegenden Ausgabe von Access im Unternehmen (oder unter http:\/\/www.access-im-unternehmen.de, Shortlink 275) beschreibt im Detail, wie Transaktionen funktionieren und wie man sie einsetzen kann. <\/p>\n<p>Die wichtigsten Merkmale von Transaktionen in diesem Zusammenhang sind die, dass alle innerhalb einer Transaktion zu ber&uuml;cksichtigenden Vorg&auml;nge im Kontext eines Workspace-Objekts  (DAO) oder eines Connection-Objekts (ADO) erfolgen m&uuml;ssen und dass alle auf diese Weise durchgef&uuml;hrten &auml;nderungen entweder komplett zu speichern oder komplett zu verwerfen sind.<\/p>\n<p>Die Beispieldatenbanken enthalten zwei sehr einfach aufgebaute Tabellen. Die erste hei&szlig;t tblKunden und enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld KundeID lediglich das Feld Kundenname. Die zweite Tabelle hei&szlig;t tblProjekte und besteht aus den Feldern ProjektID, Projekt und KundeID. Letzteres ist ein Fremdschl&uuml;sselfeld f&uuml;r die Verkn&uuml;pfung mit der Tabelle tblKunden.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die hier vorgestellten Techniken funktionieren nur unter Access 2000 und h&ouml;her. <\/p>\n<p>Bereits bei der Arbeit mit einem Formular kann es sinnvoll sein, alle seit dem &ouml;ffnen des Formulars durchgef&uuml;hrten &auml;nderungen wieder r&uuml;ckg&auml;ngig zu machen. Wie das funktioniert, erfahren Sie in nachfolgendem Beispiel.<\/p>\n<p>Das hier verwendete Formular basiert auf der Tabelle tblKunden und zeigt lediglich die beiden Felder dieser Tabelle an (siehe Bild 2). Zus&auml;tzlich enth&auml;lt das Formular eine Schaltfl&auml;che namens cmdOK und eine namens cmdAbbrechen.<\/p>\n<p>Letztere soll daf&uuml;r sorgen, dass alle seit dem &ouml;ffnen des Formulars durchgef&uuml;hrten &auml;nderungen verworfen werden.<\/p>\n<p>Bis Access 2000 gab es keine M&ouml;glichkeit, die w&auml;hrend der Arbeit mit einem Formular ablaufenden Aktionen in einer Transaktion zusammenzufassen. Der Grund sind die bereits weiter oben beschriebenen Workspace- beziehungsweise Connection-Objekte, in deren Kontext die Transaktion abl&auml;uft. Gebundene Formulare arbeiten Datenoperationen au&szlig;erhalb der &uuml;blichen Bereiche ab, sodass sich dort keine Transaktion starten l&auml;sst.<\/p>\n<p><IMG height=\"170\" src=\"..\/fileadmin\/_temp_\/{150CDBE5-F617-4842-A9D2-D8977567E725}\/pic002.png\" width=\"334\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  Beispielformular f&uuml;r das formularweite Undo<\/span><\/b><\/p>\n<p>Der Unterschied ab Version 2000, der dies erlaubt, ist die M&ouml;glichkeit der Verwendung von Recordset-Objekten als Datenherkunft von Formularen.<\/p>\n<p>Das Beispielformular ist derzeit noch an die Tabelle tblKunden gebunden, da Sie diese Tabelle als Datenherkunft des Formulars festgelegt haben.<\/p>\n<p>Ab Access 2000 k&ouml;nnen Sie das Formular auch an ein Recordset-Objekt binden, das die Daten dieser Tabelle enth&auml;lt.<\/p>\n<p>Um das nachzuvollziehen, leeren Sie einfach die Eigenschaft Datenherkunft des Formulars und legen f&uuml;r die Ereigniseigenschaft die Prozedur aus Quellcode 1 an.<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset _        (\"tblKunden\", dbOpenDynaset)\r\n    Set Me.Recordset = rst\r\nEnd Sub<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p>Wenn Sie das Formular erneut &ouml;ffnen, stellen Sie fest, dass es wie vorher die gew&uuml;nschten Daten anzeigt.<\/p>\n<pre>Private Sub Form_Delete(Cancel As Integer)\r\n    If bolDirty = False Then\r\n        bolDirty = True\r\n        DBEngine.BeginTrans\r\n    End If\r\nEnd Sub\r\nPrivate Sub Form_Dirty(Cancel As Integer)\r\n    If bolDirty = False Then\r\n        bolDirty = True\r\n        DBEngine.BeginTrans\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<pre>Private Sub cmdOK_Click()\r\n    DoCmd.RunCommand acCmdSaveRecord\r\n    If bolDirty = True Then\r\n        DBEngine.CommitTrans\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    If bolDirty = True Then\r\n        DBEngine.Rollback\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<p>Es gibt zwei Ereignisse, die beim &auml;ndern oder L&ouml;schen von Daten ausgel&ouml;st werden: Bei Ge&auml;ndert und Beim L&ouml;schen. Das Ereignis, das als Erstes ausgel&ouml;st wird, muss die Transaktion starten. Damit bei mehreren &auml;nderungen am Datenbestand nicht jedes Mal eine neue Transaktion gestartet wird, fragt die jeweilige Ereignisprozedur nach, ob schon eine Transaktion gestartet wurde. F&uuml;r diesen Zweck legen Sie eine Variable namens bolDirty im Kopf des Moduls an:<\/p>\n<pre>Dim bolDirty As Boolean<\/pre>\n<p>Mit dieser Variable im Gep&auml;ck k&ouml;nnen Sie direkt die Prozeduren anlegen, die durch die Ereigniseigenschaften Bei Ge&auml;ndert und Beim L&ouml;schen ausgel&ouml;st werden (s. Quellcode 2). Die Prozeduren pr&uuml;fen, ob die Variable bolDirty den Wert False hat, und starten in diesem Fall eine Transaktion.<\/p>\n<p><!--30percent--><\/p>\n<p>Schlie&szlig;lich legen Sie f&uuml;r die Schaltfl&auml;chen cmdOK und cmdAbbrechen noch zwei Prozeduren an, die pr&uuml;fen, ob eine Transaktion begonnen wurde, und diese gegebenenfalls beenden oder abbrechen.<\/p>\n<p>Die OK-Schaltfl&auml;che l&ouml;st die Prozedur aus Quellcode 3 aus. Da der Benutzer diese Schaltfl&auml;che m&ouml;glicherweise anklickt, obwohl der aktuelle Datensatz zwar bearbeitet, aber noch nicht gespeichert ist, speichert die Prozedur den Datensatz zun&auml;chst. Anschlie&szlig;end pr&uuml;ft die Prozedur den Wert der Variablen bolDirty und damit, ob eine &auml;nderung durchgef&uuml;hrt und eine Transaktion ausgel&ouml;st wurde. Ist das der Fall, wird das Speichern der innerhalb der Transaktion durchgef&uuml;hrten &auml;nderungen ausgel&ouml;st.<\/p>\n<p>Die Abbrechen-Schaltfl&auml;che soll alle &auml;nderungen, die seit dem &ouml;ffnen des Formulars durchgef&uuml;hrt wurden, r&uuml;ckg&auml;ngig machen.<\/p>\n<p>Dies ist nur n&ouml;tig, wenn entweder &auml;nderungen gespeichert wurden oder dies nicht der Fall ist und es offene &auml;nderungen gibt. In beiden F&auml;llen sorgt die Rollback-Methode f&uuml;r das Verwerfen der vorgenommenen &auml;nderungen (s. Quellcode 4).<\/p>\n<p>Probieren Sie das Formular nun aus. Wenn Sie etwa den Namen eines Kunden &auml;ndern und anschlie&szlig;end auf OK klicken, wird diese &auml;nderung gespeichert und beim n&auml;chsten &ouml;ffnen wieder angezeigt. Klicken Sie auf Abbrechen und &ouml;ffnen das Formular erneut, finden Sie den Datensatz unver&auml;ndert vor.<\/p>\n<p>Interessant wird es aber erst bei mehreren &auml;nderungen: L&ouml;schen Sie einen Datensatz, f&uuml;gen Sie einen neuen hinzu und &auml;ndern Sie vorhandene Datens&auml;tze &#8211; mit einem Klick auf die Abbrechen-Schaltfl&auml;che und dem erneuten &ouml;ffnen des Formulars finden Sie den alten Stand wieder vor.<\/p>\n<p>Genauso n&uuml;tzlich wie das Verwerfen von &auml;nderungen mehrerer Datens&auml;tze in einem Formular ohne Unterformular ist die Vorgehensweise in Formularen mit Unterformular. Dabei kommt gr&ouml;&szlig;tenteils die bereits beschriebene Technik zum Zuge, allerdings l&auml;sst sich die L&ouml;sung nur auf einen einzelnen Datensatz im Hauptformular und die verkn&uuml;pften Datens&auml;tze im Unterformular ausf&uuml;hren.<\/p>\n<p>Der Grund ist, dass wie bei dem vorherigen Beispiel eine Transaktion nur Datenbankoperationen innerhalb des angegebenen &#8211; in diesem Fall des aktuellen &#8211; Workspace ber&uuml;cksichtigen kann. Wie beim Hauptformular klappt dies auch in Unterformularen nur, wenn die Datenherkunft mittels Recordset-Objekt zugewiesen wird. Die Zuweisung muss bei jedem Datensatzwechsel im Hauptformular erneut durchgef&uuml;hrt werden.<\/p>\n<p>Leider l&auml;sst sich der Recordset-Eigenschaft kein entsprechendes Objekt zuweisen, w&auml;hrend eine Transaktion l&auml;uft. Daher m&uuml;ssen Sie auf den kompletten Komfort &#8211; also &auml;nderungen in mehreren Hauptformulardatens&auml;tzen plus den im Unterformular angezeigten Daten r&uuml;ckg&auml;ngig zu machen &#8211; leider verzichten und mit dem Verwerfen der &auml;nderungen des aktuellen Datensatzes im Hauptformular und der verkn&uuml;pften Daten im Unterformular vorlieb nehmen.<\/p>\n<p>In einem Formular wie dem Bestellformular aus Bild 1 k&ouml;nnten Sie also nach Lust und Laune &auml;nderungen vornehmen und bestellte Artikel hinzuf&uuml;gen und wieder entfernen &#8211; nach einem Klick auf eine (hier nicht vorhandene) Abbrechen-Schaltfl&auml;che w&auml;re alles wieder beim Alten.<\/p>\n<p><b>Voraussetzungen<\/b><\/p>\n<p>F&uuml;r die Funktion der nachfolgend beschriebenen Technik m&uuml;ssen einige Voraussetzungen erf&uuml;llt sein:<\/p>\n<li>Haupt- und Unterformular sind nicht gebunden, die Steuerelemente enthalten aber als Steuerelementinhalt die Felder der sp&auml;ter hinzugef&uuml;gten Datenherkunft.<\/li>\n<li>Die Anzeige der Best&auml;tigungen von Datensatz&auml;nderungen ist aktiviert (Dialog Optionen, Registerblatt Bearbeiten\/Suchen). Sonst wird das Ereignis Nach L&ouml;schbest&auml;tigung nicht ausgel&ouml;st, ohne die die L&ouml;sung nicht funktioniert.<\/li>\n<p><b>Aufbau der Formulare<\/b><\/p>\n<p>Das Hauptformular ist genauso wie das Formular aus dem vorherigen Beispiel aufgebaut. Erstellen Sie es zu Beispielzwecken neu oder kopieren Sie das vorhandene Formular und entfernen Sie den enthaltenen Code.<\/p>\n<p>Das Unterformular sieht im Entwurf wie in Bild 3 aus. Zum Erstellen des Formulars stellen Sie zun&auml;chst die Datenherkunft auf die Tabelle tblKunden ein, ziehen alle Felder aus der Feldliste in den Detailbereich und l&ouml;schen dann den f&uuml;r die Eigenschaft Datenherkunft angegebenen Wert &#8211; die Datenherkunft wird sp&auml;ter dynamisch zugewiesen. Ordnen Sie die Steuerelemente wie in der Abbildung an.<\/p>\n<p><IMG height=\"198\" src=\"..\/fileadmin\/_temp_\/{150CDBE5-F617-4842-A9D2-D8977567E725}\/pic003.png\" width=\"366\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Entwurfsansicht des Unterformulars<\/span><\/b><\/p>\n<pre>Option Compare Database\r\nOption Explicit\r\nDim mDirtyForm As Boolean\r\nDim mDeletedForm As Boolean\r\nDim db As DAO.Database\r\nDim wrk As DAO.Workspace\r\nPublic Property Get DirtyForm() As Boolean\r\n    DirtyForm = mDirtyForm\r\nEnd Property\r\nPublic Property Let DirtyForm (bolDirtyForm As Boolean)\r\n    mDirtyForm = bolDirtyForm\r\nEnd Property<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim rst As DAO.Recordset\r\n    Set db = DBEngine(0)(0)\r\n    Set wrk = DBEngine.Workspaces(0)\r\n    Set rst = db.OpenRecordset(\"tblKunden\", _        dbOpenDynaset)\r\n    Set Me.Recordset = rst\r\nEnd Sub<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<p><IMG height=\"353\" src=\"..\/fileadmin\/_temp_\/{150CDBE5-F617-4842-A9D2-D8977567E725}\/pic004.png\" width=\"422\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4:  Haupt- und Unterformular in der Entwurfsansicht<\/span><\/b><\/p>\n<p>F&uuml;gen Sie nun das Formular frmProjekte als Unterformular in das Formular frmKundenProjekte ein (siehe Bild 4).<\/p>\n<p><b>VBA-Code der Formulare<\/b><\/p>\n<p>Die Funktionalit&auml;t des Formulars aus dem ersten Beispiel muss nun angepasst und auf das Unterformular ausgedehnt werden. Das bedeutet, dass Transaktionen nicht mehr nur aus dem Hauptformular, sondern auch aus dem Unterformular heraus gestartet werden k&ouml;nnen. Dementsprechend m&uuml;ssen auch die Variablen zum Speichern der Zust&auml;nde (bolDirtyForm und bolSavedForm) in beiden Formularen verf&uuml;gbar sein.<\/p>\n<p>Eine &ouml;ffentliche Deklaration ist nicht besonders vorteilhaft, daher verwenden Sie Property Get- und Property Set-Anweisungen f&uuml;r den Zugriff auf diese Variablen. Deren Deklaration erfolgt nach wie vor im Codemodul des Hauptformulars. Der erste Teil des Moduls enth&auml;lt die in Quellcode 5 abgebildeten Zeilen.<\/p>\n<p><b>&ouml;ffnen des Hauptformulars<\/b><\/p>\n<p>Das &ouml;ffnen des Hauptformulars l&ouml;st die Ereignisprozedur Form_Open aus. Die Prozedur stellt die Variablen db und wrk auf das aktuelle Database- und Workspace-Objekt ein und weist der Recordset-Eigenschaft des Formulars ein Recordset-Objekt mit der Tabelle tblKunden zu (s. Quellcode 6).<\/p>\n<p><b>Anzeigen eines neuen Datensatzes<\/b><\/p>\n<pre>Private Sub Form_Current()\r\n    Dim rst As DAO.Recordset\r\n    If Me.DirtyForm = True Then\r\n        DoCmd.RunCommand acCmdSaveRecord\r\n        wrk.CommitTrans\r\n        Me.DirtyForm = False\r\n    End If\r\n    If mDeletedForm = False Then\r\n        UnterformularAktualisieren\r\n    Else\r\n        mDeletedForm = False\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 7<\/b><\/p>\n<pre>Private Sub Form_Dirty(Cancel As Integer)\r\n    If Me.DirtyForm = False Then\r\n        Me.DirtyForm = True\r\n        wrk.BeginTrans\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 8<\/b><\/p>\n<pre>Private Sub Form_Delete(Cancel As Integer)\r\n    mDeletedForm = True\r\nEnd Sub<\/pre>\n<p><b>Quellcode 9<\/b><\/p>\n<pre>Private Sub Form_AfterDelConfirm(Status As Integer)\r\n    UnterformularAktualisieren\r\nEnd Sub<\/pre>\n<p><b>Quellcode 10<\/b><\/p>\n<p>Das Ereignis Beim Anzeigen wird nach dem &ouml;ffnen des Formulars und bei jedem Datensatzwechsel ausgel&ouml;st.<\/p>\n<p>Damit tritt die entsprechende Prozedur vor allem immer dann in Aktion, wenn der Benutzer einen Datensatz verl&auml;sst und einen neuen anzeigt. Das ist Grund genug, den aktuellen Datensatz und die verkn&uuml;pften Daten zu speichern und eine eventuell aktive Transaktion zu beenden.<\/p>\n<p>Die Prozedur Form_Current tut dies, indem sie zun&auml;chst den Datensatz speichert, die Transaktion beendet und die Eigenschaft DirtyForm auf den Wert False zur&uuml;cksetzt.<\/p>\n<p>Au&szlig;erdem stellt die Prozedur die Datenherkunft des Unterformulars so ein, dass die zu dem im Hauptformular angezeigten Kunden passenden Projekte angezeigt werden (s. Quellcode 7).<\/p>\n<p>Dies passiert allerdings nur, wenn die Variable mDeletedForm den Wert True hat &#8211; wann das der Fall ist, erfahren Sie direkt im Anschluss.<\/p>\n<p>Das Ereignis Bei &auml;nderung sorgt wie im vorherigen Beispiel daf&uuml;r, dass die Eigenschaft DirtyForm auf den Wert True gesetzt und die Transaktion gestartet wird (s. Quellcode 8).<\/p>\n<h3>Keine Transaktion beim L&ouml;schen im Hauptformular<\/h3>\n<p>Das Ereignis Beim L&ouml;schen l&ouml;st die Prozedur aus Quellcode 9 aus. Diese stellt lediglich die Variable mDeletedForm auf den Wert True ein.<\/p>\n<p>Der Hintergrund f&uuml;r diese Variable ist, dass beim L&ouml;schen des Datensatzes im Hauptformular direkt zum n&auml;chsten verf&uuml;gbaren Datensatz gewechselt wird.<\/p>\n<p>Der L&ouml;schvorgang selbst dauert aber &uuml;ber den Datensatzwechsel (Form_Current) hinaus an, die beiden Ereignisse BeforeDelConfirm und AfterDelConfirm finden erst im Anschluss an die Anzeige des neuen Datensatzes statt. Da das L&ouml;schen selbst auch in einer (von Access gesteuerten) Transaktion stattfindet, w&uuml;rde das Wechseln des Recordset-Objekts des Unterformulars im Ereignis Beim Anzeigen des Formulars in diese Transaktion fallen und einen Fehler ausl&ouml;sen.<\/p>\n<p>Daher m&uuml;ssen Sie das Aktualisieren des Unterformulars nach hinten verschieben &#8211; in das Ereignis Nach L&ouml;schbest&auml;tigung (s. Quellcode 10).<\/p>\n<p>Diese ruft dann die Prozedur UnterformularAktualisieren auf, die f&uuml;r das Aktualisieren der Datenherkunft des Unterformulars verantwortlich ist.<\/p>\n<p>Zwischenzeitlich l&ouml;st Access auch noch das Ereignis Vor L&ouml;schbest&auml;tigung aus, in dem hier lediglich die Standardmeldung von Access unterbunden wird. Gegebenenfalls k&ouml;nnen Sie hier eine eigene Meldung integrieren (s. Quellcode 11).<\/p>\n<pre>Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)\r\n    Response = acDataErrContinue\r\nEnd Sub<\/pre>\n<p><b>Quellcode 11<\/b><\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    If Me.DirtyForm = True Then\r\n        wrk.Rollback\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub\r\nPrivate Sub cmdOK_Click()\r\n    DoCmd.RunCommand acCmdSaveRecord\r\n    If Me.DirtyForm = True Then\r\n        wrk.CommitTrans\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><b>Quellcode 12<\/b><\/p>\n<pre>Private Sub UnterformularAktualisieren()\r\n    Dim strSQL As String\r\n    Dim rst As DAO.Recordset\r\n    strSQL = \"SELECT * FROM tblProjekte \" & \"WHERE KundeID = \" & Nz(Me.KundeID, 0)\r\n    Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)\r\n    Set Me.frmProjekte.Form.Recordset = rst\r\nEnd Sub<\/pre>\n<p><b>Quellcode 13<\/b><\/p>\n<p>Auch die Prozeduren, die durch die Schaltfl&auml;chen cmdOK und cmdAbbrechen ausgel&ouml;st werden, unterscheiden sich lediglich durch den Bezug auf die entsprechenden Formulareigenschaften von denen des vorherigen Beispiels (s. Quellcode 12).<\/p>\n<h3>Aktualisieren des Unterformulars<\/h3>\n<pre>Option Compare Database\r\nOption Explicit\r\nDim wrk As DAO.Workspace\r\nPrivate Sub Form_BeforeDelConfirm(Cancel As Integer, _    Response As Integer)\r\n    Response = acDataErrContinue\r\nEnd Sub\r\nPrivate Sub Form_Delete(Cancel As Integer)\r\n    If Me.Parent.DirtyForm = False Then\r\n        Me.Parent.DirtyForm = True\r\n        wrk.BeginTrans\r\n    End If\r\nEnd Sub\r\nPrivate Sub Form_Dirty(Cancel As Integer)\r\n    If Me.NewRecord Then\r\n        Me.KundeID = Me.Parent.KundeID\r\n    End If\r\n    If Me.Parent.DirtyForm = False Then\r\n        Me.Parent.DirtyForm = True\r\n        wrk.BeginTrans\r\n    End If\r\nEnd Sub\r\nPrivate Sub Form_Open(Cancel As Integer)\r\n    Set wrk = DBEngine.Workspaces(0)\r\nEnd Sub<\/pre>\n<p><b>Quellcode 14<\/b><\/p>\n<p>Da Haupt- und Unterformular nicht, wie sonst &uuml;blich, &uuml;ber die Eigenschaften Verkn&uuml;pft von und Verkn&uuml;pft nach miteinander verkn&uuml;pft sind, m&uuml;ssen Sie den Inhalt des Unterformulars selbst aktualisieren. Dazu dient die Prozedur aus Quellcode 13, die beim Datensatzwechsel (Form_Current) und beim L&ouml;schen eines Datensatzes (Form_Delete) ausgel&ouml;st wird.<\/p>\n<h3>Transaktion auf das Unterformular erweitern<\/h3>\n<p>Datensatz&auml;nderungen im Unterformular werden zwar in der im Hauptformular gestarteten Transaktion ber&uuml;cksichtigt, aber sie l&ouml;sen selbst keine Transaktion aus. Daher m&uuml;ssen &auml;nderungen im Unterformular ebenfalls eine Transaktion starten k&ouml;nnen, wenn noch keine Transaktion l&auml;uft.<\/p>\n<p>Die dazu notwendigen Prozeduren sind in Form des kompletten Formularmoduls in Quellcode 14 abgebildet. Das Unterformular ben&ouml;tigt einen eigenen Verweis auf den aktuellen Workspace und verwendet die entsprechende Objektvariable in den Prozeduren Form_Delete und Form_Dirty, um eine Transaktion zu starten. Der Aufbau &auml;hnelt den entsprechenden Prozeduren des Hauptformulars und wird hier nicht weiter erl&auml;utert.<\/p>\n<p>Wichtig ist, dass die Prozeduren Form_Delete und Form_Dirty anhand der Eigenschaft DirtyForm des Hauptformulars ermitteln, ob schon eine Transaktion l&auml;uft und diese Eigenschaft auch entsprechend anpassen, wenn sie selbst eine Transaktion starten.<\/p>\n<p>Mit der hier vorgestellten Technik k&ouml;nnen Sie Unterformulare in Undo-Funktionen einbeziehen und eine Abbrechen-Schaltfl&auml;che zumHauptformular hinzuf&uuml;gen, die ihren Namen zu Recht tr&auml;gt.<\/p>\n<p>Damit werden nicht nur die &auml;nderungen im Hauptformular, sondern auch alle &auml;nderungen an den verkn&uuml;pften Datens&auml;tzen erfasst und gegebenenfalls verworfen.<\/p>\n<p>In einer der n&auml;chsten Ausgaben lernen Sie eine Vereinfachung dieser Vorgehensweise kennen, die das Anlegen ein und desselben Codes in jedem einzelnen Formular umgeht.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormsAndSubforms.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/5653DD96-DB03-4F93-8D90-1E343B918C8F\/aiu_276.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Verwendung von Formularen und Unterformularen ist ein probates Mittel zur Darstellung von Daten aus 1:n- und m:n-Beziehungen. Dabei tritt immer wieder das &Auml;rgernis zu Tage, dass Access von Haus aus keine M&ouml;glichkeit mitbringt, &Auml;nderungen an den Daten im Unterformular in einem Schritt mit denen des Hauptformulars r&uuml;ckg&auml;ngig zu machen. Dieser Beitrag stellt eine L&ouml;sung vor, wie die Benutzer einer Datenbank dennoch mit einem Mausklick komplexe &Auml;nderungen r&uuml;ckg&auml;ngig machen k&ouml;nnen.<\/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":[662005,66032005,44000038,44000021],"tags":[],"class_list":["post-55000276","post","type-post","status-publish","format-standard","hentry","category-662005","category-66032005","category-Sicherheit","category-Tabellen_und_Datenmodellierung"],"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>Undo in Formularen und Unterformularen - 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\/Undo_in_Formularen_und_Unterformularen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Undo in Formularen und Unterformularen\" \/>\n<meta property=\"og:description\" content=\"Die Verwendung von Formularen und Unterformularen ist ein probates Mittel zur Darstellung von Daten aus 1:n- und m:n-Beziehungen. Dabei tritt immer wieder das &Auml;rgernis zu Tage, dass Access von Haus aus keine M&ouml;glichkeit mitbringt, &Auml;nderungen an den Daten im Unterformular in einem Schritt mit denen des Hauptformulars r&uuml;ckg&auml;ngig zu machen. Dieser Beitrag stellt eine L&ouml;sung vor, wie die Benutzer einer Datenbank dennoch mit einem Mausklick komplexe &Auml;nderungen r&uuml;ckg&auml;ngig machen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T20:50:18+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933\" \/>\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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Undo in Formularen und Unterformularen\",\"datePublished\":\"2021-02-11T20:50:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/\"},\"wordCount\":2619,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/bf4d461d129c4adc89fe67163b708933\",\"articleSection\":[\"2005\",\"3\\\/2005\",\"Sicherheit\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/\",\"name\":\"Undo in Formularen und Unterformularen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/bf4d461d129c4adc89fe67163b708933\",\"datePublished\":\"2021-02-11T20:50:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/bf4d461d129c4adc89fe67163b708933\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/bf4d461d129c4adc89fe67163b708933\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Undo_in_Formularen_und_Unterformularen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Undo in Formularen und Unterformularen\"}]},{\"@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":"Undo in Formularen und Unterformularen - 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\/Undo_in_Formularen_und_Unterformularen\/","og_locale":"de_DE","og_type":"article","og_title":"Undo in Formularen und Unterformularen","og_description":"Die Verwendung von Formularen und Unterformularen ist ein probates Mittel zur Darstellung von Daten aus 1:n- und m:n-Beziehungen. Dabei tritt immer wieder das &Auml;rgernis zu Tage, dass Access von Haus aus keine M&ouml;glichkeit mitbringt, &Auml;nderungen an den Daten im Unterformular in einem Schritt mit denen des Hauptformulars r&uuml;ckg&auml;ngig zu machen. Dieser Beitrag stellt eine L&ouml;sung vor, wie die Benutzer einer Datenbank dennoch mit einem Mausklick komplexe &Auml;nderungen r&uuml;ckg&auml;ngig machen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T20:50:18+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Undo in Formularen und Unterformularen","datePublished":"2021-02-11T20:50:18+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/"},"wordCount":2619,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933","articleSection":["2005","3\/2005","Sicherheit","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/","url":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/","name":"Undo in Formularen und Unterformularen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933","datePublished":"2021-02-11T20:50:18+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/bf4d461d129c4adc89fe67163b708933"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Undo_in_Formularen_und_Unterformularen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Undo in Formularen und Unterformularen"}]},{"@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\/55000276","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=55000276"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000276\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}