{"id":55001466,"date":"2023-12-01T00:00:00","date_gmt":"2023-11-07T11:45:42","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1466"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Benutzerdefinierte_Standardwerte","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/","title":{"rendered":"Benutzerdefinierte Standardwerte"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/de5eeb7043694050922c058c733fe18d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Standardwerte f&uuml;r Felder legt in der Regel der Entwickler beim Definieren des Datenmodells in der Entwurfsansicht der Tabellen fest. W&auml;hrend man in bestimmten Ma&szlig;en dynamische Werte nutzen kann wie beispielsweise mit der Datum()-Funktion f&uuml;r Datumsfelder, ist man ansonsten recht unflexibel. Leider k&ouml;nnen nur einige eingebaute Funktionen genutzt werden, benutzerdefinierte VBA-Funktionen sind nicht m&ouml;glich. Aber welche benutzerdefinierten Standardwerte wollen wir &uuml;berhaupt nutzen &#8211; und wo wollen wir diese festlegen? Die Einsatzzwecke sind vielf&auml;ltig und prinzipiell k&ouml;nnen wir jedes Feld mit einem benutzerdefinierten Standardwert nutzen. Wichtig ist der Gedanke dahinter: Sinnvoll gew&auml;hlte Standardwerte sparen dem Benutzer wertvolle Zeit bei der Dateneingabe. Wenn wir zum Beispiel eine Datenbank planen, die &uuml;berwiegend weibliche Kontakte verwaltet, ist es sinnvoll, als Anrede &#8222;Frau&#8220; vorzugeben. Oder wir haben eine Autowerkstatt, die haupts&auml;chlich Fahrzeuge einer bestimmten Marke repariert &#8211; dann macht es Sinn, diese vorzubelegen. Wir k&ouml;nnen auch dynamisch den zuletzt verwendeten Eintrag als Standardwert angeben oder auch den meistgenutzen. Wie wir dies realisieren, zeigen wir im vorliegenden Beitrag.<\/b><\/p>\n<h2>Herk&ouml;mmliche Standardwerte<\/h2>\n<p>Das Festlegen von Standardwerten ist recht einfach &#8211; man wechselt in den Entwurf der betroffenen Tabelle, klickt das Feld an, dem man einen Standardwert zuweisen will und stellt die Eigenschaft <b>Standardwert <\/b>auf den gew&uuml;nschten Wert ein.<\/p>\n<p>Bei Zahlenfeldern legt man so vielleicht den Wert <b>0 <\/b>fest, bei Datumsfeldern mit dem Ausdruck <b>=Datum() <\/b>das aktuelle Datum oder bei <b>Ja\/Nein<\/b>-Feldern den Wert <b>Ja<\/b>. Das ist schnell gemacht, aber relativ unflexibel &#8211; es gibt ein paar eingebaute Funktionen, die man hier nutzen kann, aber ansonsten ist man auf statische Werte angewiesen.<\/p>\n<h2>Dynamische Standardwerte<\/h2>\n<p>Wollen wir dies flexibel erledigen, haben wir im Tabellen- und Abfrageentwurf keine M&ouml;glichkeiten. Die n&auml;chste Ebene sind die Formulare: Hier k&ouml;nnen wir f&uuml;r Steuerelemente, die an Tabellenfelder gebunden sind, per VBA einen Standardwert definieren. Aber welche Werte wollen wir &uuml;berhaupt als Standardwerte nutzen? Es gibt zum Beispiel die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Den beim zuletzt angelegten oder ge&auml;nderten Datensatz verwendeten Wert,<\/li>\n<li>den Wert, der am meisten verwendet wurde oder<\/li>\n<li>Werte, die durch den Benutzer als Standardwert vordefiniert wurden.<\/li>\n<\/ul>\n<p>Die ersten beiden Vorschl&auml;ge erfordern keine aktive Mitarbeit des Benutzers, der letzte hingegen schon.<\/p>\n<h2>Zuletzt verwendeten Wert als Standardwert nutzen<\/h2>\n<p>Wenn wir wie in Bild 1 den Namen <b>Andreas <\/b>in das Textfeld <b>txtVorname <\/b>eingeben und wollen, dass dieser fortan als Standardwert verwendet wird, ben&ouml;tigen wir eine VBA-Prozedur, die entweder nach dem Aktualisieren des Steuerelements oder des Formulars ausgel&ouml;st wird und die Eigenschaft <b>DefaultValue <\/b>des Textfeldes auf den soeben eingegebenen Wert einstellt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_001.png\" alt=\"Dieser Wert wurde soeben als Standardwert &uuml;bernommen\" width=\"499,5589\" height=\"206,7846\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Dieser Wert wurde soeben als Standardwert &uuml;bernommen<\/span><\/b><\/p>\n<p>In diesem Fall wollen wir dies direkt nach dem Eingeben des Wertes und dem Aktualisieren des Steuerelements erledigen. Dazu hinterlegen wir die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtVorname_AfterUpdate()\r\n     Me!txtVorname.DefaultValue = _\r\n         Chr(34) & Me!txtVorname & Chr(34)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir weisen hier allerdings nicht einfach den Wert des Textfeldes zu, sondern m&uuml;ssen diesen noch in Anf&uuml;hrungszeichen einfassen, die wir wie hier durch die entsprechende <b>Chr<\/b>-Funktion angeben oder alternativ beispielsweise mit vier Anf&uuml;hrungszeichen:<\/p>\n<pre>Me!txtVorname.DefaultValue = \"\"\"\" & Me!txtVorname & \"\"\"\"<\/pre>\n<p>Auch wenn wir eine feste Zeichenkette angeben wollen, m&uuml;ssen wir diese &uuml;brigens in zus&auml;tzliche Anf&uuml;hrungszeichen einfassen:<\/p>\n<pre>Me!txtVorname.DefaultValue = \"\"\"Beispiel\"\"\"<\/pre>\n<h2>Standardwert f&uuml;r weitere Datentypen<\/h2>\n<p>Bei Datumsangaben m&uuml;ssen wir das Datum zuvor in einen Zahlenwert konvertieren. Bei reinen Datumsangaben ohne Uhrzeit reicht dies aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtGeburtsdatum_AfterUpdate()\r\n     Me!txtGeburtsdatum.DefaultValue = CLng(Me!txtGeburtsdatum)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir ein Feld verwenden, das auch eine Uhrzeit enth&auml;lt, ben&ouml;tigen wir die Funktion <b>CDbl <\/b>&#8211; die Nachkommastellen nehmen in diesem Fall die Uhrzeit auf:<\/p>\n<pre>Me!txtGeburtsdatum.DefaultValue = CDbl(Me!txtGeburtsdatum)<\/pre>\n<p>Bei <b>Ja\/Nein<\/b>-Feldern greifen wir direkt auf den jeweiligen Wert zu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>chkAktiv_AfterUpdate()\r\n     Me!chkAktiv.DefaultValue = Me!chkAktiv\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Bei Zahlenwerten und W&auml;hrungsfeldern m&uuml;ssen wir das Komma durch den Punkt ersetzen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>&nbsp;&nbsp;&nbsp;&nbsp;Sub txtTaschengeld_AfterUpdate()\r\n     Me!txtTaschengeld.DefaultValue = _\r\n         <span style=\"color:blue;\">Replace<\/span>(Me!txtTaschengeld, \",\", \".\")\r\n<span style=\"color:blue;\">End Sub<\/span> \r\n<span style=\"color:blue;\">Private Sub <\/span>txtGewicht_AfterUpdate()\r\n     Me!txtGewicht.DefaultValue = _\r\n         <span style=\"color:blue;\">Replace<\/span>(Me!txtGewicht, \",\", \".\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Nachteil: Kein Speichern des Standardwerts<\/h2>\n<p>Der Nachteil dieser Methode ist, dass der zuletzt verwendete Wert erst als Standardwert genutzt wird, wenn wir den Inhalt des Steuerelements nach dem &Ouml;ffnen des Formulars erstmals bearbeitet haben.<\/p>\n<p>Wir m&uuml;ssten uns also eine M&ouml;glichkeit &uuml;berlegen, diesen Wert alternativ zu speichern und ihn wiederherzustellen. Dazu kommen wir weiter unten &#8211; erst schauen wir uns die anderen Varianten an.<\/p>\n<h2>Am meisten verwendeten Wert als Standardwert nutzen<\/h2>\n<p>Wenn wir schon eine VBA-Prozedur verwenden, k&ouml;nnen wir auch gleich noch andere Methoden zur Ermittlung des Standardwertes nutzen. So k&ouml;nnen wir beispielsweise ermitteln, welcher Wert in einem Feld am meisten verwendet wurde und diesen als Standardwert in das Feld eintragen.<\/p>\n<p>Dazu verwenden wir die Prozedur aus Listing 1. Diese ermittelt in einem Recordset den Wert des Feldes <b>Nachname<\/b>, der den h&ouml;chsten Wert f&uuml;r die Anzahl der Werte der Gruppierungen &uuml;ber das Feld <b>Nachname <\/b>enth&auml;lt. Sprich: Die Abfrage gruppiert die Datens&auml;tze nach dem Wert im Feld <b>Nachname<\/b>, z&auml;hlt diese und verwendet die Anzahl gleich noch als Sortierkriterium.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>NachnameStandardwert()\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strNachname<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 TOP 1 Nachname FROM tblPersonen GROUP BY Nachname ORDER BY COUNT(*) DESC\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.EOF<span style=\"color:blue;\"> Then<\/span>\r\n         strNachname = rst.Fields(0)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtNachname.DefaultValue = \"\"\"\" & strNachname & \"\"\"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Einstellen des h&auml;ufigsten Nachnamens als Standardwert<\/span><\/b><\/p>\n<p>Davon holt sie mit <b>TOP 1 <\/b>den ersten Eintrag. Danach pr&uuml;ft sie, ob die Abfrage einen Datensatz gefunden hat und stellt den Wert der Variablen <b>strNachname <\/b>auf den gefundenen Nachnamen ein. Dieser wird dann als Standardwert des Feldes <b>txtNachname <\/b>festgelegt.<\/p>\n<p>Damit wir sowohl beim &Ouml;ffnen des Formulars als auch nach dem Aktualisieren eines der Nachnamen jeweils den korrekten Standardwert f&uuml;r dieses Feld angeben k&ouml;nnen, rufen wir diese Prozedur gleich zwei Mal auf &#8211; zuerst in der Prozedur, die durch das Ereignis <b>Beim &Ouml;ffnen <\/b>des Formulars ausgel&ouml;st wird: <\/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;\">Call<\/span> NachnameStandardwert\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Zweitens nach dem &Auml;ndern des Wertes f&uuml;r einen Datensatz im Feld <b>Nachname<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtNachname_AfterUpdate()\r\n     <span style=\"color:blue;\">Call<\/span> NachnameStandardwert\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Standardwert beim &Ouml;ffnen einstellen<\/h2>\n<p>Den Standardwert k&ouml;nnen wir also auch gleich beim &Ouml;ffnen des Formulars zu setzen &#8211; und zwar in den Prozeduren f&uuml;r die Ereigniseigenschaften <b>Beim Laden<\/b> und <b>Beim &Ouml;ffnen<\/b>.<\/p>\n<h2>Wert aus dem zuletzt hinzugef&uuml;gten Datensatz ermitteln<\/h2>\n<p>Nun fehlt noch eine M&ouml;glichkeit, diese Standardwerte zu speichern, denn wie wir oben beschrieben haben, sind diese nach dem erneuten &Ouml;ffnen des Formulars wieder geleert. Wir haben zwar gesehen, dass wir in den Ereignisprozeduren <b>Form_Load <\/b>oder <b>Form_Open <\/b>die Werte neu einstellen k&ouml;nnen. Hier k&ouml;nnen wir aber beispielsweise nicht den zuletzt verwendeten Wert einstellen, da dieser nicht gespeichert wird. Dies w&uuml;rde h&ouml;chstes gelingen, wenn wir die Anforderung so definieren, dass der Wert des zuletzt angelegten Datensatzes als Standardwert verwendet wird. Dann w&uuml;rden wir beispielsweise diese Prozedur nutzen, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird &#8211; also beim Wechseln zu einem anderen Datensatz und somit auch zu einem neuen, leeren Datensatz:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">Dim <\/span>strAnrede<span style=\"color:blue;\"> As String<\/span>\r\n     strAnrede = Nz(DLookup(\"Anrede\", \"tblPersonen\", _\r\n         \"ID = \" & Nz(DMax(\"ID\", \"tblPersonen\"), 0)), \"\")\r\n     Me!txtAnrede.DefaultValue = \"\"\"\" & strAnrede & \"\"\"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier ermitteln wir mit <b>DMax <\/b>die h&ouml;chste Zahl im Feld <b>ID<\/b>, was in der Regel dem zuletzt angelegten Datensatz entspricht. Diese verwenden wir als Parameter f&uuml;r einen Aufruf der <b>DLookup<\/b>-Funktion, um die passende Anrede dazu zu finden. Das Ergebnis schreiben wir anschlie&szlig;end als Standardwert in das Textfeld <b>txtAnrede<\/b>.<\/p>\n<h2>Standardwerte speichern<\/h2>\n<p>Damit kommen wir endg&uuml;ltig zum Speichern der Standardwerte. Wenn dies gew&uuml;nscht ist, ben&ouml;tigen wir einen Ort, wo wir die Werte speichern k&ouml;nnen.<\/p>\n<p>Da wir ohnehin in einer Access-Datenbank arbeiten, legen wir dazu logischerweise eine eigene Tabelle an, die wir beispielsweise <b>tblStandardwerte <\/b>nennen. Hier wollen wir zun&auml;chst die folgenden Informationen speichern:<\/p>\n<ul>\n<li>Tabellenname<\/li>\n<li>Feldname<\/li>\n<\/ul>\n<p>Danach folgt der eigentlich interessante Wert, n&auml;mlich der Standardwert. Hier stellt sich die Frage, ob wir f&uuml;r jeden Datentyp ein eigenes Feld anlegen oder einfach alle Werte in ein Feld mit dem Datentyp speichern, der alles speichern kann &#8211; n&auml;mlich in einem Textfeld.<\/p>\n<p>Dar&uuml;ber hinaus lie&szlig;en sich je nach Einsatzzweck noch weitere Felder einf&uuml;gen:<\/p>\n<ul>\n<li><b>BenutzerID<\/b>: F&uuml;r den Fall, dass mehrere Benutzer mit der Anwendung arbeiten und jeder seine eigenen Standardwerte speichern m&ouml;chte.<\/li>\n<li><b>Geloescht<\/b>: Erm&ouml;glicht es, Datens&auml;tze als gel&ouml;scht zu markieren, die man gegebenenfalls nochmal wiederherstellen m&ouml;chte.<\/li>\n<li><b>Aktiv<\/b>: Erlaubt das Deaktivieren von Datens&auml;tzen f&uuml;r Standardwerte.<\/li>\n<li><b>Gruppe<\/b>: Gegebenenfalls m&ouml;chte man die Standardwerte nach Gruppen sortiert darstellen &#8211; das w&uuml;rde diese Einstellung erm&ouml;glichen.<\/li>\n<li><b>Datentyp<\/b>: Erlaubt es, je nach Datentyp gezielt auf den gespeicherten Wert zuzugreifen. Noch wichtiger: Wenn wir ein eigenes Formular zur Verwaltung der Standardwerte anbieten, sollten wir validieren k&ouml;nnen, ob der Wert g&uuml;ltig ist.<\/li>\n<\/ul>\n<h2>Mehrbenutzer<\/h2>\n<p>Bevor wir an die Umsetzung gehen, schauen wir uns die M&ouml;glichkeiten f&uuml;r Mehrbenutzer an. Hier gibt es zwei Varianten:<\/p>\n<ul>\n<li>Die Tabelle mit den Standardwerten ist im Backend gespeichert. In diesem Fall m&uuml;ssten wir ein Feld wie <b>BenutzerID <\/b>oder <b>MitarbeiterID <\/b>verwenden, um festlegen zu k&ouml;nnen, welchem Benutzer oder Mitarbeiter der Standardwert geh&ouml;rt.<\/li>\n<li>Die Tabelle mit den Standardwerten ist im Frontend gespeichert und jeder Benutzer hat sein Frontend in seinen Benutzerdokumenten, auf die er nach der Anmeldung zugreifen kann. Dann k&ouml;nnen wir auf ein Feld wie <b>BenutzerID <\/b>oder <b>MitarbeiterID <\/b>verzichten.<\/li>\n<\/ul>\n<p>Wir gehen der Einfachheit halber davon aus, dass wir entweder eine Einzelbenutzer-Anwendung haben oder dass jeder Benutzer eine Kopie des Frontends mit der Tabelle <b>tblStandardwerte <\/b>in seinem Benutzerverzeichnis hat.<\/p>\n<h2>Tabellen zum Verwalten der Standardwerte<\/h2>\n<p>Die Benutzeroberfl&auml;che gestalten wir je nach den m&ouml;glichen Elementen des Datenmodells, die wir oben vorgestellt haben. Um den Rahmen nicht zu sprengen, wollen wir die folgenden Daten darstellen:<\/p>\n<ul>\n<li>Tabellenname<\/li>\n<li>Feldname<\/li>\n<li>Standardwert<\/li>\n<li>Gruppe<\/li>\n<li>Datentyp<\/li>\n<\/ul>\n<p>Die Tabelle <b>tblStandardwerte<\/b> sieht in der Entwurfsansicht schlie&szlig;lich wie in Bild 2 aus. F&uuml;r die Kombination der beiden Felder <b>Tabellenname <\/b>und <b>Feldname <\/b>haben wir einen eindeutigen Schl&uuml;ssel definiert, damit kein Feldname doppelt zu einer Tabelle zugeordnet werden kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_004.png\" alt=\"Festlegen eines eindeutigen, zusammengesetzten Indexes\" width=\"599,559\" height=\"423,7225\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Festlegen eines eindeutigen, zusammengesetzten Indexes<\/span><\/b><\/p>\n<p>F&uuml;r das Feld <b>DatentypID <\/b>haben wir ein Nachschlagefeld eingerichtet, das mit der Tabelle <b>tblDatentypen <\/b>verkn&uuml;pft ist. Auf diese Weise brauchen wir dort nur die dem Datentyp entsprechende Zahl zu speichern. Die damit verkn&uuml;pfte Tabelle hei&szlig;t <b>tblDatentypen <\/b>und enth&auml;lt im Feld <b>ID <\/b>den Zahlenwert, den wir anschlie&szlig;end per VBA f&uuml;r das jeweilige Feld ermitteln, im Feld <b>Datentyp <\/b>die VBA-Konstante f&uuml;r den Datentyp sowie eine <b>Beschreibung <\/b>(siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_005.png\" alt=\"Datentypen f&uuml;r die Standardwerte\" width=\"424,5589\" height=\"668,6799\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Datentypen f&uuml;r die Standardwerte<\/span><\/b><\/p>\n<h2>Entwurf der Benutzeroberfl&auml;che<\/h2>\n<p>Um die Standardwerte zu verwalten, erstellen wir zwei Formulare. Das Unterformular <b>sfmStandardwerte<\/b> soll die Daten der Tabelle <b>tblStandardwerte <\/b>in der Datenblattansicht anzeigen. Dazu weisen wir dem Formular diese Tabelle f&uuml;r die Eigenschaft <b>Datensatzquelle <\/b>zu und ziehen die drei Felder <b>Tabellenname<\/b>, <b>Feldname <\/b>und <b>Standardwert <\/b>in den Detailbereich des Entwurfs.<\/p>\n<p>Anschlie&szlig;end speichern und schlie&szlig;en wir das Unterformular und ziehen es aus dem Navigationsbereich in den Entwurf des Hauptformulars <b>frmStandardwerte<\/b>. Hier f&uuml;gen wir noch eine Schaltfl&auml;che hinzu, mit der wir die Felder der Tabellen der aktuellen Datenbank in die Tabelle <b>tblStandardwerte <\/b>einlesen k&ouml;nnen.<\/p>\n<p>Au&szlig;erdem wollen wir mit dem Kontrollk&auml;stchen <b>chkStandardwerteUebernehmen<\/b> festlegen, ob die Standardwerte aus den Felddefinitionen &uuml;bernommen werden sollen, was nur beim ersten Einlesen empfehlenswert ist (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_006.png\" alt=\"Entwurf von Haupt- und Unterformular\" width=\"574,559\" height=\"315,5144\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf von Haupt- und Unterformular<\/span><\/b><\/p>\n<h2>Felder und Standardwerte einlesen<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdFelderEinlesen <\/b>l&ouml;st die folgende Prozedur aus. Diese ruft zwei weitere Routinen auf, von denen die erste die im Datenmodell vorhandenen Felder einliest und die zweite pr&uuml;ft, ob alle in der Tabelle <b>tblStandardwerte <\/b>angegebenen Felder noch vorhanden sind. Danach aktualisiert sie das Unterformular <b>sfmStandardwerte <\/b>mit der <b>Requery<\/b>-Methode:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFelderEinlesen_Click()\r\n     <span style=\"color:blue;\">Call<\/span> FelderEinlesen(Me!chkStandardwerteUebernehmen)\r\n     <span style=\"color:blue;\">Call<\/span> FelderEntfernen\r\n     Me!sfmStandardwerte.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>FelderEinlesen <\/b>nimmt den Wert des Kontrollk&auml;stchens <b>chkStandardwerteUebernehmen <\/b>als optionalen Parameter entgegen, der standardm&auml;&szlig;ig auf <b>False<\/b> eingestellt ist (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FelderEinlesen(<span style=\"color:blue;\">Optional<\/span> bolStandardwerteUebernehmen<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)\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>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     For Each tdf In db.TableDefs\r\n         Select Case <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>tdf.Name Like \"MSys*\"\r\n             <span style=\"color:blue;\">Case <\/span>tdf.Name Like \"USys*\"\r\n             <span style=\"color:blue;\">Case <\/span>tdf.Name = \"tblStandardwerte\"\r\n             <span style=\"color:blue;\">Case <\/span>tdf.Name = \"tblDatentypen\"\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 For Each fld In tdf.Fields\r\n                     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>bolStandardwerteUebernehmen<span style=\"color:blue;\"> Then<\/span>\r\n                         db.Execute \"INSERT INTO tblStandardwerte(Tabellenname, Feldname, Standardwert, DatentypID) \" _\r\n                             & \"VALUES(''\" & tdf.Name & \"'', ''\" & fld.Name & \"'', ''\" & fld.DefaultValue & \"'', \" _\r\n                             & fld.Type & \")\", dbFailOnError\r\n                     <span style=\"color:blue;\">Else<\/span>\r\n                         db.Execute \"INSERT INTO tblStandardwerte(Tabellenname, Feldname, DatentypID) VALUES(''\" _\r\n                             & tdf.Name & \"'', ''\" & fld.Name & \"'', \" & fld.Type & \")\", dbFailOnError\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     Select Case Err.Number\r\n                         <span style=\"color:blue;\">Case <\/span>3022\r\n                             <span style=\"color:blue;\">If <\/span>bolStandardwerteUebernehmen<span style=\"color:blue;\"> Then<\/span>\r\n                                 db.Execute \"UPDATE tblStandardwerte(Tabellenname, Feldname, Standardwert, \" _\r\n                                     & \"DatentypID) VALUES(''\" & tdf.Name & \"'', ''\" & fld.Name & \"'', ''\" _\r\n                                     & fld.DefaultValue & \"'', \" & fld.Type & \") WHERE Tabellenname = ''\" & tdf.Name _\r\n                                     & \"'' AND Feldname = ''\" & fld.Name & \"''\", dbFailOnError\r\n                             <span style=\"color:blue;\">Else<\/span>\r\n                                 db.Execute \"UPDATE tblStandardwerte(Tabellenname, Feldname, DatentypID) VALUES(''\" _\r\n                                     & tdf.Name & \"'', ''\" & fld.Name & \"'', \" & fld.Type & \") WHERE Tabellenname = ''\" _\r\n                                     & tdf.Name & \"'' AND Feldname = ''\" & fld.Name & \"''\", dbFailOnError\r\n                             <span style=\"color:blue;\">End If<\/span>\r\n                         <span style=\"color:blue;\">Case <\/span>0\r\n                         <span style=\"color:blue;\">Case Else<\/span>\r\n                             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \":\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n                     <span style=\"color:blue;\">End Select<\/span>\r\n                 <span style=\"color:blue;\">Next<\/span> fld\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> tdf\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Speichern der Felder in der Tabelle tblStandardwerte<\/span><\/b><\/p>\n<p>Sie durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Tabellendefinitionen der aktuellen Datenbank und pr&uuml;ft in einer <b>Select Case<\/b>-Bedingung, ob der Tabellenname bestimmten Namen wie <b>MSys*<\/b>, <b>USys*<\/b>, <b>tblStandardwerte <\/b>oder <b>tblDatentypen <\/b>entspricht. Diese Tabellen sollen beim Einlesen nicht ber&uuml;cksichtigt werden.<\/p>\n<p>F&uuml;r alle anderen durchl&auml;uft die Prozedur die <b>Fields<\/b>-Auflistung mit allen Feldern. Nach der Deaktivierung der eingebauten Fehlerbehandlung pr&uuml;ft die Prozedur, ob die Standardwerte &uuml;bernommen werden sollen. Falls ja, versucht sie, f&uuml;r die aktuelle Kombination aus Tabellenname und Feldname einen neuen Datensatz inklusive Standardwert und Felddatentyp in der Tabelle <b>tblStandardwerte <\/b>anzulegen. Das k&ouml;nnte einen Fehler ausl&ouml;sen, wenn diese Kombination bereits vorhanden ist. In diesem Fall wird in der folgenden <b>Select Case<\/b>-Bedingung gepr&uuml;ft, ob die Fehlernummer <b>3022 <\/b>lautet. Dieser Fehler wird immer ausgel&ouml;st, wenn man versucht, einen Datensatz anzulegen, dessen Kombination aus Schl&uuml;sselwerten bereits in einem anderen Datensatz vorliegt. In diesem Fall wollen wir die Werte f&uuml;r diesen Datensatz &uuml;berschreiben, was wir mit einer UPDATE-SQL-Anweisung erledigen, die genau die Daten f&uuml;r den Datensatz mit dem Tabellennamen und dem Feldnamen aktualisiert. Die Aktualisierung bezieht sich auf den Felddatentyp und gegebenenfalls auf den im Tabellenentwurf gespeicherten Standardwert. Auch haben wir zwei Varianten &#8211; eine mit &Uuml;bernahme der Standardwerte aus dem Tabellenentwurf und eine ohne.<\/p>\n<p>Wenn wir diese Prozedur ausf&uuml;hren, erhalten wir bereits die gew&uuml;nschten Daten im Formular (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_007.png\" alt=\"Liste der Standardwerte\" width=\"574,559\" height=\"496,5951\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Liste der Standardwerte<\/span><\/b><\/p>\n<p>Mit der Prozedur <b>FelderEinlesen <\/b>haben wir auch bereits die &Auml;nderungen von Felddatentypen ber&uuml;cksichtigt &#8211; diese werden durch die <b>UPDATE<\/b>-Anweisungen in die Tabelle <b>tblStandardwerte <\/b>&uuml;bernommen.<\/p>\n<h2>Gel&ouml;schte Felder aus den Standardwerten entfernen<\/h2>\n<p>Gelegentlich l&ouml;scht man Felder aus dem Tabellenentwurf. Dem wollen wir gerecht werden, indem wir mit der Prozedur <b>FelderEntfernen<\/b> alle in der Tabelle <b>tblStandardwerte <\/b>gespeicherten Kombinationen aus Tabellen und Feldern pr&uuml;fen.<\/p>\n<p>Die Prozedur durchl&auml;uft alle Datens&auml;tze des Recordsets auf Basis der Tabelle <b>tblStandardwerte<\/b>. Dabei stellt sie den Wert der <b>Field<\/b>-Variablen <b>fld <\/b>zuerst auf <b>Nothing <\/b>ein. Danach versucht sie, bei deaktivierter Fehlerbehandlung auf das Feld zuzugreifen, das sich in der Tabellendefinition aus <b>rst!Tabellenname <\/b>befindet und dem Feld mit dem Namen aus <b>rst!Feldname <\/b>entspricht. Ist <b>fld <\/b>danach leer, ist das Feld offensichtlich nicht mehr vorhanden. In diesem Fall l&ouml;scht die Prozedur den aktuellen Datensatz mit der <b>Delete<\/b>-Methode des <b>Recordset<\/b>-Objekts aus der Tabelle <b>tblStandardwerte<\/b>. Dieser Vorgang wird f&uuml;r alle in der Tabelle <b>tblStandardwerte<\/b> enthaltenen Datens&auml;tze wiederholt, sodass dort anschlie&szlig;end keine Standardwerte mehr f&uuml;r Felder vorliegen, die nicht in den Tabellen der Datenbank enthalten sind:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FelderEntfernen()\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset( _\r\n         & \"SELECT * FROM tblStandardwerte\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Set<\/span> fld = Nothing\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> fld = db.TableDefs(rst!Tabellenname). _\r\n             Fields(rst!Feldname)\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span>fld Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n             rst.Delete\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Standardwerte einstellen<\/h2>\n<p>Nun wollen wir dem Benutzer erlauben, neue Standardwerte f&uuml;r die Felder der Tabellen festzulegen. Eigentlich k&ouml;nnen wir ihm dazu einfach erlauben, die Werte in das Feld <b>Standardwert <\/b>im Unterformular einzugeben. Wir m&uuml;ssen allerdings daf&uuml;r Sorge tragen, dass er einen Wert eingibt, der dem Datentyp entspricht, der f&uuml;r dieses Feld festgelegt ist. Also m&uuml;ssen wir eine Validierung hinterlegen, die pr&uuml;ft, ob der Wert g&uuml;ltig ist.<\/p>\n<p>Als Erstes wollen wir jedoch sicherstellen, dass der Benutzer nicht den Tabellen- und den Feldnamen &auml;ndern kann. Dazu stellen wir die Eigenschaft <b>Aktiviert <\/b>auf <b>Nein <\/b>und <b>Gesperrt <\/b>auf <b>Ja <\/b>ein. Dadurch erreichen wir, dass die Steuerelemente zwar nicht mehr editierbar sind, aber dennoch nicht ausgegraut werden, wie es der Fall w&auml;re, wenn man nur die eigenschaft <b>Aktiviert <\/b>auf <b>Nein <\/b>einstellt (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_008.png\" alt=\"Deaktivieren der beiden Textfelder txtTabellenname und txtFeldname\" width=\"649,559\" height=\"362,5042\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Deaktivieren der beiden Textfelder txtTabellenname und txtFeldname<\/span><\/b><\/p>\n<p>Die Namen der Steuerelemente haben wir &uuml;brigens zuvor auf <b>txtTabellenname<\/b>, <b>txtFeldname <\/b>und <b>txtStandardwert <\/b>eingestellt.<\/p>\n<h2>Felddatentypen f&uuml;r Standardwerte<\/h2>\n<p>Wir wollen uns an dieser Stelle auf die &Auml;nderung folgender Felddatentypen beschr&auml;nken:<\/p>\n<ul>\n<li>Ja\/Nein-Felder (<b>dbBoolean<\/b>)<\/li>\n<li>Zahlenfelder (<b>dbByte<\/b>, <b>dbInteger<\/b>, <b>dbLong<\/b>, <b>dbCurrency<\/b>, <b>dbSingle<\/b>, <b>dbDouble<\/b>, <b>dbBigInt<\/b>, <b>dbDecimal<\/b>)<\/li>\n<li>Datumsfelder (<b>dbDate<\/b>)<\/li>\n<li>Textfelder (<b>dbText<\/b>, <b>dbMemo<\/b>)<\/li>\n<\/ul>\n<h2>Popup-Formulare zum &Auml;ndern der Standardwerte<\/h2>\n<p>F&uuml;r die ersten drei Kategorien wollen wir jeweils ein kleines Popup-Formular zum &Auml;ndern der Inhalte anzeigen, da wir hier eine Validierung einbauen m&uuml;ssen, die sicherstellt, dass der Benutzer Werte des entsprechenden Datentyps eingibt. F&uuml;r die Felder mit Texten ben&ouml;tigen wir dies nicht.<\/p>\n<p>Diese Formulare sollen beim Anklicken des Feldes <b>txtStandardwert <\/b>automatisch angezeigt werden, den aktuellen Inhalt anzeigen und die M&ouml;glichkeit bieten, einen neuen Wert einzugeben. Dabei sollen die Formulare eine <b>OK<\/b>&#8211; und eine <b>Abbrechen<\/b>-Schaltfl&auml;che enthalten. Die <b>OK<\/b>-Schaltfl&auml;che soll den Inhalt &uuml;bernehmen, die <b>Abbrechen<\/b>-Schaltfl&auml;che soll die Eingabe verwerfen.<\/p>\n<p>Die Popup-Formulare sollen genau an der Position des Mauszeigers erscheinen, wenn der Benutzer in das Textfeld <b>txtStandardwert <\/b>des Unterformulars klickt.<\/p>\n<p>Die dazu notwendige Technik haben wir im Beitrag <b>Formular an Mausposition &ouml;ffnen <\/b>(<b>www.access-im-unternehmen.de\/1465<\/b>) vorgestellt.<\/p>\n<h2>Aufrufen der Popup-Formulare<\/h2>\n<p>Damit beim Anklicken des Textfeldes <b>txtStandardwert <\/b>das jeweilige Popup-Formular angezeigt wird, f&uuml;gen wir dem Textfeld Ereignisprozeduren f&uuml;r die Ereigniseigenschaften <b>Bei Maustaste ab <\/b>und <b>Bei Maustaste auf <\/b>hinzu. Diese finden wir in Listing 3. In <b>txtStandardwert_MouseDown <\/b>merken wir uns die Position des Mauszeigers in der Variablen <b>pt<\/b>. In der Prozedur <b>txtStandardwert_MouseUp <\/b>zeigen wir schlie&szlig;lich die Popup-Formulare an. Dazu pr&uuml;fen wir zuerst, ob der Benutzer mit der linken Maustaste auf einen der Standardwerte geklickt hat. Ist das der Fall, schreiben wir die Koordinaten des Mauszeigers in die &ouml;ffentlichen Variablen <b>lngX <\/b>und <b>lngY<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>pt<span style=\"color:blue;\"> As <\/span>POINTAPI\r\n<span style=\"color:blue;\">Private Sub <\/span>txtStandardwert_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>Button = acLeftButton<span style=\"color:blue;\"> Then<\/span>\r\n         GetCursorPos pt\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtStandardwert_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strFormular<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Button = acLeftButton<span style=\"color:blue;\"> Then<\/span>\r\n         lngX = pt.X\r\n         lngY = pt.Y\r\n         Select Case Me!DatentypID\r\n             <span style=\"color:blue;\">Case <\/span>dbBoolean\r\n                 strFormular = \"frmStandardwertBoolean\"\r\n                 DoCmd.OpenForm strFormular, OpenArgs:=Me!txtStandardwert, WindowMode:=acDialog\r\n                 <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strFormular)<span style=\"color:blue;\"> Then<\/span>\r\n                     Me!txtStandardwert = Forms(strFormular)!chk\r\n                     DoCmd.Close acForm, strFormular\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>dbByte, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble, dbBigInt, dbDecimal\r\n                 strFormular = \"frmStandardwertNumeric\"\r\n                 DoCmd.OpenForm strFormular, OpenArgs:=Me!txtStandardwert, WindowMode:=acDialog\r\n                 <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strFormular)<span style=\"color:blue;\"> Then<\/span>\r\n                     Me!txtStandardwert = Forms(strFormular)!txt\r\n                     DoCmd.Close acForm, strFormular\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>dbDate\r\n                 strFormular = \"frmStandardwertDate\"\r\n                 DoCmd.OpenForm strFormular, OpenArgs:=Me!txtStandardwert, WindowMode:=acDialog\r\n                 <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(strFormular)<span style=\"color:blue;\"> Then<\/span>\r\n                     Me!txtStandardwert = Forms(strFormular)!txt\r\n                     DoCmd.Close acForm, strFormular\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Aufruf der Popupformulare<\/span><\/b><\/p>\n<p>Je nach dem Datentyp, der f&uuml;r den angeklickten Datensatz im Feld <b>DatentypID <\/b>gespeichert ist, arbeitet die Prozedur nun einen der Zweige der folgenden <b>Select Case<\/b>-Bedingung ab. Der erste k&uuml;mmert sich um <b>Ja\/Nein<\/b>-Felder. Wir &ouml;ffnen das Formular <b>frmStandardwertBoolean <\/b>und &uuml;bergeben diesem mit dem Parameter <b>OpenArgs <\/b>den aktuellen Wert des Feldes <b>Standardwert<\/b>. Das Formular wird als modaler Dialog ge&ouml;ffnet.<\/p>\n<p>Das Formular selbst sieht in der Entwurfsansicht wie in Bild 7 aus. In diesem Formular w&auml;hlt der Benutzer entweder den Wert <b>True <\/b>oder <b>False <\/b>aus und klickt dann auf die <b>OK<\/b>&#8211; oder die <b>Abbrechen<\/b>-Schaltfl&auml;che. Da wir das Formular als modalen Dialog ge&ouml;ffnet haben, l&auml;uft der aufrufende Code erst nach dem Schlie&szlig;en oder Ausblenden des Formulars weiter. In diesem Fall pr&uuml;fen wir mit der Funktion <b>IstFormularGeoeffnet<\/b>, ob dieses noch ge&ouml;ffnet ist. Falls ja, lesen wir den Wert des Kontrollk&auml;stchens <b>chk <\/b>im Formular aus und schreiben diesen in das Feld <b>txtStandardwert<\/b>. Danach schlie&szlig;en wir das Formular.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_009.png\" alt=\"Formular zum Einstellen von Boolean-Standardwerten\" width=\"424,5589\" height=\"153,4661\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Formular zum Einstellen von Boolean-Standardwerten<\/span><\/b><\/p>\n<p>Der Aufruf der beiden Formulare zum Einstellen der Standardwerte von Zahlen- und Datumsfeldern erfolgt analog.<\/p>\n<h2>Standardwert von Ja\/Nein-Feldern &auml;ndern<\/h2>\n<p>Das Formular zum &Auml;ndern der Standardwerte von <b>Ja\/Nein<\/b>-Feldern enth&auml;lt ein Kontrollk&auml;stchen sowie die beiden Schaltfl&auml;chen <b>cmdOK <\/b>und <b>cmdAbbrechen<\/b>.<\/p>\n<p>Beim Laden des Formulars wird das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st und startet die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>rec<span style=\"color:blue;\"> As <\/span>RECT\r\n     GetWindowRect Me.hwnd, rec\r\n     MoveWindow Me.hwnd, lngX, lngY, _\r\n         rec.<span style=\"color:blue;\">Right<\/span> - rec.Left, rec.Bottom - rec.Top, <span style=\"color:blue;\">True<\/span>\r\n     Me!chk = CBool(Nz(Me.OpenArgs, 0))\r\n     Me!chk.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese holt, wie im Beitrag <b>Formular an Mausposition &ouml;ffnen <\/b>(<b>www.access-im-unternehmen.de\/1465<\/b>) beschrieben, die Position des Formulars und stellt diese entsprechend der Position des Mauszeigers neu ein. Danach legt sie den Wert des Kontrollk&auml;stchens auf den mit dem &Ouml;ffnungsargument &uuml;bergebenen Wert fest. Schlie&szlig;lich legt sie den Fokus auf dieses Feld.<\/p>\n<p>Klickt der Benutzer auf die <b>OK<\/b>-Schaltfl&auml;che, l&ouml;st dies die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dadurch wird das Formular ausgeblendet und der Inhalt des Kontrollk&auml;stchens kann durch die aufrufende Prozedur ausgelesen werden. Klickt der Benutzer auf die <b>Abbrechen<\/b>-Schaltfl&auml;che, wird das Formular geschlossen und die aufrufende Prozedur bel&auml;sst den aktuellen Standardwert f&uuml;r dieses Feld auf dem aktuellen Wert:<\/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><\/pre>\n<p>F&uuml;r eine bessere Nutzbarkeit stellen wir f&uuml;r die Schaltfl&auml;che <b>cmdOK <\/b>die Eigenschaft <b>Standard <\/b>auf den Wert <b>Ja <\/b>ein. Dadurch wird der Code dieser Schaltfl&auml;che automatisch aufgerufen, wenn der Benutzer die Eingabetaste bet&auml;tigt.<\/p>\n<p>Analog stellen wir die Eigenschaft <b>Abbrechen <\/b>der Schaltfl&auml;che <b>cmdAbbrechen <\/b>auf den Wert <b>Ja <\/b>ein. Auf diese Weise f&uuml;hrt das Bet&auml;tigen der <b>Escape<\/b>-Taste zum Aufruf der Prozedur hinter der Schaltfl&auml;che <b>cmdAbbrechen<\/b>.<\/p>\n<p>&Ouml;ffnen wir das Formular frmStandardwerte in der Formularansicht und klicken auf ein <b>Ja\/Nein<\/b>-Feld, erhalten wir die Ansicht aus Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_010.png\" alt=\"Popup-Formular zur Eingabe von Ja\/Nein-Werten\" width=\"549,559\" height=\"252,2263\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Popup-Formular zur Eingabe von Ja\/Nein-Werten<\/span><\/b><\/p>\n<p>Das k&ouml;nnen wir noch sch&ouml;ner gestalten. In diesem Fall ist die Titelleiste eher st&ouml;rend. Das kleine Problem ist, das wir das Formular als modalen Dialog &ouml;ffnen, das hei&szlig;t, wir k&ouml;nnen das Design nicht beeinflussen &#8211; die Ansicht ist dann immer gleich.<\/p>\n<p>Doch auch daf&uuml;r haben wir eine L&ouml;sung, die wir im Beitrag <b>Modale Dialoge nach Wunsch gestalten <\/b>(<b>www.access-im-unternehmen.de\/1467<\/b>) vorstellen. Wir schauen uns das nun am Beispiel der Eingabe von Zahlenwerten an.<\/p>\n<p>Hier gestalten wir den <b>Select Case<\/b>-Zweig beim Anklicken des Eintrags wie in Listing 4. Die Prozedur erstellt eine neue Instanz des Formulars <b>frmStandardwertNumeric <\/b>und speichert diese in der folgenden Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtStandardwert_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>Button = acLeftButton<span style=\"color:blue;\"> Then<\/span>\r\n         lngX = pt.X\r\n         lngY = pt.Y\r\n         Select Case Me!DatentypID\r\n             ...\r\n             <span style=\"color:blue;\">Case <\/span>dbByte, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble, dbBigInt, dbDecimal\r\n                 <span style=\"color:blue;\">Set<\/span> frmNumeric = <span style=\"color:blue;\">New<\/span> Form_frmStandardwertNumeric\r\n                 frmNumeric.OnUnload = \"[Event Procedure]\"\r\n                 frmNumeric.Modal = <span style=\"color:blue;\">True<\/span>\r\n                 frmNumeric.Standardwert = Me!txtStandardwert\r\n                 frmNumeric.Visible = <span style=\"color:blue;\">True<\/span>\r\n             ...\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 Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Aufruf des Popup-Formulars frmStandardwertNumeric<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents frmNumeric<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Dann stellt sie die Eigenschaft <b>OnUnload <\/b>auf <b>[Event Procedure] <\/b>ein. Damit wird beim Schlie&szlig;en des Popup-Formulars die folgende Ereignisprozedur ausgel&ouml;st, welche die enthaltenen Daten ausliest und, sofern der Benutzer die <b>OK<\/b>-Schaltfl&auml;che geklickt hat, den neuen Standardwert in das aufrufende Feld speichert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>frmNumeric_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case frmNumeric.Action\r\n         <span style=\"color:blue;\">Case <\/span>\"OK\"\r\n             Me!txtStandardwert = frmNumeric!txt\r\n         <span style=\"color:blue;\">Case <\/span>\"Cancel\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Au&szlig;erdem stellt die Prozedur beim &Ouml;ffnen des Popup-Formulars noch die Eigenschaft <b>Modal <\/b>auf <b>True <\/b>ein, &uuml;bergibt den aktuellen Standardwert an die Eigenschaft <b>Standardwert <\/b>und blendet das Formular ein. Im Popup-Formular sorgt die <b>Beim Laden<\/b>-Ereignisprozedur daf&uuml;r, dass das Formular direkt am Mauszeiger positioniert wird und setzt den Fokus auf das Textfeld <b>txt<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>rec<span style=\"color:blue;\"> As <\/span>RECT\r\n     GetWindowRect Me.hwnd, rec\r\n     MoveWindow Me.hwnd, lngX, lngY, _\r\n         rec.<span style=\"color:blue;\">Right<\/span> - rec.Left, rec.Bottom - rec.Top, <span style=\"color:blue;\">True<\/span>\r\n     Me!txt.SetFocus\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der von der aufrufenden Prozedur an die Eigenschaft <b>Standardwert <\/b>&uuml;bergebene Wert wird in das Textfeld <b>txt <\/b>geschrieben. Anschlie&szlig;end wird die Schaltfl&auml;che <b>OK <\/b>aktiviert, sofern die Pr&uuml;fung auf einen Zahlenwert erfolgreich ist:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Standardwert(var<span style=\"color:blue;\"> As Variant<\/span>)\r\n     Me!txt = var\r\n     OKAktivieren Me!txt\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Das Pr&uuml;fen und Aktivieren erledigt diese Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>OKAktivieren(varWert<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>IsNumeric(varWert) Or IsNull(varWert)<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cmdOK.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!cmdOK.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>&Auml;ndert der Benutzer den Text, wird die Pr&uuml;fung erneut durchgef&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txt_Change()\r\n     OKAktivieren Me!txt.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Klickt er auf <b>OK<\/b>, stellt die folgende Prozedur die Variable <b>m_Action <\/b>auf <b>OK <\/b>ein und schlie&szlig;t das Formular:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     m_Action = \"OK\"\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Variable deklarieren wir oben im Modul:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_Action<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Schlie&szlig;t der Benutzer hingegen mit der <b>Abbrechen<\/b>-Schaltfl&auml;che, schreiben wir den Wert <b>Cancel <\/b>in <b>m_Action<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     m_Action = \"Cancel\"\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und &uuml;ber die folgenden beiden &ouml;ffentlichen Eigenschaften kann das aufrufende Formular in der <b>Unload<\/b>-Ereignisprozedur den Wert von <b>m_Action <\/b>und den Wert des Textfeldes <b>txt <\/b>auslesen:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>Action()<span style=\"color:blue;\"> As String<\/span>\r\n     Action = m_Action\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>Standardwert()<span style=\"color:blue;\"> As Variant<\/span>\r\n     Standardwert = Me!txt\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>F&uuml;r die drei Formulare <b>frmStandardwertBoolean<\/b>, <b>frmStandardwertDate <\/b>und <b>frmStandardwertNumeric <\/b>stellen wir nun noch die folgenden beiden Eigenschaften ein:<\/p>\n<ul>\n<li><b>Rahmenart<\/b>: <b>Keine<\/b><\/li>\n<li><b>Popup<\/b>: <b>Ja<\/b><\/li>\n<\/ul>\n<p>Damit sind wir fertig und k&ouml;nnen nun mit einem Klick in ein Feld mit dem Typ Boolean, Datum oder Zahl das Popup-Formular &ouml;ffnen (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_012.png\" alt=\"Ein nicht als Formular erkennbares Popup-Formular\" width=\"549,559\" height=\"295,1175\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ein nicht als Formular erkennbares Popup-Formular<\/span><\/b><\/p>\n<h2>Suchfunktion<\/h2>\n<p>Um das Formular etwas komfortabler zu gestalten, f&uuml;gen wir noch Suchfelder f&uuml;r die drei Spalten hinzu. Diese nennen wir <b>txtTabellenname<\/b>, <b>txtFeldname<\/b> und <b>txtStandardwert <\/b>(siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_013.png\" alt=\"Entwurf des Formulars mit Suchfeldern\" width=\"499,5589\" height=\"369,9774\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Entwurf des Formulars mit Suchfeldern<\/span><\/b><\/p>\n<p>Den Code zum Suchen f&uuml;gen wir im Klassenmodul des Formulars <b>frmStandarwerte <\/b>ein. Dabei verwenden wir eine allgemeine Suchfunktion, die wir bei &Auml;nderungen in den jeweiligen Textfeldern aufrufen. Wenn der Benutzer beispielsweise den Text im Suchfeld <b>txtTabellenname <\/b>eingibt, l&ouml;st er das Ereignis <b>Bei &Auml;nderung <\/b>und damit die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtTabellenname_Change()\r\n     <span style=\"color:blue;\">Call<\/span> Suche(Me!txtTabellenname.Text, _\r\n         Nz(Me!txtFeldname, \"\"), Nz(Me!txtStandardwert, \"\"))\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktion &uuml;bergibt den aktuellen Text des Textfeldes <b>txtTabellenname <\/b>sowie die Werte der Textfelder <b>txtFeldname <\/b>und <b>txtStandardwert <\/b>an die Prozedur <b>Suche<\/b>. Auf &auml;hnliche Weise arbeiten die beiden Ereignisprozeduren f&uuml;r die beiden anderen Textfelder:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtFeldname_Change()\r\n     <span style=\"color:blue;\">Call<\/span> Suche(Nz(Me!txtTabellenname, \"\"), _\r\n         Me!txtFeldname.Text, _\r\n         Nz(Me!txtStandardwert, \"\"))\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtStandardwert_Change()\r\n     <span style=\"color:blue;\">Call<\/span> Suche(Nz(Me!txtTabellenname, \"\"), _\r\n         Nz(Me!txtFeldname, \"\"), _\r\n         Me!txtStandardwert.Text)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Suchfunktion selbst finden wir in Listing 5. Sie nimmt die Vergleichswerte f&uuml;r die drei Felder entgegen und f&uuml;gt jeweils ein Kriterium zum Filterausdruck aus <b>strFilter <\/b>hinzu, wenn der jeweilige Vergleichsausdruck nicht leer ist. Dabei stellt sie jeweils den Operator <b>AND <\/b>voraus. Wenn <b>strFilter <\/b>anschlie&szlig;end nicht leer ist, wird das erste <b>AND <\/b>entfernt und das Ergebnis der Eigenschaft <b>Filter <\/b>des Unterformulars zugewiesen. Damit der Filter funktioniert, stellen wir au&szlig;erdem die Eigenschaft <b>FilterOn <\/b>auf den Wert <b>True <\/b>ein. Sind alle Vergleichskriterien leer, stellen wir einfach nur den Filter auf eine leere Zeichenfolge ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Suche(strTabellenname<span style=\"color:blue;\"> As String<\/span>, strFeldname<span style=\"color:blue;\"> As String<\/span>, strStandardwert<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<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>(strTabellenname) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND Tabellenname LIKE ''*\" & strTabellenname & \"*''\"\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>(strFeldname) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND Feldname LIKE ''*\" & strFeldname & \"*''\"\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>(strStandardwert) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \" AND Standardwert LIKE ''*\" & strStandardwert & \"*''\"\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>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = <span style=\"color:blue;\">Mid<\/span>(strFilter, 5)\r\n         Me!sfmStandardwerte.Form.Filter = strFilter\r\n         Me!sfmStandardwerte.Form.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmStandardwerte.Form.Filter = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Funktion zum Durchsuchen der Standardwerte<\/span><\/b><\/p>\n<p>Danach arbeitet die Suchfunktion wie in Bild 11.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_014.png\" alt=\"Die Suchfunktion im Einsatz\" width=\"424,5589\" height=\"287,4966\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Die Suchfunktion im Einsatz<\/span><\/b><\/p>\n<h2>Standardwerte einsetzen<\/h2>\n<p>Nun fehlt noch ein wichtiger Part: Wann und wo weisen wir die Standardwerte zu, die wir in der Tabelle <b>tblStandardwerte <\/b>zusammengetragen haben?<\/p>\n<p>Hier kommen eigentlich nur die Formulare in Frage, da diese die einzigen Elemente sind, f&uuml;r die wir VBA-Code hinterlegen k&ouml;nnen, um diese Aufgabe auszuf&uuml;hren.<\/p>\n<p>Dazu haben wir eine Standardfunktion ermittelt, der wir lediglich einen Verweis auf das Formular &uuml;bergeben, dessen Steuerelemente mit den entsprechenden Standardwerten gef&uuml;llt werden sollen. Den Aufruf legen wir in einer der Prozeduren fest, die entweder beim &Ouml;ffnen oder Laden eines Formulars ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Call<\/span> StandardwerteZuweisen(Me)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>StandardwerteZuweisen<\/b> referenziert mit der Variablen <b>rst <\/b>das Recordset des Formulars. Sie durchl&auml;uft jedes Feld dieses Recordsets in einer <b>For Each<\/b>-Schleife und ermittelt den Standardwert zu dem Feld aus der entsprechenden Tabelle. Dazu lesen wir den Tabellennamen aus <b>fld.SourceTable <\/b>und den Feldnamen aus <b>fld.SourceField <\/b>aus (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StandardwerteZuweisen(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\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>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>strStandardwert<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;\">Set<\/span> rst = frm.Recordset\r\n     For Each fld In rst.Fields\r\n         strStandardwert = Nz(DLookup(\"Standardwert\", \"tblStandardwerte\", \"Tabellenname = ''\" & fld.SourceTable _\r\n             & \"'' AND Feldname = ''\" & fld.SourceField & \"''\"), \"\")\r\n         intDataType = DLookup(\"DatentypID\", \"tblStandardwerte\", \"Tabellenname = ''\" & fld.SourceTable _\r\n             & \"'' AND Feldname = ''\" & fld.SourceField & \"''\")\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strStandardwert) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             For Each ctl In frm.Controls\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>ctl.ControlSource = fld.SourceField<span style=\"color:blue;\"> Then<\/span>\r\n                     Select Case intDataType\r\n                         <span style=\"color:blue;\">Case <\/span>dbByte, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble, dbBigInt, dbDecimal\r\n                             ctl.DefaultValue = <span style=\"color:blue;\">Replace<\/span>(strStandardwert, \",\", \".\")\r\n                         <span style=\"color:blue;\">Case <\/span>dbDate\r\n                             ctl.DefaultValue = \"\"\"\" & CDate(strStandardwert) & \"\"\"\"\r\n                         <span style=\"color:blue;\">Case <\/span>dbText, dbMemo\r\n                             ctl.DefaultValue = \"\"\"\" & strStandardwert & \"\"\"\"\r\n                         <span style=\"color:blue;\">Case Else<\/span>\r\n                             ctl.DefaultValue = strStandardwert\r\n                     <span style=\"color:blue;\">End Select<\/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;\">Next<\/span> ctl\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Zuweisen der Standardwerte zu den Steuerelementen<\/span><\/b><\/p>\n<p>Au&szlig;erdem holen wir uns mit einer weiteren <b>DLookup<\/b>-Funktion den Datentyp des Feldes, dessen Standardwert gesetzt werden soll. Wenn der Standardwert eine L&auml;nge gr&ouml;&szlig;er als <b>0 <\/b>aufweist, durchlaufen wir alle Steuerelemente des Formulars und pr&uuml;fen, ob dieses an das aktuell untersuchte Feld gebunden ist.<\/p>\n<p>Finden wir ein Steuerelement, dessen Eigenschaft <b>ControlSource <\/b>dem Feldnamen entspricht, weisen wir in Abh&auml;ngigkeit des Datentyps den entsprechend formatierten Wert aus der Tabelle <b>tblStandardwerte <\/b>zu. Bei Zahlenwerten ersetzen wir beispielsweise das Komma als Dezimaltrennzeichen durch den Punkt, bei Datumsangaben m&uuml;ssen wir die <b>CDate<\/b>-Funktion nutzen und das Ergebnis in Anf&uuml;hrungszeichen einfassen und bei Textfeldern ben&ouml;tigen wir ebenfalls Anf&uuml;hrungszeichen.<\/p>\n<h2>Die L&ouml;sung nutzen<\/h2>\n<p>Wenn Sie Standardwerte flexibel vorgeben wollen, anstatt daf&uuml;r jedes Mal den Entwurf der entsprechenden Tabellen anpassen zu m&uuml;ssen, k&ouml;nnen Sie jetzt das Formular <b>frmStandardwerte <\/b>nutzen, um alle Tabellen und Felder der Zieldatenbank einzulesen. Dazu m&uuml;ssen folgende Elemente zur Zieldatenbank hinzugef&uuml;gt werden:<\/p>\n<ul>\n<li>Tabellen: <b>tblDatentypen<\/b>, <b>tblStandardwerte<\/b><\/li>\n<li>Formulare: <b>frmStandarwertBoolean<\/b>, <b>frmStandardwertDate<\/b>, <b>frmStandardwerte<\/b>, <b>frmStandardwertNumeric<\/b>, <b>sfmStandardwerte<\/b><\/li>\n<li>Module: <b>mdlAPI<\/b>, <b>mdlStandardwerte<\/b><\/li>\n<\/ul>\n<p>Danach &ouml;ffnet man das Formular <b>frmStandardwerte <\/b>und klickt auf Felder einlesen, um alle Felder einzulesen. Hier legen wir beispielsweise f&uuml;r die Tabelle <b>tblBestellpositionen <\/b>drei Standardwerte an (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_015.png\" alt=\"Anlegen von Standardwerten\" width=\"424,5589\" height=\"287,4966\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Anlegen von Standardwerten<\/span><\/b><\/p>\n<p>Nun legen wir f&uuml;r das Unterformular <b>sfmBestellungDetails<\/b> der Beispieldatenbank die folgende Prozedur an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     StandardwerteZuweisen Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese sorgt schlie&szlig;lich daf&uuml;r, dass die Standardwerte f&uuml;r einen neuen Datensatz angezeigt werden (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1466_016.png\" alt=\"Angewendete Standardwerte\" width=\"549,559\" height=\"424,0374\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Angewendete Standardwerte<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Artikel zeigt eine umfangreiche L&ouml;sung zum Anlegen von benutzerdefinierten Standardwerten. F&uuml;gt man die ben&ouml;tigten Tabellen in das Frontend der Datenbank ein und hat jeder Benutzer ein eigenes Frontend in seinem Dokumente-Ordner, ist diese L&ouml;sung ohne Weiteres sogar mehrbenutzerf&auml;hig.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>BenutzerdefinierteStandardwerte.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/A43038D2-948B-4A7A-A588-AD694A4503F4\/aiu_1466.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Standardwerte f&uuml;r Felder legt in der Regel der Entwickler beim Definieren des Datenmodells in der Entwurfsansicht der Tabellen fest. W&auml;hrend man in bestimmten Ma&szlig;en dynamische Werte nutzen kann wie beispielsweise mit der Datum()-Funktion f&uuml;r Datumsfelder, ist man ansonsten recht unflexibel. Leider lassen sich dort nur einige eingebaute Funktionen nutzen, wir k&ouml;nnen keine benutzerdefinierten VBA-Funktionen einsetzen. Aber welche benutzerdefinierten Standardwerte wollen wir &uuml;berhaupt nutzen &#8211; und wo wollen wir diese festlegen? Die Einsatzzwecke sind vielf&auml;ltig und prinzipiell k&ouml;nnen wir jedes Feld mit einem benutzerdefinierten Standardwert nutzen. Wichtig ist der Gedanke dahinter: Sinnvoll gew&auml;hlte Standardwerte sparen dem Benutzer wertvolle Zeit bei der Dateneingabe. Wenn wir zum Beispiel eine Datenbank planen, die &uuml;berwiegend weibliche Kontakte verwaltet, ist es sinnvoll, als Anrede &#8222;Frau&#8220; vorzugeben. Oder wir haben eine Autowerkstatt, die haupts&auml;chlich Fahrzeuge einer bestimmten Marke repariert &#8211; dann macht es Sinn, diese vorzubelegen. Wir k&ouml;nnen auch dynamisch den zuletzt verwendeten Eintrag als Standardwert angeben oder auch den meistgenutzen. Wie wir dies realisieren, zeigen wir im vorliegenden Beitrag.<\/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":[662023,66062023,44000021],"tags":[],"class_list":["post-55001466","post","type-post","status-publish","format-standard","hentry","category-662023","category-66062023","category-Tabellen_und_Datenmodellierung"],"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>Benutzerdefinierte Standardwerte - 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\/Benutzerdefinierte_Standardwerte\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benutzerdefinierte Standardwerte\" \/>\n<meta property=\"og:description\" content=\"Standardwerte f&uuml;r Felder legt in der Regel der Entwickler beim Definieren des Datenmodells in der Entwurfsansicht der Tabellen fest. W&auml;hrend man in bestimmten Ma&szlig;en dynamische Werte nutzen kann wie beispielsweise mit der Datum()-Funktion f&uuml;r Datumsfelder, ist man ansonsten recht unflexibel. Leider lassen sich dort nur einige eingebaute Funktionen nutzen, wir k&ouml;nnen keine benutzerdefinierten VBA-Funktionen einsetzen. Aber welche benutzerdefinierten Standardwerte wollen wir &uuml;berhaupt nutzen - und wo wollen wir diese festlegen? Die Einsatzzwecke sind vielf&auml;ltig und prinzipiell k&ouml;nnen wir jedes Feld mit einem benutzerdefinierten Standardwert nutzen. Wichtig ist der Gedanke dahinter: Sinnvoll gew&auml;hlte Standardwerte sparen dem Benutzer wertvolle Zeit bei der Dateneingabe. Wenn wir zum Beispiel eine Datenbank planen, die &uuml;berwiegend weibliche Kontakte verwaltet, ist es sinnvoll, als Anrede &quot;Frau&quot; vorzugeben. Oder wir haben eine Autowerkstatt, die haupts&auml;chlich Fahrzeuge einer bestimmten Marke repariert - dann macht es Sinn, diese vorzubelegen. Wir k&ouml;nnen auch dynamisch den zuletzt verwendeten Eintrag als Standardwert angeben oder auch den meistgenutzen. Wie wir dies realisieren, zeigen wir im vorliegenden Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-07T11:45:42+00:00\" \/>\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=\"28\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Benutzerdefinierte Standardwerte\",\"datePublished\":\"2023-11-07T11:45:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/\"},\"wordCount\":4487,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/de5eeb7043694050922c058c733fe18d\",\"articleSection\":[\"2023\",\"6\\\/2023\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/\",\"name\":\"Benutzerdefinierte Standardwerte - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/de5eeb7043694050922c058c733fe18d\",\"datePublished\":\"2023-11-07T11:45:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/de5eeb7043694050922c058c733fe18d\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/de5eeb7043694050922c058c733fe18d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Benutzerdefinierte_Standardwerte\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Benutzerdefinierte Standardwerte\"}]},{\"@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":"Benutzerdefinierte Standardwerte - 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\/Benutzerdefinierte_Standardwerte\/","og_locale":"de_DE","og_type":"article","og_title":"Benutzerdefinierte Standardwerte","og_description":"Standardwerte f&uuml;r Felder legt in der Regel der Entwickler beim Definieren des Datenmodells in der Entwurfsansicht der Tabellen fest. W&auml;hrend man in bestimmten Ma&szlig;en dynamische Werte nutzen kann wie beispielsweise mit der Datum()-Funktion f&uuml;r Datumsfelder, ist man ansonsten recht unflexibel. Leider lassen sich dort nur einige eingebaute Funktionen nutzen, wir k&ouml;nnen keine benutzerdefinierten VBA-Funktionen einsetzen. Aber welche benutzerdefinierten Standardwerte wollen wir &uuml;berhaupt nutzen - und wo wollen wir diese festlegen? Die Einsatzzwecke sind vielf&auml;ltig und prinzipiell k&ouml;nnen wir jedes Feld mit einem benutzerdefinierten Standardwert nutzen. Wichtig ist der Gedanke dahinter: Sinnvoll gew&auml;hlte Standardwerte sparen dem Benutzer wertvolle Zeit bei der Dateneingabe. Wenn wir zum Beispiel eine Datenbank planen, die &uuml;berwiegend weibliche Kontakte verwaltet, ist es sinnvoll, als Anrede \"Frau\" vorzugeben. Oder wir haben eine Autowerkstatt, die haupts&auml;chlich Fahrzeuge einer bestimmten Marke repariert - dann macht es Sinn, diese vorzubelegen. Wir k&ouml;nnen auch dynamisch den zuletzt verwendeten Eintrag als Standardwert angeben oder auch den meistgenutzen. Wie wir dies realisieren, zeigen wir im vorliegenden Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-11-07T11:45:42+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"28\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Benutzerdefinierte Standardwerte","datePublished":"2023-11-07T11:45:42+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/"},"wordCount":4487,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/de5eeb7043694050922c058c733fe18d","articleSection":["2023","6\/2023","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/","url":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/","name":"Benutzerdefinierte Standardwerte - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/de5eeb7043694050922c058c733fe18d","datePublished":"2023-11-07T11:45:42+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/de5eeb7043694050922c058c733fe18d","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/de5eeb7043694050922c058c733fe18d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Benutzerdefinierte_Standardwerte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Benutzerdefinierte Standardwerte"}]},{"@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\/55001466","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=55001466"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001466\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}