{"id":55001214,"date":"2019-12-01T00:00:00","date_gmt":"2020-07-10T09:50:10","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1214"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Flexible_Adressen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/","title":{"rendered":"Flexible Adressen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das Thema Adressverwaltung kann man auf viele verschiedene Arten l&ouml;sen. In vielen F&auml;llen reicht eine einfache Tabelle, die eine Adresse speichert. Reden wir &uuml;ber Adressen in einer Kundenverwaltung, kann es auch vorkommen, dass der Kunde unterschiedliche Adressen f&uuml;r Lieferungen und Rechnungen angeben m&ouml;chte. Solche Daten speichert man entweder in einer einzigen Tabelle je Kunde oder man tr&auml;gt die Liefer- und Rechnungsadresse in eigene Tabellen ein, die man dann per 1:1-Beziehung mit dem Kundendatensatz verkn&uuml;pft. Wir gehen noch einen Schritt weiter und wollen mit der hier vorgestellten L&ouml;sung die M&ouml;glichkeit bieten, nicht nur zwei, sondern beliebig viele Adressen je Kunde anzulegen &#8211; die dann flexibel als Rechnung- oder Lieferadresse festgelegt werden k&ouml;nnen.<\/b><\/p>\n<p>Eigentlich ist es kein Problem, die Adressdaten eines Kunden oder einer Person in einem Datensatz einer Tabelle zu speichern. Sie legen dann Felder f&uuml;r ein oder zwei Adressen an, hier Liefer- und Rechnungsadresse, und speichern den Datensatz. Aus dieser Tabelle k&ouml;nnen Sie dann ganz einfach die Lieferadresse und die Rechnungsadresse entnehmen.<\/p>\n<p><b>Nachteile herk&ouml;mmlicher Kundentabellen<\/b><\/p>\n<p>Aber was, wenn der Kunde vor&uuml;bergehend unter einer anderen Lieferadresse erreichbar ist Oder wenn er eine Rechnung zwischenzeitlich an seinen Arbeitgeber schicken lassen will, statt zu sich nach Hause<\/p>\n<p>Dann m&uuml;ssen Sie entweder zur klassischen Methode greifen und die Rechnung oder das Paket von Hand beschriften oder Sie &auml;ndern die Rechnungs- oder Lieferadresse vor&uuml;bergehend, um diese anschlie&szlig;end wieder in den alten Zustand zu versetzen. Aber wie stellen Sie sicher, dass Sie dann nicht vergessen, die vor&uuml;bergehende Adresse wieder herauszul&ouml;schen Und wo speichern Sie in der Zwischenzeit die &uuml;blicherweise zu verwendende Adresse<\/p>\n<p>Solche Fragen stellen sich auch, wenn Sie mit der hier vorgestellten L&ouml;sung arbeiten, aber sie macht das Leben deutlich einfacher.<\/p>\n<p><b>Datenmodell f&uuml;r flexible Adressen<\/b><\/p>\n<p>Im Datenmodell f&uuml;r unsere L&ouml;sung finden wir zun&auml;chst die &uuml;bliche Tabelle etwa namens <b>tblKunden<\/b>. Diese enth&auml;lt einige Basisdaten wie etwa die Anrede, den Vor- und den Nachnamen des Kunden sowie das Geburtsdatum. Wir haben beispielsweise auch noch die E-Mail-Adresse und die Telefonnummer des Kunden erfasst. Sie k&ouml;nnen nach Bedarf noch weitere organisatorische Daten erfassen, wie etwa das Datum, an dem der Kundendatensatz erstellt wurde.<\/p>\n<p>Diese Tabelle sieht vorerst wie in Bild 1 aus. Das Feld <b>AnredeID <\/b>ist ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblAnreden<\/b>, welche wir hier nicht abbilden. Diese Tabelle besteht lediglich aus den Feldern <b>ID <\/b>und <b>Anrede<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_001.png\" alt=\"Entwurf der Tabelle tblKunden\" width=\"649,559\" height=\"461,0708\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf der Tabelle tblKunden<\/span><\/b><\/p>\n<p>Die neue Tabelle zum Speichern von Liefer- und Rechnungsadressen hei&szlig;t schlicht <b>tblAdressen<\/b>. Sie sieht im Entwurf wie in Bild 2 aus. Sie enth&auml;lt nochmals die Felder <b>AnredeID<\/b>, <b>Vorname <\/b>und <b>Nachname<\/b> &#8211; das deshalb, weil ja auch einmal eine ganz andere Person eine Lieferung oder eine Rechnung erhalten k&ouml;nnen soll. Au&szlig;erdem finden Sie hier die &uuml;blichen Felder zum Erfassen einer Adresse wie <b>Firma<\/b>, <b>Strasse<\/b>, <b>PLZ<\/b>, <b>Ort <\/b>und <b>Land<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_002.png\" alt=\"Entwurf der Tabelle tblAdresse\" width=\"549,6265\" height=\"498,8361\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblAdresse<\/span><\/b><\/p>\n<p>Interessant wird es beim Feld <b>KundeID<\/b>. Dabei handelt es sich um ein Fremdschl&uuml;sselfeld, mit dem Sie einen der Datens&auml;tze der Tabelle <b>tblKunden <\/b>ausw&auml;hlen k&ouml;nnen. Wir haben es als Nachschlagefeld ausgelegt.<\/p>\n<p>Au&szlig;erdem finden Sie hier das Feld <b>Bezeichnung<\/b>. Damit soll der Benutzer eine individuelle Bezeichnung f&uuml;r die Adresse angeben k&ouml;nnen, damit er diese sp&auml;ter leicht identifizieren kann. Es handelt sich jedoch um kein Pflichtfeld.<\/p>\n<p><b>Von der Adresse zum Kunden zur Adresse<\/b><\/p>\n<p>Nun k&ouml;nnen wir zwar bereits f&uuml;r eine Adresse festlegen, zu welchem Kunden diese geh&ouml;rt, und auf diese Weise einem Kunden keine, eine oder auch mehrere Adressen zuweisen. Aber woher wissen wir, welche Adresse die Lieferadresse des Kunden ist und welche die Rechnungsadresse<\/p>\n<p>Dazu m&uuml;ssen wir der Tabelle <b>tblKunden <\/b>noch weitere Felder hinzuf&uuml;gen, was wir wie in Bild 3 erledigen. Das erste Feld hei&szlig;t <b>LieferadresseID <\/b>und ist ein Fremdschl&uuml;sselfeld zur Auswahl eines der Datens&auml;tze der Tabelle <b>tblAdressen<\/b>. Das zweite Feld namens <b>RechnungsadresseID <\/b>dient der Auswahl der f&uuml;r den Rechnungsversand zu verwendenden Adresse.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_003.png\" alt=\"Entwurf der Tabelle tblAdresse mit Feldern zur Auswahl von Rechnungs- und Lieferadresse\" width=\"649,559\" height=\"233,4216\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle tblAdresse mit Feldern zur Auswahl von Rechnungs- und Lieferadresse<\/span><\/b><\/p>\n<p><b>Beziehungen zwischen den Tabellen<\/b><\/p>\n<p>Wir haben nun verschiedene Beziehungen festgelegt, welche die Tabellen <b>tblKunden <\/b>und <b>tblAdressen <\/b>in beide Richtungen miteinander verkn&uuml;pfen. Die Tabelle <b>tblAdressen <\/b>wird &uuml;ber das Fremdschl&uuml;sselfeld <b>Kunde-ID <\/b>mit je einem Datensatz der Tabelle <b>tblKunden <\/b>verkn&uuml;pft. Die Tabelle <b>tblKunden <\/b>wiederum wird &uuml;ber kein, eines oder zwei der Felder <b>LieferadresseID <\/b>und <b>Rechnungsadresse-ID <\/b>mit der Tabelle <b>tblAdressen <\/b>verkn&uuml;pft (siehe Bild 4). Um die Beziehungen zwischen den ID-Feldern der Tabelle <b>tblAdressen <\/b>und den beiden Fremdschl&uuml;sselfeldern <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>im Beziehungen-Fenster abzubilden, haben wir die Tabelle <b>tblAdressen <\/b>unter dem Namen <b>tblAdressen_1 <\/b>ein zweites Mal hinzugef&uuml;gt. Die Beziehung zwischen dem Feld <b>KundeID <\/b>der hier unter <b>tblAdressen_1 <\/b>abgebildeten Tabelle und der Tabelle <b>tblKunden <\/b>l&auml;sst sich aus technischen Gr&uuml;nden nicht abbilden, sie ist aber wie f&uuml;r die Tabelle <b>tblAdressen <\/b>dargestellt vorhanden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_004.png\" alt=\"Beziehungen zwischen den Tabellen\" width=\"649,559\" height=\"586,8355\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Beziehungen zwischen den Tabellen<\/span><\/b><\/p>\n<p><b>Reihenfolge beim Anlegen der Daten<\/b><\/p>\n<p>Wenn Sie einen Datensatz in die Tabelle <b>tblAdressen <\/b>eingeben, m&uuml;ssen Sie auch gleich &uuml;ber das Feld <b>KundeID <\/b>festlegen, zu welchem Kunden die Adresse geh&ouml;rt. Daher muss zu diesem Zeitpunkt bereits ein Kundendatensatz vorhanden sein. Die Reihenfolge lautet also: Erst Kundendatensatz anlegen, dann die Adressdatens&auml;tze. Um sicherzustellen, dass kein Adressdatensatz gespeichert werden kann, ohne dass ein Kundendatensatz referenziert wurde, stellen wir die Eigenschaft <b>Eingabe erforderlich <\/b>f&uuml;r das Feld <b>KundeID <\/b>der Tabelle <b>tblAdressen <\/b>auf <b>Ja <\/b>ein. Dies sollten Sie erledigen, bevor Sie Daten in die Tabelle <b>tblAdressen <\/b>eingegeben haben, deren Fremdschl&uuml;sselfeld <b>KundeID <\/b>noch leer ist. Datens&auml;tze in der Tabelle <b>tblAdressen <\/b>ohne referenzierten Kundendatensatz sind ein Problem, denn sie befinden sich quasi im luftleeren Raum &#8211; sie sind keinem Kunden zugeordnet und so nicht zu gebrauchen.<\/p>\n<p><b>L&ouml;schweitergabe bei den Verkn&uuml;pfungen<\/b><\/p>\n<p>Wenn wir mit Verkn&uuml;pfungen arbeiten, m&uuml;ssen wir uns auch ansehen, welche Regeln wir f&uuml;r das L&ouml;schen von Daten festlegen. Das ist einfach: Wenn ein Kundendatensatz aus der Tabelle <b>tblKunden <\/b>gel&ouml;scht wird, sollen nat&uuml;rlich auch die mit diesem Kunden verkn&uuml;pften Adressdatens&auml;tze aus der Tabelle <b>tblAdressen <\/b>gel&ouml;scht werden. Die Frage ist nur: &Uuml;ber welche Beziehung k&ouml;nnen wir das festlegen Die korrekte Antwort ist: &Uuml;ber die Beziehung der Felder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>der Tabelle <b>tblKunden <\/b>zum Feld <b>ID <\/b>der Tabelle <b>tblAdressen<\/b>.<\/p>\n<p>Im Fenster <b>Beziehungen bearbeiten <\/b>f&uuml;r diese Beziehung stellen wir die Eigenschaft <b>L&ouml;schweitergabe an verwandte Datens&auml;tze <\/b>zus&auml;tzlich zu <b>Mit referentieller Integrit&auml;t <\/b>ein (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_005.png\" alt=\"Beziehung zwischen den Tabellen tblKunden und tblAdressen\" width=\"424,7115\" height=\"263,8209\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Beziehung zwischen den Tabellen tblKunden und tblAdressen<\/span><\/b><\/p>\n<p>Damit werden nun beim L&ouml;schen eines Kunden aus der Tabelle <b>tblKunden <\/b>gleichzeitig alle mit diesem Kundendatensatz verkn&uuml;pften Adressen gel&ouml;scht.<\/p>\n<p><b>Auswahl der Rechnungs- und Lieferadresse<\/b><\/p>\n<p>Wenn wir nun einige Datens&auml;tze zur Tabelle <b>tblKunden <\/b>hinzugef&uuml;gt haben und in der Tabelle <b>tblAdressen <\/b>Adressen angelegt haben, die mit den Eintr&auml;gen der Tabelle <b>tblKunden <\/b>verkn&uuml;pft sind, k&ouml;nnen wir f&uuml;r die beiden Fremdschl&uuml;sselfelder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>die passenden Eintr&auml;ge aus der Tabelle <b>tblAdressen <\/b>ausw&auml;hlen.<\/p>\n<p>Sobald wir zum Beispiel das Nachschlagefeld <b>LieferadresseID <\/b>der Tabelle <b>tblKunden <\/b>aufklappen, finden wir dort nicht nur die Eintr&auml;ge der Tabelle <b>tblAdressen <\/b>vor, die wir dem aktuellen Kunden &uuml;ber das Feld <b>KundeID <\/b>zugewiesen haben, sondern alle Adressen. Wir m&uuml;ssten hier also noch einen Filter einbauen, der nur die zu diesem Kunden passenden Adressen liefert.<\/p>\n<p>Das ist nun allerdings keine Aufgabe mehr, die wir im Datenmodell erledigen k&ouml;nnen &#8211; dazu ben&ouml;tigen wir entsprechende Formulare.<\/p>\n<p><b>Formulare zur Eingabe von Kunden und Adressen<\/b><\/p>\n<p>Wir starten mit einem einfachen Formular namens <b>frmKunden<\/b>, das &uuml;ber die Eigenschaft <b>Datensatzquelle<\/b> an die Tabelle <b>tblKunden <\/b>gebunden ist.<\/p>\n<p>Au&szlig;erdem ziehen wir alle Felder dieser Tabelle &uuml;ber die Feldliste in den Entwurf des Formulars und ordnen die Felder wie in Bild 6 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_006.png\" alt=\"Das Formular sfmKundenAdressen in der Entwurfsansicht\" width=\"424,7115\" height=\"457,1895\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Formular sfmKundenAdressen in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Damit haben wir zwar nun die M&ouml;glichkeit, &uuml;ber die beiden Kombinationsfelder, die an die Felder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>gebunden sind, aus allen vorhandenen Adressen auszuw&auml;hlen.<\/p>\n<p>Aber genau das wollten wir ja verhindern und die dort zur Auswahl angebotenen Datens&auml;tze auf die zum Kunden geh&ouml;renden Adressen reduzieren.<\/p>\n<p>Dazu passen wir nun die Datensatzherkunft der beiden Kombinationsfelder an, die wir &uuml;brigens vorher in <b>cboLieferadresseID <\/b>und <b>cboRechnungsadresseID <\/b>umbenennen.<\/p>\n<p>Dann f&uuml;gen wir dem ersten der beiden Kombinationsfelder eine Abfrage hinzu, die wir mit dem Abfrage-Generator wie in Bild 7 zusammenstellen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_007.png\" alt=\"Datensatzherkunft f&uuml;r die Kombinationsfelder zur Auswahl der Liefer- und Rechnungsadresse\" width=\"649,559\" height=\"387,3146\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Datensatzherkunft f&uuml;r die Kombinationsfelder zur Auswahl der Liefer- und Rechnungsadresse<\/span><\/b><\/p>\n<p>Wir f&uuml;gen der Abfrage zun&auml;chst das Prim&auml;rschl&uuml;sselfeld der Tabelle hinzu. In der zweiten Spalte legen wir ein Feld namens <b>Adresse <\/b>an, das folgenden Ausdruck, bestehend aus verschiedenen Feldern der Tabelle, liefern soll. Aber nur, wenn das Feld <b>Bezeichnung<\/b>, das der Benutzer f&uuml;r jede Adresse vergeben kann, leer ist:<\/p>\n<pre>Adresse: Nz([Bezeichnung];[Nachname] & \", \" & [Vorname] & \" (\"+[Firma]+\")\")<\/pre>\n<p>Wir stellen hier einen Ausdruck zusammen, der zun&auml;chst pr&uuml;ft, ob das Feld <b>Bezeichnung <\/b>einen Wert enth&auml;lt. Falls ja, liefert der Ausdruck diesen Wert zur&uuml;ck. Anderenfalls ist das Ergebnis ein Ausdruck mit dem Format <b><Nachname>, <Vorname> (<Firma>)<\/b>. F&uuml;r den Fall, dass das Feld <b>Firma <\/b>einmal keinen Wert enth&auml;lt, haben wir die &ouml;ffnende und schlie&szlig;ende Klammer und das Feld <b>Firma <\/b>mit dem Plus-Operator (<b>+<\/b>) statt mit dem Kaufmanns-Und (<b>&#038;<\/b>) verkn&uuml;pft. Bei Verwendung des Plus-Operators werden alle verkn&uuml;pften Elemente zu <b>Null<\/b>, wenn nur eines der Elemente den Wert <b>Null <\/b>hat. Sprich: Wenn <b>Firma <\/b>leer ist, fallen auch die beiden Klammern weg und es werden nur der Nachname und der Vorname der Adresse ausgegeben.<\/p>\n<p><!--30percent--><\/p>\n<p>Da wir diese Abfrage f&uuml;r beide Kombinationsfelder nutzen k&ouml;nnen, speichern wir sie gleich unter dem Namen <b>qryCboAdressen<\/b>, sodass sie auch im Navigationsbereich angezeigt wird.<\/p>\n<p>Danach stellen wir diese Abfrage auch als Datensatzherkunft des zweiten Kombinationsfeldes ein. Schlie&szlig;lich m&uuml;ssen wir noch die beiden Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>auf die Werte <b>2 <\/b>und <b>0cm <\/b>einstellen, damit nur der aus den Feldern zusammengestellte Ausdruck angezeigt wird, nicht jedoch das Prim&auml;rschl&uuml;sselfeld.<\/p>\n<p>Nun haben wir allerdings immer noch nicht die angezeigten Eintr&auml;ge nach dem aktuell angezeigten Kunden gefiltert. Das erledigen wir, indem wir der Abfrage noch ein Vergleichskriterium f&uuml;r das Feld <b>KundeID <\/b>zuweisen (siehe Bild 8). Dabei beziehen wir uns auf das entsprechende Feld im Formular:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_008.png\" alt=\"Hinzuf&uuml;gen eines Kriteriums, das nur die zum Kunden geh&ouml;renden Adressen liefert\" width=\"649,559\" height=\"192,2963\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Hinzuf&uuml;gen eines Kriteriums, das nur die zum Kunden geh&ouml;renden Adressen liefert<\/span><\/b><\/p>\n<pre>[Forms]![frmKunden]![ID]<\/pre>\n<p>Damit erreichen wir, wenn wir bereits einen Kunden und eine Adresse f&uuml;r diesen Kunden &uuml;ber die Datenblattansicht der Tabellen angelegt haben, zumindest schon einmal die Ansicht aus Bild 9.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_009.png\" alt=\"Auswahl einer Rechnungsadresse\" width=\"499,6607\" height=\"340,9449\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Auswahl einer Rechnungsadresse<\/span><\/b><\/p>\n<p><b>Adressen vollst&auml;ndig anzeigen<\/b><\/p>\n<p>Nun wollen wir dem Benutzer die Adressen nicht nur in Form von <b>Vorname<\/b>, <b>Nachname <\/b>und <b>Firma <\/b>in einem Kombinationsfeld anzeigen, sondern er soll auch die vollst&auml;ndigen Daten direkt auf den ersten Blick sehen. Dazu erstellen wir zun&auml;chst ein Unterformular, das die Daten der Tabelle <b>tblAdressen <\/b>anzeigt. F&uuml;r das Unterformular stellen wir die Tabelle <b>tblAdressen <\/b>als <b>Datensatzquelle <\/b>ein. Au&szlig;erdem ziehen wir alle Felder mit Ausnahme des Fremdschl&uuml;sselfeldes <b>KundeID <\/b>in den Detailbereich des Entwurfs. Die Steuer-elemente positionieren wir so, dass nur wenig Platz zwischen ihnen und den Seitenr&auml;ndern sichtbar ist. Allein der Abstand zum linken Rand sollte dem gleichen Abstand entsprechen, den Sie sonst zwischen Formularrand und Steuer-element lassen. Schlie&szlig;lich stellen wir noch die Eigenschaften <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>ein. Den Wert der Eigenschaft <b>Datensatzmarkierer <\/b>belassen wir bei dem Wert <b>Ja<\/b>, denn daran kann der Benutzer erkennen, ob er bereits &Auml;nderungen an einer Adresse vorgenommen hat (siehe Bild 10). Au&szlig;erdem stellen wir die Eigenschaft <b>Zyklus <\/b>noch auf <b>Aktueller Datensatz <\/b>ein, damit der Benutzer im Unterformular nicht zwischen mehreren Datens&auml;tzen bl&auml;ttern kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_010.png\" alt=\"Das Unterformular zur Anzeige der Adressen in der Entwurfsansicht\" width=\"649,559\" height=\"455,3918\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Das Unterformular zur Anzeige der Adressen in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Danach speichern wir das Formular unter dem Namen <b>sfmKundenAdressen<\/b> und schlie&szlig;en es. &Ouml;ffnen Sie nun wieder das Formular <b>frmKunden <\/b>in der Entwurfsansicht. Ordnen Sie dann die beiden Steuer-elemente <b>cboLieferadresseID <\/b>und <b>cboRechnungsadresseID <\/b>nebeneinander an und ziehen Sie das Unterformular <b>sfmKundenAdressen <\/b>zweimal in den Entwurf des Formulars <b>frmKunden<\/b>.<\/p>\n<p>L&ouml;schen Sie die mit den Unterformular-Steuer-elementen automatisch angelegten Beschriftungsfelder und positionieren Sie die Unterformulare unter den beiden Kombinationsfeldern.<\/p>\n<p>Au&szlig;erdem stellen wir noch die Eigenschaft <b>Rahmen <\/b>der beiden Unterformular-Steuerelemente auf <b>Transparent <\/b>ein (das ist Geschmackssache &#8211; Sie k&ouml;nnen den Rand auch beibehalten).<\/p>\n<p>Schlie&szlig;lich versehen wir die beiden Unterformular-Steuerelemente mit passenden Namen, also etwa <b>sfmLieferadresse <\/b>und <b>sfmRechnungsadresse<\/b>. Danach sollte der Entwurf des Formulars wie in Bild 11 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_011.png\" alt=\"Einf&uuml;gen der Unterformulare zur Anzeige von Liefer- und Rechnungsadressse\" width=\"649,559\" height=\"596,157\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Einf&uuml;gen der Unterformulare zur Anzeige von Liefer- und Rechnungsadressse<\/span><\/b><\/p>\n<p><b>Beziehung zwischen Haupt- und Unterformularen herstellen<\/b><\/p>\n<p>Wenn wir nun in der Entwurfsansicht eines der beiden Unterformular-Steuerelemente markieren (was nicht gleichbedeutend mit dem Markieren des darin enthaltenen Formulars ist!), finden wir im Bereich <b>Daten <\/b>des Eigenschaftenblatts die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>vor.<\/p>\n<p>Access versucht automatisch, hier sinnvolle Werte einzutragen, was in unserem Fall wie &uuml;blich gelaufen ist (siehe Bild 12). Allerdings hat Access f&uuml;r unseren Anwendungsfall etwas &uuml;bertrieben. Das Unterformular <b>sfmLieferadresse <\/b>soll lediglich den Datensatz anzeigen, der im Kombinationsfeld <b>cboLieferadresseID <\/b>ausgew&auml;hlt ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_012.png\" alt=\"Verkn&uuml;pfung von Haupt- und Unterformular\" width=\"499,6607\" height=\"314,9024\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Verkn&uuml;pfung von Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Dazu stellen wir f&uuml;r das Unterformular-Steuerelement <b>sfm-Lieferadresse <\/b>die Eigenschaft <b>Verkn&uuml;pfen von <\/b>auf den Wert <b>ID <\/b>und <b>Verkn&uuml;pfen nach <\/b>auf <b>LieferadresseID <\/b>ein (siehe Bild 13). F&uuml;r das Unterformular <b>sfmRechnungsadresse <\/b>stellen wir die Eigenschaft <b>Verkn&uuml;pfen von <\/b>ebenfalls auf den Wert <b>ID <\/b>und <b>Verkn&uuml;pfen nach <\/b>auf <b>RechnungsadresseID <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_013.png\" alt=\"Optimierte Verkn&uuml;pfung von Haupt- und Unterformular\" width=\"499,6607\" height=\"314,9024\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Optimierte Verkn&uuml;pfung von Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Wenn wir in der Tabelle <b>tblKunden <\/b>einen Datensatz eingef&uuml;gt haben und f&uuml;r diesen je eine Liefer- und eine Rechnungsadresse angelegt haben, k&ouml;nnen wir diese nun in den Kombinationsfeldern des Formulars <b>frmKunden <\/b>ausw&auml;hlen und erhalten die Ansicht aus Bild 14.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_014.png\" alt=\"Auswahl von Liefer- und Rechnungsadresse\" width=\"649,559\" height=\"547,61\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Auswahl von Liefer- und Rechnungsadresse<\/span><\/b><\/p>\n<p><b>Unterformulare nach Auswahl aktualisieren<\/b><\/p>\n<p>Wenn Sie mit dem Formular experimentieren, werden Sie feststellen, dass nach der Auswahl eines anderen Eintrags aus dem Kombinationsfeld kein Wechsel der im Unterformular angezeigten Daten erfolgt. Der Grund ist gar nicht so einfach zu finden: Wir haben weiter oben n&auml;mlich die beiden Unterformular-Steuerelemente &uuml;ber die Werte <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>f&uuml;r die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>mit dem Hauptformular verbunden.<\/p>\n<p>Das reicht auch aus, um die Daten im Unterformular zu aktualisieren, wenn wir das Formular neu &ouml;ffnen oder einen anderen Datensatz ausw&auml;hlen. Wenn wir allerdings nur einen neuen Wert f&uuml;r eines der beiden Kombinationsfelder <b>cboLieferadresseID <\/b>oder <b>cboRechnungsadresseID <\/b>ausw&auml;hlen, tut sich bei dieser Konstellation nichts.<\/p>\n<p>Das &auml;ndert sich, wenn wir statt <b>cboLieferadresseID <\/b>und <b>cboRechnungsadresseID <\/b>einfach die Felder <b>Liefer-adresseID <\/b>und <b>RechnungsadresseID <\/b>f&uuml;r die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>angeben.<\/p>\n<p><b>Kombinationsfelder nach Auswahl aktualisieren<\/b><\/p>\n<p>Sobald wir in einen anderen Datensatz als den beim &Ouml;ffnen angezeigten wechseln, f&uuml;r den es auch schon Adressdatens&auml;tze gibt, sollten wir die zu diesem Kunden geh&ouml;renden Adressen &uuml;ber die Kombinationsfelder ausw&auml;hlen k&ouml;nnen. Das ist allerdings nicht der Fall &#8211; die Kombinationsfelder zeigen immer noch die Adressen des ersten Datensatzes an. Um diese zu aktualisieren, legen wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim Anzeigen <\/b>des Hauptformulars an. Die Ereignisprozedur sorgt immer beim Anzeigen eines Datensatzes daf&uuml;r, dass die Datensatzherkunft der beiden Kombinationsfelder aktualisiert wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cboLieferadresseID.Requery\r\n     Me!cboRechnungsadresseID.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Neue Adressen anlegen<\/b><\/p>\n<p>Wir k&ouml;nnen zwar neue Kunden &uuml;ber das Hauptformular anlegen, aber was ist mit neuen Adressen f&uuml;r den jeweiligen Kunden Normalerweise sollte es m&ouml;glich sein, nach der Eingabe der Basisdaten des Kunden im Hauptformular direkt die Liefer- und die Rechnungsadresse des Kunden in den Unterformularen einzutragen. Das gelingt aber so nicht ohne weiteres. Sp&auml;testens wenn wir versuchen, einen Datensatz im Hauptformular einzutragen und dann in einem der Unterformulare fortzufahren und schlie&szlig;lich den Datensatz im Unterformular speichern wollen, erhalten wir den Fehler aus Bild 15.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_015.png\" alt=\"Fehlermeldung beim Eintragen einer Adresse in das Unterformular\" width=\"499,6607\" height=\"134,2546\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Fehlermeldung beim Eintragen einer Adresse in das Unterformular<\/span><\/b><\/p>\n<p>Das ist logisch, denn das Feld <b>KundeID <\/b>der Tabelle <b>tblAdressen <\/b>im Unterformular wird zu keinem Zeitpunkt gef&uuml;llt &#8211; es wird nicht angezeigt und kann somit nicht vom Kunden gef&uuml;llt werden und es wird auch nicht automatisch &uuml;ber die Verkn&uuml;pfung zum Hauptformular gef&uuml;llt.<\/p>\n<p>Also erweitern wir die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>wie in Bild 16. Danach k&ouml;nnen Sie dann auch direkt eine Lieferadresse und eine Rechnungsadresse in die Unterformulare eintragen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_016.png\" alt=\"Aktualisierung der beiden Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach\" width=\"424,7115\" height=\"281,228\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Aktualisierung der beiden Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach<\/span><\/b><\/p>\n<p>Das gelingt allerdings nur manchmal, denn gelegentlich erscheint bei der Eingabe des ersten Zeichens in eines der Felder einer neuen Adresse im Unterformular auch die Fehlermeldung aus Bild 17. Spannenderweise konnten wir nicht nachvollziehen, unter welchen Bedingungen dieser Fehler auftritt. Jedenfalls ist an dieser Stelle der Zeitpunkt erreicht, die Notbremse zu ziehen: Wir werden zum Anlegen der Adressen ein neues Formular erstellen, das der Benutzer &uuml;ber eine Schaltfl&auml;che zum Anlegen einer neuen Adresse anklicken kann. Die beiden Unterformulare wandeln wir in schreibgesch&uuml;tzte Formulare um &#8211; der Benutzer soll nur noch entweder eine der verf&uuml;gbaren Adressen &uuml;ber eines der beiden Kombinationsfelder ausw&auml;hlen k&ouml;nnen oder eine neue Adresse &uuml;ber das noch zu erstellende Formular anlegen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_017.png\" alt=\"Fehlermeldung beim Versuch, eine Adresse anzulegen\" width=\"649,559\" height=\"148,4995\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Fehlermeldung beim Versuch, eine Adresse anzulegen<\/span><\/b><\/p>\n<p><b>Unterformular schreibsch&uuml;tzen<\/b><\/p>\n<p>Damit der Benutzer nicht mehr direkt in das Unterformular schreiben kann, &auml;ndern wir diese wie folgt:<\/p>\n<ul>\n<li>Stellen Sie die Eigenschaft <b>Aktiviert <\/b>f&uuml;r alle gebundenen Steuer-elemente im Unterformular auf <b>Nein <\/b>und <b>Gesperrt <\/b>auf <b>Ja <\/b>ein. Dadurch wird die Bearbeitung der Inhalte der Steuerelemente gesperrt.<\/li>\n<li>Stellen Sie die Eigenschaft <b>Rahmenart <\/b>f&uuml;r alle gebundenen Steuer-elemente auf <b>Transparent <\/b>ein. So wird auch optisch hervorgehoben, dass es sich nur um Felder zur Anzeige von Daten handelt.<\/li>\n<\/ul>\n<p>Danach sieht das Unterformular bei fehlender Adresse wie in Bild 18 aus. Hier st&ouml;ren nun noch die Schaltfl&auml;che zum Aufklappen des Kombinationsfeldes, welches nun ohnehin gesperrt ist. Au&szlig;erdem ben&ouml;tigen wir auch die Anzeige der <b>ID <\/b>der Adresse nicht. Letztere k&ouml;nnen wir einfach entfernen. Damit die Anrede nur noch in einem Textfeld angezeigt wird, &auml;ndern wir die Datensatzquelle des Unterformulars noch wie folgt und f&uuml;gen so das Feld <b>Anrede <\/b>der Tabelle <b>tblAnreden <\/b>hinzu:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_018.png\" alt=\"Die ID und das die Schaltfl&auml;che des Kombinationsfeldes st&ouml;ren das Bild.\" width=\"349,7625\" height=\"542,568\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Die ID und das die Schaltfl&auml;che des Kombinationsfeldes st&ouml;ren das Bild.<\/span><\/b><\/p>\n<pre>SELECT tblAdressen.ID, tblAdressen.KundeID, tblAdressen.Bezeichnung, tblAdressen.Firma, tblAnreden.Anrede, tblAdressen.Vorname, tblAdressen.Nachname, tblAdressen.Strasse, tblAdressen.PLZ, tblAdressen.Ort, tblAdressen.Land FROM tblAnreden INNER JOIN tblAdressen ON tblAnreden.ID = tblAdressen.AnredeID;<\/pre>\n<p>Danach liefert das Unterformular die Daten in optisch ansprechenderer Form.<\/p>\n<p><b>Formular zum Anlegen neuer Adressen<\/b><\/p>\n<p>Das Formular zum Anlegen von Adressen soll schlicht <b>frmAdressen <\/b>hei&szlig;en. Wir legen die Tabelle <b>tblAdressen <\/b>als Datensatzquelle f&uuml;r dieses Formular fest. Au&szlig;erdem ziehen wir alle Felder dieser Tabelle mit Ausnahme des Feldes <b>KundeID <\/b>in den Entwurf dieses Formulars.<\/p>\n<p>Stellen Sie die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>ein und <b>Automatisch zentrieren <\/b>auf <b>Ja<\/b>.<\/p>\n<p>Au&szlig;erdem f&uuml;gen wir zwei Schaltfl&auml;chen namens <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>hinzu, f&uuml;r die wir die folgenden Prozeduren hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     Me.Undo\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Aufruf des Formulars zum Anlegen von Adressen<\/b><\/p>\n<p>Fehlt noch die Kommunikation zwischen den Formularen, sprich die Schaltfl&auml;che, welche das Formular <b>frmAdressen <\/b>vom Formular <b>frmKunden <\/b>aus ausruft. Beziehungsweise zwei Schaltfl&auml;chen, wenn wir diese direkt f&uuml;r die Liefer- und die Rechnungsadresse anlegen wollen.<\/p>\n<p>Dann m&uuml;sste die Schaltlf&auml;che f&uuml;r die Lieferadresse das Formular <b>frmAdressen <\/b>aufrufen, den Benutzer einen neuen Datensatz anlegen lassen und nach dem Schlie&szlig;en dieses Formulars die neue Adresse gleich als neue Lieferadresse einrichten. Das Gleiche gilt f&uuml;r die Rechnungsadresse.<\/p>\n<p>Dazu statten wir das Formular <b>frmKunden <\/b>zun&auml;chst mit den beiden Schaltfl&auml;chen <b>cmdNeueLieferadresse<\/b> und <b>cmdNeueRechnungsadresse <\/b>aus (siehe Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_020.png\" alt=\"Schaltfl&auml;chen zum Hinzuf&uuml;gen neuer Rechnungs- und Lieferadressen\" width=\"599,593\" height=\"286,8008\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Schaltfl&auml;chen zum Hinzuf&uuml;gen neuer Rechnungs- und Lieferadressen<\/span><\/b><\/p>\n<p>Wenn wir das Formular <b>frmAdressen <\/b>etwa &uuml;ber die Schaltfl&auml;che <b>cmdNeueLieferadresse <\/b>&ouml;ffnen, ben&ouml;tigen wir dazu eine Prozedur wie die folgende. Diese &ouml;ffnet zun&auml;chst das Formular <b>frmAdressen <\/b>mit der <b>DoCmd<\/b>. Die <b>OpenForm<\/b>-Anweisung und legt mit den Parametern fest, dass das Formular als modaler Dialog zum Anlegen eines neuen Datensatzes ge&ouml;ffnet wird. Der letzte Parameter <b>OpenArgs <\/b>&uuml;bergibt die ID des aktuell im Formular <b>frmKunden<\/b> angezeigten Kundendatensatzes, damit wir die neue Adresse direkt im Kontext dieses neuen Kunden anlegen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueLieferadresse_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngAdresseID<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.OpenForm \"frmAdressen\", DataMode:=acFormAdd, _\r\n         WindowMode:=acDialog, OpenArgs:=Me!ID<\/pre>\n<p>Wenn der Benutzer die Daten der neuen Adresse im Formular <b>frmAdressen <\/b>eingegeben hat und das Formular mit der <b>OK<\/b>-Schaltfl&auml;che schlie&szlig;t, wird dieses unsichtbar gemacht und der Code der Prozedur <b>cmdNeueLiefer-adresse_Click <\/b>l&auml;uft weiter. Dann pr&uuml;fen wir mit der Hilfsfunktion <b>IstFormularGeoeffnet<\/b>, ob das Formular noch ge&ouml;ffnet ist, was nur der Fall ist, wenn der Benutzer es mit der <b>OK<\/b>-Schaltfl&auml;che unsichtbar gemacht hat. Dann ermittelt die Prozedur den Wert des Prim&auml;rschl&uuml;sselfeldes <b>ID <\/b>des neu angelegten Datensatzes und speichert diesen in der Variablen <b>lngAdresseID<\/b>. Danach schlie&szlig;t die Prozedur das Formular, damit der dort eingegebene Datensatz auch gespeichert wird. Danach aktualisiert sie das Kombinationsfeld <b>cboLieferadresseID <\/b>mit der <b>Requery<\/b>-Methode. Dadurch listet das Kombinationsfeld nun auch den neuen Eintrag auf. Dieser wird dann als Wert des Kombinationsfeldes eingestellt und der neue Datensatz mit der <b>Re-query<\/b>-Methode im Unterformular eingeblendet:<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmAdressen\")<span style=\"color:blue;\"> Then<\/span>\r\n         lngAdresseID = Forms!frmAdressen!ID\r\n         DoCmd.Close acForm, \"frmAdressen\"\r\n         Me!cboLieferadresseID.Requery\r\n         Me!cboLieferadresseID = lngAdresseID\r\n         Me!sfmLieferadresse.Form.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit der Plan aufgeht, m&uuml;ssen wir nun noch im aufgerufenen Formular, also <b>frmAdressen<\/b>, beim &Ouml;ffnen die &uuml;bergebene <b>ID <\/b>des Kunden ermitteln und f&uuml;r das Feld <b>KundeID <\/b>einstellen. Wenn Sie sichergehen wollen, dass dieses auch &uuml;bergeben und festgelegt wird, k&ouml;nnen Sie das Feld vor&uuml;bergehend noch in den Entwurf des Formulars <b>frmAdressen <\/b>ziehen.<\/p>\n<p>Nach dem Aufruf sieht das Formular dann etwa wie in Bild 20 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_06\/pic_1214_021.png\" alt=\"Anlegen einer neuen Lieferadresse\" width=\"649,559\" height=\"438,8649\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Anlegen einer neuen Lieferadresse<\/span><\/b><\/p>\n<p>Oben rechts sehen Sie, dass der Kunde aus dem aufrufenden Formular f&uuml;r das Feld <b>KundeID <\/b>voreingestellt wurde. Das geschieht durch die folgende Prozedur, die beim Laden des Formulars <b>frmAdressen <\/b>ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!KundeID.DefaultValue  = Me.OpenArgs\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen Sie nun neue Adressen eingeben, die direkt als Lieferanschrift im aufrufenden Formular eingestellt werden.<\/p>\n<p><b>Neue Rechnungsadresse<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdNeueRechnungsadresse <\/b>ruft eine &auml;hnliche Prozedur auf wie <b>cmdNeueLieferadresse<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeueRechnungsadresse_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngAdresseID<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.OpenForm \"frmAdressen\", DataMode:=acFormAdd, _\r\n         WindowMode:=acDialog, OpenArgs:=Me!ID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmAdressen\")<span style=\"color:blue;\"> Then<\/span>\r\n         lngAdresseID = Forms!frmAdressen!ID\r\n         DoCmd.Close acForm, \"frmAdressen\"\r\n         Me!cboRechnungsadresseID.Requery\r\n         Me!cboRechnungsadresseID = lngAdresseID\r\n         Me!sfmRechnungsadresse.Form.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Bearbeiten einer Adresse<\/b><\/p>\n<p>Zum Bearbeiten einer Adresse f&uuml;gen wir dem Formular <b>frmKunden <\/b>noch zwei weitere Schaltfl&auml;chen hinzu &#8211; jeweils neben die beiden <b>Neu<\/b>-Schaltlf&auml;chen &uuml;ber den Kombinationsfeldern. Die beiden Schaltfl&auml;chen hei&szlig;en <b>cmdLieferadresseBearbeiten <\/b>und <b>cmdRechnungsadresseBearbeiten<\/b>.<\/p>\n<p>F&uuml;r die Schaltfl&auml;che <b>cmdLieferadresseBearbeiten <\/b>hinterlegen wir die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLieferadresseBearbeiten_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngAdresseID<span style=\"color:blue;\"> As Long<\/span>\r\n     DoCmd.OpenForm \"frmAdressen\", DataMode:=acFormEdit, _\r\n         WindowMode:=acDialog, WhereCondition:=\"ID = \" _\r\n         & Me!cboLieferadresseID\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmAdressen\")<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.Close acForm, Me.Name\r\n         lngAdresseID = Me!cboLieferadresseID\r\n         Me!cboLieferadresseID.Requery\r\n         Me!cboLieferadresseID = lngAdresseID\r\n         Me!sfmLieferadresse.Form.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ist &auml;hnlich aufgebaut wie die f&uuml;r das Anlegen einer Adresse. Allerdings verwenden wir f&uuml;r den Parameter <b>DataMode <\/b>den Wert <b>acFormEdit<\/b>, und wir &uuml;bergeben auch keinen Wert f&uuml;r den Parameter <b>OpenArgs<\/b>, sondern einen f&uuml;r <b>WhereCondition<\/b>. Dieser erh&auml;lt eine <b>Where<\/b>-Condition, welche daf&uuml;r sorgt, dass beim Anzeigen des Formulars der Datensatz angezeigt wird, dessen Feld <b>ID <\/b>den Wert des Kombinationsfeldes <b>cboLieferadresseID <\/b>enth&auml;lt.<\/p>\n<p>Au&szlig;erdem brauchen wir nach dem Schlie&szlig;en des Formulars nicht erst den <b>ID<\/b>-Wert des neuen Datensatzes auszulesen, da dieser ja bereits vorhanden war. Wir m&uuml;ssen aber dennoch pr&uuml;fen, ob das Formular noch ge&ouml;ffnet ist und der Benutzer somit die <b>OK<\/b>-Schaltfl&auml;che bet&auml;tigt hat, denn nur dann brauchen wir das Kombinationsfeld und den Inhalt des Unterformulars <b>sfmLieferadresse <\/b>zu aktualisieren. Schlie&szlig;lich ist auch noch eine &Auml;nderung im aufgerufenen Formular <b>frmAdressen <\/b>n&ouml;tig. Hier m&uuml;ssen wir in der Prozedur <b>Form_Load <\/b>pr&uuml;fen, ob &uuml;berhaupt ein &Ouml;ffnungsargument &uuml;bergeben wurde. Wenn das wie beim &Ouml;ffnen zum Bearbeiten nicht der Fall ist, soll nat&uuml;rlich auch <b>KundeID <\/b>nicht auf den per &Ouml;ffnungsargument &uuml;bergebenen Wert eingestellt werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Me.OpenArgs)<span style=\"color:blue;\"> Then<\/span>\r\n         Me!KundeID.DefaultValue = Me.OpenArgs\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag zeigt, wie Sie Liefer- und Rechnungs-adressen zu einem Kunden einmal anders verwalten. Man k&ouml;nnte dem Formular zum Verwalten eines Kunden noch die M&ouml;glichkeit zum Verwalten der einzelnen Adressen hinzuf&uuml;gen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FlexibleAdressen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/74AAD776-9BE9-494A-903D-95338E10D71B\/aiu_1214.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Thema Adressverwaltung kann man auf viele verschiedene Arten l&ouml;sen. In vielen F&auml;llen reicht eine einfache Tabelle, die eine Adresse speichert. Reden wir &uuml;ber Adressen in einer Kundenverwaltung, kann es auch vorkommen, dass der Kunde unterschiedliche Adressen f&uuml;r Lieferungen und Rechnungen angeben m&ouml;chte. Solche Daten speichert man entweder in einer einzigen Tabelle je Kunde oder man tr&auml;gt die Liefer- und Rechnungsadresse in eigene Tabellen ein, die man dann per 1:1-Beziehung mit dem Kundendatensatz verkn&uuml;pft. Wir gehen noch einen Schritt weiter und wollen mit der hier vorgestellten L&ouml;sung die M&ouml;glichkeit bieten, nicht nur zwei, sondern beliebig viele Adressen je Kunde anzulegen &#8211; die dann flexibel als Rechnung- oder Lieferadresse festgelegt werden k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662019,66062019,44000027],"tags":[],"class_list":["post-55001214","post","type-post","status-publish","format-standard","hentry","category-662019","category-66062019","category-Loesungen"],"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>Flexible Adressen - 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\/Flexible_Adressen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flexible Adressen\" \/>\n<meta property=\"og:description\" content=\"Das Thema Adressverwaltung kann man auf viele verschiedene Arten l&ouml;sen. In vielen F&auml;llen reicht eine einfache Tabelle, die eine Adresse speichert. Reden wir &uuml;ber Adressen in einer Kundenverwaltung, kann es auch vorkommen, dass der Kunde unterschiedliche Adressen f&uuml;r Lieferungen und Rechnungen angeben m&ouml;chte. Solche Daten speichert man entweder in einer einzigen Tabelle je Kunde oder man tr&auml;gt die Liefer- und Rechnungsadresse in eigene Tabellen ein, die man dann per 1:1-Beziehung mit dem Kundendatensatz verkn&uuml;pft. Wir gehen noch einen Schritt weiter und wollen mit der hier vorgestellten L&ouml;sung die M&ouml;glichkeit bieten, nicht nur zwei, sondern beliebig viele Adressen je Kunde anzulegen - die dann flexibel als Rechnung- oder Lieferadresse festgelegt werden k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:50:10+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Flexible Adressen\",\"datePublished\":\"2020-07-10T09:50:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/\"},\"wordCount\":4128,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/25a51987c2764da5aeac1e40436678d0\",\"articleSection\":[\"2019\",\"6\\\/2019\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/\",\"name\":\"Flexible Adressen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/25a51987c2764da5aeac1e40436678d0\",\"datePublished\":\"2020-07-10T09:50:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/25a51987c2764da5aeac1e40436678d0\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/25a51987c2764da5aeac1e40436678d0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Adressen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flexible Adressen\"}]},{\"@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":"Flexible Adressen - 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\/Flexible_Adressen\/","og_locale":"de_DE","og_type":"article","og_title":"Flexible Adressen","og_description":"Das Thema Adressverwaltung kann man auf viele verschiedene Arten l&ouml;sen. In vielen F&auml;llen reicht eine einfache Tabelle, die eine Adresse speichert. Reden wir &uuml;ber Adressen in einer Kundenverwaltung, kann es auch vorkommen, dass der Kunde unterschiedliche Adressen f&uuml;r Lieferungen und Rechnungen angeben m&ouml;chte. Solche Daten speichert man entweder in einer einzigen Tabelle je Kunde oder man tr&auml;gt die Liefer- und Rechnungsadresse in eigene Tabellen ein, die man dann per 1:1-Beziehung mit dem Kundendatensatz verkn&uuml;pft. Wir gehen noch einen Schritt weiter und wollen mit der hier vorgestellten L&ouml;sung die M&ouml;glichkeit bieten, nicht nur zwei, sondern beliebig viele Adressen je Kunde anzulegen - die dann flexibel als Rechnung- oder Lieferadresse festgelegt werden k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:50:10+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Flexible Adressen","datePublished":"2020-07-10T09:50:10+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/"},"wordCount":4128,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0","articleSection":["2019","6\/2019","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/","url":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/","name":"Flexible Adressen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0","datePublished":"2020-07-10T09:50:10+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/25a51987c2764da5aeac1e40436678d0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Adressen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Flexible Adressen"}]},{"@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\/55001214","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=55001214"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001214\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}