{"id":55001470,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-02T19:58:52","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1470"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Kundenadressen_ausgliedern","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/","title":{"rendered":"Rechnungsverwaltung: Kundenadressen ausgliedern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In der bisherigen Version der Rechnungsverwaltung haben wir nur eine Kundenadresse in der Tabelle &#8222;tblKunden&#8220; gespeichert. Im Bestreben, diese Rechnungsverwaltung flexibler zu gestalten, wollen wir in diesem Beitrag zwei Dinge durchf&uuml;hren: Das Aufteilen der Kundentabelle in eine Tabelle mit den Basisdaten des Kunden und mehrere weitere Tabellen zum Speichern der Adressen dieses Kunden sowie das Anpassen des Formulars &#8222;frmKundenDetails&#8220; an diese &Auml;nderung des Datenmodells. Dies soll die Grundlage bilden, mehrere Adressen je Kunde zu speichern und diese dann nach Bedarf in Bestellungen, Lieferungen, Rechnungen und weitere Vorg&auml;nge zu &uuml;bernehmen.<\/b><\/p>\n<p>Das bisherige Datenmodell sah eine Tabelle namens <b>tblKunden<\/b> vor, die genau einen Satz von Adressdaten enthielt. Das wird den modernen Anforderungen nicht mehr gerecht, sodass wir unsere Rechnungsverwaltung, noch anpassen m&ouml;chten, bevor wir die auf den Kundendaten aufbauenden Tabellen und Formulare f&uuml;r die Bestelldaten und die Rechnungs- und Lieferdaten erstellen.<\/p>\n<p>Grundlage daf&uuml;r sind einige &Uuml;berlegungen aus dem Beitrag <b>Datenmodelle f&uuml;r die Rechnungsverwaltung <\/b>(<b>www.access-im-unternehmen.de\/1459<\/b>), die wir hier nicht genau, aber ansatzweise &uuml;bernehmen. Im bisherigen Datenmodell sah die Tabelle unserer Beispiell&ouml;sung wie in Bild 1 aus. Hier haben wir noch nicht einmal verschiedene Adressen f&uuml;r die Rechnung und die Lieferung gepflegt &#8211; es war eben ein recht einfaches Datenmodell.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_001.png\" alt=\"Ausgangstabelle\" width=\"649,559\" height=\"289,2844\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ausgangstabelle<\/span><\/b><\/p>\n<h2>Aufteilung der Kundendaten auf mehrere Tabellen<\/h2>\n<p>Nun f&uuml;gen wir zwei Tabellen zum Verwalten von Rechnungsadressen und Lieferadressen hinzu, die wir &uuml;ber zwei Fremdschl&uuml;sselfelder mit der Tabelle <b>tblKunden <\/b>verbinden. Aus der Tabelle <b>tblKunden <\/b>entfernen wir einige Felder, die hier nicht mehr gebraucht werden. Welche Daten man in dieser Tabelle noch ben&ouml;tigt, ist ohnehin wie vieles andere vom Anwendungsfall abh&auml;ngig. In unserem Fall behalten wir die Felder <b>Kundennummer<\/b>, <b>Firma<\/b>, <b>Vorname<\/b>, <b>Nachname<\/b>, <b>EMail <\/b>und <b>Telefon <\/b>in dieser Tabelle.<\/p>\n<p>Au&szlig;erdem legen wir zwei neue Tabellen namens <b>tblLieferadressen_Kunde <\/b>und <b>tblRechnungsadressen_Kunde <\/b>an. Diese erhalten jeweils ein Fremdschl&uuml;sselfeld namens <b>KundeID<\/b>, mit dem wir die Beziehung der jeweiligen Adresse mit dem Kundendatensatz aus der Tabelle <b>tblKunden <\/b>herstellen k&ouml;nnen. Au&szlig;erdem enthalten diese Tabellen die &uuml;blichen Adressfelder, aber auch nochmal <b>Firma<\/b>, <b>AnredeID<\/b>, <b>Vorname <\/b>und <b>Nachname<\/b>.<\/p>\n<p>Die Tabelle <b>tblRechnungsadressen_Kunde <\/b>enth&auml;lt au&szlig;erdem noch das Feld <b>UstIDNr<\/b>. Warum hier und nicht in der Tabelle <b>tblKunden<\/b>? Weil es durchaus sein kann, dass ein Kunde verschiedene Firmen mit unterschiedlichen Umsatzsteuer-Identifikationsnummern hat, f&uuml;r die er Rechnungen ben&ouml;tigt.<\/p>\n<h2>Standardadresse f&uuml;r Rechnung und Lieferung festlegen<\/h2>\n<p>Die Tabelle <b>tblRechnungsadressen_Kunde<\/b> sieht in der Entwurfsansicht wie in Bild 2 aus. Ein weiteres wichtiges Feld neben den genannten ist das Feld <b>Standardadresse<\/b>. Es ist ein <b>Ja\/Nein<\/b>-Feld, mit dem wir f&uuml;r jeden Kunden eine Standardlieferadresse und eine Standardrechnungsadresse festlegen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_003.png\" alt=\"Die Tabelle f&uuml;r die Rechnungsadressen der Kunden\" width=\"574,559\" height=\"281,9518\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Tabelle f&uuml;r die Rechnungsadressen der Kunden<\/span><\/b><\/p>\n<p>Die Pflege dieses Feldes erfordert Aufwand, den wir nicht &uuml;ber das Datenmodell erledigen k&ouml;nnen: Wir m&uuml;ssen sicherstellen, dass bei mehreren Adressen je Kunde immer genau eine Adresse den Wert <b>True <\/b>in diesem Feld aufweist. Das erledigen wir sp&auml;ter beim Programmieren der Benutzeroberfl&auml;che.<\/p>\n<p>Das Datenmodell f&uuml;r die Kundenadressen sieht nun wie in Bild 3 aus. Die beiden Tabellen <b>tblLieferadressen_Kunde <\/b>und <b>tblRechnungsadressen_Kunde <\/b>sind &uuml;ber Fremdschl&uuml;sselfelder mit der Tabelle <b>tblKunden<\/b> verkn&uuml;pft. Auf diese Weise k&ouml;nnen wir nun mehrere Adressen f&uuml;r Rechnungen und Lieferungen f&uuml;r jeden Kunden anlegen und jeweils eine als Standardadresse definieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_002.png\" alt=\"Die Kundendaten liegen nun in drei verschiedenen Tabellen.\" width=\"649,559\" height=\"343,5445\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Kundendaten liegen nun in drei verschiedenen Tabellen.<\/span><\/b><\/p>\n<h2>Formulare f&uuml;r die Kunden und ihre Adressen<\/h2>\n<p>Nun ben&ouml;tigen wir ein Formular zur Darstellung der Sachverhalte in diesen Tabellen. Ein Teil scheint offensichtlich zu sein: Ein Hauptformular wird an die Tabelle <b>tblKunden <\/b>gebunden und zeigt die Daten dieser Tabelle an.<\/p>\n<p>F&uuml;r die Rechnungs- und Lieferadressen gibt es jedoch sehr viele M&ouml;glichkeiten zur Darstellung, von denen viele nicht ergonomisch sind. Was genau wollen wir in dem Formular erledigen?<\/p>\n<ul>\n<li>&Uuml;bersichten der Rechnungsadressen und Lieferadressen anzeigen<\/li>\n<li>Details jeweils einer Rechnungs- und Lieferadresse anzeigen<\/li>\n<li>Wechsel zu den &uuml;brigen Detaildatens&auml;tzen f&uuml;r Rechnungen und Lieferungen ausw&auml;hlbar machen<\/li>\n<li>Neue Rechnungs- und Lieferadressen anlegen<\/li>\n<li>Bestehende Adressen bearbeiten<\/li>\n<li>Jeweils eine der Adressen als Standardadresse f&uuml;r Rechnungen und Lieferungen einstellen<\/li>\n<li>Standardadresse f&uuml;r Rechnungen und Lieferungen f&uuml;r neue Bestellungen &uuml;bernehmen<\/li>\n<li>Rechnungs- und Lieferadressen l&ouml;schen<\/li>\n<\/ul>\n<p>Rechnungs- und Lieferadressen l&ouml;schen? Aber brauchen wir die nicht dauerhaft? Nicht mit dem Modell, das wir auf den hier genannten Tabellen aufbauen. Erstellen wir eine Bestellung, werden die aktuellen Standardadressen f&uuml;r Rechnung und Lieferung automatisch in weitere Tabellen &uuml;bernommen, die wiederum mit der Bestellung verkn&uuml;pft sind.<\/p>\n<p>Dementsprechend k&ouml;nnen wir die Adressen f&uuml;r Rechnungen und Lieferungen f&uuml;r einen Kunden l&ouml;schen, denn diese befinden sich ja in den Datens&auml;tzen f&uuml;r die Bestellungen, Rechnungen und Lieferungen.<\/p>\n<h2>Umsetzung des Kundendetail-Formulars<\/h2>\n<p>Wie aber k&ouml;nnen wir das Formular so gestalten, dass die obigen Anforderungen alle erf&uuml;llt werden k&ouml;nnen? Dies erledigen wir wie in Bild 4. Im Gegensatz zu der Version, die wir im Beitrag <b>Rechnungsverwaltung: Kundendetails <\/b>(<b>www.access-im-unternehmen.de\/1383<\/b>) vorgestellt haben, haben wir die Adressdaten aus dem Hauptformular herausgenommen und stellen diese nun in zwei Unterformularen dar.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_004.png\" alt=\"So sollen die Kundendetails im Formular angezeigt werden\" width=\"649,559\" height=\"620,5285\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: So sollen die Kundendetails im Formular angezeigt werden<\/span><\/b><\/p>\n<p>Diese beiden f&uuml;gen wir wiederum auf zwei Seiten eines Registersteuerelements ein, sodass diese nicht gleichzeitig angezeigt werden m&uuml;ssen.<\/p>\n<p>Diese Unterformulare zeigen alle Liefer- und Rechnungsadressen zum Kunden aus dem Hauptformular an. Wir k&ouml;nnen &uuml;ber die Navigationsschaltfl&auml;chen durch diese Datens&auml;tze navigieren, aber auch eine der Adressen &uuml;ber das Kombinationsfeld oberhalb des Unterformulars ausw&auml;hlen. Au&szlig;erdem wollen wir erm&ouml;glichen, eine neue Adresse durch die Auswahl des Eintrags <b>Neu&#8230; <\/b>zu erzeugen (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_005.png\" alt=\"Neuanlage einer Adresse per Auswahlfeld\" width=\"649,559\" height=\"159,5899\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Neuanlage einer Adresse per Auswahlfeld<\/span><\/b><\/p>\n<p>Schauen wir uns nun an, wie wir dies auf Basis der vorhandenen Tabellen im Formular abbilden.<\/p>\n<h2>Unterformular f&uuml;r die Lieferadressen<\/h2>\n<p>Das erste Unterformular namens <b>sfmKunde_Lieferadressen <\/b>statten wir mit der Tabelle <b>tblLieferadressen_Kunde <\/b>als Datensatzquelle aus. Wir ziehen alle Felder aus der Feldliste in den Detailbereich und ordnen die Felder wie in Bild 6 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_006.png\" alt=\"Entwurf des Unterformulars f&uuml;r die Lieferadressen\" width=\"649,559\" height=\"298,5294\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf des Unterformulars f&uuml;r die Lieferadressen<\/span><\/b><\/p>\n<p>Es gibt einige Ereignisse im Unterformular, auf die wir reagieren wollen und die sich meist auf die Aktualisierung von Steuerelementen auswirken. Um die Ereignisse zur Steuerung des gesamten Formulars samt Unterformularen im Hauptformular zu belassen, k&ouml;nnen wir im dortigen Klassenmodul Objektvariablen deklarieren, die wir mit Verweisen auf die Unterformulare f&uuml;llen.<\/p>\n<p>Dadurch k&ouml;nnen wir die Ereignisse der Unterformulare im Klassenmodul des Hauptformulars implementieren und haben den kompletten Code in einem Modul. Im Unterformular m&uuml;ssen wir dazu nur einen Schritt durchf&uuml;hren, n&auml;mlich die Eigenschaft <b>Enth&auml;lt Modul <\/b>auf <b>Ja <\/b>einzustellen (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_007.png\" alt=\"Hinzuf&uuml;gen eines Moduls zum Unterformular\" width=\"424,5589\" height=\"414,0616\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Hinzuf&uuml;gen eines Moduls zum Unterformular<\/span><\/b><\/p>\n<p>Damit sind die Arbeiten am Unterformular f&uuml;r die Lieferadressen bereits abgeschlossen und wir k&ouml;nnen uns den Rechnungsadressen zuwenden.<\/p>\n<h2>Unterformular f&uuml;r die Rechnungsadressen<\/h2>\n<p>Bei diesem Unterformular bestehen die gleichen Anforderungen wie beim Unterformular f&uuml;r die Lieferadressen. Allerdings f&uuml;gen wir hier die Tabelle <b>tblRechnungsadressen<\/b> als Datensatzquelle hinzu und speichern das Formular unter dem Namen <b>sfmKunden_Rechnungsadressen<\/b>.<\/p>\n<p>Warum k&ouml;nnen wir nicht einfach nur ein solches Unterformular verwenden und per Code zur Laufzeit die Datensatzquelle anpassen? Weil die Tabelle mit den Rechnungsadressen ein zus&auml;tzliches Feld namens <b>UstIDNr <\/b>enth&auml;lt, das wir ebenfalls abbilden m&uuml;ssen (siehe Bild 8). Auch dieses Formulars enth&auml;lt keinen eigenen Code, aber wir wollen die Eigenschaft <b>Enth&auml;lt Modul <\/b>aktivieren, damit wir im Hauptformular die Ereignisse f&uuml;r dieses Unterformular implementieren k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_009.png\" alt=\"Entwurf des Unterformulars f&uuml;r die Rechnungsadressen\" width=\"649,559\" height=\"297,5862\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Entwurf des Unterformulars f&uuml;r die Rechnungsadressen<\/span><\/b><\/p>\n<h2>Registersteuerelement f&uuml;r die Unterformulare<\/h2>\n<p>Im Hauptformular legen wir nun ein Registersteuerelement namens <b>regAdressen <\/b>an. Dieses soll zwei Registerseiten mit den Beschriftungen <b>Lieferadresse <\/b>und <b>Rechnungsadresse <\/b>aufweisen. Sie haben den Seitenindex <b>0 <\/b>und <b>1<\/b>.<\/p>\n<p>Um der ersten Registerseite das Unterformular f&uuml;r die Lieferadressen zuzuweisen, markieren wir diese Seite durch einen Klick auf den Registerreiter. Es sollte nun ein Rahmen unterhalb des Registerreiters erscheinen. In diesen Bereich k&ouml;nnen wir nun das Formular <b>frm_KundeLieferadressenaus <\/b>dem Navigationsbereich hineinziehen. Wenn sich beim Hineinziehen der Hintergrund dieser Registerseite schwarz f&auml;rbt, k&ouml;nnen wir das Unterformular fallen lassen. Nun f&uuml;gen wir den Registerseiten noch weitere Steuerelemente hinzu, aber auf unterschiedliche Weise:<\/p>\n<ul>\n<li>Im oberen Bereich legen wir ein Kombinationsfeld an, mit dem wir die Auswahl einer der Lieferadressen erm&ouml;glichen wollen. Dieses soll ebenfalls auf der Registerseite abgelegt werden und den Namen <b>cboRechnungsadresseAuswaehlen <\/b>erhalten. Daher achten wir beim Hinzuf&uuml;gen auch wieder darauf, dass sich der Zielbereich der Registerseite schwarz f&auml;rbt, bevor wir das Steuerelement fallen lassen.<\/li>\n<li>Unter dem Unterformular legen wir zwei Schaltfl&auml;chen an. Diese sollen jedoch nicht Teil der Registerseite werden. Wieso das? Im Gegensatz zum Kombinationsfeld, das wir mit einer eigenen Datensatzherkunft und eigenen Prozeduren f&uuml;r die Liefer- und Rechnungsadressen ausstatten, wollen wir die beiden Schaltfl&auml;chen zum Hinzuf&uuml;gen und Entfernen von Adressen nur einmalig anlegen. Deshalb f&uuml;gen wir diese zun&auml;chst unterhalb des Registersteuerelements zum Detailbereich des Formularentwurfs hinzu und ziehen diese dann an die gew&uuml;nschte Position. So wirkt es, als ob die Schaltfl&auml;chen auf den beiden Registerseiten liegen, aber tats&auml;chlich liegen sie dar&uuml;ber. Beim Wechsel der Registerseite k&ouml;nnen wir diese also einfach weiterverwenden. Die Schaltfl&auml;chen benennen wir mit <b>cmdAdresseLoeschen <\/b>und <b>cmdNeueAdresse<\/b>. Au&szlig;erdem f&uuml;gen wir f&uuml;r beide ein Icon hinzu.<\/li>\n<li>Der zweiten Registerseite brauchen wir so nur noch das Kombinationsfeld <b>cboRechnungsadresseAuswaehlen <\/b>hinzuzuf&uuml;gen. Die beiden Schaltfl&auml;chen werden ja automatisch auch f&uuml;r diese Registerseite angezeigt.<\/li>\n<\/ul>\n<p>Danach sieht das Formular wie in Bild 9 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_010.png\" alt=\"Erste Seite des Registersteuerelements\" width=\"649,559\" height=\"294,1031\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erste Seite des Registersteuerelements<\/span><\/b><\/p>\n<h2>Hauptformular mit den Unterformularen verkn&uuml;pfen<\/h2>\n<p>Wie unter Access &uuml;blich, sollte die Beziehung zwischen Haupt- und Unterformular automatisch hergestellt werden, wenn diese die Daten aus Tabellen anzeigen, die &uuml;ber Prim&auml;rschl&uuml;sselfeld und Fremdschl&uuml;sselfeld miteinander verkn&uuml;pft sind. Zur Sicherheit pr&uuml;fen wir das noch einmal nach, indem wir das Unterformular-Steuerelement <b>sfmKunde_Lieferadressen <\/b>markieren und uns die Eigenschaften ansehen. Hier finden wir f&uuml;r die Eigenschaft <b>Verkn&uuml;pfen nach <\/b>den Wert <b>ID <\/b>und f&uuml;r <b>Verkn&uuml;pfen von <\/b>den Wert <b>KundeID <\/b>vor &#8211; es hat also alles nach Wunsch geklappt (siehe Bild 10). Im zweiten Unterformular-Steuerelement <b>sfmKunde_Rechnungsadressen<\/b> sollte dies genauso aussehen. Wenn das Hauptformular einen Datensatz der Tabelle <b>tblKunden <\/b>anzeigt, liefern die Unterformulare die Datens&auml;tze der Tabellen <b>tblLieferadressen_Kunde <\/b>und <b>tblRechnungsadressen_Kunde<\/b>, die mit diesem Kunden verkn&uuml;pft sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_011.png\" alt=\"Verkn&uuml;pfung zwischen Haupt- und Unterformular\" width=\"424,5589\" height=\"324,0054\" \/><\/p>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Verkn&uuml;pfung zwischen Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Gleichzeitig wird das Fremdschl&uuml;sselfeld <b>KundeID <\/b>f&uuml;r neu angelegte Datens&auml;tze der Tabellen <b>tblLieferadressen_Kunde <\/b>und <b>tblRechnungsadressen_Kunde <\/b>automatisch mit dem Wert des Feldes <b>ID <\/b>des Kunden aus dem Hauptformular gef&uuml;llt.<\/p>\n<h2>Auswahl von Adressen per Kombinationsfeld<\/h2>\n<p>Damit beim Anzeigen eines neuen Datensatzes im Hauptformular die richtigen Adressen in den Unterformularen erscheinen, brauchen wir also nichts weiter zu tun. Allerdings zeigen die beiden Kombinationsfelder <b>cboLieferadresseAuswaehlen <\/b>und <b>cboRechnungsadresseAuswaehlen <\/b>noch keine Daten an. Diese sollen sowohl einen Eintrag mit dem Text <b>Neu&#8230; <\/b>anzeigen als auch die Firmen der bisher vorhandenen Liefer- und Rechnungsadressen. Schlie&szlig;lich wollen wir auch noch, dass diese angeben, welche Adresse die aktuelle Standardadresse dieses Kunden f&uuml;r Lieferungen oder Rechnungen ist. Also f&uuml;gen wir eine entsprechende Prozedur hinzu (siehe Listing 1). Diese m&uuml;ssen wir bei jedem Datensatzwechsel im Hauptformular aufrufen, weshalb wir den Aufruf in der Ereignisprozedur unterbringen, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>KombinationsfelderAktualisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLLieferadressen<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLRechnungsadressen<span style=\"color:blue;\"> As String<\/span>\r\n     strSQLLieferadressen = \"SELECT -1 AS ID, ''&lt;Neu...&gt;'' AS Bezeichnung FROM tblLieferadressen_Kunde UNION \" _\r\n         & \"SELECT ID, IIF(Standardadresse,''(Standard) '' ,'''') & Firma + '' - '' & Vorname + '' '' & \" _\r\n         & \"Nachname + '' - '' & Strasse + '' - '' & PLZ + '' '' & Ort + '' - '' & (SELECT LandBezeichnung \" _\r\n         & \"FROM tblLaender AS t1 WHERE t1.ID = LandID) AS Bezeichnung FROM tblLieferadressen_Kunde \" _\r\n         & \"WHERE KundeID = \" & Nz(Me!ID, 0)\r\n     strSQLRechnungsadressen = \"SELECT -1 AS ID, ''&lt;Neu...&gt;'' AS Bezeichnung FROM tblRechnungsadressen_Kunde \" _\r\n         & \"UNION SELECT ID, IIF(Standardadresse,''(Standard) '' ,'''') & Firma + '' - '' & Vorname + '' '' & \" _\r\n         & \"Nachname + '' - '' & Strasse + '' - '' & PLZ + '' '' & Ort + '' - '' & (SELECT LandBezeichnung \" _\r\n         & \"FROM tblLaender AS t1 WHERE t1.ID = LandID) AS Bezeichnung FROM tblRechnungsadressen_Kunde \" _\r\n         & \"WHERE KundeID = \" & Nz(Me!ID, 0)\r\n     Me!cboLieferadresseAuswaehlen.RowSource = strSQLLieferadressen\r\n     Me!cboRechnungsadresseAuswaehlen.RowSource = strSQLRechnungsadressen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Aktualisieren der Kombinationsfelder<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     KombinationsfelderAktualisieren\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur selbst stellt die jeweiligen Datensatzherk&uuml;nfte in den Variablen <b>strSQLLieferadressen <\/b>und <b>strSQLRechnungsadressen <\/b>zusammen. Dieser Ausdruck sieht beispielsweise f&uuml;r die Lieferadressen wie folgt aus, wenn der Datensatz im Hauptformular den Wert <b>1 <\/b>im Feld <b>ID <\/b>aufweist:<\/p>\n<pre>SELECT -1 AS ID, ''&lt;Neu...&gt;'' AS Bezeichnung FROM tblLieferadressen_Kunde UNION SELECT ID, IIF(Standardadresse,''(Standard) '' ,'''') & Firma + '' - '' & Vorname + '' '' & Nachname + '' - '' & Strasse + '' - '' & PLZ + '' '' & Ort + '' - '' & (SELECT LandBezeichnung FROM tblLaender AS t1 WHERE t1.ID = LandID) AS Bezeichnung FROM tblLieferadressen_Kunde WHERE KundeID = 1<\/pre>\n<p>Wir f&uuml;gen also die Ergebnisse zweier Abfragen mit dem <b>UNION<\/b>-Schl&uuml;sselwort zusammen. Die erste Abfrage liefert den Wert <b>-1 <\/b>und den anzuzeigenden Text <b>Neu&#8230;<\/b>, die zweite die Lieferadressen f&uuml;r den aktuellen Kunden &#8211; mit allen Feldern, die gef&uuml;llt sind. Dabei f&uuml;gen wir die einzelnen Felder zu einem einzigen Ausdruck zusammen. Damit Firma, Vorname, Nachname et cetera nicht einfach hintereinander angegeben werden, f&uuml;gen wir jeweils Leerzeichen und gegebenenfalls noch Minuszeichen dazwischen ein. Dies wollen wir jedoch nur machen, wenn das entsprechende Feld gef&uuml;llt ist, damit wir nicht mehrere Leerzeichen oder Minuszeichen hintereinander vorfinden. Damit die Leerzeichen und Minuszeichen immer nur erscheinen, wenn das jeweilige Feld gef&uuml;llt ist, verbinden wir diese Zeichen &uuml;ber das Und-Zeichen (<b>&#038;<\/b>) mit dem anzuzeigenden Feld, zum Beispiel:<\/p>\n<pre>'' - '' & Strasse<\/pre>\n<p>Die einzelnen Ausdr&uuml;cke verbinden wir hingegen mit dem Pluszeichen (<b>+<\/b>):<\/p>\n<pre>'' - '' & Strasse + '' - '' & PLZ <\/pre>\n<p>Beim Verbinden mit <b>&#038; <\/b>wird der gesamte verbundene Ausdruck <b>Null<\/b>, wenn einer der Teile <b>Null <\/b>ist. Wenn also keine Strasse angegeben ist, f&auml;llt auch das f&uuml;hrende Minuszeichen weg.<\/p>\n<p>Wichtig ist dabei, dass wir den Wert des Vergleichswertes aus <b>Me!ID <\/b>in die <b>Nz<\/b>-Funktion einfassen und diese den Wert <b>0 <\/b>zur&uuml;ckliefert, wenn <b>Me!ID <\/b>leer ist. Das ist genau dann der Fall, wenn ein neuer Kunde angelegt wird und der Datensatz noch nicht bearbeitet wurde &#8211; solange hat das Feld <b>ID <\/b>den Wert <b>NULL<\/b>.<\/p>\n<p>Das f&uuml;hrt zu einem Fehler, weil die SQL-Anweisung dann das Kriterium <b>ID = <\/b>ohne einen Wert enth&auml;lt. Also f&uuml;gen wir in diesem Fall den Wert <b>0 <\/b>hinzu.<\/p>\n<p>Auf diese Weise erhalten wir eine Auswahl wie in Bild 11. Der aktuell als Standard markierte Eintrag wird entsprechend hervorgehoben. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_012.png\" alt=\"Adressen ausw&auml;hlen\" width=\"649,559\" height=\"254,1418\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Adressen ausw&auml;hlen<\/span><\/b><\/p>\n<h2>Gew&auml;hlte Adresse nach der Auswahl &auml;ndern oder neue Adresse anlegen<\/h2>\n<p>Die beiden Kombinationsfelder <b>cboLieferadresseAuswaehlen <\/b>und <b>cboRechnungsadresseAuswaehlen <\/b>bieten das Anlegen eines neuen Datensatzes sowie die Anzeige eines der bestehenden Datens&auml;tze zur Auswahl an. Nach der Auswahl eines der Eintr&auml;ge reagieren wir beispielsweise bei den Lieferadressen mit dem Ausl&ouml;sen der Ereignisprozedur aus Listing 2, die wir f&uuml;r die Ereigniseigenschaft <b>Nach Aktualisieren <\/b>des Kombinationsfeldes hinterlegen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboLieferadresseAuswaehlen_AfterUpdate()\r\n     Select Case Me!cboLieferadresseAuswaehlen\r\n         <span style=\"color:blue;\">Case <\/span>-1\r\n             Me!sfmKunde_Lieferadressen.Form.Recordset.Add<span style=\"color:blue;\">New<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             Me!sfmKunde_Lieferadressen.Form.Recordset.FindFirst \"ID = \" & Me!cboLieferadresseAuswaehlen\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Aktualisieren der Lieferadressen<\/span><\/b><\/p>\n<p>Hier verarbeiten wir in einer <b>Select Case<\/b>-Bedingung zwei F&auml;lle:<\/p>\n<ul>\n<li><b>-1<\/b>: Es soll eine neue Adresse angelegt werden. Dann wechseln wir im Unterformular mit der <b>AddNew<\/b>-Methode des Recordsets zu einem neuen, leeren Datensatz.<\/li>\n<li>Anderer Wert: Das Unterformular wird auf den im Kombinationsfeld ausgew&auml;hlten Datensatz eingestellt.<\/li>\n<\/ul>\n<p>Die Prozedur sieht f&uuml;r beide Kombinationsfelder &auml;hnlich aus.<\/p>\n<h2>Liefer- und Rechnungsadresse initialisieren<\/h2>\n<p>Beim Anzeigen eines Kunden, was das Ereignis <b>Beim Anzeigen <\/b>des Hauptformulars ausl&ouml;st, soll zun&auml;chst der Fokus auf das Steuerelement txtFirma verschoben werden. Das hat den Hintergrund, dass sich der Fokus im vorherigen Datensatz in einem der Unterformulare befunden haben k&ouml;nnte. Wenn wir dann auf einen neuen, leeren Kundendatensatz springen, l&ouml;st dies die Meldung aus, dass zuerst ein Datensatz im Hauptformular angelegt werden muss &#8211; was f&uuml;r den Benutzer irritierend sein k&ouml;nnte.<\/p>\n<p>Au&szlig;erdem sollen sowohl im Kombinationsfeld als auch im Unterformular jeweils die als Standard ausgew&auml;hlte Liefer- und Rechnungsadresse angezeigt werden. Das realisieren wir durch den Aufruf der zwei Prozeduren namens <b>LieferadresseInitialisieren <\/b>und <b>RechnungsadresseInitialisieren<\/b>. Die erste finden wir in Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>LieferadresseInitialisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>lngStandardadresse<span style=\"color:blue;\"> As Long<\/span>\r\n     lngStandardadresse = Nz(DLookup(\"ID\", \"tblLieferadressen_Kunde\", \"KundeID = \" & Me!ID _\r\n         & \" AND Standardadresse = True\"), 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngStandardadresse = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cboLieferadresseAuswaehlen = lngStandardadresse\r\n         Me!sfmKunde_Lieferadressen.Form.Recordset.FindFirst \"ID = \" & lngStandardadresse\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 3: Initialisieren der Lieferadresse<\/span><\/b><\/p>\n<p>Sie ermittelt f&uuml;r die Variable <b>lngStandardadresse <\/b>die ID des Eintrags der Tabelle <b>tblLieferadressen_Kunde<\/b>, die zum aktuell im Hauptformular ausgew&auml;hlten Kunden geh&ouml;rt und deren Feld <b>Standardadresse <\/b>den Wert <b>True <\/b>aufweist. Lautet der zur&uuml;ckgelieferte Wert nicht <b>0<\/b>, stellt die Prozedur das Kombinationsfeld <b>cboLieferadresseAuswaehlen <\/b>auf den ermittelten Wert ein.<\/p>\n<p>Die Prozeduren <b>LieferadresseInitialisieren <\/b>und <b>RechnungsadresseInitialisieren <\/b>rufen wir ebenfalls beim Anzeigen eines Datensatzes auf. Dazu erweitern wir die Prozedur <b>Beim Anzeigen <\/b>entsprechend. Au&szlig;erdem f&uuml;gen wir dieser noch zwei Aufrufe einer Prozedur namens <b>HoleStandardadresse <\/b>hinzu, die pr&uuml;ft, ob eine Standardadresse f&uuml;r die Liefer- und die Rechnungsadresse hinterlegt wurde. Die obersten Anweisungen fassen wir in eine Bedingung ein, die nur wahr ist, wenn kein neuer Datensatz angezeigt wird &#8211; anderenfalls erhalten wir diverse Fehler, weil die <b>ID <\/b>des neuen Kunden noch nicht vorliegt. Darunter folgen noch Aufrufe der Prozeduren <b>KombinationsfelderAktualisieren<\/b>, <b>SchaltflaechenBestellungAktualisieren <\/b>und <b>SchaltflaechenAdressenAktualisieren<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!txtFirma.SetFocus\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         HoleStandardadresse \"tblLieferadressen_Kunde\", _\r\n             Me!ID, <span style=\"color:blue;\">True<\/span>\r\n         HoleStandardadresse \"tblRechnungsadressen_Kunde\", _\r\n             Me!ID, <span style=\"color:blue;\">True<\/span>\r\n         LieferadresseInitialisieren\r\n         RechnungsadresseInitialisieren\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     KombinationsfelderAktualisieren\r\n     SchaltflaechenBestellungenAktualisieren\r\n     SchaltflaechenAdressenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Standardadressen setzen<\/h2>\n<p>Es kann vorkommen, dass keine der Liefer- oder Rechnungsadressen als Standardadresse f&uuml;r den jeweiligen Kunden festgelegt ist. Deshalb rufen wir vor dem Anzeigen eines jeden Datensatzes die Prozedur <b>HoleStandardadresse <\/b>f&uuml;r die beiden Tabellen <b>tblLieferadressen_Kunde <\/b>und <b>tblRechnungsadressen_Kunde <\/b>auf. Dabei geben wir f&uuml;r den zweiten Parameter die ID des Kunden an, dessen Standardadresse gepr&uuml;ft werden soll und mit dem dritten die Angabe, ob die Standardadresse gegebenenfalls auf die erste verf&uuml;gbare Standardadresse gesetzt werden soll (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>HoleStandardadresse(strTabelle<span style=\"color:blue;\"> As String<\/span>, lngKundeID<span style=\"color:blue;\"> As Long<\/span>, bolEinstellen<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngID = Nz(DLookup(\"ID\", strTabelle, \"KundeID = \" & lngKundeID & \" AND Standardadresse = -1\"), 0)\r\n     <span style=\"color:blue;\">If <\/span>lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolEinstellen<span style=\"color:blue;\"> Then<\/span>\r\n             lngID = HoleErsteAdresse(strTabelle, lngKundeID)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 SetzeStandardadresse strTabelle, lngKundeID, lngID\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     HoleStandardadresse = lngID\r\n<span style=\"color:blue;\">End Function<\/span>b<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Holen oder Einstellen der Standardadresse auf den ersten Datensatz<\/span><\/b><\/p>\n<p>Diese Funktion verwendet zwei weitere Routinen. Sollte per <b>DLookup <\/b>f&uuml;r den aktuellen Kunden keine Standardadresse in der zu untersuchenden Tabelle ermittelt werden k&ouml;nnen, pr&uuml;ft die Funktion, ob der Parameter <b>bolEinstellen <\/b>gesetzt ist. Falls ja, holt die weitere Funktion <b>HoleErsteAdresse <\/b>die erste Adresse aus der angegebenen Tabelle f&uuml;r diesen Kunden und speichert diese in der Variablen <b>lngID<\/b>. Konnte eine Adresse gefunden werden, stellt sie diese mithilfe der Prozedur <b>SetzeStandardadresse <\/b>als Standardadresse ein. Diese stellt den &uuml;bergebenen Parameter <b>lngID <\/b>auf die ID der neuen Adresse ein, die dann als Funktionsergebnis zur&uuml;ckgegeben wird.<\/p>\n<p>Die Funktion <b>HoleErsteAdresse <\/b>ermittelt mit <b>DLookup <\/b>den ersten Eintrag der mit <b>strTabelle <\/b>&uuml;bergebenen Tabelle f&uuml;r den mit <b>lngKundeID <\/b>angegebenen Kunden und gibt diesen als Funktionsergebnis zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>HoleErsteAdresse(strTabelle<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngKundeID<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     HoleErsteAdresse = Nz(DLookup(\"ID\", strTabelle, _\r\n         \"KundeID = \" & lngKundeID), 0)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Prozedur <b>SetzeStandardadresse <\/b>aus Listing 5 pr&uuml;ft, ob <b>lngID <\/b>&uuml;bergeben wurde. <b>lngID<\/b> enth&auml;lt gegebenenfalls die ID der Adresse, die als Standardadresse gesetzt werden soll. Ist diese vorhanden, wird diese Adresse als Standardadresse eingestellt. Falls nicht, wird die erste gefundene Adresse als Standardadresse definiert.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SetzeStandardadresse(strTabelle<span style=\"color:blue;\"> As String<\/span>, lngKundeID<span style=\"color:blue;\"> As Long<\/span>, <span style=\"color:blue;\">Optional<\/span> lngID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         EntferneStandardadresse strTabelle, lngKundeID, lngID\r\n         db.Execute \"UPDATE \" & strTabelle & \" SET Standardadresse = -1 WHERE ID = \" & lngID, dbFailOnError\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         db.Execute \"UPDATE \" & strTabelle & \" SET Standardadresse = -1 WHERE ID = (SELECT TOP 1 ID FROM \" _\r\n             & strTabelle & \" WHERE KundeID = \" & lngKundeID & \")\", dbFailOnError\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 5: Einstellen der Standardadresse<\/span><\/b><\/p>\n<h2>Weitere Features des Formulars<\/h2>\n<p>Im Folgenden schauen wir uns noch weitere wichtige Funktionen des Formulars an &#8211; zum Beispiel das Aktivieren und Deaktivieren der Schaltfl&auml;chen unter den Adressen beziehungsweise denen unter der Bestellungen-Liste.<\/p>\n<h2>Schaltfl&auml;chen f&uuml;r Adressen aktivieren\/deaktivieren<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdAdresseLoeschen <\/b>l&ouml;scht die aktuelle Adresse, die Schaltfl&auml;che <b>cmdNeueAdresse<\/b> legt eine neue Adresse an. Beide sollen zu bestimmten Zeitpunkten nicht aktiviert sein. Die Schaltfl&auml;che <b>cmdAdresseLoeschen <\/b>soll beispielsweise nur aktiviert sein, wenn gerade ein gespeicherter Datensatz angezeigt wird &#8211; Gleiches gilt f&uuml;r die Schaltfl&auml;che <b>cmdNeueAdresse<\/b>. Anderenfalls sollen die Schaltfl&auml;chen deaktiviert werden, was folgende Prozedur regelt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SchaltflaechenAdressenAktualisieren()\r\n     Select Case Me!regAdressen\r\n         <span style=\"color:blue;\">Case <\/span>0 ''Lieferadressen\r\n             <span style=\"color:blue;\">If <\/span>sfmLieferadressen.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!cmdAdresseLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n                 Me!cmdNeueAdresse.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 Me!cmdAdresseLoeschen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n                 Me!cmdNeueAdresse.Enabled = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>1 ''Rechnungsadressen\r\n             <span style=\"color:blue;\">If <\/span>sfmRechnungsadressen.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n                 Me!cmdAdresseLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n                 Me!cmdNeueAdresse.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 Me!cmdAdresseLoeschen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n                 Me!cmdNeueAdresse.Enabled = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese wird zu verschiedenen Gelegenheiten aufgerufen, nicht nur beim Anzeigen eines Datensatzes im Hauptformular. Sondern auch, wenn einer der Adressdatens&auml;tze aktualisiert wurde oder ein anderer angezeigt wird und beim L&ouml;schen eines Adressdatensatzes.<\/p>\n<h2>Schaltfl&auml;chen f&uuml;r Bestellungen aktivieren\/deaktivieren<\/h2>\n<p>Die Prozedur zum Aktivieren und Deaktivieren der Schaltfl&auml;chen unter der Bestellungen-Liste des aktuellen Kunden sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SchaltflaechenBestellungenAktualisieren()\r\n     <span style=\"color:blue;\">If <\/span>Me.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cmdBestellungAnzeigen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         Me!cmdBestellungLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         Me!cmdNeueBestellung.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         If <span style=\"color:blue;\">Not<\/span> Me!sfmKunde_Bestellungen.Form.Recordset. _\r\n                 RecordCount = 0 Then\r\n             Me!cmdBestellungAnzeigen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n             Me!cmdBestellungLoeschen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             Me!cmdBestellungAnzeigen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             Me!cmdBestellungLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!cmdNeueBestellung.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie pr&uuml;ft, ob das Hauptformular einen neuen, leeren Datensatz anzeigt und deaktiviert dann alle drei Schaltfl&auml;chen. Falls das Hauptformular bereits einen Kunden enth&auml;lt, pr&uuml;ft sie, ob das Unterformular mit den Bestellungen mindestens einen Datensatz enth&auml;lt und aktiviert dann die Schaltfl&auml;chen <b>cmdBestellungenAnzeigen<\/b> und <b>cmdBestellungenLoeschen<\/b>. Anderenfalls werden diese beiden Schaltfl&auml;chen deaktiviert. Die Schaltfl&auml;che <b>cmdNeueBestellung <\/b>wird in diesem Fall immer aktiviert.<\/p>\n<p>Die Prozedur wird beim Anzeigen eines Kundendatensatzes, beim L&ouml;schen einer Bestellung und beim Anlegen einer neuen Bestellung ausgel&ouml;st. Die Schaltfl&auml;che <b>OK <\/b>bleibt immer aktiviert.<\/p>\n<h2>Standardadresse bei neuen Adressen aktivieren<\/h2>\n<p>Damit beim Anlegen eines neuen Kunden die erste eingerichtete Adresse direkt als Standardadresse angelegt wird, hinterlegen wir das Ereignis <b>Beim Anzeigen <\/b>der beiden Objektvariablen f&uuml;r die Unterformulare Ereignisse wie das folgende &#8211; in Listing 6 f&uuml;r die Lieferadresse. Die Prozedur aktualisiert das Kombinationsfeld f&uuml;r die Auswahl einer der Lieferadressen des Kunden und pr&uuml;ft, ob das Unterformular gerade einen neuen, leeren Datensatz anzeigt oder einen vorhandenen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>sfmLieferadressen_Current()\r\n     Me!cboLieferadresseAuswaehlen.Requery\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> sfmLieferadressen.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cboLieferadresseAuswaehlen = sfmLieferadressen!ID\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!cboLieferadresseAuswaehlen = -1\r\n         <span style=\"color:blue;\">If <\/span>HoleStandardadresse(\"tblLieferadressen_Kunde\", Me.ID, <span style=\"color:blue;\">False<\/span>) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             sfmLieferadressen!chkStandardadresse.DefaultValue = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             sfmLieferadressen!chkStandardadresse.DefaultValue = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     SchaltflaechenAdressenAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Aktualisieren des Unterformulars f&uuml;r die Lieferadressen<\/span><\/b><\/p>\n<p>Bei einem vorhandenen Datensatz wird das Kombinationsfeld zur Auswahl der Lieferadresse auf den aktuellen Datensatz eingestellt.<\/p>\n<p>Zeigt das Unterformular einen neuen, leeren Datensatz an, erh&auml;lt das Kombinationsfeld <b>cboLieferadresse <\/b>Auswaehlen den Wert <b>-1<\/b>, wodurch es den Eintrag <b>Neu&#8230; <\/b>anzeigt. <\/p>\n<p>Danach unterscheidet die Prozedur, ob es bereits eine Standardlieferadresse f&uuml;r diesen Kunden gibt oder nicht. Dadurch wollen wir herausfinden, ob wir die neue, leere Lieferadresse direkt als Standardlieferadresse markieren wollen. Um das zu tun, lesen wir mit der Funktion <b>HoleStandardadresse <\/b>die aktuelle Standardadresse f&uuml;r diesen Kunden ein.<\/p>\n<p>Liefert dies den Wert <b>0 <\/b>zur&uuml;ck, gibt es zwei F&auml;lle: Entweder dies ist die erste Lieferadresse f&uuml;r den Kunden, oder es gibt bereits eine oder mehrere Lieferadressen, von denen aber keine als Standardadresse definiert ist. In diesem Fall erh&auml;lt das Kontrollk&auml;stchen <b>chkStandardadresse <\/b>den Standardwert <b>True<\/b>.<\/p>\n<p>Anderenfalls stellen wir den Wert der Eigenschaft <b>DefaultValue <\/b>des Kontrollk&auml;stchens auf <b>False <\/b>ein. Schlie&szlig;lich aktualisiert diese Prozedur noch die Schaltfl&auml;chen unter dem Adressblock.<\/p>\n<h2>Restarbeiten<\/h2>\n<p>Im Code waren noch einige weitere kleinere &Auml;nderungen einzupflegen, die wir gegen&uuml;ber der vorherigen Version vorgenommen haben. Au&szlig;erdem haben wir die Schaltfl&auml;chen noch mit Icons versehen, den Datensatzmarkierer und die Navigationsschaltfl&auml;chen ausgeblendet und das Formular mit einem Titel versehen.<\/p>\n<p>Auch im Formular <b>frmKundenuebersicht <\/b>gab es noch Arbeit, denn dieses zeigte im Unterformular <b>sfmKundenuebersicht <\/b>noch die Adressfelder an, die sich urspr&uuml;nglich in der Tabelle <b>tblKunden <\/b>verbargen. Diese haben wir der Einfachheit halber einfach entfernt.<\/p>\n<p>Das Formular <b>frmKundeDetails<\/b> sieht nun wie in Bild 12 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1470_013.png\" alt=\"Das Formular  mit den Kundendetails\" width=\"700\" height=\"565,2653\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Das Formular  mit den Kundendetails<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie man Kunden mit in separaten Tabellen gespeicherten Liefer- und Rechnungsadressen in einem &uuml;bersichtlichen Formular verwalten kann. Dabei haben wir eine Verwaltung mehrerer Liefer- und Rechnungsadressen f&uuml;r jeden Kunden integriert, wobei jeweils eine Liefer- oder Rechnungsadresse als Standard f&uuml;r diesen Kunden definiert wird. Die Liefer- und Rechnungsadressen lassen sich komfortabel per Kombinationsfeld ausw&auml;hlen.<\/p>\n<p>Neue Adressen legt man durch Auswahl des Eintrags <b>Neu &#8230; <\/b>im Kombinationsfeld an oder durch einen Klick auf die entsprechende Schaltfl&auml;che, das L&ouml;schen funktioniert ebenfalls per Schaltfl&auml;che.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RechnungsverwaltungKundenAdressenAusgliedern.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/08E1790B-D659-41BA-B1A9-BCAF60C9D8B2\/aiu_1470.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der bisherigen Version der Rechnungsverwaltung haben wir nur eine Kundenadresse gespeichert, die in der Tabelle &#8222;tblKunden&#8220; gespeichert war. Im Bestreben, diese Rechnungsverwaltung flexibler zu gestalten, wollen wir in diesem Beitrag zwei Dinge durchf&uuml;hren: Das Aufteilen der Kundentabelle in eine Tabelle mit den Basisdaten des Kunden und mehrere weitere Tabellen zum Speichern der Adressen dieses Kunden sowie das Anpassen des Formulars &#8222;frmKundenDetails&#8220; an diese &Auml;nderung des Datenmodells. Dies soll die Grundlage bilden, mehrere Adressen je Kunde zu speichern und diese dann nach Bedarf in Bestellungen, Lieferungen, Rechnungen und weitere Vorg&auml;nge zu &uuml;bernehmen.<\/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":[66012024,662024,44000027],"tags":[],"class_list":["post-55001470","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","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>Rechnungsverwaltung: Kundenadressen ausgliedern - 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\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungsverwaltung: Kundenadressen ausgliedern\" \/>\n<meta property=\"og:description\" content=\"In der bisherigen Version der Rechnungsverwaltung haben wir nur eine Kundenadresse gespeichert, die in der Tabelle &quot;tblKunden&quot; gespeichert war. Im Bestreben, diese Rechnungsverwaltung flexibler zu gestalten, wollen wir in diesem Beitrag zwei Dinge durchf&uuml;hren: Das Aufteilen der Kundentabelle in eine Tabelle mit den Basisdaten des Kunden und mehrere weitere Tabellen zum Speichern der Adressen dieses Kunden sowie das Anpassen des Formulars &quot;frmKundenDetails&quot; an diese &Auml;nderung des Datenmodells. Dies soll die Grundlage bilden, mehrere Adressen je Kunde zu speichern und diese dann nach Bedarf in Bestellungen, Lieferungen, Rechnungen und weitere Vorg&auml;nge zu &uuml;bernehmen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T19:58:52+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65\" \/>\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\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Rechnungsverwaltung: Kundenadressen ausgliedern\",\"datePublished\":\"2024-02-02T19:58:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/\"},\"wordCount\":3783,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/569da48700684eaa837ccecffd228a65\",\"articleSection\":[\"1\\\/2024\",\"2024\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/\",\"name\":\"Rechnungsverwaltung: Kundenadressen ausgliedern - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/569da48700684eaa837ccecffd228a65\",\"datePublished\":\"2024-02-02T19:58:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/569da48700684eaa837ccecffd228a65\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/569da48700684eaa837ccecffd228a65\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Kundenadressen_ausgliedern\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rechnungsverwaltung: Kundenadressen ausgliedern\"}]},{\"@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":"Rechnungsverwaltung: Kundenadressen ausgliedern - 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\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/","og_locale":"de_DE","og_type":"article","og_title":"Rechnungsverwaltung: Kundenadressen ausgliedern","og_description":"In der bisherigen Version der Rechnungsverwaltung haben wir nur eine Kundenadresse gespeichert, die in der Tabelle \"tblKunden\" gespeichert war. Im Bestreben, diese Rechnungsverwaltung flexibler zu gestalten, wollen wir in diesem Beitrag zwei Dinge durchf&uuml;hren: Das Aufteilen der Kundentabelle in eine Tabelle mit den Basisdaten des Kunden und mehrere weitere Tabellen zum Speichern der Adressen dieses Kunden sowie das Anpassen des Formulars \"frmKundenDetails\" an diese &Auml;nderung des Datenmodells. Dies soll die Grundlage bilden, mehrere Adressen je Kunde zu speichern und diese dann nach Bedarf in Bestellungen, Lieferungen, Rechnungen und weitere Vorg&auml;nge zu &uuml;bernehmen.","og_url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-02T19:58:52+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65","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\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Rechnungsverwaltung: Kundenadressen ausgliedern","datePublished":"2024-02-02T19:58:52+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/"},"wordCount":3783,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65","articleSection":["1\/2024","2024","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/","url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/","name":"Rechnungsverwaltung: Kundenadressen ausgliedern - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65","datePublished":"2024-02-02T19:58:52+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/569da48700684eaa837ccecffd228a65"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Kundenadressen_ausgliedern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Rechnungsverwaltung: Kundenadressen ausgliedern"}]},{"@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\/55001470","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=55001470"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001470\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}