{"id":55001472,"date":"2023-12-01T00:00:00","date_gmt":"2024-01-05T22:10:25","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1472"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Standardzuordnung_per_Datenmakro","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Standardzuordnung_per_Datenmakro\/","title":{"rendered":"Standardzuordnung per Datenmakro"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>W&auml;hrend wir den Beitrag &#8222;1:n-Beziehung mit Standardzuordnung verwalten&#8220; (www.access-im-unternehmen.de\/1469) schrieben, haben wir uns gefragt, ob man die Einhaltung der Konsistenz bei 1:n-Beziehungen mit Standardzuordnung nicht auch auf andere Weise sicherstellen kann als per VBA-Code. Zumal wir diesen auch noch in allen Formularen erneut programmieren m&uuml;ssten, welche die Daten aus dieser 1:n-Beziehung darstellen. Uns fielen zwei L&ouml;sungsans&auml;tze ein: Der erste ist die Verwendung der mit Access 2010 eingef&uuml;hrten Datenmakros, also eine Art Trigger f&uuml;r Access-Datenbanken. Der zweite Ansatz w&auml;ren die echten Trigger, und zwar die vom SQL Server. In diesem Beitrag schauen wir uns nun die Variante mit den Datenmakros an. Kann man unser Vorhaben damit abbilden? Und wenn ja, wie?<\/b><\/p>\n<p>Die Datenmakros liefern gleich f&uuml;nf verschiedene Ereignisse, zu denen wir Makrobefehle ausf&uuml;hren k&ouml;nnen:<\/p>\n<ul>\n<li><b>Vor &Auml;nderung<\/b><\/li>\n<li><b>Vor L&ouml;schung<\/b><\/li>\n<li><b>Nach Einf&uuml;gung<\/b><\/li>\n<li><b>Nach Aktualisierung<\/b><\/li>\n<li><b>Nach L&ouml;schung<\/b><\/li>\n<\/ul>\n<p>Warum es kein Ereignis namens <b>Vor Einf&uuml;gung <\/b>gibt? Weil wir dazu das Ereignis <b>Vor &Auml;nderung <\/b>nutzen k&ouml;nnen. Aber welche dieser Ereignisse ben&ouml;tigen wir, um die im oben genannten Beitrag abgebildeten Regeln zur Einhaltung der Konsistenz sicherzustellen?<\/p>\n<p>Noch mal zur Wiederholung: Wir wollen in einer 1:n-Beziehung, beispielsweise zwischen den beiden Tabellen <b>tblPersonen <\/b>und <b>tblMailAdressen <\/b>aus Bild 1, Folgendes sicherstellen: Genau einer der Datens&auml;tze aus <b>tblEMailAdressen<\/b>, der mit einem der Datens&auml;tze aus <b>tblPersonen <\/b>verbunden ist, muss f&uuml;r das Feld <b>StandardEMail <\/b>den Wert <b>True <\/b>aufweisen. Dazu ist zu ber&uuml;cksichtigen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_001.png\" alt=\"1:n-Beziehung mit Standardzuordnung\" width=\"499,5589\" height=\"244,0505\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: 1:n-Beziehung mit Standardzuordnung<\/span><\/b><\/p>\n<ul>\n<li>Wenn der erste Datensatz zu einer Person angelegt wird, muss dieser als Standard-E-Mail gekennzeichnet werden.<\/li>\n<li>Wenn ein Datensatz als <b>StandardEMail <\/b>gekennzeichnet wird, muss die Markierung beim bisher als Standard gekennzeichneten Datensatz entfernt werden.<\/li>\n<li>Wenn der aktuelle Standarddatensatz entfernt wird, muss ein anderer markiert werden, sofern noch einer vorhanden ist.<\/li>\n<li>Wenn der Benutzer versucht, den aktuellen Datensatz als Standard abzuw&auml;hlen, muss dies verhindert werden. Dies kann nur durch die Auswahl eines anderen Datensatzes geschehen.<\/li>\n<\/ul>\n<h2>Datenmakro beim L&ouml;schen<\/h2>\n<p>Damit begeben wir uns an die Programmierung der Datenmakros. Der einfachste Fall ist das L&ouml;schen eines Datensatzes, der als Standarddatensatz markiert ist. Dazu nutzen wir das Datenmakro <b>Nach L&ouml;schung<\/b>. Dieses legen wir an, indem wir die Tabelle in der Datenblattansicht &ouml;ffnen und im Ribbon unter Tabelle den Befehl <b>Nach L&ouml;schung<\/b> anklicken (siehe Bild 2). Wichtig ist, das wir die Option <b>Systemobjekte anzeigen <\/b>aktivieren, denn so k&ouml;nnen wir auf die Tabelle <b>USysApplicationLog <\/b>zugreifen, in die wir vom Makro aus Protokollmeldungen eintragen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_002.png\" alt=\"Aufrufen des Entwurfs der verschiedenen Makros\" width=\"599,559\" height=\"411,2158\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aufrufen des Entwurfs der verschiedenen Makros<\/span><\/b><\/p>\n<p>Das Datenmakro legen wir wie in Bild 3 an. Wir starten hier mit einer <b>Wenn<\/b>-Bedingung. Die Bedingung lautet <b>[Alt].[StandardEMail] = -1<\/b>. Mit <b>[Alt] <\/b>greifen wir auf die Daten des zu l&ouml;schenden Recordsets zu. Hat dessen Feld <b>StandardEMail <\/b>den Wert <b>-1<\/b>, ist er als Standardzuordnung f&uuml;r seine <b>PersonID <\/b>registriert. In diesem Fall m&uuml;ssen wir nach dem L&ouml;schen einen neuen Datensatz bestimmen, der den Wert <b>-1 <\/b>im Feld <b>StandardEMail <\/b>erhalten soll. Dazu verwenden wir die Aktion <b>Datensatz nachschlagen in <\/b>und &uuml;bergeben als Quelle die Tabelle <b>tblEMailAdressen<\/b>. Au&szlig;erdem legen wir als Bedingung fest, dass der gesuchte Datensatz im Feld <b>PersonID <\/b>den Wert des Feldes <b>PersonID <\/b>des zu l&ouml;schenden Datensatzes aufweist. Damit wir &uuml;berhaupt zwischen dem Feld <b>PersonID<\/b> des aktuellen Datensatzes und der Tabelle <b>Alt <\/b>unterscheiden k&ouml;nnen, vergeben wir f&uuml;r das Recordset den Alias <b>t1<\/b>. Falls wir einen geeigneten Datensatz finden, was immer der Fall ist, wenn mindestens noch ein weiterer Datensatz f&uuml;r diese <b>PersonID <\/b>vorhanden ist, stellen wir dessen Wert <b>StandardEMail <\/b>auf <b>-1 <\/b>ein. Damit haben wir eine neue Standardzuordnung erstellt. Wenn kein geeigneter Datensatz gefunden wird, haben wir die letzte E-Mail-Adresse f&uuml;r diese Person gel&ouml;scht und m&uuml;ssen keine neue Standardzuordnung vornehmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_003.png\" alt=\"Datenmakro Nach L&ouml;schung\" width=\"599,559\" height=\"454,0012\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Datenmakro Nach L&ouml;schung<\/span><\/b><\/p>\n<h2>Anlegen neuer Datens&auml;tze<\/h2>\n<p>Wenn wir den ersten neuen Datensatz f&uuml;r eine <b>PersonID <\/b>in der Tabelle <b>tblEMailAdressen <\/b>eintragen, soll dieser direkt mit dem Wert <b>-1 <\/b>im Feld <b>StandardEMail <\/b>versehen werden. Dazu hinterlegen wir das Makro aus Bild 4 f&uuml;r <b>Nach Einf&uuml;gung<\/b>. Hier pr&uuml;fen wir zuerst, ob das Feld <b>StandardEMail <\/b>aktualisiert wurde und protokollieren den vorherigen und den aktuellen Wert (dies hat bei der Entwicklung geholfen, zu verstehen, was passiert &#8211; daher belassen wir diese Protokollzeilen im Makro).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_004.png\" alt=\"Makro zum Einstellen der Standardzuordnung beim Anlegen neuer E-Mail-Adressen\" width=\"700\" height=\"514,0167\" \/><\/p>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Makro zum Einstellen der Standardzuordnung beim Anlegen neuer E-Mail-Adressen<\/span><\/b><\/p>\n<p>Wenn der Benutzer f&uuml;r den neuen Datensatz direkt den Wert <b>-1 <\/b>f&uuml;r <b>StandardEMail <\/b>hinterlegt hat, m&uuml;ssen wir gegebenenfalls den Wert f&uuml;r die bereits vorhandene Datens&auml;tze auf <b>0 <\/b>einstellen.<\/p>\n<p>Dazu durchlaufen wir mit <b>F&uuml;r jeden Datensatz <\/b>alle Datens&auml;tze, welche der gleichen <b>PersonID <\/b>zugeordnet sind und deren <b>ID <\/b>nicht der <b>ID <\/b>des angelegten Datensatzes entspricht.<\/p>\n<p>In dieser Schleife stellen wir mit <b>DatensatzBearbeiten <\/b>und <b>FestlegenFeld <\/b>nach einem weiteren Kommentar den Wert des Feldes <b>StandardEMail <\/b>f&uuml;r die &uuml;brigen Datens&auml;tze auf <b>0 <\/b>ein.<\/p>\n<h2>Anpassen nach dem Aktualisieren<\/h2>\n<p>Damit fehlt noch das Aktualisieren der &uuml;brigen Datens&auml;tze, wenn man einen anderen als den aktuellen Datensatz als neue Standardzuordnung festlegt. Das erledigen wir im Datenmakro <b>Nach Aktualisierung<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_005.png\" alt=\"Datenmakro Nach Aktualisierung\" width=\"700\" height=\"495,6622\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Datenmakro Nach Aktualisierung<\/span><\/b><\/p>\n<p>Hier pr&uuml;fen wir mit der Funktion <b>Aktualisiert <\/b>wieder, ob <b>StandardEMail <\/b>&uuml;berhaupt aktualisiert wurde. Falls, pr&uuml;fen wir, ob das Feld <b>StandardEMail <\/b>vor dem &Auml;ndern den Wert <b>0 <\/b>enthielt (aus dem Recordset <b>Alt<\/b>) und jetzt den Wert <b>-1<\/b>. Falls ja, durchlaufen wir jeden Datensatz eines Recordsets, das wir mit <b>F&uuml;r jeden Datensatz <\/b>ermitteln, wobei die Tabelle <b>tblEMailAdressen <\/b>als Datenquelle dient und wir alle Datens&auml;tze suchen, die zur gleichen <b>PersonID <\/b>wie der ge&auml;nderte Datensatz geh&ouml;ren und deren Wert aus dem Feld <b>ID <\/b>nicht der des ge&auml;nderten Datensatzes entspricht.<\/p>\n<p>F&uuml;r all diese Datens&auml;tze stellen wir den Wert von <b>StandardEMail <\/b>auf <b>0 <\/b>ein und entfernen somit den Status als Standardzuordnung.<\/p>\n<h2>Zwischenfazit<\/h2>\n<p>All dies funktioniert wunderbar. Wir legen eine erste E-Mail-Adresse an, diese wird direkt als Standardzuordnung definiert. Wie stellen eine andere E-Mail-Adresse als Standard ein und das Datenmakro erkennt der vorherigen diesen Status ab. Wir l&ouml;schen die aktuelle Standard-E-Mail und die erste noch verf&uuml;gbare wird als neue Standardzuordnung festgelegt.<\/p>\n<p>Allein zwei Aktionen fehlen noch: <\/p>\n<ul>\n<li>Der erste neue Datensatz soll automatisch zur Standardzuordnung werden.<\/li>\n<li>Und der Benutzer soll die aktuelle Standardzuordnung nicht durch einen Klick auf das gef&uuml;llte Kontrollk&auml;stchen entfernen k&ouml;nnen. Dazu wollen wir das Datenmakro <b>Vor &Auml;nderung <\/b>nutzen. Wir haben es zuvor mit dem Datenmakro <b>Nach Aktualisierung <\/b>probiert, aber hier k&ouml;nnen wir nicht auf den soeben ge&auml;nderten Datensatz zugreifen. Also k&ouml;nnen wir nur <b>Vor &Auml;nderung <\/b>verwenden, denn hier ist der Datensatz noch nicht gespeichert.<\/li>\n<\/ul>\n<h2>Ersten Datensatz zum Standard machen<\/h2>\n<p>Der erste Teil ist der deutlich leichtere. Diesen sehen wir in Bild 6. Hier pr&uuml;fen wir mit der Bedingung <b>[IstEingef&uuml;gt]<\/b>, ob wir es mit einem neu angelegten oder einem vorhandenen ge&auml;nderten Datensatz zu tun haben. Zuerst interessieren uns die neu angelegten Datens&auml;tze. Dabei initialisieren wir zuerst eine Variable namens <b>varStandardEMail <\/b>mit dem Wert <b>0<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_006.png\" alt=\"Datenmakro Vor &Auml;nderung, erster Teil\" width=\"700\" height=\"483,2739\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datenmakro Vor &Auml;nderung, erster Teil<\/span><\/b><\/p>\n<p>Dann suchen wir mit <b>Datensatz nachschlagen <\/b>einen Datensatz der Tabelle <b>tblEMailAdressen<\/b>, der die gleiche <b>PersonID <\/b>hat wir der neu hinzugef&uuml;gte Datensatz und dessen Feld <b>StandardEMail <\/b>den Wert <b>-1 <\/b>hat. Um den aktuellen Datensatz und den untersuchten Datensatz zu unterscheiden, verwenden wir f&uuml;r Letztere wieder den Alias <b>t1<\/b>. Haben wir einen passenden Datensatz gefunden, stellen wir die Eigenschaft <b>varStandardEMail <\/b>auf den Wert <b>-1 <\/b>und legen somit fest, dass es bereits einen Standarddatensatz gibt.<\/p>\n<p>In der folgenden <b>Wenn<\/b>-Bedingung stellen wir daher nur dann den Wert des Feldes <b>StandardEMail <\/b>f&uuml;r den neu angelegten Datensatz auf <b>-1 <\/b>ein, wenn noch kein Standarddatensatz vorhanden ist.<\/p>\n<h2>Abw&auml;hlen von Datens&auml;tzen verhindern<\/h2>\n<p>Die theoretische Idee w&auml;re gewesen, f&uuml;r das Datenmakro <b>Vor &Auml;nderung <\/b>im <b>Else<\/b>-Teil f&uuml;r das &Auml;ndern bereits vorhandener Datens&auml;tze zu pr&uuml;fen, ob der Wert des Feldes <b>StandardEMail <\/b>vor dem &Auml;ndern <b>-1 <\/b>war (f&uuml;r das Recordset <b>[Alt]<\/b>) und dass es aktuell <b>0 <\/b>lautet (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_007.png\" alt=\"Datenmakro Vor &Auml;nderung, zweiter Teil\" width=\"700\" height=\"380,4348\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Datenmakro Vor &Auml;nderung, zweiter Teil<\/span><\/b><\/p>\n<p>Das w&uuml;rde bedeuten, dass das Ereignis ausgel&ouml;st wurde durch einen Datensatz, f&uuml;r den das Feld <b>StandardEMail <\/b>von <b>-1 <\/b>auf <b>0 <\/b>ge&auml;ndert wurde, was wir genau verhindern wollen. Das gelingt auch grunds&auml;tzlich. Es erscheint sogar die Debug-Meldung, deren Text wir sp&auml;ter in einen Hinweis &auml;ndern k&ouml;nnten, dass die Standardzuordnung nicht entfernt werden kann (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_008.png\" alt=\"Meldung beim Versuch, eine Standardzuordnung abzuw&auml;hlen.\" width=\"424,5589\" height=\"354,1657\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Meldung beim Versuch, eine Standardzuordnung abzuw&auml;hlen.<\/span><\/b><\/p>\n<p>Aber es gibt ein anderes Problem: Wenn wir diesen Teil aktivieren, k&ouml;nnen wir durch Ausw&auml;hlen einer Standardzuordnung nicht mehr die vorherige Zuordnung abw&auml;hlen, so dass wir pl&ouml;tzlich mehrere Standardzuordnungen haben (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_009.png\" alt=\"Das automatische Abw&auml;hlen beim Zuordnen des Standardwertes zu einem anderen Datensatz funktioniert nicht mehr.\" width=\"424,5589\" height=\"364,7618\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das automatische Abw&auml;hlen beim Zuordnen des Standardwertes zu einem anderen Datensatz funktioniert nicht mehr.<\/span><\/b><\/p>\n<p>Was ist der Grund daf&uuml;r? Wenn wir eine neue Standardzuordnung einstellen, wurden vorher in <b>Nach Aktualisierung <\/b>die anderen Zuordnungen aufgehoben, denn der aktuelle Datensatz enthielt <b>-1 <\/b>im Feld <b>StandardEMail <\/b>und somit mussten die Zuordnungen in den &uuml;brigen Datens&auml;tzen entfernt werden.<\/p>\n<p>Bei Aufheben der Zuordnung des anderen Datensatzes wird f&uuml;r diesen aber auch wieder <b>Vor &Auml;nderung <\/b>aufgerufen und das Feld <b>StandardEMail<\/b>, das von <b>Nach Aktualisierung <\/b>auf den Wert <b>0 <\/b>eingestellt wurde, wird wieder auf <b>-1 <\/b>eingestellt &#8211; was eigentlich korrekt ist, aber eben nicht, wenn der Wert per Makro ge&auml;ndert wurde.<\/p>\n<p>Die L&ouml;sung ist, dass wir den <b>Else<\/b>-Teil des Datenmakros <b>Vor &Auml;nderung <\/b>so erweitern, dass dieser pr&uuml;ft, ob es noch einen anderen Eintrag f&uuml;r die gleiche <b>PersonID <\/b>gibt, f&uuml;r die das Feld <b>StandardEMail <\/b>auf den Wert <b>-1 <\/b>gesetzt ist. In diesem Fall k&ouml;nnen wir der &Auml;nderung von <b>-1 <\/b>auf <b>0 <\/b>stattgeben.<\/p>\n<p>Dies haben wir in der ge&auml;nderten Version aus Bild 10 umgesetzt. Hier steigen wir wieder mit der <b>Wenn<\/b>-Bedingung ein, die erf&uuml;llt ist, wenn der Wert des Feldes <b>StandardEMail <\/b>von <b>-1 <\/b>auf <b>0 <\/b>ge&auml;ndert wurde. Wir wollen nun weiter untersuchen, ob diese &Auml;nderung durch die Auswahl eines anderen Datensatzes als Standardzuordnung erfolgt ist oder durch das Abw&auml;hlen des aktuellen Datensatzes.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_011.png\" alt=\"Datenmakro Vor &Auml;nderung, zweiter Teil, mit Erweiterung\" width=\"700\" height=\"517,1747\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Datenmakro Vor &Auml;nderung, zweiter Teil, mit Erweiterung<\/span><\/b><\/p>\n<p>Dazu initialisieren wir zun&auml;chst wieder mit <b>FestlegenLokaleVar <\/b>die Variable <b>varStandardEMail <\/b>mit dem Wert <b>0<\/b>. Dann versuchen wir mit der Aktion <b>Datensatz nachschlagen in<\/b>, einen Datensatz aus der Tabelle <b>tblEMailAdressen<\/b> zu finden, der die gleiche <b>PersonID <\/b>wie der aktuelle Datensatz hat, aber nicht der gleiche ist wie der aktuelle Datensatz und der au&szlig;erdem im Feld <b>StandardEMail <\/b>den Wert <b>-1 <\/b>aufweist. Finden wir einen solchen Datensatz, wird die Variable <b>varStandardEMail <\/b>mit <b>FestlegenLokaleVar <\/b>auf <b>-1 <\/b>eingestellt.<\/p>\n<p>Im n&auml;chsten Schritt pr&uuml;fen wir, ob <b>varStandardEMail <\/b>den Wert <b>0 <\/b>hat. Das bedeutet, dass kein anderer Datensatz f&uuml;r diese <b>PersonID <\/b>gefunden werden konnte, f&uuml;r den <b>StandardEMail <\/b>auf <b>-1 <\/b>eingestellt ist. Und das tritt wiederum nur auf, wenn der Benutzer versucht, f&uuml;r den aktuellen Datensatz das Feld <b>StandardEMail <\/b>auf <b>0 <\/b>einzustellen. Nur in diesem Fall stellen wir <b>StandardEMail <\/b>mit <b>FestlegenFeld <\/b>wieder auf <b>-1 <\/b>ein und geben die entsprechende Meldung aus (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1472_010.png\" alt=\"Meldung beim Versuch, den aktuellen Standardwert abzuw&auml;hlen\" width=\"599,559\" height=\"304,5655\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Meldung beim Versuch, den aktuellen Standardwert abzuw&auml;hlen<\/span><\/b><\/p>\n<p>Ein weiterer Test auf alle ben&ouml;tigten Funktionen zeigt: Nun haben wir alle F&auml;lle abgedeckt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag haben wir gezeigt, wie man die Datenkonsistenz von Standardzuordnungen in 1:n-Beziehungen &uuml;ber ein <b>Ja\/Nein<\/b>-Feld entsprechend unseren Vorgaben mit einem Datenmakro umsetzen kann. Zuvor haben wir im Beitrag <b>1:n-Beziehung mit Standardzuordnung verwalten <\/b>(<b>www.access-im-unternehmen.de\/1469<\/b>) bereits gezeigt, wie dies mit entsprechenden Prozeduren im VBA-Code eines Formulars gelingt.<\/p>\n<p>Beide Vorgehensweisen sind aufwendig zu programmieren, aber die Variante mit dem Datenmakro ist sicherer, weil es so noch nicht einmal mehr direkt in den Tabellen m&ouml;glich ist, die Datenkonsistenz zu zerst&ouml;ren. Und die festgelegten Regeln werden in allen Formularen, welche die Daten anzeigen, durchgesetzt.<\/p>\n<p>Es gibt noch eine dritte Alternative, die voraussetzt, dass die Daten in einer SQL Server-Datenbank liegen &#8211; dann k&ouml;nnten wir die dort verf&uuml;gbaren Trigger statt Datenmakros verwenden.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>StandardzuordnungPerDatenmakro.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/0650A07C-D9CF-4B80-AC4F-6A07A2F6A1F2\/aiu_1472.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W&auml;hrend wir den Beitrag &#8222;1:n-Beziehung mit Standardzuordnung verwalten&#8220; (www.access-im-unternehmen.de\/1469) schrieben, haben wir uns gefragt, ob man die Einhaltung der Konstistenz bei 1:n-Beziehungen mit Standardzuordnung nicht auch auf andere Weise sicherstellen kann als per VBA-Code. Zumal wir diesen auch noch in allen Formularen erneut programmieren m&uuml;ssten, welche die Daten aus dieser 1:n-Beziehung darstellen. Uns fielen zwei L&ouml;sungsans&auml;tze ein: Der erste sind die mit Access 2010 eingef&uuml;hrten Datenmakros, also eine Art Trigger f&uuml;r Access-Datenbanken. Die zweite sind die echten Trigger, und zwar die vom SQL Serve. In diesem Beitrag schauen wir uns nun die Variante mit den Datenmakros an. Kann man unser Vorhaben damit abbilden? Und wenn ja, wie?<\/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":[662023,66062023,44000021],"tags":[],"class_list":["post-55001472","post","type-post","status-publish","format-standard","hentry","category-662023","category-66062023","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>Standardzuordnung per Datenmakro - 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\/?p=55001472\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Standardzuordnung per Datenmakro\" \/>\n<meta property=\"og:description\" content=\"W&auml;hrend wir den Beitrag &quot;1:n-Beziehung mit Standardzuordnung verwalten&quot; (www.access-im-unternehmen.de\/1469) schrieben, haben wir uns gefragt, ob man die Einhaltung der Konstistenz bei 1:n-Beziehungen mit Standardzuordnung nicht auch auf andere Weise sicherstellen kann als per VBA-Code. Zumal wir diesen auch noch in allen Formularen erneut programmieren m&uuml;ssten, welche die Daten aus dieser 1:n-Beziehung darstellen. Uns fielen zwei L&ouml;sungsans&auml;tze ein: Der erste sind die mit Access 2010 eingef&uuml;hrten Datenmakros, also eine Art Trigger f&uuml;r Access-Datenbanken. Die zweite sind die echten Trigger, und zwar die vom SQL Serve. In diesem Beitrag schauen wir uns nun die Variante mit den Datenmakros an. Kann man unser Vorhaben damit abbilden? Und wenn ja, wie?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/?p=55001472\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-05T22:10:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Standardzuordnung per Datenmakro\",\"datePublished\":\"2024-01-05T22:10:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472\"},\"wordCount\":2105,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a379130c8c2c4bc29e3b682de6084d25\",\"articleSection\":[\"2023\",\"6\\\/2023\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472\",\"name\":\"Standardzuordnung per Datenmakro - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a379130c8c2c4bc29e3b682de6084d25\",\"datePublished\":\"2024-01-05T22:10:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a379130c8c2c4bc29e3b682de6084d25\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a379130c8c2c4bc29e3b682de6084d25\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?p=55001472#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Standardzuordnung per Datenmakro\"}]},{\"@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":"Standardzuordnung per Datenmakro - 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\/?p=55001472","og_locale":"de_DE","og_type":"article","og_title":"Standardzuordnung per Datenmakro","og_description":"W&auml;hrend wir den Beitrag \"1:n-Beziehung mit Standardzuordnung verwalten\" (www.access-im-unternehmen.de\/1469) schrieben, haben wir uns gefragt, ob man die Einhaltung der Konstistenz bei 1:n-Beziehungen mit Standardzuordnung nicht auch auf andere Weise sicherstellen kann als per VBA-Code. Zumal wir diesen auch noch in allen Formularen erneut programmieren m&uuml;ssten, welche die Daten aus dieser 1:n-Beziehung darstellen. Uns fielen zwei L&ouml;sungsans&auml;tze ein: Der erste sind die mit Access 2010 eingef&uuml;hrten Datenmakros, also eine Art Trigger f&uuml;r Access-Datenbanken. Die zweite sind die echten Trigger, und zwar die vom SQL Serve. In diesem Beitrag schauen wir uns nun die Variante mit den Datenmakros an. Kann man unser Vorhaben damit abbilden? Und wenn ja, wie?","og_url":"https:\/\/access-im-unternehmen.de\/?p=55001472","og_site_name":"Access im Unternehmen","article_published_time":"2024-01-05T22:10:25+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Standardzuordnung per Datenmakro","datePublished":"2024-01-05T22:10:25+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472"},"wordCount":2105,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25","articleSection":["2023","6\/2023","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/?p=55001472#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/?p=55001472","url":"https:\/\/access-im-unternehmen.de\/?p=55001472","name":"Standardzuordnung per Datenmakro - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25","datePublished":"2024-01-05T22:10:25+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/?p=55001472"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/a379130c8c2c4bc29e3b682de6084d25"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/?p=55001472#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Standardzuordnung per Datenmakro"}]},{"@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\/55001472","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=55001472"}],"version-history":[{"count":1,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001472\/revisions"}],"predecessor-version":[{"id":88074930,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001472\/revisions\/88074930"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}