{"id":55000823,"date":"2012-04-01T00:00:00","date_gmt":"2020-05-22T21:53:12","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=823"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Restriktionen_mit_Datenmakros","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/","title":{"rendered":"Restriktionen mit Datenmakros"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Ab Access 2010 k&ouml;nnen Sie mit den Datenmakros auf eine trigger&auml;hnliche Technik zugreifen. Damit definieren Sie direkt in der Tabelle, was beim Hinzuf&uuml;gen, &auml;ndern oder L&ouml;schen von Daten geschehen soll &#8211; unabh&auml;ngig davon, ob diese &auml;nderung direkt in der Tabelle, &uuml;ber ein Formular, per Aktionsabfrage oder auch per VBA angesto&szlig;en wurde. Dieser Beitrag zeigt, wie Sie die Datenmakros nutzen k&ouml;nnen.<\/b><\/p>\n<p>Die Grundlagen zu Datenmakros haben wir bereits im Beitrag <b>Datenmakros in Access 2010 <\/b>(<b>www.access-im-unternehmen.de\/760<\/b>) besprochen. Im vorliegenden Beitrag schauen wir uns einige praktische Aspekte an und nehmen dabei das Thema Restriktionen in den Fokus.<\/p>\n<p>Bereits in fr&uuml;heren Versionen bietet Access ein paar M&ouml;glichkeiten, Daten mit Restriktionen zu versehen: beispielsweise mit eindeutigen Indizes, Prim&auml;rschl&uuml;sselfeldern, G&uuml;ltigkeitsregeln oder der Definition referentieller Integrit&auml;t f&uuml;r Beziehungen und damit die Einschr&auml;nkung der Werte f&uuml;r Fremdschl&uuml;sselfelder.<\/p>\n<p>Mit Datenmakros legen Sie praktisch beliebige Restriktionen fest und kombinieren Makros dabei nach Wunsch mit VBA-Funktionen.<\/p>\n<p>Da es hier um Restriktionen geht, k&uuml;mmern wir uns in diesem Beitrag ausschlie&szlig;lich um die beiden Datenmakros <b>Vor &auml;nderung <\/b>und <b>Vor L&ouml;schung<\/b>. Beide werden ausgel&ouml;st, bevor eine &auml;nderung eines Datensatzes gespeichert beziehungsweise dieser endg&uuml;ltig gel&ouml;scht wird &#8211; es gibt also noch Gelegenheit, den Vorgang zu unterbrechen.<\/p>\n<p><b>Bearbeitung komplett unterbinden<\/b><\/p>\n<p>Dies kann eine grunds&auml;tzliche Option sein: Mit den Datenmakros <b>Vor &auml;nderung <\/b>und <b>Vor L&ouml;schung <\/b>lassen sich durchaus Regeln wie die folgenden festlegen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Einer Tabelle darf kein Datensatz hinzugef&uuml;gt werden.<\/li>\n<li class=\"aufz-hlung\">Die Datens&auml;tze einer Tabelle d&uuml;rfen nicht ver&auml;ndert werden.<\/li>\n<li class=\"aufz-hlung\">Es darf kein Datensatz aus der Tabelle gel&ouml;scht werden.<\/li>\n<\/ul>\n<p><b>Differenzierte Restriktionen<\/b><\/p>\n<p>Es gibt jedoch auch die M&ouml;glichkeit, eine oder mehrere Regeln festzulegen, nach denen der Benutzer einen Datensatz hinzuf&uuml;gen, &auml;ndern oder l&ouml;schen darf. Damit k&ouml;nnen Sie die oben beschriebenen Restriktionen etwas lockern &#8211; zum Beispiel, indem Sie das Hinzuf&uuml;gen von Datens&auml;tzen zu einer Tabelle grunds&auml;tzlich erlauben. Ein &auml;ndern oder L&ouml;schen hingegen soll nur in den ersten 15 Minuten nach dem Anlegen m&ouml;glich sein &#8211; danach bleibt der Datensatz, wo und wie er ist.<\/p>\n<p><b>Zusammenspiel mit VBA<\/b><\/p>\n<p>Die f&uuml;r diese und komplizierte Restriktionen notwendigen Regeln k&ouml;nnen Sie direkt per Makro-Programmierung definieren. Sie k&ouml;nnen jedoch von Datenmakros aus auch VBA-Funktionen aufrufen, um komplexere Pr&uuml;fungen in der gewohnten Umgebung abzubilden.<\/p>\n<p>Au&szlig;erdem zeigen wir Ihnen, wie Sie von VBA aus mit Datenmakros interagieren k&ouml;nnen, die etwa durch das Bearbeiten der betroffenen Datens&auml;tze per VBA ausgel&ouml;st wurden.<\/p>\n<p><b>Datens&auml;tze einer Tabelle sch&uuml;tzen<\/b><\/p>\n<p>Als Beispiel dient eine einfache Tabelle namens <b>tblAnreden<\/b>. Diese enth&auml;lt in der Regel zwei bis drei Datens&auml;tze und sollte normalerweise nicht ver&auml;ndert werden (s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Anlegen von Datenmakros in der Datenblattansicht einer Tabelle<\/span><\/b><\/p>\n<p>Bis Access 2003 lie&szlig; sich dies mithilfe des Sicherheitssystems von Access regulieren, ab Access 2010 erledigen Sie dies mit Datenmakros. Schauen wir uns an, wie dies aussieht.<\/p>\n<p>Am schnellsten pr&uuml;fen lassen sich die &auml;nderungen an Datenmakros, wenn Sie diese &ouml;ffnen, w&auml;hrend die Tabelle in der Datenblattansicht angezeigt wird. Sie k&ouml;nnen die Wirkung dann direkt nach dem Schlie&szlig;en des Makro-Editors ausprobieren. Ein neues Datenmakro namens <b>Vor &auml;nderung <\/b>oder <b>Vor L&ouml;schung <\/b>legen Sie wie in Bild 2 an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Dieses Makro l&ouml;st einen Fehler aus, wenn der Benutzer einen Datensatz l&ouml;schen will.<\/span><\/b><\/p>\n<p>Voraussetzung hierf&uuml;r ist allerdings, dass Sie in den Access-Optionen den Eintrag <b>Aktuelle Datenbank|Anwendungsoptionen|Entwurfs&auml;nderungen f&uuml;r Tabellen in der Datenblattansicht aktivieren <\/b>angehakt haben.<\/p>\n<p><b>L&ouml;schen verhindern<\/b><\/p>\n<p>Wenn Sie verhindern m&ouml;chten, dass ein Datensatz gel&ouml;scht wird, f&uuml;gen Sie ein neues Datenmakro <b>Vor L&ouml;schung <\/b>zur Tabelle hinzu. Darin legen Sie eine einzige Aktion namens <b>Ausl&ouml;senFehler <\/b>an. Als Parameter geben Sie dabei die Fehlernummer (hier <b>1<\/b>) sowie die Fehlerbeschreibung an, in diesem Fall <b>L&ouml;schen nicht m&ouml;glich<\/b> (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Beispieltabelle, deren Daten gesch&uuml;tzt werden sollen<\/span><\/b><\/p>\n<p>Dies bewirkt, dass Access beim Versuch, einen der Datens&auml;tze der Tabelle <b>tblAnreden <\/b>zu l&ouml;schen, eine Meldung wie in <span class=\"verweis-ohneumbruch\">Bild 4 <\/span>einblendet.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Meldung beim Versuch, einen Datensatz zu l&ouml;schen<\/span><\/b><\/p>\n<p>Die Fehlermeldung wird nicht angezeigt &#8211; vielleicht erscheint diese aber, wenn Sie versuchen, einen Datensatz per VBA zu l&ouml;schen Probieren wir es aus, indem wir schnell eine entsprechende Anweisung zusammenstellen und diese im Direktfenster des VBA-Editors absetzen:<\/p>\n<pre>CurrentDB.Execute &quot;DELETE FROM tblAnreden WHERE AnredeID = 3&quot;<\/pre>\n<p>Das Ergebnis &uuml;berrascht ein wenig und sieht wie in Bild 5 aus. Als Fehlernummer kommt hier <b>3939 <\/b>zum Einsatz, was &#8211; um es vorwegzunehmen &#8211; scheinbar die Standardnummer f&uuml;r Fehler ist, die durch Datenmakros ausgel&ouml;st werden. Immerhin zeigt Access aber die angegebene Fehlermeldung an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Beim L&ouml;schen per VBA erscheint eine v&ouml;llig andere Fehlernummer.<\/span><\/b><\/p>\n<p>Begn&uuml;gen wir uns doch zun&auml;chst mit der Erkenntnis, dass wir in der Datenblattansicht und beim L&ouml;schen per <b>Execute<\/b>-Anweisung eine entsprechende Meldung provozieren und das L&ouml;schen verhindern k&ouml;nnen.<\/p>\n<p><b>&auml;ndern von Daten verhindern<\/b><\/p>\n<p>Wie sieht es bei der &auml;nderung eines Datensatzes aus Eigentlich genau wie beim L&ouml;schen. Wenn ein Datensatz nicht ge&auml;ndert werden darf, legen Sie das Datenmakro <b>Vor &auml;nderung <\/b>an.<\/p>\n<p>F&uuml;gen Sie diesem die Aktion <b>Ausl&ouml;senFehler <\/b>hinzu und hinterlegen Sie eine entsprechende Meldung (s. Bild 6). Beim Versuch, einen Datensatz der Tabelle zu &auml;ndern, liefert Access die angegebene Meldung und verwirft die &auml;nderung.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Dieses Makro verhindert &auml;nderungen am Datensatz.<\/span><\/b><\/p>\n<p><b>Hinzuf&uuml;gen von Daten verhindern<\/b><\/p>\n<p>Probieren Sie nun einmal, der mit dem oben beschriebenen Datenmakro <b>Vor &auml;nderung <\/b>ausgestatteten Tabelle einen neuen Datensatz hinzuzuf&uuml;gen.<\/p>\n<p>Auch dies wird unterbunden, denn Access interpretiert das Hinzuf&uuml;gen eines neuen Datensatzes hier als &auml;nderung.<\/p>\n<p>Was aber, wenn Sie eine spezifische Meldung ausgeben m&ouml;chten, wenn der Benutzer unerlaubterweise versucht, einen Datensatz anzulegen Dann ben&ouml;tigen Sie eine <b>Wenn<\/b>-Bedingung, die pr&uuml;ft, ob der Benutzer einen neuen Datensatz angelegt oder nur einen bestehenden Datensatz ge&auml;ndert hat.<\/p>\n<p>Wie auch bei Triggern &uuml;blich, erlaubt Access in den beiden Makro-Aktionen <b>Vor &auml;nderung <\/b>und <b>Vor L&ouml;schung <\/b>den Zugriff auf zwei verschiedene Zust&auml;nde des aktuell bearbeiteten Datensatzes: erstens auf den Datensatz vor der &auml;nderung und zweitens auf den Datensatz nach der &auml;nderung. Den ge&auml;nderten Datensatz referenzieren Sie dabei mit dem Tabellennamen. Der Ausdruck <b>[tblAnreden].[AnredeID] <\/b>liefert also den neuen Prim&auml;rschl&uuml;sselwert des Datensatzes. Wenn Sie den Prim&auml;rschl&uuml;sselwert des Datensatzes vor der &auml;nderung ermitteln m&ouml;chten, nutzen Sie den Ausdruck <b>[Alt].[AnredeID]<\/b>.<\/p>\n<p>Dies gelingt nicht nur mit vorhandenen Datens&auml;tzen, sondern auch mit neuen. Und logischerweise sind die Werte der Felder eines Datensatzes vor dem Anlegen alle leer.<\/p>\n<p><b>Auf einen neuen Datensatz pr&uuml;fen<\/b><\/p>\n<p>Um im Makro <b>Vor &auml;nderung <\/b>zu pr&uuml;fen, ob ein neuer Datensatz angelegt oder ein bestehender Datensatz ge&auml;ndert wurde, brauchen Sie nur den Inhalt eines Feldes zu pr&uuml;fen, von dem Sie genau wissen, dass es nach dem Anlegen gef&uuml;llt ist.<\/p>\n<p>Dies ist bei einem Prim&auml;rschl&uuml;sselfeld, das als Autowertfeld ausgelegt ist, der Fall. Also pr&uuml;fen wir den Ausdruck <b>IstNull([Alt].[AnredeID])<\/b>. Ist dieser wahr, handelt es sich um einen neuen Datensatz, sonst um einen bestehenden Datensatz (s. Bild 7). Dementsprechend liefert Access beim Anlegen eines neuen Datensatzes die Meldung <b>Sie d&uuml;rfen dieser Tabelle keine Daten hinzuf&uuml;gen<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Fallunterscheidung beim &auml;ndern eines Datensatzes: Neu oder ge&auml;ndert<\/span><\/b><\/p>\n<p><b>Datens&auml;tze nur 15 Minuten nach dem Anlegen &auml;ndern<\/b><\/p>\n<p>Damit haben Sie bereits ein Beispiel f&uuml;r eine Bedingung kennengelernt. Schauen wir uns ein weiteres Beispiel an: Dabei soll der Benutzer einer Tabelle zwar beliebig neue Datens&auml;tze hinzuf&uuml;gen, diese aber nur innerhalb von 15 Minuten nach dem Anlegen wieder l&ouml;schen oder &auml;ndern k&ouml;nnen.<\/p>\n<p>Dazu verwenden wir eine Tabelle namens <b>tblTaetigkeiten<\/b> mit den Feldern <b>TaetigkeitID<\/b>, <b>Taetigkeit <\/b>und <b>AngelegtAm<\/b> (s. Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Tabelle mit Zeitstempel<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Den Wert des Feldes k&ouml;nnen Sie auf gewohnte Weise mit der <b>Standardwert<\/b>-Eigenschaft des Feldes festlegen. Sie k&ouml;nnen nat&uuml;rlich auch einen Befehl im Datenmakro <b>Vor &auml;nderung <\/b>unterbringen. Der Befehl hei&szlig;t <b>FestlegenFeld<\/b>. F&uuml;r die Parameter <b>Name <\/b>und <b>Feld <\/b>legen Sie dabei die beiden Ausdr&uuml;cke <b>AngelegtAm <\/b>und <b>Jetzt() <\/b>fest.<\/p>\n<p>Dies soll geschehen, wenn soeben ein neuer Datensatz angelegt wurde. Damit das Makro das Anlegedatum nur in diesem Fall eintr&auml;gt, pr&uuml;ft es vorher, ob das Prim&auml;rschl&uuml;sselfeld <b>TaetigkeitID <\/b>den Wert <b>Null <\/b>enth&auml;lt &#8211; und dies ist nur bei einem neuen Datensatz der Fall.<\/p>\n<p>Wenn der Datensatz nicht frisch angelegt wurde, soll eine weitere Pr&uuml;fung erfolgen &#8211; n&auml;mlich die, ob das Anlegen des Datensatzes bereits vor mehr als 15 Minuten geschehen ist. In diesem Fall soll die &auml;nderung unter Angabe einer entsprechenden Meldung unterbunden werden. Der Ausdruck, der den zeitlichen Abstand zum Erstellungszeitpunkt pr&uuml;ft, lautet folgenderma&szlig;en:<\/p>\n<pre>Jetzt()-[Alt].[AngelegtAm]&gt;1\/96<\/pre>\n<p>Dies liest sich so: Wenn die Differenz aus der aktuellen Zeit und dem Erstellungszeitpunkt gr&ouml;&szlig;er als 1\/96 ist, soll ein Fehler ausgel&ouml;st und eine Meldung ausgegeben werden.<\/p>\n<p>Datumsangaben werden ja intern als <b>Double<\/b>-Zahlen gespeichert, wobei die Zahl vor dem Komma dem Datum und die Zahl hinter dem Komma der Uhrzeit entspricht. 1\/96 liefert den entsprechenden Bruchteil eines Tages, n&auml;mlich eine Viertelstunde. Das komplette Makro zeigt Bild 9.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Bei neuen Datens&auml;tzen Anlegedatum eintragen, sonst pr&uuml;fen, ob der Datensatz bereits &auml;lter als 15 Minuten ist und dann &auml;nderungen unterbinden<\/span><\/b><\/p>\n<p><b>Einfachere Variante<\/b><\/p>\n<p>Wenn Sie das Eintragen des Anlegedatums per Standardwert des Feldes <b>AngelegtAm <\/b>durchf&uuml;hren, kann das Datenmakro vereinfacht werden (siehe Beispieltabelle <b>tblTaetigkeiten_1<\/b>).<\/p>\n<p>Sie brauchen dort nicht vorab zu pr&uuml;fen, ob ein neuer Datensatz angelegt wurde &#8211; dies geschieht impliziert im folgenden Ausdruck:<\/p>\n<pre>Jetzt()-[Alt].[AngelegtAm]&gt;1\/96<\/pre>\n<p>Wurde der Datensatz soeben angelegt, aber noch nicht gespeichert, liefert <b>[Alt].[AngelegtAm] <\/b>den Wert <b>NULL <\/b>zur&uuml;ck. Der Ausdruck <b>Jetzt() &#8211; NULL <\/b>liefert wiederum <b>NULL<\/b>, und <b>NULL &gt; 1\/96<\/b> ebenfalls.<\/p>\n<p>Das Ergebnis des gesamten Ausdrucks ist also <b>NULL <\/b>und somit ungleich <b>True <\/b>&#8211; die im <b>Wenn&#8230;Dann<\/b>-Konstrukt enthaltenen Anweisungen werden nicht ausgef&uuml;hrt.<\/p>\n<p>In den ersten 15 Minuten nach dem Anlegen des Datensatzes liefert die Bedingung den Wert <b>False<\/b>, das Bearbeiten des Datensatzes innerhalb dieses Zeitraums ist also erlaubt. Erst nach 15 Minuten lautet das Ergebnis des Ausdrucks <b>True <\/b>und der Fehler innerhalb der <b>Wenn&#8230;Dann<\/b>-Bedingung wird ausgel&ouml;st. Dieses Makro zeigt Bild 10.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Die Restriktion impliziert die Pr&uuml;fung des NULL-Wertes.<\/span><\/b><\/p>\n<p><b>Standardwert: Per Eigenschaft oder per Makro<\/b><\/p>\n<p>Beim Experimentieren mit den Datenmakros ist beil&auml;ufig aufgefallen, dass die beiden Methoden zum Festlegen eines Standardwertes durchaus unterschiedliche Ergebnisse liefern. Wenn Sie die Eigenschaft <b>Standardwert <\/b>eines Feldes wie etwa <b>AngelegtAm <\/b>auf den Ausdruck <b>Now() <\/b>einstellen, belegt Access dieses Feld bereits beim &Ouml;ffnen der Tabelle\/Abfrage mit dem angegebenen Wert vor (s. Bild 11).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Standardwerte werden gleich beim Anzeigen des neuen Datensatzes vorbelegt.<\/span><\/b><\/p>\n<p>Dies gilt auch f&uuml;r gebundene Formulare gleich in welcher Ansicht: Sobald das Formular ge&ouml;ffnet wurde, wird der Standardwert f&uuml;r einen neuen Datensatz festgelegt. Erst das Aktualisieren der Datensatzgruppe &auml;ndert den Standardwert entsprechend der angegebenen Funktion.<\/p>\n<p>Probleme entstehen dadurch, wenn Sie in einem Formular zun&auml;chst die vorhandenen Datens&auml;tze betrachten oder bearbeiten und erst dann einen neuen Datensatz anlegen. Dieser erh&auml;lt dann als Anlegedatum nicht den gew&uuml;nschten Wert, sondern den Zeitpunkt des &Ouml;ffnens des Formulars.<\/p>\n<p>Wenn das Anlegedatum oder &auml;hnliche Werte f&uuml;r die Handhabung der Daten wichtig sind, sollten Sie daher besser eine alternative Vorgehensweise w&auml;hlen. Eine davon ist der Einsatz des oben erw&auml;hnten Datenmakros, das den Anlegezeitpunkt tats&auml;chlich erst beim Anlegen des Datensatzes festlegt.<\/p>\n<p><b>L&ouml;schen nach mehr als 15 Minuten verhindern<\/b><\/p>\n<p>Wenn ein Datensatz nur innerhalb der ersten 15 Minuten nach dem Anlegen ge&auml;ndert werden darf, sollte dies auch f&uuml;r den L&ouml;schvorgang gelten. Dies erreichen Sie am Beispiel der Tabelle <b>tblTaetigkeiten_1 <\/b>mit dem Makro aus Bild 12.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Das L&ouml;schen eines neuen Datensatzes ist nur innerhalb der ersten 15 Minuten m&ouml;glich.<\/span><\/b><\/p>\n<p><b>Restriktionen in Datenmakros und VBA<\/b><\/p>\n<p>Die bisherigen Ausf&uuml;hrungen liefern die Grundlage f&uuml;r den Praxiseinsatz. Dort werden Daten nicht direkt in Tabellen oder Abfragen ge&auml;ndert, sondern in Formularen oder per VBA. Als Erstes schauen wir uns an, wie sich die Zusammenarbeit zwischen Datenmakros und VBA gestaltet, sp&auml;ter kommen dann die Formulare hinzu.<\/p>\n<p>Weiter oben haben Sie beim Aufruf einer <b>DELETE<\/b>-Anweisung &uuml;ber die <b>Execute<\/b>-Methode bereits ein Beispiel daf&uuml;r kennengelernt, dass Datenmakros auch funktionieren, wenn die Daten einer mit Datenmakros versehenen Tabelle per VBA ge&auml;ndert werden.<\/p>\n<p><b>Entwickler- und Administratormodus f&uuml;r Datenmakros<\/b><\/p>\n<p>Die mit Datenmakros geschaffenen Vorrichtungen zum Sch&uuml;tzen der Daten vor unbeabsichtigten oder unerw&uuml;nschten &auml;nderungen erweisen sich w&auml;hrend der Entwicklung der Anwendung und eventuell auch im sp&auml;teren Einsatz manchmal als Hindernis.<\/p>\n<p>Auch wenn Sie, wie oben beispielhaft beschrieben, das &auml;ndern von Daten nach einer gewissen Zeitspanne nach dem Anlegen unterbinden m&ouml;chten, m&ouml;chten Sie beim Entwickeln angelegte Daten doch vielleicht wieder entfernen.<\/p>\n<p>Oder ein Mitarbeiter gibt einmal Daten ein und stellt erst nach Ablauf des festgelegten Zeitraums zum &auml;ndern fest, dass er die Daten noch korrigieren m&ouml;chte. Dann sollte zumindest ein Administrator in der Lage sein, solche Daten noch zu &auml;ndern.<\/p>\n<p>F&uuml;r solche Zwecke k&ouml;nnen Sie einen Entwickler- oder Administratormodus f&uuml;r eine Anwendung vorsehen.<\/p>\n<p>Ob dieser Modus aktiviert ist oder nicht, soll der Einfachheit halber durch folgende Variable festgelegt werden:<\/p>\n<pre>Public bolIstAdmin As Boolean<\/pre>\n<p>Den Wert dieser Variablen stellen Sie zu Versuchszwecken einfach im Direktfenster ein. Den Administratormodus aktivieren Sie mit dieser Anweisung:<\/p>\n<pre>bolIstAdmin = True<\/pre>\n<p>Damit deaktivieren Sie den Administratormodus wieder:<\/p>\n<pre>bolIstAdmin = False<\/pre>\n<p>Damit das entsprechende Datenmakro den Wert dieser Variablen abfragen kann, legen Sie eine kleine VBA-Funktion an:<\/p>\n<pre>Public Function IstAdmin() As Boolean\r\n    IstAdmin = bolIstAdmin\r\nEnd Function<\/pre>\n<p>Diese Funktion m&uuml;ssen Sie nun nur noch in die Datenmakros integrieren. Wie dies gelingt, zeigt das Makro <b>Vor &auml;nderung <\/b>der Tabelle <b>tblTaetigkeiten_Mit_Adminmodus<\/b> (s. Bild 13). Das Makro fragt gleich in der ersten Zeile den Wert der Funktion <b>IstAdmin <\/b>ab.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic013.png\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Das Makro wird im Admin-Modus nach der ersten Anweisung gestoppt.<\/span><\/b><\/p>\n<p>Lautet das Ergebnis <b>True<\/b>, wird das Datenmakro angehalten, sonst wird es fortgesetzt. Sie k&ouml;nnen diese Funktionalit&auml;t nun ausprobieren, indem Sie die beiden Anweisungen von oben im Direktfenster eingeben und jeweils versuchen, Datens&auml;tze, die &auml;lter als 15 Minuten sind, zu &auml;ndern. Bei aktiviertem Administrator-Modus gelingt dies nun.<\/p>\n<p><b>Makro-Anweisungen auslagern<\/b><\/p>\n<p>Nun, da Sie wissen, dass Sie das Ermitteln einer Bedingung in eine VBA-Funktion auslagern k&ouml;nnen, fragen Sie sich sicher, ob dies auch f&uuml;r komplette Makros funktioniert. Ja, dies ist grunds&auml;tzlich m&ouml;glich: Sie ben&ouml;tigen einfach nur eine entsprechende VBA-Funktion.<\/p>\n<p>Beim Aufruf m&uuml;ssen Sie dieser Funktion nat&uuml;rlich alle f&uuml;r die Ausf&uuml;hrung der Funktion ben&ouml;tigten Parameter &uuml;bergeben. Es gibt allerdings eine wichtige Einschr&auml;nkung: Das Unterbinden der &auml;nderung eines Datensatzes gelingt nur durch die Makro-Aktion <b>Ausl&ouml;senFehler<\/b>. Damit steht auch fest, dass zumindest beim direkten Zugriff auf Tabellen oder Abfragen die Fehlermeldung der Aktion <b>Ausl&ouml;senFehler <\/b>des Datenmakros angezeigt werden muss.<\/p>\n<p><b>Datenmakros per VBA ausl&ouml;sen<\/b><\/p>\n<p>Die &auml;nderungen, die zum Ausl&ouml;sen von Datenmakros f&uuml;hren, k&ouml;nnen Sie nat&uuml;rlich nicht nur durch direkte Bearbeitung provozieren. Dies schaffen Sie auch, wenn Sie einen Datensatz einer mit Datenmakros ausgestatteten Tabelle per VBA bearbeiten und speichern beziehungsweise l&ouml;schen. Die Auswirkungen k&ouml;nnen Sie sich anhand der Tabelle <b>tblAnreden <\/b>und des Versuchs, einen neuen Datensatz anzulegen, in Bild 14 ansehen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic016.png\" alt=\"pic016.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 16: Fehlernummer und -meldung in einer Eigenschaft<\/span><\/b><\/p>\n<p><b>Provozierte Fehler durch Datenmakros behandeln<\/b><\/p>\n<p>Wenn per VBA Daten ge&auml;ndert werden sollen, die durch ein Datenmakro vor &auml;nderungen gesch&uuml;tzt werden, l&ouml;st dies ebenfalls einen Laufzeitfehler aus. Die Frage ist nun: Wie pr&auml;sentieren wir dem Benutzer die entsprechende Meldung Die eingebaute Fehlermeldung ist wohl kaum geeignet, zudem sie dem Benutzer in der Vollversion von Access die M&ouml;glichkeit gibt, den Code zu debuggen (s. Bild 15).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic014.png\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: Fehlermeldung beim Versuch, einen neuen Datensatz per VBA anzulegen<\/span><\/b><\/p>\n<p>Ein erster Versuch, eine Fehlerbehandlung zu integrieren, gelingt schon recht gut. Die folgende Prozedur deaktiviert die integrierte Fehlerbehandlung und pr&uuml;ft unmittelbar nach dem Ausf&uuml;hren der Aktionsabfrage, ob der Fehler mit der Nummer <b>3939<\/b> aufgetreten ist. Ist dies der Fall, liefert ein Meldungsfenster genau den Text, der im Datenmakro festgelegt wurde:<\/p>\n<pre>Public Sub AnredeAnlegen()\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    On Error Resume Next\r\n    db.Execute &quot;INSERT INTO tblAnreden(Anrede) VALUES(''Mein Lieber'')&quot;\r\n    Select Case Err.Number\r\n        Case 3939\r\n            MsgBox Err.Description, vbOKOnly + vbExclamation, &quot;Datenfehler&quot;\r\n    End Select\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Wenn Sie mit der Anzeige einer Fehlermeldung leben k&ouml;nnen, reicht dieser Ansatz aus. Interessant wird es, wenn Sie in Abh&auml;ngigkeit vom Fehler noch weitere Schritte einleiten m&uuml;ssen, die &uuml;ber die Fehleranzeige hinausgehen. Eine Fehlernummer zur Qualifizierung des genauen Fehlers fehlt, denn Makrofehler liefern immer den Fehler mit der Nummer <b>3939<\/b> &#8211; jedoch mit wechselnden Fehlermeldungen. Sie k&ouml;nnen nun entweder die Fehlermeldung selbst analysieren und in Abh&auml;ngigkeit davon weitere Ma&szlig;nahmen ergreifen. Dazu w&auml;re es unter anderem denkbar, statt einer Fehlerbeschreibung einfach ein zweites Mal die Fehlernummer anzugeben &#8211; diese k&ouml;nnte dann individuell ausgewertet werden. Es g&auml;be dann allerdings keine aussagekr&auml;ftige Fehlermeldung mehr, wenn der Fehler durch direkte Eingabe etwa in einem Datenblatt in einem Unterformular ausgel&ouml;st w&uuml;rde. Doch auch das ist kein Problem: Fehler in Datenmakros lassen sich auch in Formularen abfangen und behandeln, wie Sie gleich erfahren werden.<\/p>\n<p>Eine weitere M&ouml;glichkeit w&auml;re es, die Fehlernummer und eine Fehlermeldung f&uuml;r die Eigenschaft Fehlerbeschreibung der Makroaktion <b>Ausl&ouml;senFehler <\/b>festzulegen. Dies s&auml;he in einem Makro dann wie in Bild 16<\/a><\/span> aus. In einer Prozedur w&uuml;rden Sie diesen Fehler dann wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-70-anchor\">Listing 1 behandeln. F&uuml;r eine Fehlermeldung, die nach dem Schema <b>&lt;Nummer&gt;|&lt;Beschreibung&gt; <\/b>aufgebaut ist, parst die Prozedur die Bestandteile dann durch Aufsplitten aller durch das <b>|<\/b>-Zeichen getrennten Elemente. Dies geschieht jedoch nur, wenn <b>Err.Number <\/b>den Fehler <b>3939 <\/b>liefert.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Abfangen eines Fehlers in einem Datenmakro<\/p>\n<pre>Public Sub AnredeAnlegen_MitFehlernummer()\r\n    Dim db As DAO.Database\r\n    Dim lngError As Long\r\n    Dim strError As String\r\n    Set db = CurrentDb\r\n    On Error Resume Next\r\n    db.Execute &quot;INSERT INTO tblAnreden(Anrede) VALUES(''Mein Lieber'')&quot;\r\n    If Err.Number = 3939 Then\r\n         lngError = Split(Err.Description, &quot;|&quot;)(0)\r\n        strError = Split(Err.Description, &quot;|&quot;)(1)\r\n        Select Case lngError\r\n            Case 3\r\n                MsgBox strError, vbOKOnly + vbExclamation, &quot;Fehler Nummer &quot; &amp; lngError\r\n        End Select\r\n    End If\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_02\/RestriktionenMitDatenmakros-web-images\/pic015.png\" alt=\"pic015.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 15: Auch das L&ouml;schen von einer Prozedur aus liefert einen Laufzeitfehler.<\/span><\/b><\/p>\n<p><b>Fehler in Datenmakros in Formularen<\/b><\/p>\n<p>Wenn der Benutzer eines der Datenmakros ausl&ouml;st, indem er in einem Formular einen Datensatz l&ouml;scht, &auml;ndert oder anlegt, tut dieses wie gewohnt seinen Dienst. Auch hier stellt sich die Frage, wie man die Anzeige der im Datenmakro angegebenen Fehlermeldung unterbindet und den Fehler geziehlt behandelt &#8211; sei es durch eine weitere benutzerdefinierte Fehlermeldung oder zus&auml;tzliche, von der Fehlernummer abh&auml;ngige Aktionen. Wie Sie Fehler durch die Verletzung von Restriktionen im Datenmodell in Formularen behandeln, wissen Sie &#8211; Sie verwenden dazu das <b>Bei Fehler<\/b>-Ereignis. Ohne Vorbehalte k&ouml;nnte man etwa so an das Problem herangehen:<\/p>\n<pre>Private Sub Form_Error(DataErr As Integer, Response As Integer)\r\n    Select Case DataErr\r\n        Case 3939\r\n            ''hier Fehlermeldung\r\n            Response = acDataErrContinue\r\n        Case Else\r\n            Response = acDataErrDisplay\r\n    End Select\r\nEnd Sub<\/pre>\n<p>An der Stelle <b>&#8220;hier Fehlermeldung <\/b>sollte nun Code stehen, der Nummer und Beschreibung des Fehlers ausgibt. Tatsache ist jedoch, dass wir zumindest in der aktuellen Version von Access 2010 mit Service Pack 1 nicht an diese Informationen herankommen. Der Parameter <b>DataErr <\/b>liefert nur die Fehlernummer <b>3939<\/b>. Die Funktion <b>AccessError <\/b>bietet uns f&uuml;r diesen Fehler den Meldungstext <b>|1 <\/b>an &#8211; nicht sehr erbaulich. Und aktuell ist uns auch keine M&ouml;glichkeit bekannt, &uuml;ber Bordmittel an die Nummer des Fehlers heranzukommen, der diesen ausgel&ouml;st hat.<\/p>\n<p>Welche M&ouml;glichkeit bietet sich nun, dennoch auch in Formularen auf die Datenmakros zu reagieren Die einfachste Variante: Sie verwenden einfach eine allgemeine Meldung wie <b>Die Anreden d&uuml;rfen nicht bearbeitet werden<\/b>. Da dies in vielen F&auml;llen nicht funktionieren wird, weil schlicht nicht alle Fehler durch diese eine Meldung ersch&ouml;pfend beschrieben werden, ist dies keine befriedigende Alternative. Ein weiterer Denkansatz w&auml;re, beim Ausl&ouml;sen eines Datenmakros die Fehlerinformationen in eine Fehlertabelle einzutragen und diese dann im <b>Form_Error<\/b>-Ereignis auszulesen. Allerdings ist der Befehlsumfang von Datenmakros derart eingeschr&auml;nkt, dass dies nicht m&ouml;glich ist.<\/p>\n<p>Eine weitere einfache M&ouml;glichkeit ist es auch, in der <b>Form_Error<\/b>-Prozedur einfach gar nicht auf den Fehler zu reagieren &#8211; au&szlig;er die Fehlermeldung zu unterbinden. Im Einzelfall mag dies helfen.<\/p>\n<p>Und wenn es nur um die Anzeige der Meldung des vom Datenmakro ausgel&ouml;sten Fehlers geht, lassen Sie eine Behandlung einfach komplett weg und zeigen schlicht die im Datenmakro definierte Fehlermeldung an. Dies bei&szlig;t sich aber wiederum mit der Fehlerbehandlung in Prozeduren, die per DAO auf die Tabelle zugreifen und dabei Fehlerbeschreibungen wie <b>4|Sie d&uuml;rfen diesen Datensatz nicht l&ouml;schen <\/b>parsen &#8211; diese m&uuml;ssten dann komplett ausgegeben werden.<\/p>\n<p><b>Sind Datenmakros gesch&uuml;tzt<\/b><\/p>\n<p>Wenn Sie per Datenmakro festlegen k&ouml;nnen, wann Daten hinzugef&uuml;gt, ge&auml;ndert oder gel&ouml;scht werden d&uuml;rfen, stellt sich die Frage, ob der Benutzer diese Restriktionen umgehen kann.<\/p>\n<p>Die Antwort lautet leider ja. Selbst wenn Sie die Datenbankanwendung in eine <b>.accde<\/b>-Datei umwandeln und somit das &Ouml;ffnen von Formularen, Berichten und VBA-Modulen im Entwurf unterbinden, betrifft dies leider nicht Tabellen und Datenmakros. Der Benutzer kann also ein Makro deaktivieren, die Daten nach seinen W&uuml;nschen &auml;ndern und die Makros dann wieder aktivieren. Das Aktivieren und Deaktivieren erfolgt dann schlicht durch Einfassen der Makrobefehle in eine <b>Wenn&#8230;Dann<\/b>-Bedingung, die niemals eintritt und anschlie&szlig;endes Entfernen dieser Bedingung. Datenmakros sind somit zwar ein Werkzeug, um das versehentliche &auml;ndern oder L&ouml;schen von Daten zu unterbinden. F&uuml;r Benutzer mit Access-Kenntnissen stellen diese jedoch kein Hindernis dar, wenn sie unterw&uuml;nschte &auml;nderungen an den Daten durchf&uuml;hren m&ouml;chten.<\/p>\n<p><b>Datenmakros in Webdatenbanken<\/b><\/p>\n<p>Seit Access 2010 gibt es die sogenannten Webdatenbanken. Solche Datenbanken werden ausschlie&szlig;lich mit Makros statt mit VBA automatisiert und k&ouml;nnen komplett &uuml;ber den Webbrowser verf&uuml;gbar gemacht werden. Damit w&auml;re auch gleich die Einschr&auml;nkung beschrieben, die f&uuml;r die hier vorgestellten Techniken gilt: Solange Sie kein VBA verwenden, sollten alle Datenmakros auch in Webdatenbanken funktionieren.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Datenmakros liefern interessante M&ouml;glichkeiten, um Restriktionen f&uuml;r die in Tabellen gespeicherten Daten zu definieren. Sie brauchen nun nicht mehr in jedem Codeschnipsel und in jedem Formular, das auf die Daten einer Tabelle zugreift, Pr&uuml;fungen zu integrieren, die beispielsweise sicherstellen, dass ein Benutzer keine Anreden mehr zu einer existierenden Anreden-Tabelle hinzuf&uuml;gt oder, noch schlimmer, dort Datens&auml;tze entfernt.<\/p>\n<p>Es gibt sicher auch Nachteile, vor allem in der konsistenten Behandlung von Fehlern und hier besonders bei der Bereitstellung der im Makro selbst angegebenen Fehlerinformationen. Hier zeigt sich, dass Datenmakros offensichtlich eher f&uuml;r den Einsatz in Webdatenbanken als in Desktop-Anwendungen konzipiert wurden. Die folgenden Access-Versionen werden zeigen, wohin diesbez&uuml;glich die Reise geht.<\/p>\n<p>Wer auf den Geschmack gekommen ist, sollte sich auf jeden Fall die M&ouml;glichkeiten von Triggern oder Stored Procedures unter SQL Server oder MySQL ansehen &#8211; diese bieten gegen&uuml;ber der Access-Implementation von Triggern die notwendige Sicherheit, damit Benutzer nicht selbstst&auml;ndig &auml;nderungen an solchen Einrichtungen vornehmen k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RestriktionenMitDatenmakros.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{4BB25770-B8B8-499A-BBF5-68C17CD7F9C9}\/aiu_823.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ab Access 2010 k&ouml;nnen Sie mit den Datenmakros auf eine trigger&auml;hnliche Technik zugreifen. Damit definieren Sie direkt in der Tabelle, was beim Hinzuf&uuml;gen, &Auml;ndern oder L&ouml;schen von Daten geschehen soll &#8211; unabh&auml;ngig davon, ob diese &Auml;nderung direkt in der Tabelle, &uuml;ber ein Formular, per Aktionsabfrage oder auch per VBA angesto&szlig;en wurde. Dieser Beitrag zeigt, wie Sie die Datenmakros nutzen 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":[66022012,662012,44000021],"tags":[],"class_list":["post-55000823","post","type-post","status-publish","format-standard","hentry","category-66022012","category-662012","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>Restriktionen mit Datenmakros - 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\/Restriktionen_mit_Datenmakros\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Restriktionen mit Datenmakros\" \/>\n<meta property=\"og:description\" content=\"Ab Access 2010 k&ouml;nnen Sie mit den Datenmakros auf eine trigger&auml;hnliche Technik zugreifen. Damit definieren Sie direkt in der Tabelle, was beim Hinzuf&uuml;gen, &Auml;ndern oder L&ouml;schen von Daten geschehen soll - unabh&auml;ngig davon, ob diese &Auml;nderung direkt in der Tabelle, &uuml;ber ein Formular, per Aktionsabfrage oder auch per VBA angesto&szlig;en wurde. Dieser Beitrag zeigt, wie Sie die Datenmakros nutzen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:53:12+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Restriktionen mit Datenmakros\",\"datePublished\":\"2020-05-22T21:53:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/\"},\"wordCount\":3976,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/55e5ef487edf432297fbed12fb60dd65\",\"articleSection\":[\"2\\\/2012\",\"2012\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/\",\"name\":\"Restriktionen mit Datenmakros - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/55e5ef487edf432297fbed12fb60dd65\",\"datePublished\":\"2020-05-22T21:53:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/55e5ef487edf432297fbed12fb60dd65\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/55e5ef487edf432297fbed12fb60dd65\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Restriktionen_mit_Datenmakros\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Restriktionen mit Datenmakros\"}]},{\"@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":"Restriktionen mit Datenmakros - 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\/Restriktionen_mit_Datenmakros\/","og_locale":"de_DE","og_type":"article","og_title":"Restriktionen mit Datenmakros","og_description":"Ab Access 2010 k&ouml;nnen Sie mit den Datenmakros auf eine trigger&auml;hnliche Technik zugreifen. Damit definieren Sie direkt in der Tabelle, was beim Hinzuf&uuml;gen, &Auml;ndern oder L&ouml;schen von Daten geschehen soll - unabh&auml;ngig davon, ob diese &Auml;nderung direkt in der Tabelle, &uuml;ber ein Formular, per Aktionsabfrage oder auch per VBA angesto&szlig;en wurde. Dieser Beitrag zeigt, wie Sie die Datenmakros nutzen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:53:12+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Restriktionen mit Datenmakros","datePublished":"2020-05-22T21:53:12+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/"},"wordCount":3976,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65","articleSection":["2\/2012","2012","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/","url":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/","name":"Restriktionen mit Datenmakros - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65","datePublished":"2020-05-22T21:53:12+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/55e5ef487edf432297fbed12fb60dd65"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Restriktionen_mit_Datenmakros\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Restriktionen mit Datenmakros"}]},{"@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\/55000823","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=55000823"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000823\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}