{"id":55000354,"date":"2017-06-01T00:00:00","date_gmt":"2020-01-24T15:59:49","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=354"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Transaktionen_in_Access","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html","title":{"rendered":"Transaktionen in Access"},"content":{"rendered":"<p class='introduction'>Wenn Sie Datenbankaktionen per Code ausf&uuml;hren, also beispielsweise mit der Methode <b>Execute <\/b>des <b>Database<\/b>-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und &auml;ndern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausf&uuml;hren wollen, die nur dann ausgef&uuml;hrt werden sollen, wenn die Ausf&uuml;hrung jeder einzelnen Aktion erfolgreich ist Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext &uuml;ber eine oder mehrere Datenbank&auml;nderungen, der nach dem Ausf&uuml;hrung aller &auml;nderungen entweder komplett abgeschlossen oder verworfen werden kann.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1703_Transaktionen.accdb<\/b>.<\/p>\n<h2>M&ouml;glichkeiten der &auml;nderung von Daten<\/h2>\n<p>Unter DAO gibt es verschiedene M&ouml;glichkeiten, per Code Daten zu &auml;ndern. Die erste Variante nutzt etwa die <b>AddNew<\/b>-Methode, um einen neuen Datensatz zu einem Recordset hinzuzuf&uuml;gen und schlie&szlig;t den Vorgang nach dem Festlegen der Feldinhalte mit der <b>Update<\/b>-Methode ab:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Datenaenderungen()\r\n    <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"tblKategorien\", dbOpenDynaset)\r\n    rst.Add<span style=\"color:blue;\">New<\/span>\r\n    rst!Kategoriename = \"Neue Kategorie\"\r\n    rst.Update\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier gibt es keine offenen Fragen: Wenn keine Fehlermeldung erscheint, speichert die Prozedur den Datensatz wie gew&uuml;nscht in der Datenbank. Ein Fehler tritt beispielsweise auf, wenn Sie zwei Mal den gleichen Wert f&uuml;r das Feld Kategoriename in der Datenbank speichern und den eindeutigen Index f&uuml;r dieses Feld verletzen. In diese Fall wird der Datensatz dann einfach nicht gespeichert.<\/p>\n<p>Etwas anders sieht es aus, wenn Sie die Aufgaben mit der <b>Execute<\/b>-Methode ausf&uuml;hren und dazu eine entsprechende SQL-Abfrage formulieren. Ein ganz einfaches Beispiel sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>NeuerDatensatzExecute()\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 \"INSERT INTO tblKategorien          (Kategoriename) VALUES('Noch eine Kategorie')\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch hier gilt: Der Datensatz wird entweder eingetragen oder auch nicht. &uuml;ber letzteres werden wir allerdings nicht informiert, denn wir haben den Wert <b>dbFailOnError <\/b>f&uuml;r den zweiten Parameter der <b>Execute<\/b>-Methode vergessen. Erst damit setzt es eine Fehlermeldung, wenn Sie beispielsweise versuchen, den gleichen Kategorienamen zwei Mal hintereinander einzuf&uuml;gen (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_354_001.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_354_001.png\" alt=\"Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens<\/p>\n<h2>Probleme mit mehreren betroffenen Datens&auml;tzen<\/h2>\n<p>Nun schauen wir uns an, was passiert, wenn wir mit einer Aktionsabfrage gleich mehrere Datens&auml;tze &auml;ndern wollen &#8211; beispielsweise, indem wir versuchen, alle Einzelpreise in der Tabelle <b>tblArtikel <\/b>um 10 EUR zu senken:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>MehrereDatensaetze()\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 tblArtikel SET Einzelpreis =                                        Einzelpreis - 10\"\r\n    <span style=\"color:blue;\">Debug.Print<\/span> \"Betroffene Datens&auml;tze: \" _\r\n        & db.RecordsAffected\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir verwenden bewusst noch einmal die Variante der <b>Execute<\/b>-Methode ohnen den Wert <b>dbFailOnError<\/b>. Was geschieht Es wird nat&uuml;rlich keine Fehlermeldung ausgel&ouml;st und wir erhalten im Direktfenster die folgende Ausgabe:<\/p>\n<pre>Betroffene Datens&auml;tze: 38<\/pre>\n<p>Das hei&szlig;t, dass von den 77 Datens&auml;tzen dieser Tabelle nur 38 ge&auml;ndert wurden. Bei den &uuml;brigen hat die G&uuml;ltigkeitsregel gegriffen, die besagt, dass nur Werte gr&ouml;&szlig;er oder gleich <b>0 <\/b>in das Feld eingegeben werden d&uuml;rfen. Welche Erkenntnis ziehen wir daraus Aktionsabfragen, die sich auf mehrere Datens&auml;tze beziehen, werden unter Umst&auml;nden nicht komplett ausgef&uuml;hrt.<\/p>\n<p>F&uuml;gen wir dem Aufruf der <b>Execute<\/b>-Methode hingegen wieder den Wert <b>dbFailOnError <\/b>als zweiten Parameter hinzu, wird die Abfrage insgesamt nicht ausgef&uuml;hrt, sondern die G&uuml;ltigkeitsmeldung erscheint (siehe Bild 2):<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_354_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_354_002.png\" alt=\"Fehlermeldung bei Verletzung der G&uuml;ltigkeitsregel bei mindestem einem der betroffenen Datens&auml;tze\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Fehlermeldung bei Verletzung der G&uuml;ltigkeitsregel bei mindestem einem der betroffenen Datens&auml;tze<\/p>\n<pre>db.Execute \"UPDATE tblArtikel SET Einzelpreis = Einzelpreis - 10\", dbFailOnError<\/pre>\n<p>Wenn Sie eine solche Abfrage &uuml;ber die Benutzeroberfl&auml;che &uuml;ber den Abfrageentwurf formulieren und starten, erhalten Sie eine Fehlermeldung wie in Bild 3. Hier erhalten Sie zwar keine genaue Angabe, warum die Daten nicht aktualisiert werden k&ouml;nnen, aber immerhin haben Sie die M&ouml;glichkeit, die Aktualisierung abzubrechen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_354_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_354_003.png\" alt=\"Fehlermeldung, wenn nicht alle Daten ge&auml;ndert werden k&ouml;nnen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Fehlermeldung, wenn nicht alle Daten ge&auml;ndert werden k&ouml;nnen<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000354\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000354?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000354\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Datenbankaktionen per Code ausf&uuml;hren, also beispielsweise mit der Methode <b>Execute <\/b>des <b>Database<\/b>-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und &auml;ndern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausf&uuml;hren wollen, die nur dann ausgef&uuml;hrt werden sollen, wenn die Ausf&uuml;hrung jeder einzelnen Aktion erfolgreich ist Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext &uuml;ber eine oder mehrere Datenbank&auml;nderungen, der nach dem Ausf&uuml;hrung aller &auml;nderungen entweder komplett abgeschlossen oder verworfen werden kann.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662017,66032017,44000018],"tags":[],"class_list":["post-55000354","post","type-post","status-publish","format-standard","hentry","category-662017","category-66032017","category-Datenzugriff_programmieren"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Transaktionen in Access - Access [basics]<\/title>\n<meta name=\"description\" content=\"Wenn Sie Datenbankaktionen per Code ausf\u00fchren, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und \u00e4ndern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausf\u00fchren wollen, die nur dann ausgef\u00fchrt werden sollen, wenn die Ausf\u00fchrung jeder einzelnen Aktion erfolgreich ist? Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext \u00fcber eine oder mehrere Datenbank\u00e4nderungen, der nach dem Ausf\u00fchrung aller \u00c4nderungen entweder komplett abgeschlossen oder verworfen werden kann.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transaktionen in Access - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Datenbankaktionen per Code ausf\u00fchren, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und \u00e4ndern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausf\u00fchren wollen, die nur dann ausgef\u00fchrt werden sollen, wenn die Ausf\u00fchrung jeder einzelnen Aktion erfolgreich ist? Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext \u00fcber eine oder mehrere Datenbank\u00e4nderungen, der nach dem Ausf\u00fchrung aller \u00c4nderungen entweder komplett abgeschlossen oder verworfen werden kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_354_001.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"10\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_354_001.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\",\"name\":\"Transaktionen in Access - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:49+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Wenn Sie Datenbankaktionen per Code ausf\\u00fchren, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und \\u00e4ndern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausf\\u00fchren wollen, die nur dann ausgef\\u00fchrt werden sollen, wenn die Ausf\\u00fchrung jeder einzelnen Aktion erfolgreich ist? Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext \\u00fcber eine oder mehrere Datenbank\\u00e4nderungen, der nach dem Ausf\\u00fchrung aller \\u00c4nderungen entweder komplett abgeschlossen oder verworfen werden kann.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Transaktionen_in_Access.html\",\"name\":\"Transaktionen in Access\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000354"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000354\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}