{"id":55001417,"date":"2023-02-01T00:00:00","date_gmt":"2023-06-17T09:32:54","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1417"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Formatassistent_fuer_Textfelder","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/","title":{"rendered":"Formatassistent f&uuml;r Textfelder"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Access liefert standardm&auml;&szlig;ig bereits einige Assistenten mit. F&uuml;r die Format-Eigenschaft jedoch liefert es nur ein Auswahlfeld mit einigen voreingestellten Optionen wie verschiedneen Zeit-, Zahlen und Boolean-Formaten. Diese dienen durchaus als gute Beispiele, wie man selbst Formatierungen vornehmen kann, aber wenn man sich dann an diese Aufgabe begibt, wird schnell ein ziemliches Experimentieren daraus. Um diesen Teil zu vereinfachen, wollen wir Sie mit einem Assistenten unterst&uuml;tzen. Dieser soll direkt &uuml;ber das Eingabefenster f&uuml;r die Format-Eigenschaft ge&ouml;ffnet werden und die M&ouml;glichkeit bieten, verschiedene Werte einzugeben und diese mit dem ge&uuml;nwschten  Formatierungsausdruck zu testen. Und nat&uuml;rlich finden Sie in diesem Beitrag die Anleitung, wie Sie den Assistenten selbst erstellen k&ouml;nnen!<\/b><\/p>\n<h2>Die Format-Eigenschaft<\/h2>\n<p>Die Eigenschaft <b>Format <\/b>kennen Sie von verschiedenen Situationen. Das erste Mal begegnet sie einem beim Erstellen einer neuen Datenbankanwendung bereits im Tabellenentwurf f&uuml;r neue Felder beispielsweise des Datentyps <b>Kurzer Text <\/b>(siehe Bild 1). An dieser Stelle finden wir noch nicht einmal eine Auswahlliste mit verschiedenen Optionen vor, sodass wir zu eigenen Versuchen mit den verschiedenen Platzhaltern und M&ouml;glichkeiten der Format-Eigenschaft angehalten sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_002.png\" alt=\"Format-Eigenschaft im Tabellenentwurf\" width=\"424,5589\" height=\"273,0946\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Format-Eigenschaft im Tabellenentwurf<\/span><\/b><\/p>\n<p>Erstellen wir Abfragen auf Basis einer solchen Tabelle, finden wir hier ebenfalls die M&ouml;glichkeit, die <b>Format<\/b>-Eigenschaft zu setzen. Damit w&uuml;rden wir eventuelle Einstellungen aus der zugrunde liegenden Tabelle &uuml;berschreiben. Auch hier finden wir keine Unterst&uuml;tzung zum Zusammenstellen der Ausdr&uuml;cke f&uuml;r die <b>Format<\/b>-Eigenschaft.<\/p>\n<p>Damit landen wir bei den Formularen, wo wir Steuerelemente auf Basis der Felder der als Datensatzquelle verwendeten Tabelle oder Abfrage hinzuf&uuml;gen. Auch hier finden wir die Eigenschaft Format vor. Allerdings sehen wir an dieser Stelle bereits ein reichlich gef&uuml;lltes Auswahlfeld f&uuml;r verschiedene Formatierungen (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_001.png\" alt=\"Auswahl verschiedener Formate\" width=\"424,5589\" height=\"427,751\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl verschiedener Formate<\/span><\/b><\/p>\n<p>Wenn wir nun an der einen oder anderen Stelle einen <b>Format<\/b>-Ausdruck festlegen wollen, der die im Feld gespeicherten Daten in der gew&uuml;nschten Art formatiert, m&uuml;ssen wir in die Entwurfsansicht wechseln, den <b>Format<\/b>-Ausdruck definieren, zur&uuml;ck zur Datenblattansicht wechseln, pr&uuml;fen, ob der <b>Format<\/b>-Ausdruck die gew&uuml;nschte Ansicht liefert und falls nicht, wieder zur&uuml;ck zur Entwurfsansicht wechseln, um den Wert der <b>Format<\/b>-Eigenschaft weiter zu optimieren.<\/p>\n<p>Es gibt in Formularen eine M&ouml;glichkeit, den Formatausdruck f&uuml;r ein Feld ohne st&auml;ndiges Wechseln zwischen Formular- und Entwurfsansicht zu testen. Dabei handelt es sich um die Layout-Ansicht. Hier k&ouml;nnen wir das betroffene Feld markieren und die Eigenschaft <b>Format<\/b> anpassen, w&auml;hrend die Formatierung direkt auf die aktuell angezeigten Daten angewendet wird (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_003.png\" alt=\"Anpassen von Formaten in der Layoutansicht von Formularen\" width=\"599,559\" height=\"280,769\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anpassen von Formaten in der Layoutansicht von Formularen<\/span><\/b><\/p>\n<p>In Tabellen und Abfragen steht diese M&ouml;glichkeit allerdings nicht zur Verf&uuml;gung, sodass wir mit dem hier vorgestellten Assistenten eine alternative L&ouml;sung anbieten wollen. Der Assistent soll au&szlig;erdem noch einen weiteren Mehrwert bieten: Er soll mehrere Werte gleichzeitig inklusive der formatierten Version anzeigen k&ouml;nnen.<\/p>\n<h2>Grundger&uuml;st des Assistenten<\/h2>\n<p>Die grundlegende Vorgehensweise beim Erstellen eines Eigenschafts-Assistenten, wie wir ihn hier beschreiben, finden Sie im Beitrag <b>Eigenschaftsassistenten oder Property Wizards <\/b>(<b>www.access-im-unternehmen.de\/****<\/b>).  Im vorliegenden Beitrag beschreiben wir nur kurz die Anwendung der dort vorgestellten Techniken anhand unserer konkreten Umsetzung.<\/p>\n<p>Als Erstes ben&ouml;tigen wir eine Tabelle namens <b>USysRegInfo<\/b>, welche die Daten f&uuml;r die Registrierung des Assistenten in der Windows-Registry enth&auml;lt. Diese werden beim Installieren mit dem Add-In-Manager in die Registry eingetragen, damit Access den Assistenten an der gew&uuml;nschten Stelle anbieten kann.<\/p>\n<p>Die Tabelle enth&auml;lt die Daten aus Bild 4. Wichtig ist, dass der Name der <b>.accda<\/b>-Datei genau in der Zeile mit dem Wert <b>Library <\/b>angegeben wird und das der Name der aufzurufenden Funktion des Assistenten in der Zeile mit dem Wert <b>Function <\/b>erscheint.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_004.png\" alt=\"Die Tabelle USysRegInfo mit den Daten f&uuml;r die Registrierung des Assistenten\" width=\"700\" height=\"159,5482\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle USysRegInfo mit den Daten f&uuml;r die Registrierung des Assistenten<\/span><\/b><\/p>\n<h2>Formulare f&uuml;r den Assistenten vorbereiten<\/h2>\n<p>Der Assistent soll seine Daten in Haupt- und Unterformular anzeigen. Das Hauptformular soll das Textfeld zur Eingabe des zu testenden Format-Ausdrucks bereitstellen sowie die beiden Schaltfl&auml;chen zum &Uuml;bernehmen der Eingabe oder zum Abbrechen. Au&szlig;erdem soll es das Unterformular anzeigen, das in der Datenblattansicht zwei Spalten anzeigt.<\/p>\n<p>Die erste enth&auml;lt die Daten, die formatiert werden sollen, in der gespeicherten Version. Die zweite soll die Daten mit dem Formatausdruck formatieren, den der Benutzer im Hauptformular angibt. Die Datens&auml;tze des Unterformulars in der Datenblattansicht sollen die Daten aus der eigentlichen Datenquelle anzeigen. Wenn wir also die Eigenschaft <b>Format <\/b>f&uuml;r das Feld <b>PLZ <\/b>einer Tabelle anpassen wollen, dann soll das Unterformular die Werte des Feldes <b>PLZ <\/b>f&uuml;r alle Datens&auml;tze der zugrunde liegenden Tabelle anzeigen.<\/p>\n<h2>Unterformular anlegen<\/h2>\n<p>Daher erstellen wir nun zwei Formulare. Wir beginnen mit dem Unterformular, das wir unter dem Namen <b>sfmFormatassistent<\/b> speichern. Es sieht in der Entwurfsansicht wie in Bild 5 aus. Wir f&uuml;gen diesem zwei Textfelder samt Bezeichnungsfeldern hinzu. Die Bezeichnungsfelder erhalten die Beschriftungen <b>Wert <\/b>und <b>Formatierter Wert<\/b>. Die Textfelder versehen wir mit den Namen <b>txtWert <\/b>und <b>txtFormatierterWert<\/b>. Damit die Daten des Unterformulars in der Datenblattansicht angezeigt werden, stellen wir die Eigenschaft <b>Standardansicht <\/b>auf den Wert <b>Datenblatt <\/b>ein. Danach speichern und schlie&szlig;en wir das Unterformular.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_005.png\" alt=\"Unterformular des Formulars des Assistenten\" width=\"624,559\" height=\"302,418\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Unterformular des Formulars des Assistenten<\/span><\/b><\/p>\n<h2>Hauptformular anlegen<\/h2>\n<p>Das Hauptformular legen wir unter dem Namen <b>frmFormatassistent <\/b>an. Solange wir mit dem Formular des Assistenten keine Daten bearbeiten wollen, ben&ouml;tigen wir einige Elemente nicht. Diese blenden wir aus, indem wir die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>einstellen. Au&szlig;erdem soll das Formular immer zentriert im Access-Fenster angezeigt werden, sodass wir die Eigenschaft <b>Automatisch zentrieren <\/b>auf den Wert <b>Ja <\/b>einstellen.<\/p>\n<p>Au&szlig;erdem stellen wir den Wert der Eigenschaft <b>Beschriftung <\/b>auf einen passenden Titel ein, in diesem Fall <b>amvFormatassistent<\/b>.<\/p>\n<p>Dann folgen die eigentlichen Steuerelement. Ganz oben platzieren wir ein Textfeld mit dem Namen <b>txtFormat<\/b>. Daneben legen wir ein weiteres Textfeld an, dieses hei&szlig;t <b>txtFormatDeutsch<\/b>. Der Grund ist, dass die deutschen Formatierungen teilweise anders lauten als die englischen, die wir hier nutzen m&uuml;ssen.<\/p>\n<p>Darunter f&uuml;gen wir das Unterformular ein, indem wir es aus dem Navigationsbereich in den Formularentwurf ziehen. Unter diesem platzieren wir die beiden Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen<\/b>, sodass das Formular wie in Bild 6 aussieht. Au&szlig;erdem bringen wir noch eine weitere Schaltfl&auml;che namens <b>cmdBeispielwerteEinlesen <\/b>hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_006.png\" alt=\"Hauptformular des Assistenten mit Unterformular\" width=\"499,5589\" height=\"440,2744\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Hauptformular des Assistenten mit Unterformular<\/span><\/b><\/p>\n<p>F&uuml;r die Schaltfl&auml;chen hinterlegen wir die folgenden Ereignisprozeduren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Bevor wir mit der Programmierung der Funktion des Formulars fortschreiten, k&uuml;mmern wir uns als Erstes noch um Beispieldaten f&uuml;r den Assistenten und dann um seinen Aufruf und die Auswertung des Ergebnisses.<\/p>\n<h2>Vorbereitung von Beispieldaten f&uuml;r das Unterformular<\/h2>\n<p>Der Benutzer soll direkt mit dem Format experimentieren k&ouml;nnen und deshalb stellen wir ihm im Unterformular zehn Datens&auml;tze zur Verf&uuml;gung. Diese stammen aus der Tabelle <b>tblWerteFormatierteWerte<\/b>, die in der Entwurfsansicht wie in Bild 7 aussieht. Wir haben Felder f&uuml;r die verschiedenen Datentypen festgelegt. Damit diese nicht alle angezeigt werden m&uuml;ssen, der Benutzer aber dennoch mit realistischen Beispielwerten arbeiten kann, weisen wir der Eigenschaft <b>Steuerelementinhalt <\/b>beziehungsweise unter VBA <b>ControlSource <\/b>des Feldes <b>txtWert <\/b>das jeweilige Feld zu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_007.png\" alt=\"Entwurf der Tabelle f&uuml;r die Beispieldaten\" width=\"499,5589\" height=\"408,2602\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf der Tabelle f&uuml;r die Beispieldaten<\/span><\/b><\/p>\n<p>Wechseln wir in die Datenblattansicht, sehen wir, dass wir bereits einige Beispieldatens&auml;tze eingegeben haben &#8211; zugegebenerma&szlig;en etwas improvisiert, aber der Benutzer kann diese nach seinen eigenen W&uuml;nschen anpassen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_008.png\" alt=\"Beispielwerte f&uuml;r die verschiedenen Felddatentypen\" width=\"649,559\" height=\"257,0594\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Beispielwerte f&uuml;r die verschiedenen Felddatentypen<\/span><\/b><\/p>\n<h2>Startfunktion f&uuml;r den Assistenten<\/h2>\n<p>Um das Formular beim Aufrufen des Assistenten anzuzeigen, m&uuml;ssen wir die Funktion, die wir in der Tabelle <b>USysRegInfo <\/b>hinterlegt haben, zun&auml;chst mit den entsprechenden Anweisungen f&uuml;llen. Diese Funktion soll nicht nur das Formular &ouml;ffnen, sondern auch noch die ben&ouml;tigten Informationen &uuml;bergeben. Diese erhalten wir in dieser Funktion &uuml;ber die standardm&auml;&szlig;ig zu definierenden Parameter:<\/p>\n<ul>\n<li><b>strObject <\/b>liefert den Namen des Objekts, also Tabelle, Abfrage, Formular oder Bericht, von dem aus der Assistent aufgerufen wurde.<\/li>\n<li><b>strControl <\/b>liefert den Namen des Tabellen- oder Abfragefeldes beziehungsweise des Formular- oder Berichtssteuerelements, f&uuml;r welches der Assistent gestartet wurde.<\/li>\n<li><b>strCurVal <\/b>liefert, sofern vorhanden, den aktuellen Wert der <b>Format<\/b>-Eigenschaft f&uuml;r das ausl&ouml;sende Element.<\/li>\n<\/ul>\n<p>Die Funktion aus Listing 1 stellt zun&auml;chst den Namen des zu &ouml;ffnenden Formulars, hier <b>frmFormatassistent<\/b>, in der Variablen <b>strFormular <\/b>ein. Dann f&uuml;gt es die Werte der drei Parameter in einer einzigen Zeichenkette zusammen &#8211; getrennt durch das Pipe-Zeichen. Das sieht beispielsweise wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>amvFormatAssistent(strObject<span style=\"color:blue;\"> As String<\/span>, strControl<span style=\"color:blue;\"> As String<\/span>, strCurVal<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strOpenArgs<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFormular<span style=\"color:blue;\"> As String<\/span>\r\n     strFormular = \"frmFormatassistent\"\r\n     strOpenArgs = strObject & \"|\" & strControl & \"|\" & strCurVal\r\n     DoCmd.OpenForm strFormular, WindowMode:=acDialog, OpenArgs:=strOpenArgs\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strFormular)<span style=\"color:blue;\"> Then<\/span>\r\n         amvFormatAssistent = Nz(Forms(strFormular)!txtFormatDeutsch, \"\")\r\n         DoCmd.Close acForm, strFormular\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 1: Startfunktion des Assistenten<\/span><\/b><\/p>\n<pre>tblKunden|PLZ|\"D-\"@@@@@<\/pre>\n<p>Danach ruft die Funktion das Formular mit der <b>DoCmd.Open<\/b>-Methode auf und &uuml;bergibt den Inhalt von <b>strOpenArgs <\/b>mit dem Parameter <b>OpenArgs<\/b>. Durch den Parameter <b>WindowMode:=acDialog<\/b> wird das Formular au&szlig;erdem als modaler Dialog ge&ouml;ffnet. Dies sorgt daf&uuml;r, dass der Code an dieser Stelle angehalten wird.<\/p>\n<p>Hier folgt nun die eigentliche Bearbeitung. Diese schlie&szlig;t der Benutzer entweder mit der <b>OK<\/b>&#8211; oder der <b>Abbrechen<\/b>-Schaltfl&auml;che ab. Dadurch wird das Formular entweder ausblendet oder geschlossen, was beides dazu f&uuml;hrt, dass der aufrufende Code fortgesetzt wird. <\/p>\n<p>Hier kommt die Funktion <b>IstFormularGeoeffnet<\/b> zum Einsatz und &uuml;berpr&uuml;ft, ob das Formular noch ge&ouml;ffnet ist. Ist das nicht der Fall, hat der Benutzer die <b>Abbrechen<\/b>-Schaltfl&auml;che bet&auml;tigt und es ist nichts weiter zu tun. Ist das Formular jedoch noch ge&ouml;ffnet, muss der Benutzer es durch einen Klick auf die Schaltfl&auml;che <b>cmdOK <\/b>unsichtbar gemacht haben und die Anweisungen innerhalb der <b>If&#8230;Then<\/b>-Bedingung werden ausgef&uuml;hrt.<\/p>\n<p>Hier liest die Funktion den Wert des Textfeldes <b>txtFormatDeutsch <\/b>aus dem noch ge&ouml;ffneten Formular als R&uuml;ckgabewert der Funktion <b>amvFormatAssistent <\/b>ein und schlie&szlig;t das Formular dann. Hier ist zu ber&uuml;cksichtigen, dass das Textfeld <b>txtFormat <\/b>auch leer sein kann, also den Wert <b>Null <\/b>enth&auml;lt. In diesem Fall ist der Wert <b>Null <\/b>durch eine leere Zeichenkette zu ersetzen, was wir mit der <b>Nz<\/b>-Funktion erledigen.<\/p>\n<h2>Beim &Ouml;ffnen des Formulars<\/h2>\n<p>Beim &Ouml;ffnen des Formulars wird die Prozedur aus Listing 2 aufgerufen. Diese deklariert einige Variablen und liest als erstes den Inhalt der Eigenschaft <b>OpenArgs <\/b>in die Variable <b>strOpenArgs <\/b>ein. Dabei wandelt den eventuell vorhandenen Wert <b>Null <\/b>in eine leere Zeichenkette um, da die Zuweisung des Wertes <b>Null <\/b>zu einer <b>String<\/b>-Variablen einen Fehler ausl&ouml;sen w&uuml;rde.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strOpenArgs<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCurVal<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intDataType<span style=\"color:blue;\"> As <\/span>DataTypeEnum\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     strOpenArgs = Nz(Me.OpenArgs, \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strOpenArgs) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der Assistent kann nicht ohne Angabe der Parameter aufgerufen werden.\"\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strOpenArgs) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strObject = <span style=\"color:blue;\">Split<\/span>(strOpenArgs, \"|\")(0)\r\n         strControl = <span style=\"color:blue;\">Split<\/span>(strOpenArgs, \"|\")(1)\r\n         strCurVal = <span style=\"color:blue;\">Split<\/span>(strOpenArgs, \"|\")(2)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der Assistent kann nicht ohne Angabe der Parameter aufgerufen werden.\"\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtFormatDeutsch = strCurVal\r\n     intObjectType = GetObjectType(strObject)\r\n     intDataType = GetDataType(strObject, strControl, intObjectType)\r\n     strCurVal = UebersetzeNachEnglisch(strCurVal, intDataType)\r\n     Me!txtFormat = strCurVal\r\n     Select Case intDataType\r\n         <span style=\"color:blue;\">Case <\/span>dbText\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertText\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertText\"\r\n         <span style=\"color:blue;\">Case <\/span>dbCurrency\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertWaehrung\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertWaehrung\"\r\n         <span style=\"color:blue;\">Case <\/span>dbBoolean\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertBoolean\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertBoolean\"\r\n         <span style=\"color:blue;\">Case <\/span>dbDate\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertDatum\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertDatum\"\r\n         <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertZahl\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertZahl\"\r\n         <span style=\"color:blue;\">Case <\/span>dbSingle, dbDouble\r\n             Me!sfmFormatassistent.Form!txtWert.ControlSource = \"WertZahl\"\r\n             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = \"WertZahlMitKomma\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Nicht definierter Felddatentyp: \" & intDataType\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     Me!sfmFormatassistent.Form!txtFormatierterWert.Format = Me!txtFormat\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Beim Aufrufen des Formulars des Assistenten<\/span><\/b><\/p>\n<p>Dann pr&uuml;ft die Prozedur, ob <b>strOpenArgs <\/b>&uuml;berhaupt eine Zeichenkette mit einer L&auml;nge gr&ouml;&szlig;er <b>0 <\/b>enth&auml;lt. Falls ja, untersucht sie die Zeichenkette genauer. In diesem Fall zerlegen wir diese mit der <b>Split<\/b>-Funktion in die durch das Pipe-Zeichen getrennten Einzelteile. &Uuml;ber den nachgeschalteten Index greifen wir auf das erste, zweite und dritte Element einer Zeichenkette wie beispielsweise der folgenden zu:<\/p>\n<pre>tblKunden|PLZ|\"D-\"@@@@@<\/pre>\n<p>Das erste Element landet in der Variablen <b>strObject<\/b>, das zweite in <b>strControl <\/b>und das dritte in <b>strCurVal<\/b>. Ist <b>strOpenArgs <\/b>hingegen leer, erscheint eine entsprechende Meldung und das Formular die Prozedur wird mit <b>Exit Sub <\/b>verlassen. Au&szlig;erdem stellen wir noch den Parameter <b>Cancel <\/b>auf den Wert <b>True <\/b>ein, damit auch das &Ouml;ffnen des Formulars abgebrochen wird.<\/p>\n<p>Sind alle Werte in die Variablen eingelesen, weisen wir den Wert aus <b>strCurVal <\/b>dem Textfeld <b>txtFormatDeutsch <\/b>zu. Dies ist also die Formatierung, die der Benutzer gegebenenfalls bereits in der entsprechenden Eigenschaft des Feldes oder Steuerelements festgelegt hat. Die englische Version wollen wir im Textfeld <b>txtFormat <\/b>anzeigen. Dazu m&uuml;ssen wir das Format jedoch erst noch &uuml;bersetzen und dazu ben&ouml;tigen wir noch weitere Informationen.<\/p>\n<p>[<\/p>\n<p><b>strObject <\/b>liefert uns den Namen des Objekts, von dem aus der Benutzer den Assistenten aufgerufen hat. Damit wollen wir den Typ des Objekts ermitteln. Davon ausgehend, dass jeder Objektname nur einmal pro Datenbank angelegt werden kann, k&ouml;nnen wir damit die Tabelle <b>MSysObjects <\/b>durchsuchen und aus dieser den Typ ermitteln. Das erledigt die Hilfsfunktion <b>GetObjectType <\/b>f&uuml;r uns, die wir weiter unten beschreiben.<\/p>\n<p>Diese wandelt au&szlig;erdem die kryptischen Zahlenwerte wie zum Beispiel <b>-32.768 <\/b>f&uuml;r Formulare in handliche Konstanten wie <b>acForm <\/b>um und wir speichern den ermittelten Wert in der Variablen <b>intObjectType<\/b>.<\/p>\n<p>Den Objekttyp ben&ouml;tigen wir unter anderem f&uuml;r die nachfolgende Ermittlung des Felddatentyps des mit der <b>Format<\/b>-Eigenschaft auszustattenden Feldes. Diese erfolgt mit der Funktion <b>GetDataType<\/b>. Dieser &uuml;bergeben wir den Namen des Objekts und des Felds beziehungsweise Steuerelements und schreiben das Ergebnis in Form eines der entsprechenden Konstanten wie beispielsweise <b>acText <\/b>f&uuml;r ein Textfeld mit dem Datentyp <b>Kurzer Text <\/b>in die Variable <b>intDataType<\/b>. Diese hat wiederum den Datentyp <b>DataTypeEnum<\/b>.<\/p>\n<p>Den Datentyp nutzen wir nun in der Funktion <b>UebersetzeNachEnglisch<\/b>, der wir den zu &uuml;bersetzenden Ausdruck &uuml;bergeben sowie den Datentyp. Das Ergebnis dieses Aufrufs landet schlie&szlig;lich im Textfeld <b>txtFormat<\/b>. Wie und warum wir das Format &uuml;bersetzen, erl&auml;utern wir weiter unten.<\/p>\n<p>Den Inhalt der Variablen <b>intDataType <\/b>untersuchen wir dann in einer <b>Select Case<\/b>-Anweisung daraufhin, um welchen Datentyp es sich handelt. Abh&auml;ngig davon nehmen wir nun Einstellungen im Unterformular des Assistenten vor. Dieses zeigt ja bereits die Tabelle der Tabelle <b>tblWerteFormatierteWerte <\/b>an.<\/p>\n<p>Je nachdem, welchen Datentyp das Feld hat, f&uuml;r das der Benutzer den Format-Assistenten aufgerufen hat, stellen wir die Eigenschaft <b>Steuerelementinhalt <\/b>auf eines der Felder <b>WertText<\/b>, <b>WertWaehrung<\/b>, <b>WertBoolean<\/b>, <b>WertDatum<\/b>, <b>WertZahl <\/b>oder <b>WertZahlMitKomma <\/b>ein.<\/p>\n<p>Hat der Benutzer einen anderen Datentyp gew&auml;hlt, erscheint eine entsprechende Meldung &#8211; an dieser Stelle k&ouml;nnte man die Prozedur noch f&uuml;r diesen zus&auml;tzlichen Datentyp erweitern. Schlie&szlig;lich stellen wir die Eigenschaft <b>Format <\/b>des Feldes <b>txtFormatierterWert <\/b>auf die im Textfeld <b>txtFormat <\/b>gespeicherte <b>Formatierung <\/b>ein.<\/p>\n<h2>&Auml;ndern des Formats<\/h2>\n<p>Wenn der Benutzer die Formatierung im Textfeld <b>txtFormat <\/b>&auml;ndert, soll sich dies jeweils direkt auf die zu formatierenden Beispieltextfelder auswirken. Dazu hinterlegen wir f&uuml;r das Ereignis <b>Bei &Auml;nderung <\/b>das Format f&uuml;r die Eigenschaft <b>Format <\/b>des Textfeldes <b>txtFormatierterWert<\/b>. Hier lesen wir allerdings nicht den aktuellen Wert aus, also <b>Value<\/b>, sondern den aktuell angezeigten Inhalt aus der Eigenschaft <b>Text<\/b> (der aktuelle Inhalt wird erst nach dem Speichern des Inhalts zum <b>Value<\/b>):<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFormat_Change()\r\n     Me!sfmFormatassistent.Form!txtFormatierterWert.Format _\r\n         = Me!txtFormat.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Modul mdlTools<\/h2>\n<p>Die Hilfsfunktion <b>GetObjectType <\/b>erwartet den Namen des zu untersuchenden Objekts als Parameter und soll den Typ in Form einer Konstanten der Auflistung <b>acObjectType <\/b>zur&uuml;ckliefern. Dazu &ouml;ffnen wir die Systemtabelle <b>MSysObjects<\/b> der Datenbank, von der aus der Assistent ge&ouml;ffnet wurde, als Recordset. Als Kriterium der zu verwendenden Abfrage verwenden wir das Feld <b>Name<\/b>, dessen Wert mit dem per Parameter &uuml;berlieferten Objektnamen &uuml;bereinstimmen soll.<\/p>\n<p>Es kommen nur die vier Elementtypen Tabelle, Abfrage, Formular oder Berichte als Elementtypen in Frage. Daher pr&uuml;fen wir f&uuml;r den Wert <b>Type <\/b>des gefundenen Datensatzes der Tabelle <b>MSysObjects<\/b>, ob dieser einen der folgenden Werte enth&auml;lt:<\/p>\n<ul>\n<li><b>1<\/b>: Das Objekt ist eine Tabelle.<\/li>\n<li><b>5<\/b>: Das Objekt ist eine Abfrage.<\/li>\n<li><b>-32.768<\/b>: Das Objekt ist ein Formular.<\/li>\n<li><b>-32.764<\/b>: Das Objekt ist ein Bericht.<\/li>\n<\/ul>\n<p>Abh&auml;ngig davon, welchen Objekttyp das Element hat, geben wir einen der Werte <b>acTable<\/b>, <b>acQuery<\/b>, <b>acForm <\/b>oder <b>acReport <\/b>zur&uuml;ck. Den kompletten Code dieser Funktion zeigt Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetObjectType(strObject<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>AcObjectType\r\n     <span style=\"color:blue;\">Dim <\/span>dbc<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CodeDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM MSysObjects WHERE Name = ''\" & strObject & \"''\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         Select Case rst!Type\r\n             <span style=\"color:blue;\">Case <\/span>1 ''Tabelle\r\n                 GetObjectType = acTable\r\n             <span style=\"color:blue;\">Case <\/span>5 ''Abrfrage\r\n                 GetObjectType = acQuery\r\n             <span style=\"color:blue;\">Case <\/span>-32768 ''Formulare\r\n                 GetObjectType = acForm\r\n             <span style=\"color:blue;\">Case <\/span>-32764 ''Bericht\r\n                 GetObjectType = acReport\r\n         <span style=\"color:blue;\">End Select<\/span>\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 3: Die Hilfsfunktion GetObjectType<\/span><\/b><\/p>\n<h2>Die Hilfsfunktion GetDataType<\/h2>\n<p>Die zweite Hilfsfunktion finden wir ebenfalls im Modul <b>mdlTools<\/b> (siehe Listing 4). Die Funktion <b>GetDataType <\/b>hat die Aufgabe, zu dem mit <b>strControl <\/b>gelieferten Element des mit <b>strObject <\/b>gelieferten Objekts mit dem Typ aus <b>intObjectType <\/b>den Datentyp zu liefern.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetDataType(strObject<span style=\"color:blue;\"> As String<\/span>, strControl<span style=\"color:blue;\"> As String<\/span>, intObjectType<span style=\"color:blue;\"> As <\/span>acObjectType)<span style=\"color:blue;\"> As <\/span>DataTypeEnum\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>rpt<span style=\"color:blue;\"> As <\/span>Report\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strRecordsource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     Select Case intObjectType\r\n         <span style=\"color:blue;\">Case <\/span>acTable\r\n             <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strObject)\r\n             <span style=\"color:blue;\">Set<\/span> fld = tdf.Fields(strControl)\r\n             GetDataType = fld.Type\r\n         <span style=\"color:blue;\">Case <\/span>acQuery\r\n             <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(strObject)\r\n             <span style=\"color:blue;\">Set<\/span> fld = qdf.Fields(strControl)\r\n             GetDataType = fld.Type\r\n         <span style=\"color:blue;\">Case <\/span>acForm, acReport\r\n             Select Case intObjectType\r\n                 <span style=\"color:blue;\">Case <\/span>acForm\r\n                     <span style=\"color:blue;\">Set<\/span> frm = Forms(strObject)\r\n                     strRecordsource = frm.RecordSource\r\n                 <span style=\"color:blue;\">Case <\/span>acReport\r\n                     <span style=\"color:blue;\">Set<\/span> rpt = Reports(strObject)\r\n                     strRecordsource = rpt.RecordSource\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n             Select Case <span style=\"color:blue;\">Left<\/span>(strRecordsource, 7)\r\n                 <span style=\"color:blue;\">Case <\/span>\"SELECT\"\r\n                     <span style=\"color:blue;\">Set<\/span> qdf = db.OpenRecordset(strRecordsource)\r\n                     <span style=\"color:blue;\">Set<\/span> fld = qdf.Fields(strControl)\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strRecordsource)\r\n                     <span style=\"color:blue;\">Set<\/span> fld = tdf.Fields(strControl)\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n             GetDataType = fld.Type\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Hilfsfunktion GetFieldType<\/span><\/b><\/p>\n<p>Das bedeutet, dass sie genauso den Datentyp eines Feldes einer Tabelle wie eines Steuerelements in einem Formular oder Bericht liefern k&ouml;nnen soll.<\/p>\n<p>Zu diesem Zweck nimmt die Prozedur die drei genannten Parameter entgegen und liefert einen Wert der Auflistung <b>DataTypeEnum <\/b>zur&uuml;ck. Wir deklarieren hier gleich eine ganze Reihe von Objektvariablen f&uuml;r die unterschiedlichen F&auml;lle, also zum Beispiel ein <b>TableDef<\/b>-, ein <b>QueryDef<\/b>-, ein <b>Form<\/b>&#8211; oder ein <b>Report<\/b>-Objekt.<\/p>\n<p>Gleich zu Beginn unterscheiden wir in einer <b>Select Case<\/b>-Bedingung zwischen den verschiedenen Werten des Parameters <b>intObjectType <\/b>und somit den unterschiedlichen Objekttypen <b>Tabelle<\/b>, <b>Abfrage<\/b>, <b>Formular <\/b>und <b>Bericht<\/b>.<\/p>\n<p>Im Fall einer Tabelle ermitteln wir das <b>TableDef<\/b>-Objekt und das <b>Field<\/b>-Element f&uuml;r das mit <b>strControl <\/b>angegebene Feld. Den Typ des Feldes ermitteln wir mit der <b>Type<\/b>-Eigenschaft und tragen diese als R&uuml;ckgabewert der Funktion <b>GetDataType <\/b>ein.<\/p>\n<p>Die Vorgehensweise f&uuml;r eine Abfrage sieht identisch aus, nur dass wir hier ein <b>QueryDef<\/b>-Objekt referenzieren und kein <b>TableDef<\/b>-Objekt. Schlie&szlig;lich folgen noch die Formulare und Berichte. Diese verarbeiten wir in einem <b>Case<\/b>-Zweig, der noch eine verschachtelte <b>Select Case<\/b>-Bedingung enth&auml;lt. In dieser unterscheiden wir zun&auml;chst nach <b>acForm <\/b>und <b>acReport<\/b>.<\/p>\n<p>F&uuml;r ein Formular lesen wir einen Verweis auf das entsprechende Formular &uuml;ber die <b>Forms<\/b>-Auflistung ein und schreiben dann den Wert der Eigenschaft <b>RecordSource<\/b>, also der Datensatzquelle, in die Variable <b>strRecordsource <\/b>ein.<\/p>\n<p>Das Gleiche erledigen wir auch im Fall eines Berichts, nur dass wir hier auf die <b>Reports<\/b>-Auflistung zugreifen und den Verweis in die <b>Report<\/b>-Variable <b>rpt <\/b>schreiben.<\/p>\n<p>Danach pr&uuml;fen wir, ob das Formular oder der Bericht eine <b>SELECT<\/b>-Abfrage oder die reine Angabe des Namens einer Tabelle oder Abfrage als Datensatzquelle verwenden. Im Falle einer <b>SELECT<\/b>-Anweisung erstellen wir ein Recordset auf Basis dieser Datensatzquelle und referenzieren diese mit der Variablen <b>qdf<\/b>.<\/p>\n<p>Aus dieser ermitteln wir dann &uuml;ber den Namen des Elements aus der <b>Fields<\/b>-Auflistung einen Verweis auf das zu formatierende Feld. Dessen <b>Type<\/b>-Eigenschaft liefert dann wiederum den Felddatentyp, den wir als Ergebnis der Funktion <b>GetDataType <\/b>zur&uuml;ckgeben.<\/p>\n<h2>Probleme mit Deutsch\/Englisch in Formatausdr&uuml;cken<\/h2>\n<p>Wenn wir beispielsweise das Format eines Datumsfeldes auf einen Format wie <b>2022-12-31 <\/b>einstellen wollen, dann geben wir in der <b>Format<\/b>-Eigenschaft in der Benutzeroberfl&auml;che von Access den Wert <b>jjjj-mm-tt <\/b>ein &#8211; also mit <b>j <\/b>f&uuml;r <b>Jahr <\/b>und <b>t <\/b>f&uuml;r <b>Tag<\/b>. Wenn wir allerdings den Assistenten nutzen, k&ouml;nnen wir nur mit der englischen Version arbeiten &#8211; also statt <b>jjjj-mm-tt <\/b>mit <b>yyyy-mm-dd<\/b>. <\/p>\n<p>Es gibt noch weitere Beispiele daf&uuml;r, wo sich Formatausdr&uuml;cke in der deutschen und der englischen Version unterscheiden. Bei Zahlen etwa ist in der englischen Version das Komma das Tausendertrennzeichen und der Punkt das Dezimaltrennzeichen.<\/p>\n<p>In der deutschen Version ist es umgekehrt. &Auml;hnlich sieht es aus, wenn man f&uuml;r die Anzeige von <b>Ja\/Nein<\/b>-Feldern kein Kontrollk&auml;stchen, sondern ein Textfeld w&auml;hlt. Dieses kann beispielsweise Texte wie <b>Yes\/No <\/b>oder <b>True\/False <\/b>anzeigen &#8211; oder eben Ja\/Nein oder Wahr\/Falsch in der deutschen Variante. Auch hier m&uuml;ssen wir zum Testen die englische Version eingeben.<\/p>\n<p>Die Frage ist: Wie kann man das l&ouml;sen? Es ist wenig sinnvoll, den Benutzer mit den deutschen Formatierungen herumspielen zu lassen, wenn diese eine falsche Vorschau liefern. Andersherum k&ouml;nnen wir auch nicht die &#8222;falsche&#8220; englische Version eines Datumformats in die Format-Eigenschaft eintragen.<\/p>\n<p>An irgendeiner Stelle m&uuml;ssten wir also eine &Uuml;bersetzung vornehmen &#8211; beziehungsweise an mehreren. Wir haben entschieden, dass wir dem Benutzer im Assistenten die englische Version pr&auml;sentieren und parallel die deutsche anzeigen. Dazu m&uuml;ssen wir allerdings gegebenenfalls den Ausdruck, der bereits f&uuml;r die <b>Format<\/b>-Eigenschaft festgelegt ist, zuerst von der deutschen in die englische Version &uuml;bersetzen und dann beim Schlie&szlig;en des Assistenten wieder in die deutsche Version zur&uuml;ck&uuml;bersetzen. Im Assistenten wollen wir es also so l&ouml;sen, dass wir immer beide Versionen anzeigen &#8211; und dem Benutzer auch die M&ouml;glichkeit bieten, die deutsche Version einzugeben (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_015.png\" alt=\"Im Assistenten ben&ouml;tigen wir die englische Variante.\" width=\"474,5589\" height=\"272,317\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Im Assistenten ben&ouml;tigen wir die englische Variante.<\/span><\/b><\/p>\n<p>Wir m&uuml;ssen an mindestens zwei Stellen &uuml;bersetzen. Die erste ist die Prozedur, die beim &Ouml;ffnen des Formulars <b>frmFormatassistent <\/b>aufgerufen wird und in der wir das mit <b>strCurVal <\/b>&uuml;bergebene Format mit der oben bereits erw&auml;hnten Funktion <b>UebersetzeNachEnglisch <\/b>aus dem deutschen Format in das englische Format &uuml;bersetzen. In der aktuellen Version sieht die Funktion aus dem Modul <b>mdlTools <\/b>wie in Listing 5 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>UebersetzeNachEnglisch(strOriginal, intDataType<span style=\"color:blue;\"> As <\/span>DataTypeEnum)\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = strOriginal\r\n     Select Case intDataType\r\n         <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbSingle, dbDouble\r\n             strTemp = InterchangeChars(strTemp, \".\", \",\")\r\n         <span style=\"color:blue;\">Case <\/span>dbBoolean\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"Ja\", \"Yes\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"Nein\", \"No\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"Wahr\", \"True\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"Falsch\", \"False\")\r\n         <span style=\"color:blue;\">Case <\/span>dbDate\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"t\", \"d\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"j\", \"y\")\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     UebersetzeNachEnglisch = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Hilfsfunktion UebersetzeNachEnglisch<\/span><\/b><\/p>\n<p>Die Funktion &#8222;&uuml;bersetzt&#8220; nur die Teile des Formatierungsausdruck, die sich in der englischen Version von der deutschen unterscheiden. Dabei &uuml;bergeben wir also den Originalausdruck mit dem Parameter <b>strOriginal <\/b>und mit <b>intDataType <\/b>eine Konstante der Auflistung <b>DataTypeEnum<\/b> und somit den Datentyp des Feldes, dessen Format-Wert &uuml;bersetzt werden soll.<\/p>\n<p>Warum das? Weil bestimmte Elemente nur in Feldern mit speziellen Datentypen &uuml;bersetzt werden sollen. Die Funktion deklariert eine Variable namens <b>strTemp<\/b>, die den Originaltext aufnimmt, und behandelt diese dann entsprechend dem Datentyp:<\/p>\n<ul>\n<li>F&uuml;r die Zahlendatentyp mit den Konstanten <b>dbInteger<\/b>, <b>dbLong<\/b>, <b>dbSingle <\/b>und <b>dbDouble <\/b>vertauscht die Funktion die Dezimaltrennzeichen und Tausendertrennzeichen, also Punkt und Komma, miteinander. Dazu nutzt sie eine weitere Hilfsfunktion namens <b>InterchangeChars<\/b>.<\/li>\n<li>F&uuml;r den Datentyp <b>Boolean <\/b>ersetzt sie <b>Ja <\/b>durch <b>Yes<\/b>, <b>Nein <\/b>durch <b>No<\/b>, <b>Wahr <\/b>durch <b>True <\/b>und <b>Falsch <\/b>durch <b>False<\/b>.<\/li>\n<li>F&uuml;r den Datentyp <b>dbDate <\/b>ersetzt die Funktion <b>t <\/b>durch <b>d <\/b>und <b>j <\/b>durch <b>y<\/b>.<\/li>\n<\/ul>\n<p>Weitere Datentypen behandelt sie noch nicht, wir k&ouml;nnen die Funktion jedoch nach Bedarf noch erweitern.<\/p>\n<h2>Formatdefinition eingeben<\/h2>\n<p>Der Ort, an dem wir die Formatdefinitionen entweder auf Deutsch oder Englisch eingeben, ist das Formular <b>frmFormatassistent<\/b>. Wenn der Benutzer hier den Text der englischen Formatdefinition im Feld <b>txtFormat <\/b>anpasst, soll diese direkt &uuml;bersetzt und in das Feld <b>txtFormatDeutsch <\/b>geschrieben werden.<\/p>\n<p>Dazu haben wir f&uuml;r die beiden Textfelder jeweils eine Ereignisprozedur hinterlegt, die nicht nur diese Aufgabe erledigt, sondern auch noch das Format auf die im Unterformular angezeigten Daten anwendet.<\/p>\n<p>Das Ereignis, das beim Eingeben eines Zeichens in das Textfeld <b>txtFormat <\/b>ausgel&ouml;st wird, hei&szlig;t <b>Bei &Auml;nderung<\/b>. F&uuml;r dieses hinterlegen wir die Prozedur aus Listing 6. Diese ermittelt zuerst den Datentyp des zu untersuchenden Feldes oder Steuerelements mit der bereits vorgestellten Funktion <b>GetDataType <\/b>und speichert diesen in der Variablen <b>intDataType<\/b>. Dann ruft sie die &Uuml;bersetzungsfunktion <b>UebersetzeNachDeutsch<\/b> auf und &uuml;bergibt den zu &uuml;bersetzenden Text und den Datentyp. Das Ergebnis landet im Textfeld <b>txtFormatDeutsch<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFormat_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>intDataType<span style=\"color:blue;\"> As <\/span>DataTypeEnum\r\n     intDataType = GetDataType(strObject, strControl, intObjectType)\r\n     Me!txtFormatDeutsch = UebersetzeNachDeutsch(Me!txtFormat.Text, intDataType)\r\n     Me!sfmFormatassistent.Form!txtFormatierterWert.Format = Me!txtFormat.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Funktion f&uuml;r das Ereignis Bei &Auml;nderung des Textfeldes txtFormat<\/span><\/b><\/p>\n<p>Au&szlig;erdem weisen wir dieses noch der Eigenschaft <b>Format <\/b>des beispielhaft zu formatierenden Feldes im Unterformular zu.<\/p>\n<h2>&Auml;ndern der deutschen Formatierung<\/h2>\n<p>Der Benutzer kann auch direkt den deutschen Formatausdruck eingeben, bei Datumsfeldern also beispielsweise mit <b>t <\/b>f&uuml;r <b>Tag <\/b>oder <b>J <\/b>f&uuml;r <b>Jahr<\/b>.<\/p>\n<p>Um diese Formatierung in die englische Formatierung umzuwandeln, brauchen wir zwei Dinge: erstens eine Prozedur, die direkt bei der Eingabe eines Zeichens im Textfeld <b>txtFormatDeutsch <\/b>eine &Uuml;bersetzungsfunktion aufruft und zweitens die entsprechende &Uuml;bersetzungsfunktion.<\/p>\n<p>Die Funktion f&uuml;r das Ereignis <b>Bei &Auml;nderung <\/b>des Textfeldes <b>txtFormatDeutsch <\/b>funktioniert analog zu der zuvor beschriebenen, jedoch rufen wir nicht <b>UebersetzeNachDeutsch<\/b>, sondern <b>UebersetzeNachEnglisch <\/b>auf.<\/p>\n<p>Au&szlig;erdem k&ouml;nnen wir, wenn wir das Format aus <b>txtFormat <\/b>auf das Feld im Unterformular anwenden wollen, nicht mehr &uuml;ber die <b>Text<\/b>-Eigenschaft auf den aktuellen Text zugreifen, sondern erledigen das direkt &uuml;ber die <b>Value<\/b>-Funktion (welche die Standardeigenschaft ist und deshalb nicht angegeben werden muss) &#8211; siehe Listing 7.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFormatDeutsch_Change()\r\n     <span style=\"color:blue;\">Dim <\/span>intDataType<span style=\"color:blue;\"> As <\/span>DataTypeEnum\r\n     intDataType = GetDataType(strObject, strControl, intObjectType)\r\n     Me!txtFormat = UebersetzeNachEnglisch(Me!txtFormatDeutsch.Text, intDataType)\r\n     Me!sfmFormatassistent.Form!txtFormatierterWert.Format = Me!txtFormat\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion f&uuml;r das Ereignis Bei &Auml;nderung des Textfeldes txtFormatDeutsch<\/span><\/b><\/p>\n<p>Die Funktion <b>UebersetzeNachDeutsch <\/b>erledigt die gleiche Aufgabe wie <b>UebersetzeNachEnglisch<\/b> &#8211; nur umgekehrt (siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>UebersetzeNachDeutsch(strOriginal, intDataType<span style=\"color:blue;\"> As <\/span>DataTypeEnum)\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = strOriginal\r\n     Select Case intDataType\r\n         <span style=\"color:blue;\">Case <\/span>dbInteger, dbLong, dbSingle, dbDouble\r\n             strTemp = InterchangeChars(strTemp, \".\", \",\")\r\n         <span style=\"color:blue;\">Case <\/span>dbBoolean\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"Yes\", \"Ja\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"No\", \"Nein\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"True\", \"Wahr\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"False\", \"Falsch\")\r\n         <span style=\"color:blue;\">Case <\/span>dbDate\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"d\", \"t\")\r\n             strTemp = ReplaceNotInLiterals(strTemp, \"y\", \"j\")\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     UebersetzeNachDeutsch = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Die Funktion UebersetzeNachDeutsch<\/span><\/b><\/p>\n<h2>Ersetzen, aber nicht in Literalen<\/h2>\n<p><b>Format<\/b>-Ausdr&uuml;cke enthalten gern mal Literale, also in Anf&uuml;hrungszeichen eingefasste Ausdr&uuml;cke, die so, wie sie sind, in den zu formatierenden Ausdr&uuml;ck &uuml;bernommen werden sollen. Ein Beispiel ist das Format <b>&#8222;D-&#8222;@@@@@ <\/b>zur Anzeige einer PLZ wie <b>12345 <\/b>im Format <b>D-12345<\/b>.<\/p>\n<p>Nun wollen wir beim &Uuml;bersetzen nur die tats&auml;chlich zur Formatierung verwendeten Elemente &uuml;bersetzen und nicht diejenigen, die in Anf&uuml;hrungszeichen eingefasst sind. Deshalb k&ouml;nnen wir nicht einfach mit der <b>Replace<\/b>-Funktion arbeiten: Diese w&uuml;rde keine R&uuml;cksicht darauf nehmen, ob der zu ersetzende Text sich innerhalb oder au&szlig;erhalb von Anf&uuml;hrungszeichen befindet.<\/p>\n<p>Also haben wir eine eigene Funktion namens <b>ReplaceNotInLiterals<\/b> geschrieben, die Sie in Listing 8 finden. Diese Funktion nimmt den Text mit den zu ersetzenden Elementen entgegen sowie die zu ersetzenden und die ersetzenden Zeichenfolgen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ReplaceNotInLiterals(strText<span style=\"color:blue;\"> As String<\/span>, strToReplace<span style=\"color:blue;\"> As String<\/span>, strReplaceBy<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolLiteral<span style=\"color:blue;\"> As Boolean<\/span>\r\n     i = 1\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> i &gt; <span style=\"color:blue;\">Len<\/span>(strText)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Mid<\/span>(strText, i, 1) = \"\"\"\"<span style=\"color:blue;\"> Then<\/span>\r\n             bolLiteral = <span style=\"color:blue;\">Not<\/span> bolLiteral\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolLiteral<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(i, strText, strToReplace) = i<span style=\"color:blue;\"> Then<\/span>\r\n                 strText = <span style=\"color:blue;\">Left<\/span>(strText, i - 1) & strReplaceBy & <span style=\"color:blue;\">Mid<\/span>(strText, i + <span style=\"color:blue;\">Len<\/span>(strToReplace))\r\n                 i = i + <span style=\"color:blue;\">Len<\/span>(strToReplace) - 1\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         i = i + 1\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     ReplaceNotInLiterals = strText\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Die Hilfsfunktion ReplaceNotInLiterals <\/span><\/b><\/p>\n<p>Die Funktion durchl&auml;uft eine <b>Do While<\/b>-Schleife so oft, bis die Laufvariable <b>i <\/b>gr&ouml;&szlig;er ist als die L&auml;nge der Zeichenkette.<\/p>\n<p>Diese kann sich w&auml;hrend des Ersetzens durchaus &auml;ndern, sodass wir hier nicht einfach mit einer <b>For&#8230;Next<\/b>-Schleife arbeiten k&ouml;nnen. Wir pr&uuml;fen f&uuml;r jedes Zeichen, ob es sich dabei um ein Anf&uuml;hrungszeichen handelt. Ist das der Fall, wird die Variable <b>bolLiteral <\/b>auf <b>True <\/b>eingestellt &#8211; und beim Auffinden des n&auml;chsten Anf&uuml;hrungszeichens wieder auf <b>False<\/b>.<\/p>\n<p>Die nachfolgend beschriebene Untersuchung findet nur dann statt, wenn der aktuelle Buchstabe sich nicht innerhalb eines Literals befindet. Dann pr&uuml;ft die Funktion, ob der zu ersetzende Ausdruck aus <b>strToReplace <\/b>an der aktuellen, mit <b>i <\/b>angegebenen Position gefunden werden kann. Ist das der Fall, ersetzt die Funktion den gefundenen Text durch den mit <b>strReplaceBy <\/b>gelieferten. Das Ersetzen besteht aus dem Zusammensetzen des Teils der Zeichenkette aus <b>strText <\/b>vor der gefundenen, zu ersetzenden Zeichenkette, der ersetzenden Zeichenkette und dem Teil aus <b>strText<\/b>, der sich hinter der zu ersetzenden Zeichenkette befindet. In diesem Fall wird die Laufvariable <b>i <\/b>direkt um die Anzahl Zeichen des ersetzenden Ausdrucks minus 1 erh&ouml;ht.<\/p>\n<p>Auf diese Weise werden alle Vorkommen des zu ersetzenden Ausdrucks ersetzt und die Funktion gibt das Ergebnis zur&uuml;ck.<\/p>\n<h2>Zeichen austauschen<\/h2>\n<p>Das Ersetzen wird interessant, wenn wir bei einem <b>Format<\/b>-Ausdruck wie <b>1.000,00 <\/b>den Punkt gegen Komma und das Komma gegen den Punkt tauschen wollen. Wenn wir das mit zwei aufeinanderfolgenden Ausdr&uuml;cken erledigen, dann wird beim ersten der Punkt gegen das Komma ersetzt und beim zweiten beide Kommata durch Punkte. Wir ben&ouml;tigen also eine weitere benutzerdefinierte Funktion, die wir diesmal <b>InterchangeChars <\/b>nennen. Diese nimmt den zu untersuchenden Text sowie die beiden auszutauschenden Zeichen entgegen (siehe Listing 10).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>InterchangeChars(strText<span style=\"color:blue;\"> As String<\/span>, strChar1<span style=\"color:blue;\"> As String<\/span>, strChar2<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     For i = 1 To <span style=\"color:blue;\">Len<\/span>(strText)\r\n         Select Case <span style=\"color:blue;\">Mid<\/span>(strText, i, 1)\r\n             <span style=\"color:blue;\">Case <\/span>strChar1\r\n                 strText = <span style=\"color:blue;\">Left<\/span>(strText, i - 1) & strChar2 & <span style=\"color:blue;\">Mid<\/span>(strText, i + 1)\r\n                 i = i + 1\r\n             <span style=\"color:blue;\">Case <\/span>strChar2\r\n                 strText = <span style=\"color:blue;\">Left<\/span>(strText, i - 1) & strChar1 & <span style=\"color:blue;\">Mid<\/span>(strText, i + 1)\r\n                 i = i + 1\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     InterchangeChars = strText\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Die Hilfsfunktion InterchangeChars<\/span><\/b><\/p>\n<p>Wir gehen davon aus, dass immer nur aus einem Zeichen bestehende Ausdr&uuml;cke zum Vertauschen angegeben werden. Daher k&ouml;nnen wir in einer <b>For&#8230;Next<\/b>-Schleife einfach alle Elemente durchlaufen und wenn wir eines der zu vertauschenden Zeichen finden, ersetzen wir dieses entsprechend durch Auseinandernehmen und anschlie&szlig;endes Zusammenf&uuml;gen der Teile um das zu ersetzende Zeichen herum.<\/p>\n<h2>Fokus auf txtFormat<\/h2>\n<p>In unserer Anwendung war durch das nachtr&auml;gliche Hinzuf&uuml;gen des Textfeldes <b>txtFormat <\/b>die Aktivierreihenfolge der Steuerelemente so ver&auml;ndert, dass dieses Textfeld nicht direkt den Fokus erhielt. Dies haben wir durch Verschieben dieses Elements an die erste Stelle im Dialog <b>Reihenfolge <\/b>wie in Bild 10 erreicht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_014.png\" alt=\"Anpassen der Aktivierreihenfolge der Steuerelemente im Assistenten\" width=\"499,5589\" height=\"333,5226\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Anpassen der Aktivierreihenfolge der Steuerelemente im Assistenten<\/span><\/b><\/p>\n<h2>OK und Abbrechen mit Eingabetaste und Escape<\/h2>\n<p>Das Formular des Assistenten soll, wenn der Benutzer die <b>OK<\/b>-Schaltfl&auml;che bet&auml;tigt, geschlossen werden &#8211; genau wie bei der <b>Abbrechen<\/b>-Schaltfl&auml;che. Dies wollen wir noch ein wenig vereinfachen, indem wir die beiden Schaltfl&auml;chen mit den beiden Tasten <b>Eingabetaste <\/b>und <b>Escape <\/b>verkn&uuml;pfen (siehe &#8222;Entwurf des Formulars frmDatenquelleUndFeldAuswerten&#8220; auf Seite Formatassistent f&uuml;r Textfelder).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_016.png\" alt=\"Entwurf des Formulars frmDatenquelleUndFeldAuswerten\" width=\"424,5589\" height=\"284,2619\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Entwurf des Formulars frmDatenquelleUndFeldAuswerten<\/span><\/b><\/p>\n<p>Dazu markieren wir beispielsweise die <b>OK<\/b>-Schaltfl&auml;che und w&auml;hlen im Eigenschaftenblatt den Bereich <b>Andere <\/b>aus. Hier stellen wir die Eigenschaft <b>Standard <\/b>auf <b>Ja <\/b>ein (siehe Bild 12). Von nun an wird die Ereignisprozedur hinter dieser Schaltfl&auml;che ausgef&uuml;hrt, wenn der Benutzer im Formular die Eingabetaste bet&auml;tigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_017.png\" alt=\"Bet&auml;tigen der OK-Schaltfl&auml;che per Eingabetaste\" width=\"499,5589\" height=\"348,4008\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Bet&auml;tigen der OK-Schaltfl&auml;che per Eingabetaste<\/span><\/b><\/p>\n<p>Das Gleiche erledigen wir f&uuml;r die <b>Abbrechen<\/b>-Schaltfl&auml;che &#8211; nur, dass wir f&uuml;r diese die Eigenschaft <b>Abbrechen <\/b>auf <b>Ja <\/b>einstellen.<\/p>\n<h2>Installieren des Assistenten<\/h2>\n<p>Sobald wir die oben genannten Elemente und vor allem die Tabelle <b>USysRegInfo <\/b>in der Assistenten-Datenbank angelegt und diese unter der Dateiendung <b>.accda <\/b>gespeichert haben, k&ouml;nnen wir das Add-In installieren.<\/p>\n<p>Dazu rufen wir in einer im Administratormodus ge&ouml;ffneten Access-Instanz den Men&uuml;befehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>auf und klicken dort auf die Schaltfl&auml;che <b>Neues hinzuf&uuml;gen&#8230;<\/b>, um den Assistenten zu installieren.<\/p>\n<p>Hier w&auml;hlen Sie die <b>.accda<\/b>-Datei des Assistenten aus. Danach ist der Eintrag in der Liste der Verf&uuml;gbaren Add-Ins sichtbar (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_018.png\" alt=\"Der Assistent in der Liste der Add-Ins\" width=\"424,5589\" height=\"253,7593\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Der Assistent in der Liste der Add-Ins<\/span><\/b><\/p>\n<h2>Ausprobieren des Assistenten<\/h2>\n<p>Danach finden wir f&uuml;r s&auml;mtliche <b>Format<\/b>-Eigenschaften in Tabellen, Abfragen, Formularen und Berichten nicht mehr nur die Schaltfl&auml;che zum Aufklappen einer Liste mit Vorschl&auml;gen, sondern auch noch eine Schaltfl&auml;che mit drei Punkten (siehe Bild 14). Damit &ouml;ffnen wir nun den Assistenten, probieren das gew&uuml;nschte Format mit bis zu zehn verschiedenen Werten gleichzeitig aus und schlie&szlig;en es dann mit der Schaltfl&auml;che <b>OK<\/b>, um das aktuelle Format zu &uuml;bernehmen, oder verwerfen es mit einem Klick auf die Schaltfl&auml;che <b>Abbrechen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_010.png\" alt=\"Aufruf des Format-Assistenten\" width=\"499,5589\" height=\"347,6462\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Aufruf des Format-Assistenten<\/span><\/b><\/p>\n<p>F&uuml;r ein Datumsfeld sieht dies beispielsweise wie in Bild 15 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_019.png\" alt=\"Anzeige des Format-Assistenten\" width=\"574,559\" height=\"585,503\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Anzeige des Format-Assistenten<\/span><\/b><\/p>\n<p>Die aktuell im Feld <b>txtFormat <\/b>eingegebene Formatierung wird direkt auf die in der Spalte <b>Formatierter Wert <\/b>angezeigten Werte angewendet.<\/p>\n<p>Nach dem Schlie&szlig;en wird der angepasste Format-Ausdruck in die aufrufende Eigenschaft &uuml;bernommen.<\/p>\n<h2>Technik zum Anpassen oder Erweitern des Assistenten<\/h2>\n<p>Nach einigen schlechten Erfahrungen, in denen wir den Code eines Add-Ins oder Assistenten angepasst haben, w&auml;hrend wir dies von der entsprechenden Host-Datei aus aufgerufen haben und nach dem Schlie&szlig;en alle durchgef&uuml;hrten &Auml;nderungen verloren haben, sind wir auf eine praktische Methode zum Testen von Assistenten gesto&szlig;en.<\/p>\n<p>Die Funktionen von Men&uuml;-Assistenten, die wir &uuml;ber den Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins <\/b>aufrufen k&ouml;nnen, k&ouml;nnen wir auch direkt in der Add-In-Datenbank testen, indem wir die entsprechende Funktion direkt aufrufen.<\/p>\n<p>Bei Assistenten wie etwa den Eigenschafts-Assistenten sieht es etwas anders aus, denn hier wollen wir speziell das &Uuml;bernehmen des aktuellen Wertes der Eigenschaft und die R&uuml;ckgabe des ge&auml;nderten Wertes ausprobieren. Das Problem dabei ist, dass dies nicht gelingt, wenn der Assistent nicht installiert ist.<\/p>\n<p>Wenn er installiert ist und wir rufen seine Funktion &uuml;ber eine andere Host-Anwendung auf, dann k&ouml;nnen wir, wenn uns Fehler oder notwendige &Auml;nderungen auffallen, nicht direkt den Code anpassen, da der Assistent nur als Assistent ge&ouml;ffnet ist und &Auml;nderungen nicht gespeichert werden. <\/p>\n<p>Unsere neue, sehr praktische Methode ist, die Funktionen des Assistenten von der <b>.accda<\/b>-Datenbank aus aufzurufen. Damit k&ouml;nnen wir die Funktionen von Beispielobjekten wie Tabellen, Abfragen oder Formularen aus aufrufen, aber auch den VBA-Code direkt anpassen, wenn &Auml;nderungen notwendig sind.<\/p>\n<p>Eine der wenigen Dinge, die wir tats&auml;chlich von einer &#8222;echten&#8220; Host-Datenbank aus ausprobieren m&uuml;ssen, ist der Zugriff auf die Tabellen der <b>.accda<\/b>-Datenbank und der Host-Datenbank. Weiter oben haben wir beispielsweise berichtet, dass wir, wenn wir von der Benutzeroberfl&auml;che des Assistenten auf die Daten der <b>MSysObjects<\/b>-Tabelle der Host-Datenbank zugreifen wollen, per VBA ein Recordset erstellen und &uuml;ber <b>CurrentDb <\/b>auf dieses zugreifen m&uuml;ssen.<\/p>\n<p>Ein direktes Einbinden der Daten dieser Tabelle in einem Formular des Assistenten w&auml;re nicht m&ouml;glich, weil dann automatisch die gleichnamige Tabelle der <b>.accda<\/b>-Datenbank verwendet wird.<\/p>\n<p>Wenn man dies nicht ber&uuml;cksichtigt, f&auml;llt dies erst auf, wenn man tats&auml;chlich mit einer Host-Datenbank auf den Assistenten zugreift, und daf&uuml;r ist der Test mit einer eigenst&auml;ndigen Host-Datenbank zwingend n&ouml;tig. Und hier ist dann wieder Vorsicht beim Durchf&uuml;hren von Code-&Auml;nderungen geboten, denn in diesem Setting werden diese nicht gespeichert.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag haben wir einen Assistenten vorgestellt, mit dem wir die <b>Format<\/b>-Eigenschaft verschiedener Objekte wie Tabellenfelder, Abfragefelder oder Formulare ausprobieren und festlegen k&ouml;nnen. Zum Ausprobieren nutzen wir in der aktuellen Version noch vorgegebene und in einer Tabelle des Assistenten gespeicherte Beispieldaten.<\/p>\n<p>Um das Erlebnis f&uuml;r den Benutzer noch besser zu gestalten, soll dieser die Gelegenheit bekommen, die zu formatierenden Daten auf den Assistenten zu &uuml;bertragen, sodass dieser sie anzeigt und der Benutzer die gew&uuml;nschten Formatierungen direkt auf seinen Originaldaten ausprobieren kann (siehe Bild 16).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_01\/pic_1417_020.png\" alt=\"Der Formatassistent in Aktion\" width=\"499,5589\" height=\"386,6223\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Der Formatassistent in Aktion<\/span><\/b><\/p>\n<p>Wie wir den Assistenten entsprechend erweitern, zeigen wir im zweiten Teil dieser Beitragsreihe in der folgenden Ausgabe von Access im Unternehmen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvFormatAssistent.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F0D9C5E4-0D65-4F61-9504-F840C3CE5F7E\/aiu_1417.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access liefert standardm&auml;&szlig;ig bereits einige Assistenten mit. F&uuml;r die Format-Eigenschaft jedoch liefert es nur ein Auswahlfeld mit einigen voreingestellten Optionen wie verschiedneen Zeit-, Zahlen und Boolean-Formaten. Diese dienen durchaus als gute Beispiele, wie man selbst Formatierungen vornehmen kann, aber wenn man sich dann an diese Aufgabe begibt, wird schnell ein ziemliches Experimentieren daraus. Um diesen Teil zu vereinfachen, wollen wir Sie mit einem Assistenten unterst&uuml;tzen. Dieser soll direkt &uuml;ber das Eingabefenster f&uuml;r die Format-Eigenschaft ge&ouml;ffnet werden und die M&ouml;glichkeit bieten, verschiedene Werte einzugeben und diese mit dem ge&uuml;nwschten  Formatierungsausdruck zu testen. Und nat&uuml;rlich finden Sie in diesem Beitrag die Anleitung, wie Sie den Assistenten selbst erstellen 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":[66012023,662023,44000027],"tags":[],"class_list":["post-55001417","post","type-post","status-publish","format-standard","hentry","category-66012023","category-662023","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Formatassistent f&uuml;r Textfelder - 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\/Formatassistent_fuer_Textfelder\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formatassistent f&uuml;r Textfelder\" \/>\n<meta property=\"og:description\" content=\"Access liefert standardm&auml;&szlig;ig bereits einige Assistenten mit. F&uuml;r die Format-Eigenschaft jedoch liefert es nur ein Auswahlfeld mit einigen voreingestellten Optionen wie verschiedneen Zeit-, Zahlen und Boolean-Formaten. Diese dienen durchaus als gute Beispiele, wie man selbst Formatierungen vornehmen kann, aber wenn man sich dann an diese Aufgabe begibt, wird schnell ein ziemliches Experimentieren daraus. Um diesen Teil zu vereinfachen, wollen wir Sie mit einem Assistenten unterst&uuml;tzen. Dieser soll direkt &uuml;ber das Eingabefenster f&uuml;r die Format-Eigenschaft ge&ouml;ffnet werden und die M&ouml;glichkeit bieten, verschiedene Werte einzugeben und diese mit dem ge&uuml;nwschten Formatierungsausdruck zu testen. Und nat&uuml;rlich finden Sie in diesem Beitrag die Anleitung, wie Sie den Assistenten selbst erstellen k&ouml;nnen!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-17T09:32:54+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b\" \/>\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=\"31\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Formatassistent f&uuml;r Textfelder\",\"datePublished\":\"2023-06-17T09:32:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/\"},\"wordCount\":5419,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/6acaf28d271145e7996de8aaf867a93b\",\"articleSection\":[\"1\\\/2023\",\"2023\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/\",\"name\":\"Formatassistent f&uuml;r Textfelder - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/6acaf28d271145e7996de8aaf867a93b\",\"datePublished\":\"2023-06-17T09:32:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/6acaf28d271145e7996de8aaf867a93b\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/6acaf28d271145e7996de8aaf867a93b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formatassistent_fuer_Textfelder\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formatassistent f&uuml;r Textfelder\"}]},{\"@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":"Formatassistent f&uuml;r Textfelder - 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\/Formatassistent_fuer_Textfelder\/","og_locale":"de_DE","og_type":"article","og_title":"Formatassistent f&uuml;r Textfelder","og_description":"Access liefert standardm&auml;&szlig;ig bereits einige Assistenten mit. F&uuml;r die Format-Eigenschaft jedoch liefert es nur ein Auswahlfeld mit einigen voreingestellten Optionen wie verschiedneen Zeit-, Zahlen und Boolean-Formaten. Diese dienen durchaus als gute Beispiele, wie man selbst Formatierungen vornehmen kann, aber wenn man sich dann an diese Aufgabe begibt, wird schnell ein ziemliches Experimentieren daraus. Um diesen Teil zu vereinfachen, wollen wir Sie mit einem Assistenten unterst&uuml;tzen. Dieser soll direkt &uuml;ber das Eingabefenster f&uuml;r die Format-Eigenschaft ge&ouml;ffnet werden und die M&ouml;glichkeit bieten, verschiedene Werte einzugeben und diese mit dem ge&uuml;nwschten Formatierungsausdruck zu testen. Und nat&uuml;rlich finden Sie in diesem Beitrag die Anleitung, wie Sie den Assistenten selbst erstellen k&ouml;nnen!","og_url":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-06-17T09:32:54+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"31\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Formatassistent f&uuml;r Textfelder","datePublished":"2023-06-17T09:32:54+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/"},"wordCount":5419,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b","articleSection":["1\/2023","2023","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/","url":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/","name":"Formatassistent f&uuml;r Textfelder - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b","datePublished":"2023-06-17T09:32:54+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/6acaf28d271145e7996de8aaf867a93b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Formatassistent_fuer_Textfelder\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Formatassistent f&uuml;r Textfelder"}]},{"@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\/55001417","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=55001417"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001417\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}