{"id":55001090,"date":"2017-06-01T00:00:00","date_gmt":"2020-05-14T13:42:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1090"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dynamischer_Adressblock","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/","title":{"rendered":"Dynamischer Adressblock"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie einen Adressblock etwa f&uuml;r die Anzeige in einem Bericht oder f&uuml;r anderweitige Nutzung zusammenstellen wollen, sto&szlig;en Sie mitunter auf eine anspruchsvolle Aufgabe. Dummerweise sind die Kundentabellen, aus denen die Adressen bezogen werden sollen, immer unterschiedlich aufgebaut. Noch dazu gibt es manchmal nicht nur eine einzige Adresse, sondern Liefer- und Rechnungsadresse. Dabei treten wiederum Unterschiede auf, wo die prim&auml;re Adresse eingetragen wird &#8211; also die Adresse, die als Rechnungs- und Lieferadresse genutzt wird, wenn nur eine Lieferadresse oder nur eine Rechnungsadresse vorliegt. Dieser Beitrag zeigt eine Funktion, mit der Sie die Adressbl&ouml;cke f&uuml;r Ihren Einsatzzweck komfortabel zusammenstellen k&ouml;nnen.<\/b><\/p>\n<h2>Beispieltabelle<\/h2>\n<p>Ein Beispiel f&uuml;r eine Kundentabelle mit Rechnungs- und Lieferdaten sieht etwa wie in Bild 1 aus. Wenn f&uuml;r einen Kunden eine Lieferanschrift und eine Rechnungsanschrift vorliegt ist der Umgang mit den Daten in dieser Tabelle recht unkompliziert: Sie ermitteln die Lieferadresse aus den oberen Feldern und die Rechnungsadresse aus den unteren Feldern der Tabelle.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_001.png\" alt=\"Beispiel f&uuml;r eine Kundentabelle\" width=\"424,7115\" height=\"481,6208\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r eine Kundentabelle<\/span><\/b><\/p>\n<p>Etwas komplizierter wird es, wenn Liefer- und Rechnungsadresse identisch sind. Dann gilt es zun&auml;chst festzustellen, ob diese in den Feldern vorliegt, die mit <b>Liefer&#8230; <\/b>beginnen, oder in denen, die mit <b>Rechnung&#8230; <\/b>beginnen.<\/p>\n<p>Sie als menschlicher Beobachter erkennen dies normalerweise mit einem Blick, aber wenn wir sp&auml;ter automatisiert bestimmen wollen, welcher der beiden Bl&ouml;cke mit Adressinformationen die gesuchten Informationen liefert, brauchen wir ein auswertbares Kriterium. Wir k&ouml;nnen an dieser Stelle festlegen, dass zumindest f&uuml;r deutsche Adressen mindestens eine PLZ oder ein Ort vorliegen m&uuml;ssen. Bei den anderen Daten kann es vorkommen, dass das eine oder andere Feld fehlt. Eine Adresse kann zwar Firma und Name einer Person enthalten, aber es kann auch nur eine Firma oder nur eine Person geben. Und auch die Stra&szlig;e muss nicht zwangsl&auml;ufig angegeben werden, denn es gibt auch Adressen, die nur &uuml;ber Firma, Postleitzahl und Ort definiert werden.<\/p>\n<p>Also legen wir an dieser Stelle fest, dass die PLZ unser Kriterium sein soll, ob in den <b>Liefer&#8230;<\/b>-Feldern oder den <b>Rechnung&#8230;<\/b>-Feldern eine Adresse vorliegen soll.<\/p>\n<p>In der Tabelle <b>tblKunden <\/b>finden Sie &uuml;brigens die beiden Felder <b>LieferAnredeID <\/b>und <b>RechnungAnredeID<\/b>, die mit einer weiteren Tabelle namens <b>tblAnreden <\/b>verkn&uuml;pft sind.<\/p>\n<p>Im Folgenden wollen wir durch geeignete Konfigurationen und eine entsprechende VBA-Funktion sicherstellen, dass alle Varianten von Adressen wie in Bild 2 abgebildet in entsprechende Adressbl&ouml;cke umgewandelt werden k&ouml;nnen. Das hei&szlig;t, dass wir aus dem vollst&auml;ndigen Datensatz ganz oben die Lieferadresse aus den <b>Liefer&#8230;<\/b>-Feldern zusammenstellen und die Rechnungsadresse aus den <b>Rechnung&#8230;<\/b>-Feldern. F&uuml;r den zweiten Datensatz wollen wir die Lieferadresse aus den <b>Liefer&#8230;<\/b>-Feldern zusammenstellen &#8211; genau wie die Rechnungsadresse. Der dritte Datensatz enth&auml;lt nur Daten in den <b>Rechnung&#8230;<\/b>-Feldern, also sollen sowohl die Lieferadresse als auch die Rechnungsadresse aus diesen Feldern erstellt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_002.png\" alt=\"Verschiedene Konstellationen von Adressen\" width=\"700\" height=\"130,1536\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Verschiedene Konstellationen von Adressen<\/span><\/b><\/p>\n<h2>Einfache Benutzerf&uuml;hrung<\/h2>\n<p>Der Benutzer\/Entwickler, der mit dieser L&ouml;sung arbeitet, soll es m&ouml;glichst einfach haben, den Adressblock zu definieren. Daher wollen wir einige Daten in einer Konfigurationstabelle festlegen, die der Benutzer nach Wunsch bearbeiten kann.<\/p>\n<p>Diese Tabelle sieht im Entwurf wie in Bild 3 aus. Das erste Feld enth&auml;lt die Bezeichnung der jeweiligen Konfiguration. Das zweite und dritte Feld dienen der Eingabe eines Schemas f&uuml;r die Platzhalter, die in der Lieferadresse und der Rechnungsadresse verwendet werden sollen (mehr dazu weiter unten).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_003.png\" alt=\"Konfigurationstabelle\" width=\"649,559\" height=\"455,7864\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Konfigurationstabelle<\/span><\/b><\/p>\n<p>Das Feld <b>Standard <\/b>legt fest, ob die Quelltabelle standardm&auml;&szlig;ig die Lieferdaten enth&auml;lt oder die Rechnungsdaten und dass, sofern die jeweils andere Adresse fehlt, die als Standard festgelegte Adresse angelegt wird. Dieses Feld legen wir als Nachschlagefeld aus, allerdings ohne fremde Tabelle als Datensatzherkunft. Stattdessen legen wir f&uuml;r die Eigenschaft <b>Herkunftstyp <\/b>den Wert <b>Wertliste <\/b>fest und geben f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>die folgende Liste an:<\/p>\n<pre>\"Lieferadresse\";\"Rechnungsadresse\"<\/pre>\n<p>Dadurch zeigt das Feld diese beiden Eintr&auml;ge als m&ouml;gliche Werte an. Das Feld <b>Identifizierer <\/b>nimmt den Namen des Feldes auf, das entscheidet, ob die Daten der Liefer- oder Rechnungsadresse vorliegen oder nicht &#8211; wie oben beschrieben wollen wir hier das PLZ-Feld f&uuml;r die Liefer- oder die Rechnungsadresse verwenden. Wenn die Daten f&uuml;r die Lieferadresse immer eingetragen werden und die der Rechnungsadresse nur, wenn diese von der Lieferadresse abweicht, tragen wir etwa das Feld <b>RechnungPLZ <\/b>in das Feld <b>Identifizierer <\/b>ein, sonst das Feld <b>LieferPLZ<\/b>.<\/p>\n<p>Das Feld <b>TabelleAbfrage <\/b>nimmt den Namen der Tabelle oder Abfrage auf, die als Datenquelle f&uuml;r die Adressbl&ouml;cke verwendet werden soll. <b>Primaerschluesselfeld <\/b>legt fest, welches Feld das Prim&auml;rschl&uuml;sselfeld der in <b>TabelleAbfrage <\/b>festgelegten Tabelle oder Abfrage ist. Die folgenden beiden Felder sind vor allem interessant, wenn der Versand nicht nur in das gleiche, sondern auch in andere L&auml;nder erfolgt. Wenn Sie etwa eine Sendung innerhalb Deutschlands verschicken, geben Sie nur Firma, Name, Stra&szlig;e, PLZ und Ort im Adressblock an. Wenn die Sendung hingegen in das Ausland geht, f&uuml;gen Sie noch eine Zeile mit dem Zielland hinzu. Damit Sie definieren k&ouml;nnen, wann das Zielland angegeben werden soll und wann nicht, tragen Sie unter <b>NichtAuszugebendeLaender <\/b>eine Liste der L&auml;nder ein, f&uuml;r die das Land nicht in die Zieladresse &uuml;bernommen werden soll. Unter <b>FelderMitLaendern <\/b>geben Sie dann ein, welche Felder die L&auml;nder enthalten, in unserem Beispiel also etwa <b>LieferLand <\/b>und <b>RechnungLand<\/b>. Bei mehreren Eintr&auml;gen trennen Sie diese durch Semikola.<\/p>\n<h2>Formular zur Verwaltung der Konfigurationen<\/h2>\n<p>Diese Daten verwalten wir in einem Formular namens <b>frmKonfiguration<\/b>. Es ist an die Tabelle <b>tblKonfigurationen <\/b>gebunden und sieht in der Formularansicht wie in Bild 4 aus. Besonderheiten gibt es bei diesem Formular nicht &#8211; die Steuer-elemente werden nach dem Hineinziehen in den Detailbereich lediglich noch in der Gr&ouml;&szlig;e und Position angepasst.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_004.png\" alt=\"Formular zum Verwalten der Konfigurationen\" width=\"499,6607\" height=\"596,682\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Formular zum Verwalten der Konfigurationen<\/span><\/b><\/p>\n<h2>Anlegen einer Konfiguration<\/h2>\n<p>Noch nicht beschrieben haben wir den Inhalt der beiden Felder <b>KonfigurationLieferung <\/b>und <b>KonfigurationRechnung<\/b>. Hier gibt es verschiedene M&ouml;glichkeiten, die Felder der unter <b>TabelleAbfrage <\/b>als Datenquelle verwendeten Tabelle oder Abfrage einzutragen. Dazu schauen wir uns zun&auml;chst die Abfrage <b>qryKunden <\/b>an, welche die Daten der Tabelle <b>tblKunden <\/b>und <b>tblAnreden <\/b>in eine f&uuml;r unsere Zwecke optimal nutzbare Form bringt. Die Abfrage sieht im Entwurf wie in Bild 5 aus. Um diese zu erstellen, f&uuml;gen Sie zun&auml;chst die Tabelle <b>tblKunden <\/b>und dann zwei Mal die Tabelle <b>tblAnreden <\/b>zum Entwurf der Abfrage hinzu. Die erste Verkn&uuml;pfung zwischen dem Feld <b>LieferAnredeID <\/b>der Tabelle <b>tblKunden <\/b>und dem gleichnamigen Feld der Tabelle <b>tblAnreden <\/b>wird noch automatisch erstellt, die Verkn&uuml;pfung zwischen dem Feld <b>RechnungAnredeID <\/b>der Tabelle <b>tblKunden <\/b>und dem Feld <b>AnredeID <\/b>der zweiten Instanz der Tabelle <b>tblAnreden <\/b>im Entwurf m&uuml;ssen Sie per Drag and Drop zwischen den beiden Feldern selbst hinzuf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_005.png\" alt=\"Abfrage, welche die Daten der beteiligten Tabellen zusammenf&uuml;hrt\" width=\"700\" height=\"409,7365\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Abfrage, welche die Daten der beteiligten Tabellen zusammenf&uuml;hrt<\/span><\/b><\/p>\n<p>Wichtig ist, dass Sie die Verkn&uuml;pfungseigenschaften der beiden Verkn&uuml;pfungen bearbeiten. Wenn Sie dies nicht tun und enth&auml;lt beispielsweise das Feld <b>RechnungAnredeID <\/b>eines Datensatzes der Tabelle <b>tblKunden <\/b>keinen Wert und somit auch keine Verkn&uuml;pfung zur Tabelle <b>tblAnreden<\/b>, dann wird dieser Datensatz der Tabelle <b>tblKunden <\/b>nicht als Ergebnis der Abfrage <b>qryKunden <\/b>zur&uuml;ckgeliefert. Damit dies dennoch geschieht, stellen Sie in den Verkn&uuml;pfungseigenschaften der Beziehung die folgende Option ein:<\/p>\n<pre>Beinhaltet ALLE Datens&auml;tze aus ''tblKunden'' und nur die Datens&auml;tze aus ''tblAnreden'', bei denen die Inhalte der verkn&uuml;pften Felder beider Tabellen gleich sind.<\/pre>\n<p>Dann werden auch Daten aus <b>tblKunden <\/b>angezeigt, zu denen es nicht f&uuml;r beide Felder <b>LieferAnredeID <\/b>und <b>RechnungAnredeID <\/b>einen verkn&uuml;pften Datensatz in der Tabelle <b>tblAnreden <\/b>gibt.<\/p>\n<p>Die beiden verkn&uuml;pften Tabellen ziehen wir &uuml;brigens hinzu, um jeweils das Feld <b>Anrede <\/b>statt der Felder <b>LieferAnredeID <\/b>und <b>RechnungAnredeID <\/b>f&uuml;r die Zusammenstellung der Adressbl&ouml;cke bereitzustellen.<\/p>\n<p>Damit diese dann sp&auml;ter auch unterschieden werden k&ouml;nnen, obwohl sie den gleichen Feldnamen besitzen, stellen wir diesen noch jeweils den Alias <b>LieferAnrede <\/b>beziehungsweise <b>RechnungAnrede <\/b>voran, also etwa so:<\/p>\n<pre>LieferAnrede: Anrede<\/pre>\n<p>Nun erstellen wir die Vorlage f&uuml;r die beiden Konfigurationen f&uuml;r die Liefer- und die Rechnungsadresse. Dazu geben Sie den Platzhalter f&uuml;r einen Feldnamen aus der Datenquelle grunds&auml;tzlich in eckigen Klammern an.<\/p>\n<p>Wenn Sie also sicher sind, dass alle Felder der als Datenquelle verwendeten Tabelle ausgef&uuml;llt sind, k&ouml;nnen Sie eine Vorlage wie die folgende verwenden:<\/p>\n<pre>[LieferFirma]\r\n[LieferAnrede] [LieferVorname] [LieferNachname]\r\n[LieferZusatz]\r\n[LieferStrasse]\r\n[LieferPLZ] [LieferOrt]\r\n[LieferLand]<\/pre>\n<p>F&uuml;r die Rechnungsadresse sieht dies analog so aus:<\/p>\n<pre>[RechnungFirma]\r\n[RechnungAnrede] [RechnungVorname] [RechnungNachname]\r\n[RechnungZusatz]\r\n[RechnungStrasse]\r\n[RechnungPLZ] [RechnungOrt]\r\n[RechnungLand]<\/pre>\n<p>Nun kommt es allerdings vor, dass Informationen fehlen. Das ist kein Problem, wenn die komplette Zeile fehlt &#8211; diese wird dann von unserer Funktion einfach weggelassen. Fehlt also etwa die Zeile mit dem Platzhalter <b>LieferZusatz<\/b>, weil das gleichnamige Feld f&uuml;r den aktuellen Datensatz keinen Wert enth&auml;lt, dann wird die Zeile einfach weggelassen.<\/p>\n<p>Aber was, wenn beispielsweise das Feld <b>Firma <\/b>fehlt In diesem Fall w&uuml;rde ja die Zeile mit der Firma wegfallen &#8211; auch das w&auml;re kein Problem. Aber in diesem Fall m&ouml;chten wir zum Beispiel die Anrede in die erste Zeile holen, also etwa so:<\/p>\n<pre>Herrn\r\nAndr&eacute; Minhorst\r\nBorkhofer Str. 17\r\n47137 Duisburg<\/pre>\n<p>Mit Firma soll der Adressblock so aussehen:<\/p>\n<pre>Andr&eacute; Minhorst Verlag\r\nHerrn Andr&eacute; Minhorst\r\nBorkhofer Str. 17\r\n47137 Duisburg<\/pre>\n<p>Daf&uuml;r haben wir uns eine spezielle Notation f&uuml;r eine <b>If&#8230;Then&#8230;Else<\/b>-Bedingung ausgedacht. Sie k&ouml;nnen in einer eckigen Klammer nicht nur den Namen eines Feldes angeben, sondern bis zu drei durch das Pipe-Zeichen (<b>|<\/b>) getrennte Felder. Der erste Eintrag gibt dabei das Feld an, dessen Inhalt auf den Wert <b>Null <\/b>beziehungsweise auf eine leere Zeichenfolge gepr&uuml;ft wird.<\/p>\n<p>Der zweite Eintrag nimmt das Feld auf, das im Adressblock ausgegeben werden soll, wenn das im ersten Eintrag angegebene Feld nicht leer ist. Der dritte Eintrag nimmt das Feld auf, das im Adressblock erscheinen soll, wenn das im ersten Eintrag angegebene Feld leer bleibt. Der folgende Platzhalter sorgt also daf&uuml;r, dass die Funktion pr&uuml;ft, ob das Feld <b>LieferFirma <\/b>einen Wert enth&auml;lt. Falls ja, wird der Inhalt dieses Feldes ausgegeben, falls nicht, der Wert des Feldes <b>Anrede<\/b>:<\/p>\n<pre>[LieferFirma|Lieferfirma|LieferAnrede]<\/pre>\n<p>Wenn wir im gleichen Zuge daf&uuml;r sorgen wollen, dass, wenn das Feld <b>LieferFirma <\/b>einen Wert enth&auml;lt, die Anrede zusammen mit dem Vornamen und dem Nachnamen in die folgende Zeile gesetzt wird, verwenden wir die folgende Konstellation von Platzhaltern:<\/p>\n<pre>[LieferFirma|LieferAnrede] [LieferVorname] [LieferNachname]<\/pre>\n<h2>Anwendung der Funktion<\/h2>\n<p>F&uuml;r die Anwendung der Funktion namens <b>Adressblock <\/b>finden Sie im Modul <b>mdlTools <\/b>der Beispieldatenbank einige Beispiele. Die Funktion erwartet drei Parameter und liefert direkt den Adressblock als String zur&uuml;ck. Schauen wir uns den folgenden Aufruf an:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Adressblock(Lieferadresse, 1, 1)<\/pre>\n<p>Dieser liefert die Lieferadresse f&uuml;r die Konfiguration mit dem Wert <b>1 <\/b>im Feld <b>KonfigurationID <\/b>und f&uuml;r den Kunden mit dem Wert <b>1 <\/b>im Feld <b>KundeID<\/b>:<\/p>\n<pre>Andr&eacute; Minhorst Verlag\r\nHerr Andr&eacute; Minhorst\r\nLabor\r\nBorkhofer Str. 17\r\n47137 Duisburg<\/pre>\n<p>Wenn Sie die Rechnungsadresse f&uuml;r den gleichen Datensatz mit der gleichen Konfiguration ausgeben m&ouml;chten, verwenden Sie einfach Rechnungsadresse als ersten Parameter:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Adressblock(Rechnungsadresse, 1, 1)<\/pre>\n<p>Das Ergebnis sieht dann so aus:<\/p>\n<pre>Frau\r\nAnja Minhorst\r\nSchn&uuml;ranstr. 25\r\n47138 Duisburg<\/pre>\n<p>Auf die gleiche Weise k&ouml;nnen Sie durch Variation des zweiten und dritten Parameters andere Konfigurationen und nat&uuml;rlich auch andere Eintr&auml;ge der Kundentabelle zur Ausgabe der Adressbl&ouml;cke verwenden.<\/p>\n<p>Bei den beiden vorangegangenen Beispielen war als Land jeweils <b>Deutschland <\/b>angegeben. Wie weiter oben festgelegt, soll der Wert <b>Deutschland <\/b>f&uuml;r die beiden Felder <b>LieferLand <\/b>und <b>RechnungLand <\/b>ignoriert werden, was hier geschieht.<\/p>\n<p>Wenn Sie beispielsweise den vierten Eintrag der Beispieltabelle <b>tblKunden<\/b>, der das Land <b>Schweiz <\/b>verwendet, als Adressblock ausgeben wollen, sieht der Aufruf so aus:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Adressblock(Lieferadresse, 1, 4)<\/pre>\n<p>Dies ist der resultierende Adressblock:<\/p>\n<pre>Heinz M&uuml;ller AG\r\nHerr Heinz M&uuml;ller\r\nTestweg 2\r\n2222 Luzern\r\nSchweiz<\/pre>\n<h2>Programmierung der Funktion<\/h2>\n<p>Damit k&ouml;nnen wir uns nun an die Programmierung der Funktion machen, die aus der Tabelle <b>tblKunden <\/b>mithilfe der Konfiguration aus <b>tblKonfigurationen <\/b>einen Adressblock erstellt. Zun&auml;chst definieren wir eine Enumeration, welche die beiden Werte <b>Lieferadresse <\/b>(<b>0<\/b>) und <b>Rechnungsadresse <\/b>(<b>1<\/b>) festlegt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum eAdressart\r\n     Lieferadresse = 0\r\n     Rechnungsadresse = 1\r\nEnd Enum<\/pre>\n<p>Die Funktion <b>Adressblock <\/b>legt die Enumeration f&uuml;r den Parameter <b>lngAdressart <\/b>als Datentyp fest, sodass Sie per IntelliSense direkt bei der Definition des Aufrufs der Funktion auf die beiden bereitstehenden Werte zugreifen k&ouml;nnen (s. Bild 6). Die beiden &uuml;brigen Parameter <b>lngKonfigurationID <\/b>und <b>lngKundeID <\/b>haben jeweils den Datentyp <b>Long<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_03\/pic_1090_006.png\" alt=\"IntelliSense beim Funktionsaufruf\" width=\"599,593\" height=\"238,0736\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: IntelliSense beim Funktionsaufruf<\/span><\/b><\/p>\n<p>Die Funktion sieht wie in Listing 1 aus und erstellt zun&auml;chst ein Recordset auf Basis der Tabelle <b>tblKonfigurationen <\/b>f&uuml;r den mit dem Parameter <b>lngKonfigurationID <\/b>&uuml;bergebenen Prim&auml;rschl&uuml;sselwert. Das Gleiche erledigt sie f&uuml;r die Tabelle <b>tblKunden<\/b>, deren Datensatz mit dem Wert des Parameters <b>lngKundeID <\/b>als Prim&auml;rschl&uuml;sselwert in der Variablen <b>rstKunde <\/b>landet. Eine erste Hilfsfunktion namens <b>VorlageErmitteln <\/b>ermittelt die Vorlage f&uuml;r die angegebene Adressart aus <b>lngAdressart<\/b>, die Konfiguration aus <b>rst <\/b>und den Kunden aus <b>rstKunde<\/b>. Diese Funktion liefert den Inhalt eines der beiden Felder <b>KonfigurationRechnung <\/b>oder <b>KonfigurationLieferung <\/b>aus der Tabelle <b>tblKonfigurationen <\/b>zur&uuml;ck, die f&uuml;r die aktuelle Konstellation ben&ouml;tigt wird.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Adressblock(lngAdressart<span style=\"color:blue;\"> As <\/span>eAdressart, lngKonfigurationID<span style=\"color:blue;\"> As Long<\/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, rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, rstKunde<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strVorlage<span style=\"color:blue;\"> As String<\/span>, strZeilen()<span style=\"color:blue;\"> As String<\/span>, strFeld<span style=\"color:blue;\"> As String<\/span>, i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStart<span style=\"color:blue;\"> As Integer<\/span>, intEnde<span style=\"color:blue;\"> As Integer<\/span>, strElement<span style=\"color:blue;\"> As String<\/span>, strZeile<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strZwischen<span style=\"color:blue;\"> As String<\/span>, strVorhanden<span style=\"color:blue;\"> As String<\/span>, strAdressblock<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblKonfigurationen WHERE KonfigurationID = \" _\r\n& lngKonfigurationID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstKunde = db.OpenRecordset(\"SELECT * FROM \" & rst!TabelleAbfrage & \" WHERE \" & rst!Primaerschluesselfeld _\r\n         & \" = \" & lngID, dbOpenDynaset)\r\n     strVorlage = VorlageErmitteln(lngAdressart, rst, rstKunde)\r\n     strZeilen = <span style=\"color:blue;\">Split<\/span>(strVorlage, <span style=\"color:blue;\">vbCrLf<\/span>)\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strZeilen) To <span style=\"color:blue;\">UBound<\/span>(strZeilen)\r\n         strZeile = \"\"\r\n         intStart = <span style=\"color:blue;\">InStr<\/span>(1, strZeilen(i), \"[\")\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intStart = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strZwischen = <span style=\"color:blue;\">Mid<\/span>(strZeilen(i), 1, intStart - 1)\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strZwischen = strZeilen(i)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strZeile = strZeile & strZwischen\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> intStart = 0\r\n             intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart + 1, strZeilen(i), \"]\")\r\n             strElement = <span style=\"color:blue;\">Mid<\/span>(strZeilen(i), intStart, intEnde - intStart + 1)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strElement, \"|\") &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strVorhanden = <span style=\"color:blue;\">Mid<\/span>(strElement, 2, <span style=\"color:blue;\">InStr<\/span>(2, strElement, \"|\") - 2)\r\n                 <span style=\"color:blue;\">If <\/span>Nz(rstKunde(strVorhanden), \"\") = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                     strFeld = ElseFeldLesen(strElement)\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     strFeld = ThenFeldLesen(strElement)\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strFeld = <span style=\"color:blue;\">Mid<\/span>(strElement, 2, <span style=\"color:blue;\">Len<\/span>(strElement) - 2)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             strZeile = strZeile & WertLesen(rstKunde, strFeld, rst!FelderMitLaendern, rst!NichtAuszugebendeLaender)\r\n             intStart = <span style=\"color:blue;\">InStr<\/span>(intEnde + 1, strZeilen(i), \"[\")\r\n             <span style=\"color:blue;\">If <\/span>intStart &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strZwischen = <span style=\"color:blue;\">Mid<\/span>(strZeilen(i), intEnde + 1, intStart - intEnde - 1)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             strZeile = strZeile & strZwischen\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         strZeile = <span style=\"color:blue;\">Trim<\/span>(strZeile)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strZeile) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strAdressblock = strAdressblock & <span style=\"color:blue;\">vbCrLf<\/span> & strZeile\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     strAdressblock = DoppelteLeerzeichenEntfernen(strAdressblock)\r\n     Adressblock = strAdressblock\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Funktion Adressblock<\/span><\/b><\/p>\n<h2>Funktion zum Ermitteln der Vorlage<\/h2>\n<p>Die Funktion <b>VorlageErmitteln <\/b>pr&uuml;ft in einer ersten <b>If&#8230;Then<\/b>-Bedingung, ob der Wert von <b>lngAdressart <\/b>mit dem Wert des Eintrags <b>Lieferadresse <\/b>der Enumeration <b>eAdressart <\/b>&uuml;bereinstimmt (s. Listing 2). In diesem Fall soll die Vorlage f&uuml;r die Lieferadresse zur&uuml;ckgeliefert werden. Es folgt nun eine weitere <b>If&#8230;Then<\/b>-Bedingung, die pr&uuml;ft, ob die Lieferadresse die Standardadresse der aktuellen Konfiguration ist, also ob diese immer gef&uuml;llt wird und die Rechnungsadresse nur erg&auml;nzt wird, wenn diese sich von der Lieferadresse unterscheidet. In diesem Fall tr&auml;gt die Funktion einfach die Konfiguration aus dem Feld <b>KonfigurationLieferung <\/b>in die Variable <b>strVorlage <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VorlageErmitteln(lngAdressart<span style=\"color:blue;\"> As Long<\/span>, rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, rstKunde<span style=\"color:blue;\"> As <\/span>DAO.Recordset)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVorlage<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>lngAdressart = eAdressart.Lieferadresse<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>rst!Standard = \"Lieferadresse\"<span style=\"color:blue;\"> Then<\/span>\r\n             strVorlage = rst!KonfigurationLieferung\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(rstKunde(rst!Identifizierer), \"\") = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                 strVorlage = rst!KonfigurationRechnung\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strVorlage = rst!KonfigurationLieferung\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>rst!Standard = \"Rechnungsadresse\"<span style=\"color:blue;\"> Then<\/span>\r\n             strVorlage = rst!KonfigurationRechnung\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Nz(rstKunde(rst!Identifizierer), \"\") = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n                 strVorlage = rst!KonfigurationRechnung\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strVorlage = rst!KonfigurationLieferung\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     VorlageErmitteln = strVorlage\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Funktion VorlageErmitteln<\/span><\/b><\/p>\n<p>Falls es nicht die Standardadresse ist, pr&uuml;ft die Funktion, ob f&uuml;r diesen Adresstyp, hier die Lieferadresse, Daten hinterlegt sind, und zwar anhand des Feldes, das f&uuml;r das Feld <b>Identifizierer <\/b>hinterlegt ist (hier <b>RechnungPLZ<\/b>). Falls nicht, wird die Vorlage aus dem Feld  <b>KonfigurationRechnung <\/b>an <b>strVorlage <\/b>&uuml;bergeben, sonst <b>KonfigurationLieferung<\/b>.<\/p>\n<p>Sollte es sich bei dem zu erstellenden Adressblock um den f&uuml;r eine Rechnung handeln, wird dies im <b>Else<\/b>-Teil der &auml;u&szlig;eren <b>If&#8230;Then<\/b>-Bedingung abgehandelt. Hier erfolgt die Abarbeitung umgekehrt: Ist die Rechnungsadresse als Standard im Feld <b>Standard <\/b>voreingestellt, dann verwenden wir in <b>strVorlage <\/b>die Vorlage aus dem Feld <b>KonfigurationRechnung<\/b>.<\/p>\n<p>Anderenfalls pr&uuml;fen wir wieder, ob das als Identifizierer angegebene Feld, hier nun beispielsweise <b>LieferungPLZ<\/b>, der Datenquelle einen Wert enth&auml;lt. Falls nicht, kommt der Adressblock aus dem Feld <b>KonfigurationRechnung<\/b>, sonst aus dem Feld <b>KonfigurationLieferung<\/b>.<\/p>\n<p>Der Wert von <b>strVorlage <\/b>wird nun als Funktionswert mit der Variablen <b>VorlageErmitteln <\/b>an die aufrufende Funktion zur&uuml;ckgegeben.<\/p>\n<h2>Abarbeiten der einzelnen Zeilen der Vorlage<\/h2>\n<p>Zur&uuml;ck zur aufrufenden Funktion <b>Adressblock<\/b>. Hier landet das Ergebnis der Funktion <b>VorlageErmitteln <\/b>nun in der Variablen <b>strVorlage<\/b>. Die <b>Split<\/b>-Funktion nimmt die in <b>strVorlage <\/b>gespeicherte Vorlage und teilt diese in einzelne Zeilen auf, die in einem Array namens <b>strZeilen() <\/b>landen.<\/p>\n<p>Dieses durchlaufen wir in einer <b>For&#8230;Next<\/b>-Schleife mit dem Laufparameter <b>i<\/b>. Die Variable <b>strZeile<\/b>, die sp&auml;ter die mit den tats&auml;chlichen Werten der Datenquelle gef&uuml;llte Zeile der Vorlage enthalten soll, wird zun&auml;chst geleert, da sie in der Schleife immer wieder neu gef&uuml;llt werden soll. <\/p>\n<p>Wir ermitteln nun die Startposition des ersten Platzhalters, indem wir mit der <b>InStr<\/b>-Funktion nach dem ersten Auftreten der &ouml;ffnenden eckigen Klammer (<b>[<\/b>) in der in <b>strZeilen(i) <\/b>gespeicherten aktuellen Zeile suchen und diese in <b>intStart <\/b>speichern.<\/p>\n<p>Hat <b>intStart <\/b>nicht den Wert <b>0<\/b>, was darauf hindeuten w&uuml;rde, dass sich in dieser Zeile kein Platzhalter befindet, lesen wir den Inhalt der Zeile vom ersten Zeichen bis zu dem mit <b>intStart <\/b>markierten Zeichen in die Variable <b>strZwischen <\/b>ein. Hat <b>intStart <\/b>hingegen den Wert <b>0<\/b>, landet der gesamte Inhalt der Zeile in der Variablen <b>strZwischen<\/b>.<\/p>\n<p>Der Inhalt von <b>strZwischen <\/b>wird dann an <b>strZeile <\/b>angeh&auml;ngt. Dann durchlaufen wir eine <b>Do While<\/b>-Schleife, die erst dann endet, wenn <b>intStart <\/b>den Wert <b>0 <\/b>annimmt. Dies k&ouml;nnte schon der Fall sein, wenn die Zeile keinen Platzhalter enth&auml;lt &#8211; dann w&auml;re die Schleife vor dem ersten Durchlauf beendet und es w&uuml;rde der aktuelle Inhalt von <b>strZeile <\/b>um f&uuml;hrende und folgende Leerzeichen erleichtert und zur Variablen <b>strAdressblock <\/b>hinzugef&uuml;gt.<\/p>\n<p>Anderenfalls steigen wir in die Abarbeitung der <b>Do While<\/b>-Schleife ein, in der wir zun&auml;chst die Variable <b>intEnde <\/b>mit der Position der ersten schlie&szlig;enden eckigen Klammer der Zeile f&uuml;llen. Das erste Element ist nun der Bereich von der &ouml;ffnenden eckigen Klammer (<b>intStart<\/b>) bis zur schlie&szlig;enden eckigen Klammer (<b>intEnde &#8211; intStart + 1<\/b>), also beispielsweise <b>[LieferFirma]<\/b>. Dieser Ausdruck wird in der Variablen <b>strElement <\/b>gespeichert.<\/p>\n<p>Nun untersuchen wir, ob es sich um eines der Elemente handelt, die wie weiter oben beschrieben eine <b>If&#8230;Then&#8230;Else<\/b>-Bedingung abbilden. Dazu pr&uuml;fen wir, ob sich innerhalb des Elements ein Pipe-Zeichen befindet (<b>|<\/b>). Falls ja, tragen wir den Inhalt von <b>strElement <\/b>von hinter der &ouml;ffnenden eckigen Klammer bis zum ersten Pipe-Zeichen in die Variable <b>strVorhanden <\/b>ein. Sollte das in <b>strVorhanden <\/b>gespeicherte Feld im Recordset <b>rstKunde <\/b>keinen Wert enthalten, was wir in der folgenden <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen, dann tragen wir das Ergebnis der Funktion <b>ElseFeldLesen <\/b>in die Variable <b>strFeld <\/b>ein.<\/p>\n<p>Die Funktion ermittelt den Wert des Recordsets <b>rstKunde <\/b>f&uuml;r das Feld, das als <b>Else<\/b>-Teil in <b>strElement <\/b>eingetragen ist (bei <b>[Liefer-Firma|LieferFirma|LieferAnrede] <\/b>also beispielsweise das Feld <b>Anrede<\/b>. Anderenfalls greifen wir mit der Funktion <b>ThenFeldLesen <\/b>auf das <b>Then<\/b>-Feld zu, hier also <b>LieferFirma<\/b>.<\/p>\n<h2>Die Funktionen ThenFeldLesen und ElseFeldLesen<\/h2>\n<p>Die Funktion <b>ThenFeldLesen <\/b>ermittelt aus einem String wie <b>[LieferFirma|LieferFirma|LieferAnrede] <\/b>das mittlere Element, also <b>LieferFirma<\/b>. Dazu erwartet sie lediglich die Zeichenfolge in eckigen Klammern (s. Listing 3). Sie ermittelt dann f&uuml;r die Variable <b>intStart <\/b>die Position des ersten Pipe-Zeichens in der mit <b>strElement <\/b>&uuml;bergebenen Zeichenfolge, in diesem Fall also den Wert <b>13<\/b>. Dann liest sie die Position des zweiten Pipe-Zeichens ein, hier auf der Position <b>25<\/b>. Wenn es kein zweites Pipe-Zeichen gibt, enth&auml;lt <b>intEnde <\/b>nun den Wert <b>0<\/b>. In diesem Fall wird der <b>Then<\/b>-Teil der folgenden <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt. Hier ermittelt die Funktion nun mit <b>InStr <\/b>die Position der schlie&szlig;enden Klammer und speichert diese in <b>intEnde<\/b>. Anschlie&szlig;end liest sie mit der <b>Mid<\/b>-Funktion den Inhalt von der Position <b>intStart <\/b>mit der L&auml;nge <b>intEnde &#8211; intStart &#8211; 1 <\/b>ein und speichert das Ergebnis in der Variablen <b>strFeld<\/b>. Dieser Wert dient dann auch als R&uuml;ckgabewert der Funktion.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ThenFeldLesen(strElement<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intEnde<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeld<span style=\"color:blue;\"> As String<\/span>\r\n     intStart = <span style=\"color:blue;\">InStr<\/span>(1, strElement, \"|\")\r\n     intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart + 1, strElement, \"|\")\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strElement, intStart, intEnde\r\n     <span style=\"color:blue;\">If <\/span>intEnde = 0<span style=\"color:blue;\"> Then<\/span>\r\n         intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart, strElement, \"]\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strFeld = <span style=\"color:blue;\">Mid<\/span>(strElement, intStart + 1, intEnde - intStart - 1)\r\n     ThenFeldLesen = strFeld\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion ThenFeldLesen<\/span><\/b><\/p>\n<p>Die Funktion <b>ElseFeldLesen<\/b> arbeitet etwas anders, da bei dieser auch eine leere Zeichenfolge zur&uuml;ckgegeben werden kann (s. Listing 4). Sie ermittelt zun&auml;chst die Position des ersten Pipe-Zeichens, das ja auf jeden Fall vorliegen muss, und speichert es in <b>intStart<\/b>. Dann versucht sie, ein zweites Pipe-Zeichen zu finden, und speichert es in <b>intEnde<\/b>. Hat <b>intEnde <\/b>dann den Wert <b>0<\/b>, befindet sich nur ein Pipe-Zeichen in <b>strElement<\/b>, was etwa so aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ElseFeldLesen(strElement<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intEnde<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeld<span style=\"color:blue;\"> As String<\/span>\r\n     intStart = <span style=\"color:blue;\">InStr<\/span>(1, strElement, \"|\")\r\n     intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart + 1, strElement, \"|\")\r\n     <span style=\"color:blue;\">If <\/span>intEnde = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFeld = \"\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         intStart = intEnde\r\n         intEnde = <span style=\"color:blue;\">InStr<\/span>(intStart + 1, strElement, \"]\")\r\n         strFeld = <span style=\"color:blue;\">Mid<\/span>(strElement, intStart + 1, intEnde - intStart - 1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>FeldLesen = strFeld\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Funktion ElseFeldLesen<\/span><\/b><\/p>\n<pre>[LieferFirma|LieferAnrede]<\/pre>\n<p>In diesem Fall greift der erste Teil der nun folgenden <b>If&#8230;Then<\/b>-Bedingung und <b>strFeld <\/b>wird mit einer leeren Zeichenkette gef&uuml;llt. Hat <b>intEnde <\/b>hingegen einen Wert ungleich <b>0<\/b>, landet der Wert von <b>intEnde <\/b>im zweiten Teil in der Variablen, bevor die Funktion dort mit <b>InStr <\/b>die Position der schlie&szlig;enden eckigen Klammer ermittelt. Damit liest die Funktion dann den Wert zwischen dem zweiten Pipe-Zeichen und der schlie&szlig;enden eckigen Klammer in die Variable <b>strFeld <\/b>ein. <b>strFeld <\/b>wird anschlie&szlig;end dem Funktionswert der Funktion zugewiesen. Wenn die Zeile aus <b>strElement <\/b>kein Pipe-Zeichen enthielt, wird im <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung einfach der Inhalt des Platzhalters zwischen der &ouml;ffnenden und der schlie&szlig;enden Klammer ermittelt und in die Variable <b>strFeld <\/b>eingetragen.<\/p>\n<h2>Zeile mit Feldwert erweitern<\/h2>\n<p>In der Funktion <b>Adressblock <\/b>geht es nun nach dem Ermitteln des aktuellen Feldes aus einem einfachen Platzhalter wie <b>[LieferVorname] <\/b>oder aus einem <b>If&#8230;Then<\/b>-Element wie <b>[LieferFirma|LieferFirma|LieferAnrede] <\/b>hinter der <b>If&#8230;Then<\/b>-Bedingung weiter. Hier ruft die Routine nun die Funktion <b>WertLesen <\/b>auf, der sie das Recordset mit dem Kundendatensatz, den Feldnamen mit <b>strFeld <\/b>und die Inhalte der beiden Felder <b>FeldMitLaendern <\/b>und <b>NichtAuszugebendeLaender <\/b>des Recordsets der aktuellen Konfiguration &uuml;bergibt.<\/p>\n<p>Die Funktion <b>WertLesen <\/b>finden Sie in Listing 5. Sie erwartet die genannten Parameter und pr&uuml;ft zun&auml;chst, ob <b>strFeld <\/b>&uuml;berhaupt eine Zeichenkette mit mehr als <b>0 <\/b>Zeichen enth&auml;lt. Dann deaktiviert sie die Fehlerbehandlung, da nun der Zugriff auf das Feld mit dem Namen aus <b>strFeld <\/b>erfolgt, also beispielsweise <b>LieferFirma<\/b>. Die Fehlerbehandlung wird ausgesetzt, da es ja sein kann, dass der Benutzer einen Tippfehler eingebaut hat und das angegebene Feld gar nicht in der Tabelle mit dem Kunden vorhanden ist.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WertLesen(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, strFeld<span style=\"color:blue;\"> As String<\/span>, strFelderMitLaendern<span style=\"color:blue;\"> As String<\/span>, _\r\n         strNichtAuszugebendeLaender<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFeld) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strWert = rst(strFeld)\r\n         <span style=\"color:blue;\">If <\/span>Err.Number = 3265<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Das Feld ''\" & strFeld & \"'' ist nicht in der Datenherkunft definiert.\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>FeldNutzbar(strFeld, strWert, strFelderMitLaendern, strNichtAuszugebendeLaender)<span style=\"color:blue;\"> Then<\/span>\r\n         WertLesen = strWert\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Funktion WertLesen<\/span><\/b><\/p>\n<p>Dies l&ouml;st den Fehler mit der Nummer <b>3265 <\/b>aus, den wir mit einer entsprechenden Fehlermeldung quittieren, und wir verlassen die Funktion. Ist das Feld vorhanden und der Wert in die Variable <b>strWert <\/b>&uuml;bertragen, wird die Funktion <b>FeldNutzbar <\/b>mit &auml;hnlichen Parametern aufgerufen wie die aktuelle Funktion (s. Listing 6). Diesmal handelt es sich um den Feldnamen (<b>strFeld<\/b>), den Wert (<b>strWert<\/b>), die Liste der Felder, die L&auml;nder enthalten (<b>strFelderMitLaendern<\/b>, zum Beispiel <b>LieferLand;RechnungLand<\/b>) und die Liste der L&auml;nder, die nicht im Adressblock erscheinen sollen (<b>strNichtAuszugebendeLaender<\/b>, zum Beispiel <b>Deutschland<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FeldNutzbar(strFeld<span style=\"color:blue;\"> As String<\/span>, strWert<span style=\"color:blue;\"> As String<\/span>, strFelderMitLaendern<span style=\"color:blue;\"> As String<\/span>, _\r\n         strNichtAuszugebendeLaender<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLandfelder()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLaender()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolTemp<span style=\"color:blue;\"> As Boolean<\/span>\r\n     strLandfelder = <span style=\"color:blue;\">Split<\/span>(strFelderMitLaendern, \";\")\r\n     strLaender = <span style=\"color:blue;\">Split<\/span>(strNichtAuszugebendeLaender, \";\")\r\n     bolTemp = <span style=\"color:blue;\">True<\/span>\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strLandfelder) To <span style=\"color:blue;\">UBound<\/span>(strLandfelder)\r\n         <span style=\"color:blue;\">If <\/span>strFeld = strLandfelder(i)<span style=\"color:blue;\"> Then<\/span>\r\n             For j = <span style=\"color:blue;\">LBound<\/span>(strLaender) To <span style=\"color:blue;\">UBound<\/span>(strLaender)\r\n                 <span style=\"color:blue;\">If <\/span>strWert = strLaender(j)<span style=\"color:blue;\"> Then<\/span>\r\n                     bolTemp = <span style=\"color:blue;\">False<\/span>\r\n                     <span style=\"color:blue;\">Exit Function<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> j\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     FeldNutzbar = bolTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Funktion FeldNutzbar<\/span><\/b><\/p>\n<p>Diese Funktion hat die Aufgabe herauszufinden, ob das aktuelle Feld eines der Felder ist, die L&auml;nder enthalten, und ob dieses Feld ein Land als Wert enth&auml;lt, das nicht in die Adresse eingef&uuml;gt werden soll &#8211; was zum Beispiel mit dem Land <b>Deutschland <\/b>f&uuml;r Sendungen innerhalb Deutschlands der Fall ist. Dazu definiert die Funktion zwei Arrays namens <b>strLandfelder <\/b>und <b>strLaender<\/b>, welche &uuml;ber die <b>Split<\/b>-Funktion mit den durch Semikola getrennten Eintr&auml;gen der beiden Zeichenketten <b>strFelderMitLaendern <\/b>und <b>strNichtAuszugebendeLaender <\/b>gef&uuml;llt werden. Sie setzt den Wert der Variablen <b>bolTemp <\/b>auf den Wert <b>True<\/b>, denn grunds&auml;tzlich soll angenommen werden, dass die Kombination aus Feld und Feldwert im Adressblock verwendet werden soll. Erst in den folgenden beiden verschachtelten <b>For&#8230;Next<\/b>-Schleifen pr&uuml;fen wir, ob eine Konstellation vorliegt, bei der der Feldwert nicht im Adressblock erscheinen soll. Die &auml;u&szlig;ere <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft alle Elemente des Arrays <b>strLandfelder<\/b>. Entspricht das mit <b>strFeld <\/b>&uuml;bergebene Feld dem Wert des aktuell durchlaufenen Array-Eintrags, wird auch die innere <b>For&#8230;Next<\/b>-Schleife durchlaufen. Entspricht der Inhalt von <b>strWert <\/b>auch noch einem der Eintr&auml;ge der Auflistung <b>strLaender<\/b>, dann liegt tats&auml;chlich eine Konstellation vor, bei welcher der Wert nicht im Adressblock landen soll, und der R&uuml;ckgabewert der Funktion wird &uuml;ber die Variable <b>bolTemp <\/b>auf <b>False <\/b>eingestellt und die Funktion verlassen.<\/p>\n<p>Damit kehren wir zur aufrufenden Funktion <b>WertLesen<\/b> zur&uuml;ck, die nun abh&auml;ngig vom Ergebnis den Inhalt von <b>strWert <\/b>als R&uuml;ckgabewert der Funktion festlegt oder eben eine leere Zeichenfolge zur&uuml;ckgibt.<\/p>\n<p>Dies f&uuml;hrt uns noch einen Schritt weiter nach oben in der Aufrufhierarchie, wo wir in der Funktion <b>Adressblock <\/b>den mit der Funktion <b>WertLesen <\/b>ermittelten Wert an die Variable <b>strZeile <\/b>anf&uuml;gen, die ja aus keinem, einem oder auch mehreren f&uuml;r einen Platzhalter ersetzten Element bestehen kann.<\/p>\n<p>Danach lesen wir die Position der n&auml;chsten &ouml;ffnenden eckigen Klammer der aktuellen Platzhalterzeile in die Variable <b>intStart <\/b>ein. Ist <b>intStart <\/b>gr&ouml;&szlig;er <b>0<\/b>, liegt mindestens ein weiterer Platzhalter vor. Nun kann es sein, dass sich zwischen zwei Platzhaltern weitere Zeichen befinden, in der Regel zumindest ein Leerzeichen. Dieses ermitteln wir mit der <b>Mid<\/b>-Funktion f&uuml;r den Bereich von der mit <b>intEnde <\/b>festgelegten bis zu der mit <b>intStart <\/b>festgelegten Position und tragen diese in die Variable <b>strZwischen <\/b>ein. Der Inhalt dieser Variablen landet anschlie&szlig;end unmittelbar in der Zeile <b>strZeile<\/b>, bevor wir zum n&auml;chsten Durchlauf der <b>Do While<\/b>-Schleife ansetzen, um weitere Elemente in eckigen Klammern zu identifizieren und zu analysieren.<\/p>\n<p>Nach dem Beenden einer Zeile und dem Verlassen der <b>Do While<\/b>-Schleife wird die aktuelle Zeile um f&uuml;hrende und folgende Leerzeichen erleichtert und per Zeilenumbruch von der vorherigen Zeile getrennt an den in <b>strAdressblock <\/b>gespeicherten Adressblock angeh&auml;ngt.<\/p>\n<p>Schlie&szlig;lich ruft die Funktion noch eine weitere Hilfsfunktion namens <b>DoppelteLeerzeichenEntfernen <\/b>auf, die eventuell fehlerhaft eingef&uuml;gte Leerzeichen zwischen den einzelnen Elementen einer Zeile entfernt. Diese Funktion finden Sie in Listing 7. Die Funktion pr&uuml;ft zun&auml;chst, ob die Zeichenkette schon leer ist, was zum Verlassen der Funktion f&uuml;hrt. Anderenfalls durchl&auml;uft sie eine <b>Do While<\/b>-Schleife so lange, bis eine in der Abbruchbedingung definierte <b>InStr<\/b>-Funktion keine weiteren doppelten Leerzeichen mehr im zu untersuchenden Ausdruck findet. W&auml;hrend der Durchl&auml;ufe der Schleife ersetzt sie jeweils doppelte Leerzeichen durch einfache Leerzeichen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DoppelteLeerzeichenEntfernen(strText<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strTemp = strText\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">InStr<\/span>(1, strTemp, \"  \") = 0\r\n         strTemp = <span style=\"color:blue;\">Replace<\/span>(strTemp, \"  \", \" \")\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     DoppelteLeerzeichenEntfernen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion DoppelteLeerzeichenEntfernen<\/span><\/b><\/p>\n<p>Das Ergebnis gibt die aufrufende Funktion <b>Adressblock <\/b>dann als Funktionswert zur&uuml;ck.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Das waren einige Codezeilen, die allerdings nur einmal angelegt werden m&uuml;ssen, um dann ihren Dienst in allen Datenbanken zu verrichten, die Adressbl&ouml;cke aus den in einer Adresstabelle vorhandenen Daten erstellen m&uuml;ssen.<\/p>\n<p>Einen Beispieleinsatzzweck finden Sie beispielsweise im Beitrag <b>Mails mit Vorlage <\/b>(<b>www.access-im-unternehmen.de\/1088<\/b>), wo wir die Adresse des Kunden einlesen und in einer Mail an den Kunden als Adressblock ausgeben, damit er die Korrektheit der Adresse pr&uuml;fen kann.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DynamischerAdressblock.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/2D1BF774-39A1-4C75-A737-5785473B4F40\/aiu_1090.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie einen Adressblock etwa f&uuml;r die Anzeige in einem Bericht oder f&uuml;r anderweitige Nutzung zusammenstellen wollen, sto&szlig;en Sie mitunter auf eine anspruchsvolle Aufgabe. Dummerweise sind die Kundentabellen, aus denen die Adressen bezogen werden sollen, immer unterschiedlich aufgebaut. Noch dazu gibt es manchmal nicht nur eine einzige Adresse, sondern Liefer- und Rechnungsadresse. Dabei treten wiederum Unterschiede auf, wo die prim&auml;re Adresse eingetragen wird &#8211; also die Adresse, die als Rechnungs- und Lieferadresse genutzt wird, wenn nur eine Lieferadresse oder nur eine Rechnungsadresse vorliegt. Dieser Beitrag zeigt eine Funktion, mit der Sie die Adressbl&ouml;cke f&uuml;r Ihren Einsatzzweck komfortabel zusammenstellen 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":[662017,66032017,44000027],"tags":[],"class_list":["post-55001090","post","type-post","status-publish","format-standard","hentry","category-662017","category-66032017","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>Dynamischer Adressblock - 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\/Dynamischer_Adressblock\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dynamischer Adressblock\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie einen Adressblock etwa f&uuml;r die Anzeige in einem Bericht oder f&uuml;r anderweitige Nutzung zusammenstellen wollen, sto&szlig;en Sie mitunter auf eine anspruchsvolle Aufgabe. Dummerweise sind die Kundentabellen, aus denen die Adressen bezogen werden sollen, immer unterschiedlich aufgebaut. Noch dazu gibt es manchmal nicht nur eine einzige Adresse, sondern Liefer- und Rechnungsadresse. Dabei treten wiederum Unterschiede auf, wo die prim&auml;re Adresse eingetragen wird - also die Adresse, die als Rechnungs- und Lieferadresse genutzt wird, wenn nur eine Lieferadresse oder nur eine Rechnungsadresse vorliegt. Dieser Beitrag zeigt eine Funktion, mit der Sie die Adressbl&ouml;cke f&uuml;r Ihren Einsatzzweck komfortabel zusammenstellen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:42:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"25\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dynamischer Adressblock\",\"datePublished\":\"2020-05-14T13:42:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/\"},\"wordCount\":4190,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b2f15b14f31f4ef18d7d422da00d9af9\",\"articleSection\":[\"2017\",\"3\\\/2017\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/\",\"name\":\"Dynamischer Adressblock - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b2f15b14f31f4ef18d7d422da00d9af9\",\"datePublished\":\"2020-05-14T13:42:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b2f15b14f31f4ef18d7d422da00d9af9\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/b2f15b14f31f4ef18d7d422da00d9af9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dynamischer_Adressblock\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamischer Adressblock\"}]},{\"@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":"Dynamischer Adressblock - 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\/Dynamischer_Adressblock\/","og_locale":"de_DE","og_type":"article","og_title":"Dynamischer Adressblock","og_description":"Wenn Sie einen Adressblock etwa f&uuml;r die Anzeige in einem Bericht oder f&uuml;r anderweitige Nutzung zusammenstellen wollen, sto&szlig;en Sie mitunter auf eine anspruchsvolle Aufgabe. Dummerweise sind die Kundentabellen, aus denen die Adressen bezogen werden sollen, immer unterschiedlich aufgebaut. Noch dazu gibt es manchmal nicht nur eine einzige Adresse, sondern Liefer- und Rechnungsadresse. Dabei treten wiederum Unterschiede auf, wo die prim&auml;re Adresse eingetragen wird - also die Adresse, die als Rechnungs- und Lieferadresse genutzt wird, wenn nur eine Lieferadresse oder nur eine Rechnungsadresse vorliegt. Dieser Beitrag zeigt eine Funktion, mit der Sie die Adressbl&ouml;cke f&uuml;r Ihren Einsatzzweck komfortabel zusammenstellen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:42:59+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"25\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dynamischer Adressblock","datePublished":"2020-05-14T13:42:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/"},"wordCount":4190,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9","articleSection":["2017","3\/2017","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/","url":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/","name":"Dynamischer Adressblock - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9","datePublished":"2020-05-14T13:42:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/b2f15b14f31f4ef18d7d422da00d9af9"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Dynamischer_Adressblock\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dynamischer Adressblock"}]},{"@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\/55001090","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=55001090"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001090\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}