{"id":55001175,"date":"2019-02-01T00:00:00","date_gmt":"2020-05-13T21:05:47","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1175"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"1nBeziehung_als_Restriktion_fuer_Feldwerte","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/","title":{"rendered":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Normalerweise verwenden Sie 1:n-Beziehungen, um die Datens&auml;tze zweier Tabellen zu verkn&uuml;pfen und so Kombinationen aus diesen Datens&auml;tzen zu erm&ouml;glichen. Oder Sie nutzen die Beziehung f&uuml;r die Verkn&uuml;pfung mit einer Lookup-Tabelle, welche die Werte f&uuml;r ein Feld liefert. Es geht aber noch anders: Wir w&auml;re es, wenn Sie etwa f&uuml;r ein Feld, dass nur bestimmte Zahlenwerte annehmen k&ouml;nnen soll, auch eine per 1:n-Beziehung verkn&uuml;pfte Tabelle hinterlegen Dieser Beitrag zeigt, welchen praktischen Zweck dies hat und wie Sie dies umsetzen.<\/b><\/p>\n<p>Im Beitrag <b>HTML-Kreuztabelle 2: Werte bearbeiten <\/b>(<b>www.access-im-unternehmen.de\/1162<\/b>) haben wir eine Tabelle namens <b>tblMaterialpreise <\/b>verwendet, um die Preise f&uuml;r ein Material mit bestimmten Ma&szlig;en, in diesem Fall H&ouml;he und Breite, zu definieren. Um schon Werte f&uuml;r H&ouml;he und Breite vorzudefinieren, die noch gar nicht in der Tabelle <b>tblMaterialpreise <\/b>enthalten sind, haben wir zwei Tabellen namens <b>tblHoehen <\/b>und <b>tblBreiten <\/b>erstellt. Diese haben ein Prim&auml;rschl&uuml;sselfeld namens <b>HoeheID<\/b>\/<b>BreiteID<\/b>, ein Feld f&uuml;r die Angabe des jeweiligen Wertes namens <b>Hoehe<\/b>\/<b>Breite <\/b>und ein Fremdschl&uuml;sselfeld namens <b>MaterialID <\/b>zur Auswahl des Materials, auf das sich die H&ouml;he oder Breite bezieht, enthalten (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_001.png\" alt=\"Bisherige Ausstattung der Tabellen tblMaterialpreise, tblHoehen und tblTiefen\" width=\"649,559\" height=\"349,5546\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Bisherige Ausstattung der Tabellen tblMaterialpreise, tblHoehen und tblTiefen<\/span><\/b><\/p>\n<p>Eigentlich wollte ich der Tabelle <b>tblMaterialpreise <\/b>dann statt der bisher vorhandenen Felder <b>Hoehe <\/b>und <b>Breite<\/b>, welche die Angaben mit dem Datentyp <b>Zahl <\/b>in Millimeter  gespeichert haben, zwei Fremdschl&uuml;sselfelder namens <b>HoeheID <\/b>und <b>BreiteID <\/b>hinzuf&uuml;gen, die jeweils mit der Tabelle <b>tblHoehen <\/b>beziehungsweise <b>tblBreiten <\/b>verkn&uuml;pft werden sollten. Auf diese Weise h&auml;tte man dann &uuml;ber ein Nachschlagefeld die jeweils f&uuml;r den Preis ausschlaggebenden Ma&szlig;e ausw&auml;hlen k&ouml;nnen.<\/p>\n<h2>Wert als Prim&auml;rschl&uuml;ssel<\/h2>\n<p>Allerdings fiel mir dann auf, dass dies m&ouml;glicherweise einfacher geht und auf eine andere Weise sogar noch Performance-Vorteile mit sich bringen k&ouml;nnte. Wenn ich die Verkn&uuml;pfungen wie geplant realisieren w&uuml;rde, m&uuml;sste Access immer, wenn die Werte der Tabelle <b>tblMaterialpreise <\/b>mit den Werten f&uuml;r die H&ouml;he und Breite ausgegeben werden sollen, die entsprechenden Informationen &uuml;ber die Verkn&uuml;pfung aus den Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>abfragen. Das ist aber in diesem Fall gar nicht n&ouml;tig.<\/p>\n<p>Wenn wir uns ansehen, welche Werte das Feld <b>Hoehe <\/b>in der Tabelle <b>tblHoehen <\/b>und das Feld <b>Breite <\/b>in der Tabelle <b>tblBreite <\/b>annehmen soll, k&ouml;nnte man annehmen, dass jeder Wert in jeder der beiden Tabellen nur einmal vorkommen soll. Das ist jedoch nicht der Fall, denn jeder Wert kann f&uuml;r jede Kombination mit dem &uuml;ber das Fremdschl&uuml;sselfeld <b>MaterialID <\/b>maximal einmal vorkommen &#8211; bei zwei Materialien kann also auch zweimal der Wert 1.000 mm vorkommen.<\/p>\n<p>Wenn die Unterscheidung &uuml;ber das Feld <b>MaterialID <\/b>nicht w&auml;re und wir die Werte nur f&uuml;r ein einziges Material angeben m&uuml;ssten, k&ouml;nnten wir die Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>mit dem Feld <b>Hoehe <\/b>beziehungsweise <b>Breite <\/b>als Prim&auml;rschl&uuml;sselfeld ausstatten. Da wir allerdings das Feld <b>MaterialID <\/b>ber&uuml;cksichtigen m&uuml;ssen und wir einen zusammengesetzten, eindeutigen Index &uuml;ber die beiden Felder <b>Hoehe <\/b>und <b>MaterialID <\/b>beziehungsweise <b>Breite <\/b>und <b>MaterialID <\/b>haben, m&uuml;ssten wir aus diesen zusammengesetzten, eindeutigen Indizes einen zusammengesetzten Prim&auml;rschl&uuml;ssel machen. Das Ergebnis sieht wie in Bild 2 aus. Die noch in <b>Indizes<\/b>-Fenster vorhandenen zusammengesetzten, eindeutigen Indizes aus den Feldern <b>Hoehe <\/b>und <b>MaterialID <\/b>beziehungsweise <b>Breite <\/b>und <b>MaterialID <\/b>entfernen wir.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_002.png\" alt=\"Ersetzen des einfachen Prim&auml;rschl&uuml;sselfeldes durch einen zusammengesetzten Prim&auml;rschl&uuml;ssel aus den &uuml;brigen Feldern\" width=\"549,6265\" height=\"424,8242\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ersetzen des einfachen Prim&auml;rschl&uuml;sselfeldes durch einen zusammengesetzten Prim&auml;rschl&uuml;ssel aus den &uuml;brigen Feldern<\/span><\/b><\/p>\n<h2>Verkn&uuml;pfungen erstellen<\/h2>\n<p>Dann haben wir aber auch leider kein einfaches Prim&auml;rschl&uuml;sselfeld mehr, mit dem wir die noch zu erstellenden Fremdschl&uuml;sselfelder der Tabelle <b>tblMaterialpreise<\/b> verkn&uuml;pfen k&ouml;nnen. Aber das ist kein Problem: Wir erstellen einfach zwei Verkn&uuml;pfungen!<\/p>\n<p>Die erste legen wir auf dem gewohnten Wege an. Dazu nutzen wir das bereits in der Tabelle <b>tblMaterialpreise <\/b>vorhandene Feld <b>Hoehe <\/b>und w&auml;hlen als neuen Datentyp in der Entwurfsansicht den Eintrag <b>Nachschlagefeld <\/b>aus. Hier w&auml;hlen wir die Tabelle <b>tblHoehen <\/b>als Quelltabelle aus und das Feld <b>Hoehe <\/b>als einziges ausgew&auml;hltes Feld.<\/p>\n<p>F&uuml;r dieses Feld legen wir eine aufsteigende Sortierung fest. Interessanterweise finden wir in dem Schritt, der normalerweise die M&ouml;glichkeit anbietet, referenzielle Integrit&auml;t zu definieren, keine solche Einstellung (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_003.png\" alt=\"Fehlende Einstellung zum Festlegen referenzieller Integrit&auml;t\" width=\"549,6265\" height=\"370,6055\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Fehlende Einstellung zum Festlegen referenzieller Integrit&auml;t<\/span><\/b><\/p>\n<p>Also verzichten wir zun&auml;chst darauf und schlie&szlig;en den Dialog &uuml;ber die Schaltfl&auml;che <b>Fertigstellen<\/b>. Das Gleiche erledigen f&uuml;r analog f&uuml;r das Feld <b>Breite <\/b>der Tabelle <b>tblMaterialpreise <\/b>und die Tabelle <b>tblBreiten<\/b>.<\/p>\n<p>Schauen wir uns nun das Datenmodell im <b>Beziehungen<\/b>-Fenster an, sieht dies wie in Bild 4 aus. Nun soll der Benutzer etwa f&uuml;r das Feld <b>Hoehe <\/b>der Tabelle <b>tblMaterialpreise <\/b>nur diejenigen Felder der Tabelle <b>tblHoehen <\/b>ausw&auml;hlen k&ouml;nnen, die im Feld <b>MaterialID <\/b>den gleichen Wert wie die Tabelle <b>tblMaterialpreise <\/b>aufweist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_004.png\" alt=\"Datenmodell f&uuml;r die Zuordnung der H&ouml;he und der Breite\" width=\"549,6265\" height=\"306,9987\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Datenmodell f&uuml;r die Zuordnung der H&ouml;he und der Breite<\/span><\/b><\/p>\n<p>Um dies zu gew&auml;hrleisten, m&uuml;ssen wir dann auch noch eine Beziehung zwischen den beiden Feldern <b>MaterialID <\/b>der Tabelle <b>tblMaterialpreise <\/b>und <b>MaterialID <\/b>der Tabelle <b>tblHoehen <\/b>beziehungsweise <b>tblBreiten <\/b>herstellen.<\/p>\n<p>Wie erledigen wir das Wenn wir es probieren wie beim herk&ouml;mmlichen Erstellen einer Beziehung zwischen zwei Tabellen im Beziehungen-Fenster, also durch das Ziehen des Fremdschl&uuml;sselfeldes der einen Tabelle auf die Zieltabelle, erhalten wir die Meldung aus Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_005.png\" alt=\"Meldung bei vorhandener Beziehung\" width=\"700\" height=\"116,989\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Meldung bei vorhandener Beziehung<\/span><\/b><\/p>\n<p>Bet&auml;tigen wir hier nun die Schaltfl&auml;che <b>Ja<\/b>, erscheint der Dialog <b>Beziehung bearbeiten <\/b>aus Bild 6. Hier f&uuml;gen wir die zweite Beziehung hinzu, indem wir sowohl f&uuml;r die Tabelle <b>tblHoehen <\/b>als auch f&uuml;r die Tabelle <b>tblMaterialpreise <\/b>das Feld <b>MaterialID <\/b>ausw&auml;hlen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_006.png\" alt=\"Doppelte Verkn&uuml;pfung herstellen\" width=\"424,7115\" height=\"263,8209\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Doppelte Verkn&uuml;pfung herstellen<\/span><\/b><\/p>\n<p>Au&szlig;erdem aktivieren wir hier die Option <b>Mit referenzieller Integrit&auml;t<\/b>. Das Gleiche erledigen wir f&uuml;r die Tabellen <b>tblBreiten <\/b>und <b>tblMaterialpreise<\/b>.<\/p>\n<p>Wenn wir nun einige weitere Datens&auml;tze zur Tabelle <b>tblHoehen <\/b>hinzuf&uuml;gen, die wir einem anderen Wert der Tabelle <b>tblMaterialien<\/b> zuordnen, sieht diese Tabelle wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_008.png\" alt=\"H&ouml;hen f&uuml;r verschiedene Spanplattendicken\" width=\"424,7115\" height=\"311,239\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: H&ouml;hen f&uuml;r verschiedene Spanplattendicken<\/span><\/b><\/p>\n<p>Was wollen wir damit erreichen Nun, wir wollen sehen, ob wir damit die Auswahl im Nachschlagefeld der Tabelle <b>tblMaterialpreise <\/b>so einschr&auml;nken k&ouml;nnen, dass nur die Werte der verkn&uuml;pften Tabelle <b>tblHoehen <\/b>im Nachschlagefeld <b>Hoehe <\/b>angezeigt werden, die auch dem aktuell im Feld <b>MaterialID <\/b>ausgew&auml;hlten Material entsprechen. Das ist nicht der Fall, wie Bild 8 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_007.png\" alt=\"Die Auswahl der H&ouml;hen bietet zu viele Datens&auml;tze an.\" width=\"499,6607\" height=\"496,5827\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die Auswahl der H&ouml;hen bietet zu viele Datens&auml;tze an.<\/span><\/b><\/p>\n<h2>Einschr&auml;nkung per Abfrage<\/h2>\n<p>Diese Einschr&auml;nkung bekommen wir nur durch die Erstellung einer geeigneten Abfrage hin. Diese sieht im Entwurf wie in Bild 9 aus. Wir f&uuml;gen der Abfrage die beiden Tabellen <b>tblMaterialpreise <\/b>und <b>tblHoehen <\/b>hinzu. Die beiden vorhandenen Beziehungen werden automatisch in den Abfrageentwurf &uuml;bernommen. Was noch fehlt, ist die Anpassung der Datensatzherkunft des Nachschlagefeldes <b>Hoehe <\/b>der Tabelle <b>tblMaterialpreise<\/b>. Diese wollen wir so einrichten, dass diese nur solche Eintr&auml;ge der Tabelle <b>tblHoehen <\/b>anzeigt, die den gleichen Wert im Feld <b>MaterialID <\/b>aufweist wie der aktuelle Datensatz der Tabelle <b>tblMaterialpreise<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_009.png\" alt=\"Formulierung der Datensatzherkunft des Nachschlagefeldes\" width=\"649,559\" height=\"442,2138\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Formulierung der Datensatzherkunft des Nachschlagefeldes<\/span><\/b><\/p>\n<p>Das realisieren wir durch die Formulierung der Eigenschaft wie folgt:<\/p>\n<pre>SELECT Hoehe FROM tblHoehen WHERE tblMaterialpreise.MaterialID = tblHoehen.MaterialID;<\/pre>\n<p>Wenn wir nun in die Datenblattansicht der Abfrage wechseln, sind die Datens&auml;tze im Nachschlagefeld <b>Hoehe <\/b>zwar nach den Werten der Tabelle <b>tblHoehen <\/b>f&uuml;r einen der beiden angegebenen Werte von <b>MaterialID <\/b>gefiltert &#8211; allerdings immer nur f&uuml;r den Wert von <b>MaterialID <\/b>f&uuml;r den oben befindlichen Datensatz (siehe Bild 10). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_010.png\" alt=\"F&uuml;r diesen Datensatz zeigt das Nachschlagefeld die richtigen Werte an ...\" width=\"424,7115\" height=\"133,7355\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: F&uuml;r diesen Datensatz zeigt das Nachschlagefeld die richtigen Werte an &#8230;<\/span><\/b><\/p>\n<p>Wenn wir zu einem Datensatz wechseln, der mit dem Eintrag <b>Spanplatte 19 mm <\/b>der Tabelle <b>tblMaterialien <\/b>verkn&uuml;pft ist und hier das Nachschlagefeld f&uuml;r <b>Hoehe <\/b>&ouml;ffnen, erhalten wir wieder die H&ouml;hen f&uuml;r den Eintrag <b>Spanplatte 17 mm <\/b>(siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_011.png\" alt=\"... f&uuml;r den n&auml;chsten nicht mehr.\" width=\"424,7115\" height=\"140,2197\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: &#8230; f&uuml;r den n&auml;chsten nicht mehr.<\/span><\/b><\/p>\n<p>Das &auml;ndert sich allerdings, wenn wir nun auf die Schaltfl&auml;che <b>F5 <\/b>zum Aktualisieren klicken. Dies aktualisiert nicht nur die Abfrage, sondern offensichtlich auch die Datensatzherkunft des Nachschlagefeldes entsprechend des Wertes des zuletzt markierten Datensatzes der Abfrage &#8211; auch wenn der Datensatzmarkierer danach wieder auf den ersten Datensatz zur&uuml;ckf&auml;llt. Bild 12 zeigt, dass das Nachschlagefeld nun den richtigen Datensatz anzeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_012.png\" alt=\"Nach der Aktualisierung klappt es dann.\" width=\"424,7115\" height=\"175,3544\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Nach der Aktualisierung klappt es dann.<\/span><\/b><\/p>\n<h2>Neuen Datensatz in der Abfrage anlegen<\/h2>\n<p>Damit k&ouml;nnte man sp&auml;ter im Formular eventuell leben &#8211; die Datensatzherkunft lie&szlig;e sich ja direkt ansteuern und aktualisieren, ohne dass der aktuelle Datensatz verlassen werden muss. Aber was geschieht, wenn wir nun einen &uuml;ber die Abfrage <b>qryMaterialpreiseHoehenBreiten <\/b>einen neuen Datensatz in der Tabelle <b>tblMaterialpreise <\/b>hinzuf&uuml;gen Wenn wir den Datensatzzeiger auf einen neuen Datensatz einstellen, mit <b>F5 <\/b>aktualisieren und dann wieder zum neuen, leeren Datensatz wechseln, ist das Nachschlagefeld leer (siehe Bild 13). Kein Wunder, denn das Feld <b>MaterialID <\/b>ist leer und die Tabelle <b>tblHoehen <\/b>hat keine Datens&auml;tze, in denen das Feld auch leer ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_013.png\" alt=\"Beim Einf&uuml;gen eines neuen Datensatzes, bei dem man zuvor mit F5 die Datensatzherkunft des Nachschlagefeldes aktualisiert hat, ist dieses leer.\" width=\"424,7115\" height=\"150,7041\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Beim Einf&uuml;gen eines neuen Datensatzes, bei dem man zuvor mit F5 die Datensatzherkunft des Nachschlagefeldes aktualisiert hat, ist dieses leer.<\/span><\/b><\/p>\n<p>Also w&auml;hlen wir hier erst einen Wert f&uuml;r <b>MaterialID <\/b>aus und aktualisieren dann mit <b>F5<\/b>. Dadurch will Access den Datensatzzeiger auf den ersten Datensatz verschieben. Das gelingt allerdings nicht, da der neue Datensatz nicht vollst&auml;ndig ist &#8211; die beiden Felder <b>Hoehe <\/b>und <b>Breite <\/b>m&uuml;ssen mit Datens&auml;tzen der Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>verkn&uuml;pft werden. Also erhalten wir die Meldung aus Bild 14.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_014.png\" alt=\"Fehlermeldung beim Verlassen eines unvollst&auml;ndigen Datensatzes\" width=\"700\" height=\"95,60571\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Fehlermeldung beim Verlassen eines unvollst&auml;ndigen Datensatzes<\/span><\/b><\/p>\n<p>Nachdem wir diese best&auml;tigt haben und nochmal das Nachschlagefeld aufklappen, finden wir dort die gew&uuml;nschten Daten vor (siehe Bild 15). Da wir nun das gew&uuml;nschte Ergebnis haben, nehmen wir zwei Schritte vor: <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_015.png\" alt=\"Korrekte Darstellung der gew&uuml;nschten Daten nach Aktualisierung\" width=\"424,7115\" height=\"199,1087\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Korrekte Darstellung der gew&uuml;nschten Daten nach Aktualisierung<\/span><\/b><\/p>\n<ul>\n<li>Erstens die Anpassung des Nachschlagefeldes f&uuml;r das Fremdschl&uuml;sselfeld <b>Breite<\/b> und<\/li>\n<li>zweitens den Bau eines Formulars, das die hier vorkommenden Fehlermeldungen abf&auml;ngt beziehungsweise die Daten der Nachschlagefelder aktualisiert, ohne Datensatz zu wechseln und somit die Fehlermeldungen &uuml;berhaupt gar nicht anzeigt.<\/li>\n<\/ul>\n<p>Den ersten Schritt erledigen wir wie in Bild 16. Wir f&uuml;gen die Tabelle <b>tblBreiten <\/b>zum Abfrageentwurf hinzu und stellen die Eigenschaften im Bereich <b>Nachschlagen <\/b>wie in der Abbildung ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_016.png\" alt=\"Erweiterung der Abfrage um die Tabelle tblBreiten und Einstellung des Nachschlagefeldes\" width=\"649,559\" height=\"420,2104\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Erweiterung der Abfrage um die Tabelle tblBreiten und Einstellung des Nachschlagefeldes<\/span><\/b><\/p>\n<h2>Formular erstellen<\/h2>\n<p><!--30percent--><\/p>\n<p>F&uuml;r den zweiten Teil erstellen wir ein neues Formular namens <b>frmMaterialpreiseHoehenBreiten <\/b>und &ouml;ffnen es in der Entwurfsansicht. Stellen Sie die Abfrage <b>qryMaterialpreiseHoehenBreiten <\/b>als Datenherkunft f&uuml;r das Formular ein. Au&szlig;erdem legen Sie f&uuml;r die Eigenschaft <b>Standardansicht <\/b>den Wert <b>Datenblatt <\/b>fest. Ziehen Sie alle Felder der Datenherkunft aus der Feldliste in den Entwurf des Formulars (siehe Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_017.png\" alt=\"Entwurf des Formulars frmMaterialpreiseHoehenBreiten\" width=\"424,7115\" height=\"266,7745\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Entwurf des Formulars frmMaterialpreiseHoehenBreiten<\/span><\/b><\/p>\n<p>Wechseln Sie nun in die Datenblattansicht, verh&auml;lt sich das Formular genauso wie die Abfrage. Sie zeigt f&uuml;r die Nachschlagefelder <b>Hoehe <\/b>und <b>Breite <\/b>die Werte an, die zu der <b>MaterialID<\/b> passen, die f&uuml;r den beim &ouml;ffnen oben angezeigten Datensatz ausgew&auml;hlt ist.<\/p>\n<p>Wir wollen nun, dass beim Wechseln des Wertes f&uuml;r das Feld <b>MaterialID <\/b>oder auch beim Wechseln des Datensatzes die zur jeweiligen <b>MaterialID <\/b>geh&ouml;renden Werte der beiden Tabellen <b>tblHoehen <\/b>und <b>tblTiefen <\/b>angezeigt werden.<\/p>\n<p>Dazu m&uuml;ssen wir f&uuml;r zwei Ereignisprozeduren entsprechende Prozeduren hinterlegen. Das erste ist das Ereignis <b>Beim Anzeigen <\/b>des Formulars, die beim Wechseln des Datensatzes ausgel&ouml;st wird, das zweite das Ereignis <b>Nach Aktualisierung <\/b>des Nachschlagefeldes <b>MaterialID<\/b>. Dieses benennen wir zuvor in <b>cboMaterialID <\/b>um, genau wie wir die beiden Kombinationsfelder <b>Hoehe <\/b>und <b>Breite <\/b>in <b>cboHoehe <\/b>und <b>cboBreite <\/b>umbenennen. Beide resultierenden Ereignisprozeduren statten wir mit einem Aufruf der Prozedur <b>NachschlagefelderAktualisieren <\/b>aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboMaterialID_AfterUpdate()\r\n     NachschlagefelderAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     NachschlagefelderAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese sieht schlie&szlig;lich wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>NachschlagefelderAktualisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLHoehe<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLBreite<span style=\"color:blue;\"> As String<\/span>\r\n     strSQLHoehe = \"SELECT Hoehe FROM tblHoehen  WHERE tblHoehen.MaterialID = \" & Me!cboMaterialID\r\n     strSQLBreite = \"SELECT Breite FROM tblBreiten  WHERE tblBreiten.MaterialID = \" & Me!cboMaterialID\r\n     Me!cboHoehe.RowSource = strSQLHoehe\r\n     Me!cboBreite.RowSource = strSQLBreite\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur stellt jeweils eine SQL-Abfrage f&uuml;r die beiden Kombinationsfelder zusammen, deren Kriterium das Feld <b>MaterialID <\/b>nach dem Wert des Kombinationsfeldes <b>cboMaterialID <\/b>filtert.<\/p>\n<p>Wenn wir das Formular <b>frmMaterialpreiseHoehenBreiten <\/b>nun in der Datenblattansicht &ouml;ffnen, funktioniert die Auswahl bereits wie gew&uuml;nscht. In Bild 18 haben wir das &ouml;ffnen der Auswahl f&uuml;r zwei Datens&auml;tze mit verschiedenen Einstellungen f&uuml;r das Feld <b>MaterialID <\/b>dargestellt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_018.png\" alt=\"Die Kombinationsfelder &auml;ndern ihre Datensatzherkunft je nach Datensatz\" width=\"424,7115\" height=\"328,6266\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Die Kombinationsfelder &auml;ndern ihre Datensatzherkunft je nach Datensatz<\/span><\/b><\/p>\n<p>Wenn wir allerdings eines der beiden Kombinationsfelder <b>cboHoehe <\/b>oder <b>cboBreite<\/b> f&uuml;r den neuen, leeren Datensatz &ouml;ffnen, erhalten wir den Fehler aus Bild 19. Das ist logisch, denn wenn f&uuml;r <b>cboMaterialID <\/b>kein Wert ausgew&auml;hlt ist, stellt die Prozedur <b>NachschlagefelderAktualisieren <\/b>eine Abfrage wie die folgende als Datensatzherkunft f&uuml;r das Kombinationsfeld <b>cboHoehe <\/b>zusammen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_019.png\" alt=\"Fehler bei fehlender MaterialID\" width=\"499,6607\" height=\"251,5474\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Fehler bei fehlender MaterialID<\/span><\/b><\/p>\n<pre>SELECT Hoehe FROM tblHoehen WHERE tblHoehen.MaterialID = <\/pre>\n<p>Hier fehlt der Vergleichswert. Wie wollen wir hier agieren Am einfachsten w&auml;re es, wenn wir dem Benutzer in diesem Fall eine Meldung anzeigen, dass er zun&auml;chst einen Wert f&uuml;r das Feld <b>Material-ID <\/b>ausw&auml;hlen muss und dann den Fokus auf das aufgeklappte Kombinationsfeld <b>cboMaterialID <\/b>setzen. Das erledigen wir durch die folgende Erg&auml;nzung:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>NachschlagefelderAktualisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLHoehe<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLBreite<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboMaterialID)<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie zuerst das Material aus.\"\r\n         Me!cboMaterialID.SetFocus\r\n         Me!cboMaterialID.Dropdown\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir pr&uuml;fen hier also, ob <b>cboMaterialID <\/b>den Wert <b>Null <\/b>hat. Falls nicht, f&uuml;hren wir die bereits weiter oben erl&auml;uterten Schritte durch. Ist <b>cboMaterialID <\/b>noch leer, zeigen wir die Meldung an, verschieben den Fokus auf <b>cboMaterialID <\/b>und klappen dieses auf (siehe Bild 20).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_020.png\" alt=\"Aufforderung zur Auswahl des Materials\" width=\"499,6607\" height=\"269,8702\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Aufforderung zur Auswahl des Materials<\/span><\/b><\/p>\n<p>Damit haben wir jedoch noch immer nicht alle Fehlerquellen abgedeckt. Wenn Sie n&auml;mlich f&uuml;r den neuen, leeren Datensatz das Material ausgew&auml;hlt haben und dann, ohne diesen in Bearbeitung befindlichen Datensatz fertigzustellen und zu speichern, zu einem anderen Datensatz wechseln, erscheint die n&auml;chste Fehlermeldung (siehe Bild 21). <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_021.png\" alt=\"Fehlermeldung beim Verlassen des unvollst&auml;ndigen Datensatzes\" width=\"700\" height=\"96,4072\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Fehlermeldung beim Verlassen des unvollst&auml;ndigen Datensatzes<\/span><\/b><\/p>\n<p>Diese besagt, dass in der Tabelle <b>tblMaterialpreise <\/b>kein passender Datensatz zur Auswahl der Kombinationsfelder f&uuml;r die Felder <b>Breite <\/b>und <b>MaterialID <\/b>gefunden werden konnte. Nach der Best&auml;tigung der Meldung verweilt der Datensatzzeiger auf dem unvollst&auml;ndigen neuen Datensatz.<\/p>\n<p>Das Problem ist, dass wir eine Beziehung zwischen den Tabellen <b>tblMaterialpreise <\/b>und <b>tblBreiten <\/b>definiert haben, wonach die Inhalte der Felder <b>Breite <\/b>und <b>MaterialID <\/b>in der Tabelle <b>tblMaterialpreise <\/b>auch in der Tabelle <b>tblBreiten <\/b>vorkommen m&uuml;ssen. Nun haben wir allerdings nur einen Wert f&uuml;r <b>MaterialID <\/b>ausgew&auml;hlt, aber nicht f&uuml;r die Breite. Da die Bedingung zum Speichern des Datensatzes nicht erf&uuml;llt ist, wird der Vorgang an dieser Stelle abgebrochen.<\/p>\n<p>Auch diesen Fehler wollen wir abfangen und den Benutzer genauer darauf hinweisen, welche Eingabe noch fehlt. Dazu legen wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Bei Fehler <\/b>des Formulars an und f&uuml;llen diese wie folgt auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> DataErr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit geben wir zun&auml;chst die Nummer des Fehlers mit der obigen Fehlermeldung im Direktbereich des VBA-Editors aus. Wie sich zeigt, handelt es sich um den Fehler mit der Nummer <b>3101<\/b>.<\/p>\n<p>Diesen wollen wir nun gezielt abfangen und daf&uuml;r eine eigene Fehlermeldung ausgeben. Das erledigen wir durch die folgenden Anpassungen der Ereignisprozedur <b>Form_Error<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>3101\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie Werte f&uuml;r die H&ouml;he  und die Breite aus.\"\r\n             <span style=\"color:blue;\">If <\/span>IsNull(Me!cboHoehe)<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!cboHoehe.SetFocus\r\n                 Me!cboHoehe.Dropdown\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 Me!cboBreite.SetFocus\r\n                 Me!cboBreite.Dropdown\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             Response = acDataErrContinue\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur pr&uuml;ft, ob sie durch den Fehler mit der Nummer <b>3101<\/b> ausgel&ouml;st wurde.<\/p>\n<p>In diesem Fall erscheint eine Meldung, die den Benutzer darauf hinweist, dass er die H&ouml;he und die Breite eingeben muss und die den Fokus auf das erste der beiden Kombinationsfelder setzt, f&uuml;r das noch kein Wert ausgew&auml;hlt wurde.<\/p>\n<h2>N&auml;chster Fehler: Kombination bereits vorhanden<\/h2>\n<p>Eine weitere Restriktion f&uuml;r die Tabelle <b>tblMaterialpreise <\/b>besagt, dass die Kombination der Werte f&uuml;r die Felder <b>Hoehe<\/b>, <b>Breite <\/b>und <b>MaterialID <\/b>einzigartig sein muss. Geben wir nun eine bereits vorhandene Kombination ein, erscheint die durch den Fehler <b>3022 <\/b>ausgel&ouml;ste Meldung. Auch diese wollen wir in der Ereignisprozedur <b>Form_Error <\/b>behandeln, die wir dazu wie folgt erweitern:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>3022\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Kombination aus H&ouml;he und Breite  ist f&uuml;r das gew&auml;hlte Material bereits vorhanden.\"\r\n             Response = acDataErrContinue\r\n         <span style=\"color:blue;\">Case <\/span>3101\r\n             ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Willk&uuml;rliche Anzeige der Meldungen<\/h2>\n<p>Beim weiteren Testen stellen wir fest, dass die Meldung, die den Benutzer um die vorherige Auswahl des Materials bittet, immer beim Verschieben des Datensatzzeigers auf einen leeren, neuen Datensatz angezeigt wird. Unsere &auml;nderung an der Prozedur <b>NachschlagefelderAktualisieren<\/b> funktioniert also nicht in allen F&auml;llen wie gew&uuml;nscht.<\/p>\n<p>Die Meldung soll n&auml;mlich erst angezeigt werden, wenn der Benutzer eines der beiden Kombinationsfelder <b>cboHoehe <\/b>oder <b>cboBreite <\/b>aufklappt.<\/p>\n<p>Also &auml;ndern wir die Prozedur <b>NachschlagefelderAktualisieren <\/b>zun&auml;chst wieder auf die vorherige Version, bei der die Datensatzherkunft f&uuml;r die beiden Kombinationsfelder in dem Fall, dass <b>MaterialID <\/b>noch nicht ausgew&auml;hlt wurde, auf die fehlerhafte Datensatzherkunft, da ohne Vergleichswert, eingestellt wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>NachschlagefelderAktualisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLHoehe<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLBreite<span style=\"color:blue;\"> As String<\/span>\r\n     strSQLHoehe = \"SELECT Hoehe FROM tblHoehen WHERE  tblHoehen.MaterialID = \" & Nz(Me!cboMaterialID, 0)\r\n     strSQLBreite = \"SELECT Breite FROM tblBreiten WHERE  tblBreiten.MaterialID = \" & Nz(Me!cboMaterialID, 0)\r\n     Me!cboHoehe.RowSource = strSQLHoehe\r\n     Me!cboBreite.RowSource = strSQLBreite\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wie aber wirken wir dem Fehler entgegen, der nun beim Aufklappen eines der beiden Kombinationsfelder <b>cboHoehe <\/b>oder <b>cboBreite <\/b>ausgel&ouml;st wird Das erledigen wir wieder in der Prozedur <b>Form_Error<\/b>.<\/p>\n<p>Die Nummer des hier ausgel&ouml;sten Fehlers lautet <b>3075<\/b>. Daf&uuml;r legen wir einen neuen Zweig in der <b>Select Case<\/b>-Bedingung an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>3075\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"W&auml;hlen Sie zun&auml;chst das Material aus.\"\r\n             Me!cboMaterialID.SetFocus\r\n             Me!cboMaterialID.Dropdown\r\n             Response = acDataErrContinue\r\n     ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie nun das Formular in der Datenblattansicht &ouml;ffnen und im neuen, leeren Datensatz versuchen, eines der beiden Kombinationsfelder <b>cboHoehe <\/b>oder <b>cboBreite <\/b>aufzuklappen, sollte die angegebene Meldung erscheinen &#8211; gefolgt vom Aufklappen des Kombinationsfeldes <b>cboMaterialID<\/b>. Dies ist allerdings nicht der Fall.<\/p>\n<p>Stattdessen reagiert Access recht merkw&uuml;rdig: Es versucht wohl, das Kombinationsfeld <b>cboMaterialID <\/b>zu markieren, das Aufklappen gelingt jedoch nicht &#8211; stattdessen wird das Kombinationsfeld <b>cboHoehe <\/b>ge&ouml;ffnet, das aber den Wert <b>1 <\/b>anzeigt. Viel Zeit, diesen Fehler zu analysieren, bleibt nicht, denn kurz darauf st&uuml;rzt Access auf dem Testrechner ab (siehe Bild 22).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_022.png\" alt=\"Merkw&uuml;rdige Reaktion des Formulars\" width=\"424,7115\" height=\"187,4426\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Merkw&uuml;rdige Reaktion des Formulars<\/span><\/b><\/p>\n<p>Wenn wir allerdings einen Haltepunkt auf die Zeile mit der <b>MsgBox<\/b>-Anweisung setzen und die folgenden Anweisungen langsam durchlaufen, arbeitet die Prozedur zun&auml;chst wie gew&uuml;nscht. Sobald wir jedoch die Prozedur verlassen, tritt der Absturz wieder auf. Offensichtlich tritt irgendein Konflikt auf, wenn man, w&auml;hrend ein Kombinationsfeld ge&ouml;ffnet ist, ein anderes Kombinationsfeld &ouml;ffnet.<\/p>\n<p>Was tun wir in solch einem Fall Wir entkoppeln die Fehlerbehandlung und die dadurch ausgel&ouml;sten Aktionen. Sprich: Wir lassen erst die Ereignisprozedur <b>Form_Error <\/b>durchlaufen und erledigen dort nur die n&ouml;tigsten Schritte &#8211; also das Anzeigen der Meldung und das Unterbinden der Ausgabe der eingebauten Fehlermeldung durch Setzen von <b>Response <\/b>auf den Wert <b>acDataErrContinue<\/b>. Wie aber sorgen wir dann daf&uuml;r, dass das Kombinationsfeld <b>cboMaterialID <\/b>aufgeklappt wird, damit der Benutzer direkt die n&ouml;tigen Informationen ausw&auml;hlen kann Dies erledigen wir in einer weiteren Ereignisprozedur, die durch das Ereignis <b>Bei Zeitgeber <\/b>ausgel&ouml;st wird. Hinterlegen Sie f&uuml;r diese Ereigniseigenschaft die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     Me!cboMaterialID.SetFocus\r\n     Me!cboMaterialID.Dropdown\r\n     Me.TimerInterval = 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die ersten beiden Anweisungen verschieben den Fokus auf das Steuer-element <b>cboMaterialID <\/b>und klappen die Liste der Eintr&auml;ge auf. Die dritte stellt die Eigenschaft <b>TimerInterval <\/b>auf den Wert <b>0 <\/b>ein. Damit wird das Ereignis nicht nochmals ausgel&ouml;st.<\/p>\n<p>Damit das Ereignis <b>Bei Zeitgeber <\/b>&uuml;berhaupt feuert, m&uuml;ssen wir die Eigenschaft <b>Zeitgeberintervall auf <\/b>einen Wert gr&ouml;&szlig;er als <b>0 <\/b>einstellen. Dies erledigen wir ebenfalls in der Ereignisprozedur <b>Bei Fehler<\/b>, indem wir <b>Me.TimerInterval <\/b>auf den Wert <b>100 <\/b>einstellen, was einer Verz&ouml;gerung von 100 Millisekunden bis zum n&auml;chsten Ausl&ouml;sen der Ereignisprozedur <b>Form_Timer <\/b>entspricht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>3075\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"W&auml;hlen Sie zun&auml;chst das Material aus.\"\r\n             Me.TimerInterval = 100\r\n             Response = acDataErrContinue\r\n         ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit funktioniert das automatische Aufklappen des Kombinationsfeldes <b>cboMaterialID <\/b>wie gew&uuml;nscht und ohne Absturz der Anwendung.<\/p>\n<h2>Nachtr&auml;gliche &auml;nderung des Materials<\/h2>\n<p>Was noch geschehen kann, ist die nachtr&auml;gliche &auml;nderung des Materials durch den Benutzer. In diesem Fall zeigen die Felder <b>Hoehe <\/b>und <b>Breite <\/b>unter Umst&auml;nden Werte an, die f&uuml;r das gew&auml;hlte Material gar nicht zur Verf&uuml;gung stehen.<\/p>\n<p>Wir m&uuml;ssen also bei Neuauswahl des Materials darauf hinweisen, dass die H&ouml;he und die Breite gegebenenfalls neu ausgew&auml;hlt werden m&uuml;ssen und dem Benutzer die M&ouml;glichkeit geben, dies gegebenenfalls abzubrechen.<\/p>\n<p>Der erste Ansatz, den ich dazu verfolgte, war etwas naiv: Ich habe dabei zuerst gepr&uuml;ft, ob die beiden Kombinationsfelder <b>cboHoehe <\/b>und <b>cboBreite <\/b>gegebenenfalls bereits Werte enthalten, die auch f&uuml;r die neue mit <b>cboMaterialID <\/b>ausgew&auml;hlte Materialsorte vorhanden sind. Falls ja, wollte ich lediglich den Eintrag in den zugrunde liegenden Feldern <b>Hoehe <\/b>und <b>Breite <\/b>auf die entsprechenden Beitr&auml;ge f&uuml;r die neue Materialsorte verschieben. Falls nicht, sollten die beiden Kombinationsfelder (oder auch nur eines davon) einfach geleert werden, damit der Benutzer hier die neue H&ouml;he und die neue Breite ausw&auml;hlen kann.<\/p>\n<p>Allerdings stellte es sich als unm&ouml;glich heraus, den Wert eines der Kombinationsfelder in dieser Konstellation auf den Wert <b>Null <\/b>einzustellen oder einen anderen Wert, der einem leeren Kombinationsfeld entspricht. Normalerweise ist das aber m&ouml;glich.<\/p>\n<p>Warum gelingt es aber in diesem Fall nicht Bei Experimenten hiermit stellt sich als Erstes heraus, dass es wohl an der Abfrage <b>qryMaterialpreiseHoeheBreite <\/b>als Datenherkunft f&uuml;r das Formular liegt, die ja die Tabelle <b>tblMaterialpreise <\/b>mit den beiden jeweils &uuml;ber zwei Beziehungen mit der Haupttabellen verkn&uuml;pften Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>liegt.<\/p>\n<p>Interessant ist vor allem die resultierende Fehlermeldung (siehe Bild 23). Interessanterweise funktioniert das Zuweisen des Wertes <b>Null <\/b>an Kombinationsfelder, die an ein Feld einer herk&ouml;mmlichen Tabelle gebunden sind, ohne diese Fehlermeldung, und auch hier wird ja kein Variant-Datentyp verwendet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_023.png\" alt=\"Fehlermeldung beim Versuch, eines der Nachschlagefelder der Abfrage qryMaterialpreiseHoehenBreiten zu leeren   \" width=\"424,7115\" height=\"177,3067\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 23: Fehlermeldung beim Versuch, eines der Nachschlagefelder der Abfrage qryMaterialpreiseHoehenBreiten zu leeren   <\/span><\/b><\/p>\n<p>An der doppelten Beziehung zwischen den Feldern <b>Hoehe<\/b>\/<b>Breite <\/b>und <b>MaterialID <\/b>der Tabellen liegt es nicht &#8211; die haben wir testweise entfernt. Wenn wir die beiden Tabellen <b>tblHoehen <\/b>und <b>tblBreiten <\/b>aus der Abfrage <b>qryMaterialpreiseHoehenBreiten <\/b>entfernen, gelingt das Leeren der Kombinationsfelder hingegen.<\/p>\n<p>Es w&auml;re also zu pr&uuml;fen, ob das Formular auch noch funktioniert, wenn wir die Tabelle <b>tblMaterialpreise <\/b>als Datenherkunft verwenden und die Einschr&auml;nkungen f&uuml;r die Datensatzherk&uuml;nfte der beiden Kombinationsfelder <b>cboHoehen <\/b>und <b>cboBreiten <\/b>jeweils per Code herstellen, statt diese von vornherein fest zu definieren.<\/p>\n<p>Ein erster Test ergibt, dass dies funktioniert. Damit funktioniert dann auch die zu Beginn geplante Vorgehensweise, die in der Prozedur aus Listing 1 resultiert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboMaterialID_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intResult<span style=\"color:blue;\"> As <\/span>VbMsgBoxResult\r\n     <span style=\"color:blue;\">Dim <\/span>lngHoeheAlt<span style=\"color:blue;\"> As Long<\/span>, lngBreiteAlt<span style=\"color:blue;\"> As Long<\/span>, lngHoeheNeu<span style=\"color:blue;\"> As Long<\/span>, lngBreiteNeu<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMaterialIDNeu<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMaterialIDAlt<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolAendern<span style=\"color:blue;\"> As Boolean<\/span>\r\n     lngMaterialIDNeu = Nz(Me!cboMaterialID)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngMaterialIDNeu = Me!cboMaterialID.OldValue<span style=\"color:blue;\"> Then<\/span>\r\n         lngMaterialIDAlt = Me!cboMaterialID.OldValue\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboHoehe)<span style=\"color:blue;\"> Then<\/span>\r\n             lngHoeheAlt = Me!cboHoehe\r\n             lngHoeheNeu = Nz(DLookup(\"Hoehe\", \"tblHoehen\", \"Hoehe = \" & lngHoeheAlt & \" AND MaterialID = \" _\r\n                 & lngMaterialIDNeu), 0)\r\n             <span style=\"color:blue;\">If <\/span>lngHoeheNeu = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 bolAendern = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboBreite)<span style=\"color:blue;\"> Then<\/span>\r\n             lngBreiteAlt = Me!cboBreite\r\n             lngBreiteNeu = Nz(DLookup(\"Breite\", \"tblBreiten\", \"Breite = \" & lngBreiteAlt & \" AND MaterialID = \" _\r\n                 & lngMaterialIDNeu), 0)\r\n             <span style=\"color:blue;\">If <\/span>lngBreiteNeu<span style=\"color:blue;\"> Then<\/span>\r\n                 bolAendern = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolAendern = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             intResult = <span style=\"color:blue;\">MsgBox<\/span>(\"Mindestens eines der Felder H&ouml;he oder Breite m&uuml;ssen neu eingegeben werden. _\r\n                 Fortsetzen\", vbYesNo)\r\n             <span style=\"color:blue;\">If <\/span>intResult = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n                 NachschlagefelderAktualisieren\r\n                 <span style=\"color:blue;\">If <\/span>lngHoeheNeu &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     Me!cboHoehe = lngHoeheNeu\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     Me!cboHoehe = Null\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>lngBreiteNeu &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     Me!cboBreite = lngBreiteNeu\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     Me!cboBreite = Null\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 Me!cboMaterialID.Undo\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Pr&uuml;fen der Inhalte von H&ouml;he und Breite nach Auswahl eines neuen Materials<\/span><\/b><\/p>\n<h2>Prozedur zum Aktualisieren der H&ouml;he und der Breite bei Neuauswahl des Materials<\/h2>\n<p>Die Prozedur ermittelt zun&auml;chst den neuen Prim&auml;rschl&uuml;sselwert f&uuml;r das Material und speichert es in <b>lngMaterialIDNeu<\/b>. Dann vergleicht sie diesen mit dem zuvor ausgew&auml;hlten Wert aus der Eigenschaft <b>OldValue <\/b>des Kombinationsfeldes.<\/p>\n<p>War dieser vorher <b>Null<\/b>, liefert der Vergleichsausdruck <b>Not lngMaterialIDNeu = Me!cboMaterialID.OldValue <\/b>den Wert <b>Null<\/b>, was ungleich <b>True <\/b>ist und dementsprechend zum Verlassen der <b>If&#8230;Then<\/b>-Bedingung f&uuml;hrt. Das ist sinnvoll, denn in diesem Fall muss der Benutzer H&ouml;he und Breite ohnehin noch angeben.<\/p>\n<p>Hat der Benutzer hingegen tats&auml;chlich die vorhandene Auswahl ge&auml;ndert, wird der Inhalt der <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt. Hier tr&auml;gt die Prozedur den Wert aus <b>OldValue <\/b>in <b>lngMaterialIDAlt <\/b>ein. Hat der Benutzer bereits einen Wert f&uuml;r <b>cboHoehe <\/b>ausgew&auml;hlt, wird dieser Wert in <b>lngHoeheAlt <\/b>gespeichert. Die Prozedur sucht dann per <b>DLookup <\/b>in der Tabelle <b>tblHoehen <\/b>nach einem Datensatz, dessen Wert im Feld <b>Hoehe <\/b>mit dem Wert aus <b>lngHoeheAlt <\/b>und dessen Wert im Feld <b>MaterialID <\/b>mit dem Wert aus <b>lngMaterialIDNeu <\/b>&uuml;bereinstimmt.<\/p>\n<p>Falls ja, wird der Wert <b>Hoehe <\/b>aus diesem Datensatz in <b>lngHoeheNeu <\/b>eingetragen. &uuml;bersetzt pr&uuml;ft dies, ob es f&uuml;r das neu gew&auml;hlte Material bereits die zuvor ausgew&auml;hlte H&ouml;he gibt. Ist <b>lngHoeheNeu <\/b>danach <b>0<\/b>, kann dieser Wert nicht automatisch eingestellt werden und die Variable <b>bolAendern <\/b>wird auf den Wert <b>True <\/b>eingestellt.<\/p>\n<p>Die gleiche Operation f&uuml;hren wir auch noch f&uuml;r das Kombinationsfeld <b>cboBreite <\/b>durch. Auch hier wird gegebenenfalls der Wert der Variablen <b>bolAendern <\/b>auf <b>True <\/b>eingestellt, sodass diese immer den Wert <b>True <\/b>enth&auml;lt, auch wenn nur eines der beiden Kombinationsfelder nicht automatisch mit einem neuen Wert gef&uuml;llt werden kann.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft dann auch, ob <b>bolAendern <\/b>den Wert <b>True <\/b>aufweist. In diesem Fall zeigt die Prozedur eine Meldung an, die den Benutzer fragt, ob er das Material &auml;ndern will, obwohl er dadurch die H&ouml;he und\/oder die Breite neu festlegen muss. Das Ergebnis speichert die Variable <b>intResult<\/b>.<\/p>\n<p>Hat diese anschlie&szlig;end den Wert <b>vbYes<\/b>, ruft dies die Prozedur <b>NachschlagefelderAktualisieren <\/b>auf, was die Datensatzherk&uuml;nfte der beiden Kombinationsfelder <b>cboHoehe <\/b>und <b>cboBreite <\/b>auf das neue Material aktualisiert. ist <b>lngHoeheNeu<\/b> gr&ouml;&szlig;er als <b>0<\/b>, also gibt es die zuvor ausgew&auml;hlte H&ouml;he auch f&uuml;r das neue Material, wird diese in <b>cboHoehe <\/b>eingestellt. Falls nicht, wird das Kombinationsfeld mit dem Wert <b>Null <\/b>gef&uuml;llt und somit geleert.<\/p>\n<p>Gleiches geschieht f&uuml;r das Kombinationsfeld <b>cboBreite<\/b>. Hat der Benutzer im Meldungsfenster die Schaltfl&auml;che Nein angeklickt, wird die &auml;nderung im Kombinationsfeld <b>cboMaterialID <\/b>mit der <b>Undo<\/b>-Methode r&uuml;ckg&auml;ngig gemacht.<\/p>\n<h2>Meldung bei fehlender H&ouml;he oder Breite anpassen<\/h2>\n<p>Eine Meldung wollen wir noch durch eine benutzerdefinierte Meldung ersetzen: Wenn Sie einen neuen Datensatz anlegen, ein Material ausw&auml;hlen und den Datensatz dann verlassen wollen, ohne eine Breite oder H&ouml;he auszuw&auml;hlen, erscheint die Meldung aus Bild 24. Dies k&ouml;nnen Sie noch durch Hinzuf&uuml;gen des folgenden <b>Case<\/b>-Zweiges in der <b>Select Case<\/b>-Bedingung erledigen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1175_024.png\" alt=\"Meldung beim Verlassen des Datensatzes, wenn noch keine Breite festgelegt wurde\" width=\"700\" height=\"92,10529\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 24: Meldung beim Verlassen des Datensatzes, wenn noch keine Breite festgelegt wurde<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Case <\/span>3201\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!cboHoehe)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie die H&ouml;he aus.\"\r\n         Me!cboHoehe.SetFocus\r\n         Me!cboHoehe.Dropdown\r\n         Response = acDataErrContinue\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!cboBreite)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie die Breite aus.\"\r\n         Me!cboBreite.SetFocus\r\n         Me!cboBreite.Dropdown\r\n         Response = acDataErrContinue\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsNull(Me!cboMaterialID)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte w&auml;hlen Sie ein Material aus.\"\r\n         Me!cboMaterialID.SetFocus\r\n         Me!cboMaterialID.Dropdown\r\n         Response = acDataErrContinue\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Dadurch erscheint die entsprechende Meldung und das passende Kombinationsfeld wird aufgeklappt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die Konstellation mit der doppelten Beziehung ist interessant und wie sich w&auml;hrend der Entwicklung der Darstellung in einem Formular in der Datenblattansicht zeigte, nicht an allen Stellen unproblematisch. Letztlich konnten wir aber alle Klippen umschiffen und haben an diesem Beispiel eine interessante M&ouml;glichkeit gezeigt, die den Einsatz von zwei Beziehungen zwischen zwei Tabellen demonstriert. <\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>HTMLKreuztabelleBearbeitenVerschiedeneMaterialien.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/7F3E7D85-18E3-4CF7-8C27-D0EC9926C8BB\/aiu_1175.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalerweise verwenden Sie 1:n-Beziehungen, um die Datens&auml;tze zweier Tabellen zu verkn&uuml;pfen und so Kombinationen aus diesen Datens&auml;tzen zu erm&ouml;glichen. Oder Sie nutzen die Beziehung f&uuml;r die Verkn&uuml;pfung mit einer Lookup-Tabelle, welche die Werte f&uuml;r ein Feld liefert. Es geht aber noch anders: Wir w&auml;re es, wenn Sie etwa f&uuml;r ein Feld, dass nur bestimmte Zahlenwerte annehmen k&ouml;nnen soll, auch eine per 1:n-Beziehung verkn&uuml;pfte Tabelle hinterlegen Dieser Beitrag zeigt, welchen praktischen Zweck dies hat und wie Sie dies umsetzen.<\/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":[66012019,662019,44000023],"tags":[],"class_list":["post-55001175","post","type-post","status-publish","format-standard","hentry","category-66012019","category-662019","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>1:n-Beziehung als Restriktion f&uuml;r Feldwerte - 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\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"1:n-Beziehung als Restriktion f&uuml;r Feldwerte\" \/>\n<meta property=\"og:description\" content=\"Normalerweise verwenden Sie 1:n-Beziehungen, um die Datens&auml;tze zweier Tabellen zu verkn&uuml;pfen und so Kombinationen aus diesen Datens&auml;tzen zu erm&ouml;glichen. Oder Sie nutzen die Beziehung f&uuml;r die Verkn&uuml;pfung mit einer Lookup-Tabelle, welche die Werte f&uuml;r ein Feld liefert. Es geht aber noch anders: Wir w&auml;re es, wenn Sie etwa f&uuml;r ein Feld, dass nur bestimmte Zahlenwerte annehmen k&ouml;nnen soll, auch eine per 1:n-Beziehung verkn&uuml;pfte Tabelle hinterlegen Dieser Beitrag zeigt, welchen praktischen Zweck dies hat und wie Sie dies umsetzen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:05:47+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc\" \/>\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=\"25\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"1:n-Beziehung als Restriktion f&uuml;r Feldwerte\",\"datePublished\":\"2020-05-13T21:05:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/\"},\"wordCount\":4388,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/60a977bb505841bbb2551ff163b1dbfc\",\"articleSection\":[\"1\\\/2019\",\"2019\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/\",\"name\":\"1:n-Beziehung als Restriktion f&uuml;r Feldwerte - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/60a977bb505841bbb2551ff163b1dbfc\",\"datePublished\":\"2020-05-13T21:05:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/60a977bb505841bbb2551ff163b1dbfc\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/60a977bb505841bbb2551ff163b1dbfc\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/1nBeziehung_als_Restriktion_fuer_Feldwerte\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"1:n-Beziehung als Restriktion f&uuml;r Feldwerte\"}]},{\"@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":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte - 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\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/","og_locale":"de_DE","og_type":"article","og_title":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte","og_description":"Normalerweise verwenden Sie 1:n-Beziehungen, um die Datens&auml;tze zweier Tabellen zu verkn&uuml;pfen und so Kombinationen aus diesen Datens&auml;tzen zu erm&ouml;glichen. Oder Sie nutzen die Beziehung f&uuml;r die Verkn&uuml;pfung mit einer Lookup-Tabelle, welche die Werte f&uuml;r ein Feld liefert. Es geht aber noch anders: Wir w&auml;re es, wenn Sie etwa f&uuml;r ein Feld, dass nur bestimmte Zahlenwerte annehmen k&ouml;nnen soll, auch eine per 1:n-Beziehung verkn&uuml;pfte Tabelle hinterlegen Dieser Beitrag zeigt, welchen praktischen Zweck dies hat und wie Sie dies umsetzen.","og_url":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:05:47+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"25\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte","datePublished":"2020-05-13T21:05:47+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/"},"wordCount":4388,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc","articleSection":["1\/2019","2019","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/","url":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/","name":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc","datePublished":"2020-05-13T21:05:47+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/60a977bb505841bbb2551ff163b1dbfc"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/1nBeziehung_als_Restriktion_fuer_Feldwerte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"1:n-Beziehung als Restriktion f&uuml;r Feldwerte"}]},{"@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\/55001175","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=55001175"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001175\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}