{"id":55001485,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-02T20:09:18","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1485"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Assistent_fuer_Domaenenfunktionen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/","title":{"rendered":"Assistent f&uuml;r Dom&auml;nenfunktionen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/cfd81f4dee5c45f8b0239b914c78f8e4\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\">\n<p><b>Dom&auml;nenfunktionen wie DomWert (DLookup), DomMax (DMax) oder DomAnzahl (DCount) sind praktische Helfer, wenn es um das schnelle Zugreifen auf verschiedene Informationen einer Datenbank geht. Wir k&ouml;nnen damit den Wert eines oder mehrerer Felder aus einem Datensatz mit einem bestimmten Kriterium ermitteln, die Gesamtanzahl von Datens&auml;tzen einer Tabelle mit oder ohne Kriterium oder auch Minimal- oder Maximalwerte. Der Assistent, den wir in diesem Beitrag vorstellen, hilft dabei auf verschiedene Arten. Die erste ist, dass Sie ihn einfach aufrufen k&ouml;nnen, um schnell die Werte f&uuml;r eine Dom&auml;nenfunktion einzutippen und das Ergebnis auszulesen. Aber der Assistent kann noch mehr: Sie k&ouml;nnen ihn auch von Eigenschaftsfeldern heraus aufrufen, um die gew&auml;hlte Dom&auml;nenfunktion direkt dort einzutragen.<\/b><\/p>\n<p>Damit Sie sich direkt einen Eindruck davon machen k&ouml;nnen, wie der fertige Assistent aussieht, schauen Sie sich Bild 1 an. Hier finden Sie im oberen Bereich die Eingabefelder f&uuml;r die Parameter der Dom&auml;nenfunktionen. Wir haben die Reihenfolge im Vergleich zur Funktion etwas umgestellt, sodass die Auswahl der Dom&auml;ne der erste Schritt ist. Das hat den Hintergrund, dass wir nach der Auswahl der Tabelle oder Abfrage, aus der die zu ermittelnden Daten stammen sollen, die darin enthaltenen Felder per Kontextmen&uuml; zum Einf&uuml;gen in die folgenden beiden Textfelder bereithalten wollen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_001.png\" alt=\"Der Dom&auml;nenfunktions-Assistent in Aktion\" width=\"700\" height=\"429,2179\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der Dom&auml;nenfunktions-Assistent in Aktion<\/span><\/b><\/p>\n<p>Nachdem wir beispielsweise eine Tabelle wie <b>tblAutoren <\/b>ausgew&auml;hlt haben, liefert ein Rechtsklick auf eines der Textfelder f&uuml;r den Ausdruck oder das Kriterium die Liste der Felder dieser Tabelle (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_002.png\" alt=\"Auswahl der Felder per Kontextmen&uuml;\" width=\"499,5589\" height=\"267,1252\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Auswahl der Felder per Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Der untere Bereich enth&auml;lt jeweils eine Zeile f&uuml;r alle zw&ouml;lf verf&uuml;gbaren Dom&auml;nenfunktionen. Hier sehen wir zuerst die deutsche und in Klammern die englische Bezeichnung, daneben folgt das Ergebnis f&uuml;r die Dom&auml;nenfunktion mit den oben angegebenen Parametern.<\/p>\n<p>Rechts davon finden wir den aktuellen Ausdruck f&uuml;r den Aufruf dieser Dom&auml;nenfunktion, der die oben angegebenen Parameter ber&uuml;cksichtigt. Mit den Schaltfl&auml;chen rechts daneben k&ouml;nnen wir die aktuelle Funktion in die Zwischenablage kopieren.<\/p>\n<p>Da der Assistent die Dom&auml;nenfunktionen in der deutschen Fassung (f&uuml;r die Benutzeroberfl&auml;che der deutschen Version von Access) sowie in der englischen Fassung (f&uuml;r VBA) bereitstellen soll, haben wir im oberen Bereich noch eine Option hinzugef&uuml;gt, mit der wir w&auml;hlen k&ouml;nnen, ob die Funktion als Ausdruck oder als VBA-Funktion angezeigt werden soll.<\/p>\n<h2>Programmierung des Formulars<\/h2>\n<p>In der Entwurfsansicht sieht das Formular wie in Bild 3 aus. Die oberen drei Steuerelemente hei&szlig;en <b>cboDomaene<\/b>, <b>txtAusdruck<\/b> und <b>txtKriterium<\/b>. Das Kombinationsfeld <b>cboDomaene <\/b>wird beim Laden des Formulars durch das Ereignis aus Listing 1 gef&uuml;llt. Hier &ouml;ffnen wir mit <b>OpenRecordset <\/b>ein Recordset auf Basis der Tabelle <b>MSysObjects<\/b>. Diese enth&auml;lt alle Objekte einer Access-Datenbank. Wir ben&ouml;tigen nur die mit den Typen <b>1<\/b>, <b>4<\/b>, <b>5 <\/b>und <b>6<\/b>. <b>1<\/b>, <b>4 <\/b>und <b>6 <\/b>liefern die verschiedenen Tabellenarten (lokale Tabelle, verkn&uuml;pfte Tabelle und ODBC-Tabelle) und <b>5 <\/b>die Abfragen. Au&szlig;erdem wollen wir Systemtabellen und &auml;hnliche Objekte ausschlie&szlig;en, die nicht vom Benutzer angelegt wurden und legen dazu entsprechende Kriterien fest.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_003.png\" alt=\"Entwurfsansicht des Formulars frmDomaenenfunktionen\" width=\"674,559\" height=\"559,0405\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurfsansicht des Formulars frmDomaenenfunktionen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database, rstDomaene<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strDomaenen<span style=\"color:blue;\"> As String<\/span>, strAusdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolHinzufuegen<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef, tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstDomaene = db.OpenRecordset(\"SELECT Name, Type FROM MSysObjects WHERE Type IN (1,4,5,6) AND NOT Name \" _\r\n         & \"LIKE ''f_*'' AND NOT Name LIKE ''MSys*'' AND NOT Name LIKE ''USys*'' AND NOT Name LIKE ''~*'' ORDER BY Name\", _\r\n         dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstDomaene.EOF\r\n         Select Case rstDomaene!Type\r\n             <span style=\"color:blue;\">Case <\/span>1, 4, 6\r\n                 bolHinzufuegen = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>5\r\n                 <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(rstDomaene!Name)\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>qdf.Parameters.Count = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     bolHinzufuegen = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     bolHinzufuegen = <span style=\"color:blue;\">False<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     bolHinzufuegen = <span style=\"color:blue;\">False<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolHinzufuegen<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strAusdruck) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 Select Case rstDomaene!Type\r\n                     <span style=\"color:blue;\">Case <\/span>1, 4, 6\r\n                         <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(rstDomaene.Fields(0))\r\n                         strAusdruck = tdf.Fields(0).Name\r\n                     <span style=\"color:blue;\">Case <\/span>5\r\n                         <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(rstDomaene.Fields(0))\r\n                         strAusdruck = qdf.Fields(0).Name\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             strDomaenen = strDomaenen & \"\"\"\" & rstDomaene!Name & \"\"\";\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         rstDomaene.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!cboDomaene.RowSource = strDomaenen\r\n     Me!cboDomaene = Me.cboDomaene.ItemData(0)\r\n     Me!txtAusdruck = \"[\" & strAusdruck & \"]\"\r\n     Me!txtKriterium = \"\"\r\n     Me!ogrZiel = 1\r\n     UpdateControls Nz(Me!txtAusdruck, \"\"), Nz(Me!cboDomaene, \"\"), Nz(Me!txtKriterium, \"\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur, die beim Laden des Formulars aufgerufen wird<\/span><\/b><\/p>\n<p>Das Kombinationsfeld <b>cboDomaene <\/b>soll eine Wertliste als Datensatzherkunft erhalten, deshalb stellen wir die Eigenschaft <b>Herkunftsart <\/b>auf <b>Wertliste <\/b>ein. Um den Rest k&uuml;mmern sich die folgenden Zeilen der Prozedur <b>Form_Load<\/b>. Hier durchlaufen wir alle Datens&auml;tze des Recordsets. In einer <b>Select Case<\/b>-Bedingung pr&uuml;fen wir den Typ, also ob es sich um eine Tabelle oder um eine Abfrage handelt. Warum ist das n&ouml;tig? Weil es vorkommen kann, dass eine Abfrage Parameter enth&auml;lt. In diesem Fall k&ouml;nnen wir nicht per Dom&auml;nenfunktion darauf zugreifen, daher wollen wir solche Eintr&auml;ge direkt auslassen. Um festzulegen, ob eine Dom&auml;ne Parameter enth&auml;lt, verwenden wir die Variable <b>bolHinzufuegen<\/b>. Diese wird bei Tabellen immer auf <b>True <\/b>eingestellt. Bei einer Abfrage erstellt die Prozedur ein <b>QueryDef<\/b>-Objekt und weist diesem die aktuell untersuchte Abfrage zu. F&uuml;r dieses k&ouml;nnen wir mit der Eigenschaft <b>Parameters.Count <\/b>ermitteln, ob die Abfrage Parameter enth&auml;lt. Ist das nicht der Fall, stellen wir <b>bolHinzufuegen <\/b>auf <b>True <\/b>ein, sonst auf <b>False<\/b>.<\/p>\n<p>Diesen Vorgang haben wir auch noch bei deaktivierter eingebauter Fehlerbehandlung ausgef&uuml;hrt, da dieser Zugriff bei einigen weiteren Abfragen zu Fehlern f&uuml;hrte. Ist dies der Fall, stellen wir ebenfalls <b>bolHinzufuegen <\/b>auf <b>False <\/b>ein.<\/p>\n<p>Hat <b>bolHinzufuegen <\/b>danach den Wert <b>True<\/b>, k&ouml;nnen wir die Tabelle oder Abfrage zur Liste der Dom&auml;nen in <b>strDomaenen <\/b>hinzuf&uuml;gen. Der Variablen <b>strAusdruck <\/b>weisen wir den Namen des ersten Feldes der Tabelle oder Abfrage zu, denn wir wollen das Kombinationsfeld mit dem ersten Eintrag vorbelegen und das Textfeld <b>txtAusdruck <\/b>mit dem ersten Feld dieser Tabelle oder Abfrage &#8211; so sieht der Benutzer direkt Beispiele f&uuml;r die anzugebenden Werte. Den Namen des ersten Feldes lesen wir wieder in einer <b>Select Case<\/b>-Bedingung ein, in der wir testen, ob es sich um eine Tabelle oder Abfrage handelt. Abh&auml;ngig davon &ouml;ffnen wir ein <b>TableDef<\/b>&#8211; oder <b>QueryDef<\/b>-Objekt, dem wir dann den Namen des ersten Feldes entnehmen.<\/p>\n<p>Nach dem Durchlaufen aller Recordsets stellen wir die Eigenschaft <b>Datensatzherkunft <\/b>(<b>RowSource<\/b>) auf die Liste aus <b>strDomaenen <\/b>ein und setzen den Wert des Kombinationsfeldes auf den ersten verf&uuml;gbaren Eintrag.<\/p>\n<p>Dann f&uuml;llen wir das Textfeld <b>txtAusdruck <\/b>mit dem Wert aus <b>strAusdruck<\/b>, also dem ersten Feld der gew&auml;hlten Tabelle oder Abfrage. <b>txtKriterium <\/b>leeren wir hingegen. Schlie&szlig;lich stellen wir noch die Optionsgruppe zum Ausw&auml;hlen der auszugebenden Ausdr&uuml;cke auf <b>1 <\/b>ein, damit zun&auml;chst die deutschen Versionen der Dom&auml;nenfunktionen erscheinen.<\/p>\n<p>Danach folgt Arbeit f&uuml;r das Add-In &#8211; wir rufen die Prozedur <b>UpdateControls <\/b>auf, welche die &uuml;brigen Steuerelemente des Formulars aktualisiert. Dabei &uuml;bergeben wir die Werte der drei Steuerelemente <b>cboDomaene<\/b>, <b>txtAusdruck <\/b>und <b>txtKriterien <\/b>als Parameter.<\/p>\n<h2>Aktualisieren der Steuerelemente<\/h2>\n<p>Die Prozedur <b>UpdateControls <\/b>erwartet die Werte der drei Steuerelemente <b>cboDomaene<\/b>, <b>txtAusdruck <\/b>und <b>txtKriterien <\/b>als Parameter. Sie f&uuml;llt zun&auml;chst die Textfelder mit den Ergebnissen der jeweiligen Dom&auml;nenfunktion (siehe Listing 2). Dies erledigen wir jeweils unter Deaktivierung der eingebauten Fehlerbehandlung. Somit verhindern wir eine bei einem Fehler ausgegebene Fehlermeldung von Access selbst und k&ouml;nnen stattdessen einfach den Wert <b>#Fehler <\/b>in das jeweilige Textfeld schreiben &#8211; genau so, wie es auch bei einer als Ausdruck verwendeten Dom&auml;nenfunktion geschehen w&uuml;rde. Der Ablauf sieht f&uuml;r alle zw&ouml;lf Dom&auml;nenfunktionen &auml;hnlich aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UpdateControls(strAusdruck<span style=\"color:blue;\"> As String<\/span>, strDomaene<span style=\"color:blue;\"> As String<\/span>, strKriterium<span style=\"color:blue;\"> As String<\/span>)\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Me!txtDCount = DCount(strAusdruck, strDomaene, strKriterium)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtDCount = \"#Fehler\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...\r\n     Me!txtDLookup = DLookup(strAusdruck, strDomaene, strKriterium)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtDLookup = \"#Fehler\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Select Case ogrZiel\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             Me!txtDCount<span style=\"color:blue;\">Call<\/span> = \"=DomAnzahl(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDFirst<span style=\"color:blue;\">Call<\/span> = \"=DomErsterWert(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDLast<span style=\"color:blue;\">Call<\/span> = \"=DomLetzterWert(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDMax<span style=\"color:blue;\">Call<\/span> = \"=DomMax(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDMin<span style=\"color:blue;\">Call<\/span> = \"=DomMin(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDAvg<span style=\"color:blue;\">Call<\/span> = \"=DomMittelwert(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n             ...\r\n             Me!txtDLookup<span style=\"color:blue;\">Call<\/span> = \"=DomWert(\"\"\" & strAusdruck & \"\"\";\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\";\"\"\" & strKriterium) & \"\"\")\"\r\n         <span style=\"color:blue;\">Case <\/span>2\r\n             Me!txtDCount<span style=\"color:blue;\">Call<\/span> = \"DCount(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDFirst<span style=\"color:blue;\">Call<\/span> = \"DFirst(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDLast<span style=\"color:blue;\">Call<\/span> = \"DLast(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDMax<span style=\"color:blue;\">Call<\/span> = \"DMax(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDMin<span style=\"color:blue;\">Call<\/span> = \"DMin(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             Me!txtDAvg<span style=\"color:blue;\">Call<\/span> = \"DAvg(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene & _\r\n                 IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n             ...\r\n             Me!txtDLookup<span style=\"color:blue;\">Call<\/span> = \"DLookup(\"\"\" & strAusdruck & \"\"\",\"\"\" & strDomaene _\r\n                 & IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \"\"\",\"\"\" & strKriterium) & \"\"\")\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur, welche die Parameter in Ergebnisse umwandelt<\/span><\/b><\/p>\n<pre>Me!txtDCount = DCount(strAusdruck, strDomaene, strKriterium)\r\n<span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n     Me!txtDCount = \"#Fehler\"\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Anschlie&szlig;end folgt eine <b>Select Case<\/b>-Bedingung, die pr&uuml;ft, ob der deutsche Ausdruck oder die englische VBA-Funktion ausgegeben werden soll. Der erste Teil weist jeweils dem rechten Textfeld die Funktion zu. Diese setzen wir aus dem Funktionsaufruf und den in Klammern eingefassten Parametern zusammen, die wir den drei Steuerelementen <b>cboDomaene<\/b>, <b>txtAusdruck <\/b>und <b>txtKriterium <\/b>entnehmen &#8211; hier am Beispiel der Funktion <b>DomAnzahl <\/b>(<b>DCount<\/b>):<\/p>\n<pre>Me!txtDCount<span style=\"color:blue;\">Call<\/span> = \"DomAnzahl(\" & strAusdruck & \";\" _\r\n     & strDomaene & IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \";\" _\r\n     & strKriterium) & \")\"<\/pre>\n<p>F&uuml;r die VBA-Funktion sieht der zusammengestellte Ausdruck nur wenig anders aus.<\/p>\n<p>Die beiden Unterschiede sind die englische statt der deutschen Bezeichnung und die Verwendung des Kommas statt des Semikolons als Trennzeichen:<\/p>\n<pre>Me!txtDCount<span style=\"color:blue;\">Call<\/span> = \"DCount(\" & strAusdruck & \",\" _\r\n     & strDomaene & IIf(<span style=\"color:blue;\">Len<\/span>(strKriterium) = 0, \"\", \",\" _\r\n     & strKriterium) & \")\"<\/pre>\n<p>Nach dem Laden sehen die Werte der drei oberen Steuerelemente wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_004.png\" alt=\"Anzeige nach dem Laden des Assistenten\" width=\"574,559\" height=\"213,5301\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anzeige nach dem Laden des Assistenten<\/span><\/b><\/p>\n<h2>Aktualisieren der Funktionen bei Eingabe<\/h2>\n<p>Nach dem Initialisieren zeigt das Formular also die erste Abfrage oder Tabelle nach alphabetischer Sortierung an sowie die Ergebnisse der einzelnen Dom&auml;nenfunktionen samt Definition.<\/p>\n<p>Die Ergebnisse und Definitionen sollen nun direkt bei &Auml;nderung durch den Benutzer aktualisiert werden, unmittelbar nach der Eingabe eines jeden Zeichens. Dazu nutzen wir das Ereignis <b>Bei &Auml;nderung <\/b>der verschiedenen Steuerelemente.<\/p>\n<p>F&uuml;r das Textfeld <b>txtAusdruck <\/b>f&uuml;gen wir folgende Prozedur hinzu, welche wieder die Prozedur <b>UpdateControls <\/b>aufruft. Um den aktuell im Textfeld angezeigten Text mit dem ersten Parameter zu &uuml;bergeben, verwenden wir dessen <b>Text<\/b>-Eigenschaft. Anderenfalls w&uuml;rde n&auml;mlich nur der gespeicherte Wert &uuml;bergeben, aber wir wollen ja den aktuell eingegebenen Wert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtAusdruck_Change()\r\n     UpdateControls Me!txtAusdruck.Text, _\r\n         Nz(Me!cboDomaene, \"\"), Nz(Me!txtKriterium, \"\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Eine &auml;hnliche Ereignisprozedur hinterlegen wir f&uuml;r das Textfeld <b>txtKriterium<\/b>. Der Unterschied ist, dass wir hier die <b>Text<\/b>-Eigenschaft von <b>txtKriterium <\/b>als dritten Wert &uuml;bergeben und den Wert von <b>txtAusdruck <\/b>als ersten:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtKriterium_Change()\r\n     UpdateCalls Nz(Me!txtAusdruck, \"\"), _\r\n         Nz(Me!cboDomaene, \"\"), Me!txtKriterium.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r das Kombinationsfeld zur Eingabe der Tabelle oder Abfrage hinterlegen wir gleich zwei Ereignisprozeduren.<\/p>\n<p>Die erste wird ebenfalls bei &Auml;nderungen am enthaltenen Text ausgel&ouml;st:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDomaene_Change()\r\n     UpdateControls Me!txtAusdruck, Me!cboDomaene.Text, _\r\n         Nz(Me!txtKriterium, \"\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die zweite wird aufgerufen, wenn der Benutzer einen neuen Eintrag im Kombinationsfeld ausw&auml;hlt. Sie ist etwas umfangreicher, da wir hier erneut auch das erste Feld dieser Tabelle oder Abfrage auslesen, um dieses direkt im Textfeld <b>txtAusdruck<\/b> anzuzeigen (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboDomaene_AfterUpdate()\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>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\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>rstDomaene<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strAusdruck<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> rstDomaene = db.OpenRecordset(\"SELECT Name, Type FROM MSysObjects WHERE Name = ''\" & Me!cboDomaene & \"''\", _\r\n         dbOpenDynaset)\r\n     Select Case rstDomaene!Type\r\n         <span style=\"color:blue;\">Case <\/span>1, 4, 6\r\n             <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(rstDomaene.Fields(0))\r\n             strAusdruck = tdf.Fields(0).Name\r\n         <span style=\"color:blue;\">Case <\/span>5\r\n             <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(rstDomaene.Fields(0))\r\n             strAusdruck = qdf.Fields(0).Name\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     Me!txtAusdruck = strAusdruck\r\n     UpdateControls Me!txtAusdruck, Nz(Me!cboDomaene, \"\"), Nz(Me!txtKriterium, \"\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur, die nach dem Ausw&auml;hlen einer neuen Tabelle oder Abfrage ausgew&auml;hlt wird<\/span><\/b><\/p>\n<p>Schlie&szlig;lich aktualisieren wir den Inhalt noch, wenn der Benutzer zwischen den Zielen <b>Ausdruck <\/b>und <b>VBA <\/b>wechselt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ogrZiel_AfterUpdate()\r\n     UpdateControls Nz(Me!txtAusdruck, \"\"), _\r\n         Nz(Me!cboDomaene, \"\"), Nz(Me!txtKriterium, \"\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Felder per Kontextmen&uuml; einf&uuml;gen<\/h2>\n<p>Wenn man schon einen Assistenten zum Zusammenstellen von Dom&auml;nenfunktionen nutzt, hat man vielleicht nicht alle Feldnamen, die man im Ausdruck und im Kriterium einsetzen m&ouml;chte, im Kopf und m&ouml;chte diese auch nicht nachschlagen.<\/p>\n<p>Also f&uuml;gen wir noch eine Funktion hinzu, mit der wir ein Kontextmen&uuml; anzeigen k&ouml;nnen, wenn der Benutzer mit der rechten Maustaste in eines der Textfelder <b>txtAusdruck <\/b>oder <b>txtKriterium <\/b>klickt.<\/p>\n<p>Dazu nutzen wir das Ereignis <b>Bei Maustaste ab <\/b>der beiden Textfelder, die wir mit dem Aufruf der gleichen Funktion f&uuml;llen. Dabei &uuml;bergeben wir als ersten Parameter den Wert des Parameters <b>Button<\/b> und als zweiten den Namen des aufrufenden Textfeldes. Der Parameter <b>Button <\/b>enth&auml;lt einen Wert, der angibt, welche Maustaste der Benutzer angeklickt hat:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtAusdruck_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         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     Kontextmenue Button, \"txtAusdruck\"\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtKriterium_MouseDown(Button<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         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     Kontextmenue Button, \"txtKriterium\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier aufgerufene Prozedur <b>Kontextmenue <\/b>erwartet genau diese beiden Parameter (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Kontextmenue(Button<span style=\"color:blue;\"> As Integer<\/span>, strSteuerelement<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\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>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\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>strDomaene<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelLength<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Button = acRightButton<span style=\"color:blue;\"> Then<\/span>\r\n         strDomaene = Nz(Me!cboDomaene, \"\")\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         lngSelStart = Me.Controls(strSteuerelement).SelStart\r\n         lngSelLength = Me.Controls(strSteuerelement).SelLength\r\n         If db.OpenRecordset(\"SELECT Name FROM MSysObjects WHERE Type IN (1,4,6) AND Name = ''\" _\r\n                 & strDomaene & \"''\").RecordCount = 1 Then\r\n             <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strDomaene)\r\n             <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Control\")\r\n             cbr.Reset\r\n             For Each fld In tdf.Fields\r\n                 lngIndex = lngIndex + 1\r\n                 <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , lngIndex, <span style=\"color:blue;\">True<\/span>)\r\n                 <span style=\"color:blue;\">With<\/span> cbb\r\n                     .Caption = \"[\" & fld.Name & \"]\"\r\n                     .OnAction = \"=FeldEinfuegen(\"\"\" & strSteuerelement & \"\"\", \"\"[\" & fld.Name & \"]\"\", \" & lngSelStart _\r\n                         & \", \" & lngSelLength & \")\"\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> fld\r\n         <span style=\"color:blue;\">Else<\/span>If db.OpenRecordset(\"SELECT Name FROM MSysObjects WHERE Type IN (5) AND Name = ''\" & strDomaene _\r\n                 & \"''\").RecordCount = 1 Then\r\n             <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(strDomaene)\r\n             <span style=\"color:blue;\">Set<\/span> cbr = CommandBars(\"Form View Control\")\r\n             cbr.Reset\r\n             For Each fld In qdf.Fields\r\n                 lngIndex = lngIndex + 1\r\n                 <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(msoControlButton, , , lngIndex, <span style=\"color:blue;\">True<\/span>)\r\n                 <span style=\"color:blue;\">With<\/span> cbb\r\n                     .Caption = \"[\" & fld.Name & \"]\"\r\n                     .OnAction = \"=FeldEinfuegen(\"\"\" & strSteuerelement & \"\"\", \"\"[\" & fld.Name & \"]\"\", \" & lngSelStart _\r\n                         & \", \" & lngSelLength & \")\"\r\n                 End <span style=\"color:blue;\">With<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> fld\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Anzeigen von Kontextmen&uuml;-Eintr&auml;gen<\/span><\/b><\/p>\n<p>Hier arbeiten wir mit dem <b>CommandBars<\/b>-Objekt, wozu wir einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>ben&ouml;tigen. Diesen f&uuml;gen wir mit dem Verweise-Dialog (siehe Bild 5) hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_005.png\" alt=\"Verweis auf die Office-Bibliothek\" width=\"499,5589\" height=\"393,8207\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Verweis auf die Office-Bibliothek<\/span><\/b><\/p>\n<p>Die Prozedur pr&uuml;ft als Erstes den Wert des Parameters <b>Button<\/b>. Im Falle des Wertes <b>acRightButton <\/b>wissen wir, dass der Benutzer die rechte Maustaste angeklickt hat. Nur in diesem Fall wollen wir auch das Kontextmen&uuml; anzeigen. Dazu ermitteln wir zun&auml;chst den Namen der Tabelle oder Abfrage und speichern diesen in <b>strDomaene<\/b>. Dann holen wir einen Verweis auf die aktuelle Datenbank und speichern diesen in der Variablen <b>db<\/b>.<\/p>\n<p>Nun ben&ouml;tigen wir die Position der aktuellen Markierung, da wir das vom Benutzer ausgew&auml;hlte Feld an der Stelle der Markierung einf&uuml;gen wollen. Dazu lesen wir die Werte der Eigenschaften <b>SelStart <\/b>und <b>SelLength <\/b>des Zielfeldes in die Variablen <b>lngSelStart <\/b>und <b>lngSelLength<\/b> ein.<\/p>\n<p>Anschlie&szlig;end pr&uuml;ft die Prozedur, ob es sich bei der mit <b>strDomaene <\/b>&uuml;bergebenen Dom&auml;ne um eine Tabelle oder Abfrage handelt. Dies finden wir etwas umst&auml;ndlich mit <b>OpenRecordset <\/b>und einer entsprechenden Abfrage heraus. Diese schaut, ob es in der Tabelle <b>MSysObjects <\/b>einen Eintrag gibt, der dem Namen der gew&auml;hlten Tabelle oder Abfrage entspricht und die den Typ <b>1<\/b>, <b>4 <\/b>oder <b>6 <\/b>hat. Liefert <b>RecordCount <\/b>f&uuml;r dieses Recordset den Wert <b>1<\/b>, handelt es sich um eine Tabelle. Wir k&ouml;nnten hier normalerweise auch <b>DCount <\/b>verwenden, was aber aus einem bestimmten Grund nicht funktioniert: Wir wollen ein Access-Add-In programmieren und damit auf die Daten der aktuell ge&ouml;ffneten Datenbank zugreifen. <b>DCount <\/b>und die anderen Dom&auml;nenfunktionen greifen aber immer auf die Datenbank zu, die zu dem VBA-Projekt geh&ouml;rt, von der aus <b>DCount <\/b>aufgerufen wird. Mit <b>CurrentDb <\/b>greifen wir hingegen auf die Host-Datenbank zu, daher m&uuml;ssen wir den Umweg &uuml;ber <b>OpenRecordset<\/b> gehen.<\/p>\n<p>Im Fall einer Tabelle weisen wir einer <b>TableDef<\/b>-Variablen das entsprechende Objekt f&uuml;r diese Tabelle zu. Dann referenzieren wir das bestehende Kontextmen&uuml; f&uuml;r Steuerelemente namens <b>Form View Control<\/b> und referenzieren es mit der Variablen <b>cbr<\/b>. Diese setzen wir zun&auml;chst zur&uuml;ck, um eventuell vorhandene benutzerdefinierte Eintr&auml;ge aus der vorherigen Anzeige zu entfernen.<\/p>\n<p>Nun durchlaufen wir alle Felder des <b>TableDef<\/b>-Objekts mit einer <b>Fields<\/b>-Variablen namens <b>fld<\/b>. Darin f&uuml;gen wir der <b>Controls<\/b>-Auflistung des <b>CommandBar<\/b>-Objekts mit der <b>Add<\/b>-Methode ein neues Steuerelement des Typs <b>msoControlButton <\/b>hinzu. Dabei geben wir als ersten Parameter den Typ des zu erstellenden Steuerelements an. Der vierte Parameter namens <b>Before <\/b>erh&auml;lt den Wert der Variablen <b>lngIndex<\/b>. Dies hat den Hintergrund, dass wir die Elemente gleich oben im Kontextmen&uuml; anzeigen wollen, damit der Benutzer nur einen kurzen Weg mit der Maus zur&uuml;cklegen muss. Beim ersten Eintrag ist das kein Problem, wir ben&ouml;tigen einfach den Wert <b>1<\/b>, damit das neue Element vor dem ersten eingebauten Elemente eingef&uuml;gt wird. Beim zweiten Eintrag m&uuml;ssen wir hier aber den Wert <b>2 <\/b>angeben, damit dieser hinter dem ersten neuen Eintrag angelegt wird &#8211; so k&ouml;nnen wir die Felder in der Reihenfolge anzeigen, wie sie auch im Tabellenentwurf angeordnet sind. Um dies zu realisieren, verwenden wir die Laufvariable <b>lngIndex<\/b>, die wir mit jedem Feld um <b>1 <\/b>erh&ouml;hen.<\/p>\n<p>F&uuml;r <b>ControlButton<\/b>-Objekte legen wir im Anschluss einige Eigenschaften fest. F&uuml;r die Beschriftung tragen wir den Namen des Feldes ein, umgeben von eckigen Klammern. F&uuml;r die Eigenschaft <b>OnAction <\/b>legen wir einen Wert fest, der den Aufruf der Funktion <b>FeldEinfuegen <\/b>enth&auml;lt und als Parameter den Namen des Steuerelements, den einzuf&uuml;genden Text, den Start und die L&auml;nge der aktuellen Markierung enth&auml;lt. Der Aufruf sieht beispielsweise wie folgt aus:<\/p>\n<pre>=FeldEinfuegen(\"txtAusdruck\", \"[Artikelbezeichnung]\", 9, 0)<\/pre>\n<p>Damit kommen wir zum <b>ElseIf<\/b>-Teil, wo wir uns um die Abfragen k&uuml;mmern. Hier erledigen wir die gleichen Schritte wie im <b>If<\/b>-Teil, nur dass wir hier mit dem <b>QueryDef<\/b>-Objekt arbeiten.<\/p>\n<h2>Einf&uuml;gen eines Feldes in den Ausdruck oder das Kriterium<\/h2>\n<p>Die f&uuml;r die Kontextmen&uuml;-Steuerelemente hinterlegte Funktion hei&szlig;t <b>FeldEinfuegen <\/b>und erwartet den Namen des Steuerelements, den Feldnamen und die aktuelle Markierung als Parameter (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FeldEinfuegen(strSteuerelement<span style=\"color:blue;\"> As String<\/span>, strFeld<span style=\"color:blue;\"> As String<\/span>, lngSelStart<span style=\"color:blue;\"> As Long<\/span>, lngSelLength<span style=\"color:blue;\"> As Long<\/span>)\r\n     Me.Controls(strSteuerelement).Text = <span style=\"color:blue;\">Left<\/span>(Me.Controls(strSteuerelement).Text, lngSelStart) & strFeld _\r\n         & <span style=\"color:blue;\">Mid<\/span>(Me.Controls(strSteuerelement).Text, lngSelStart + lngSelLength + 1)\r\n     Me.Controls(strSteuerelement).SelStart = lngSelStart + <span style=\"color:blue;\">Len<\/span>(strFeld)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Funktion zum Einf&uuml;gen von Feldnamen in den Ausdruck oder das Kriterium<\/span><\/b><\/p>\n<p>Sie stellt die Eigenschaft <b>Text <\/b>des &uuml;bergebenen Steuerelements auf einen Wert ein, der den vorhandenen Text bis zum Start der Markierung, den in eckige Klammern eingefassten Feldnamen und den vorhandenen Text ab dem Ende der Markierung enth&auml;lt. Dann stellt sie die Markierung noch so ein, dass der neu hinzugef&uuml;gte Ausdruck markiert ist.<\/p>\n<h2>Dom&auml;nenfunktion in die Zwischenablage kopieren<\/h2>\n<p>Fehlen noch die Schaltfl&auml;chen, die wir jeweils rechts von den Ausdr&uuml;cken beziehungsweise VBA-Aufrufen platziert haben. Diese sollen den Inhalt des jeweiligen Textfeldes in die Zwischenablage kopieren.<\/p>\n<p>Die Funktionen sind alle gleich aufgebaut und rufen die Prozedur <b>InZwischenablage <\/b>aus dem Modul <b>mdlZwischenablage <\/b>auf. Dabei &uuml;bergeben Sie den Inhalt des jeweiligen Textfeldes als Parameter. Hier der Code f&uuml;r die Dom&auml;nenfunktion <b>DomAnzahl <\/b>(<b>DCount<\/b>):<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdCopyDCount_Click()\r\n     Inzwischenablage Me!txtDCount<span style=\"color:blue;\">Call<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Einsatz als Men&uuml;-Add-In<\/h2>\n<p>Damit haben wir alle Funktionen zusammen. Das Formular und die dazugeh&ouml;rigen Elemente kann man nun in eine eigene Anwendung kopieren und dieses dort nutzen. Interessanter ist es aber, dieses Formular f&uuml;r alle Anwendungen verf&uuml;gbar zu machen. Eine gute M&ouml;glichkeit ist der Einsatz als Men&uuml;-Add-In. Wir k&ouml;nnen das Formular dann &uuml;ber den Ribbonbefehl <b>Datenbanktools|Add-Ins|Add-Ins|[Add-In-Name] <\/b>aufrufen. Die Schritte dorthin sind &uuml;berschaubar, wenn wir das Tool nutzen, das wir im Beitrag <b>Access-Add-In per Knopfdruck erstellen <\/b>(<b>www.access-im-unternehmen.de\/1427<\/b>) vorgestellt haben.<\/p>\n<p>Starten wir dieses &uuml;ber den Add-In-Manager, erscheint das Formular aus Bild 6. Hier passen wir die Inhalte der Felder an und klicken auf <b>Zum Add-In umr&uuml;sten<\/b>. Anschlie&szlig;end brauchen wir nur noch eine &ouml;ffentlich verf&uuml;gbare Funktion namens <b>Autostart <\/b>hinzuzuf&uuml;gen und von dort aus das Formular aufzurufen. Diese Funktion legen wir in einem neuen Modul namens <b>mdlAddIn <\/b>an:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_006.png\" alt=\"Umr&uuml;sten einer Datenbank zu einem Access-Add-In\" width=\"424,5589\" height=\"268,411\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Umr&uuml;sten einer Datenbank zu einem Access-Add-In<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart()\r\n     DoCmd.OpenForm \"frmDomaenenfunktionen\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Au&szlig;erdem benennen wir die Datenbankdatei noch in <b>amvDomaenenfunktionen.accda <\/b>um. Schlie&szlig;lich k&ouml;nnen wir das Access-Add-In &uuml;ber den Add-In-Manager, den wir mit dem Ribbonbefehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>&ouml;ffnen, installieren. Danach zeigt das Add-In-Men&uuml; das neue Add-In an und kann f&uuml;r das Ausprobieren von Dom&auml;nenfunktionen genutzt werden.<\/p>\n<h2>Einsatz als Eigenschafts-Add-In<\/h2>\n<p>Ebenfalls interessant w&auml;re es, das Add-In immer dann anzuzeigen, wenn der Benutzer eine Eigenschaft eines Elements bearbeitet, die eine Dom&auml;nenfunktion als Ausdruck verwenden kann.<\/p>\n<p>Dazu ben&ouml;tigen wir noch zwei Erweiterungen. Die erste sind ein paar weitere Eintr&auml;ge in der Tabelle <b>USysRegInfo<\/b>, die mit dem Add-In aus dem soeben beschriebenen Beitrag angelegt wurde.<\/p>\n<p>Die oberen vier Eintr&auml;ge dieser Tabelle aus Bild 7 wurden durch das Add-In hinzugef&uuml;gt, die unteren f&uuml;nf erg&auml;nzen wir manuell. Diese sorgen daf&uuml;r, dass bei der Installation des Add-Ins Registry-Eintr&auml;ge nicht nur f&uuml;r das Men&uuml;-Add-In sondern auch f&uuml;r die Eigenschaft, in deren Kontext das Add-In als Eigenschaften-Assistent zur Verf&uuml;gung gestellt werden soll. Dazu tragen wir die Eintr&auml;ge nicht unter <b>&#8230;\\Menu Add-Ins\\&#8230; <\/b>ein, sondern unter <b>&#8230;\\Wizards\\Property Wizards\\ControlSource\\&#8230; <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_007.png\" alt=\"Eintr&auml;ge in der Tabelle USysRegInfo\" width=\"700\" height=\"291,6667\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Eintr&auml;ge in der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Dadurch erscheint der Assistent &uuml;berall dort, wo die Eigenschaft <b>Steuerelementinhalt <\/b>verwendet wird (<b>ControlSource<\/b>).<\/p>\n<p>Vielleicht ist Ihnen aufgefallen, dass die Tabelle f&uuml;r den Eigenschafts-Assistenten f&uuml;nf Eintr&auml;ge enth&auml;lt und f&uuml;r das Men&uuml;-Add-In nur vier. Au&szlig;erdem finden wir einige neue Eintr&auml;ge. Daher eine kurze Zusammenfassung:<\/p>\n<ul>\n<li><b>Description<\/b>: Enth&auml;lt den Text, der im Dialog zur Auswahl der Assistenten erscheint.<\/li>\n<li><b>Library<\/b>: Gibt den Pfad zur Add-In-Datenbank an.<\/li>\n<li><b>Can Edit<\/b>: Gibt an, ob der Assistent Daten per Funktion zur&uuml;ckliefern und so den Wert einer Eigenschaft &auml;ndern soll (1) oder nicht (0).<\/li>\n<li><b>Function<\/b>: Funktion, die beim Start des Assistenten aufgerufen werden soll.<\/li>\n<\/ul>\n<p>Die Funktion, die wir hier angeben, muss einer speziellen Syntax folgen. Sie enth&auml;lt einige fest vorgegebene Parameter, die Informationen &uuml;ber das aufrufende Objekt, das Steuerelement und den aktuellen Wert der Eigenschaft liefert:<\/p>\n<ul>\n<li><b>strObject<\/b>: Name des Formulars, in dem sich das Steuerelement mit der betroffenen Eigenschaft befindet<\/li>\n<li><b>strControl<\/b>: Name des Steuerelements mit der betroffenen Eigenschaft<\/li>\n<li><b>strCurVal<\/b>: Aktueller Wert der Eigenschaft<\/li>\n<\/ul>\n<p>In Listing 6 haben wir diese Funktion abgebildet. Sie &ouml;ffnet das Formular <b>frmDomaenenfunktionen <\/b>als modalen Dialog und &uuml;bergibt ihr mit dem &Ouml;ffnungsargument den Wert <b>Wizard<\/b>. Dieses wird in der Prozedur ausgewertet, die der Benutzer beim Schlie&szlig;en des Formulars ausl&ouml;st. Wenn das Add-In mit dem &Ouml;ffnungsargument <b>Wizard <\/b>ge&ouml;ffnet wurde, wird das Formular ausgeblendet, ansonsten wird es geschlossen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart_Eigenschaften(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>strFunktion<span style=\"color:blue;\"> As String<\/span>\r\n     DoCmd.OpenForm \"frmDomaenenfunktionen\", Windowmode:=acDialog, OpenArgs:=\"AddIn\"\r\n     <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmDomaenenfunktionen\")<span style=\"color:blue;\"> Then<\/span>\r\n         Select Case Forms!frmDomaenenfunktionen!ogrFunktion\r\n             <span style=\"color:blue;\">Case <\/span>1\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDCount<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>2\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDFirst<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>3\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDLast<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>4\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDMax<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>5\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDMin<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>6\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDAvg<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>7\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDStDev<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>8\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDStDevP<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>9\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDSum<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>10\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDVar<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>11\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDVarP<span style=\"color:blue;\">Call<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>12\r\n                 strFunktion = Forms!frmDomaenenfunktionen!txtDLookup<span style=\"color:blue;\">Call<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         DoCmd.Close acForm, \"frmDomaenenfunktionen\"\r\n         Autostart_Eigenschaften = strFunktion\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Autostart_Eigenschaften = strCurVal\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 6: Funktion, die das Ergebnis des Add-Ins an die aufrufende Eigenschaft zur&uuml;ckgibt<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     Select Case Me.OpenArgs\r\n         <span style=\"color:blue;\">Case <\/span>\"Wizard\"\r\n             Me.Visible = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             DoCmd.Close acForm, Me.Name\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies ist wichtig, weil wir, wenn wir das Formular als Assistent f&uuml;r die Eigenschaft <b>ControlSource<\/b> ge&ouml;ffnet haben, die Eingabe des Benutzers auswerten wollen &#8211; und dazu muss das Formular noch ge&ouml;ffnet sein.<\/p>\n<p>In der Funktion <b>Autostart_Eigenschaften <\/b>h&auml;lt die Prozedur zum &Ouml;ffnen des Formulars den Code solange an, bis dieses wieder geschlossen oder unsichtbar gemacht wird. Letzteres tun wir durch das Ausblenden mit <b>Me.Visible = False<\/b>. Dann pr&uuml;fen wir in einer <b>Select Case<\/b>-Bedingung den Wert der Optionsgruppe <b>ogrFunktion<\/b> und schreiben den Inhalt des jeweiligen Textfeldes in die Variable <b>strFunktion<\/b>. Dann schlie&szlig;t die Prozedur das bereits ausgeblendete Formular und weist den Inhalt von <b>strFunktion <\/b>dem R&uuml;ckgabewert der Funktion zu.<\/p>\n<p>Anderenfalls wird der vorherige Wert der Eigenschaft zur&uuml;ckgegeben.<\/p>\n<h2>Add-In und Assistent installieren und testen<\/h2>\n<p>Wir haben nun prinzipiell ein Add-In und einen Assistenten in einer Datei programmiert. Wenn wir das Add-In installieren, wird die Funktion an zwei Stellen gleichzeitig freigeschaltet. Die Installation ist einfach: Wir starten einfach den Add-In-Manager mit dem Ribbon-Befehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager<\/b>. Hier klicken wir auf die Schaltfl&auml;che <b>Neues hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen im folgenden Dialog die <b>.accda<\/b>-Datei aus. <\/p>\n<p>Anschlie&szlig;end erscheint diese wie in Bild 8 im Add-In-Manager.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_008.png\" alt=\"Installation des Access-Add-Ins\" width=\"499,5589\" height=\"298,5869\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Installation des Access-Add-Ins<\/span><\/b><\/p>\n<p>Wir k&ouml;nnen die Funktion dann als Add-In &uuml;ber den Ribbon-Eintrag Datenbanktools|Add-Ins|Add-Ins|amvDom&auml;nenfunktionen aufrufen, um mit den Dom&auml;nenfunktionen zu experimentieren (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_009.png\" alt=\"Aufruf des Add-Ins &uuml;ber das Add-In-Men&uuml;\" width=\"499,5589\" height=\"239,3324\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Aufruf des Add-Ins &uuml;ber das Add-In-Men&uuml;<\/span><\/b><\/p>\n<p>Oder wir &ouml;ffnen ein Formular in der Entwurfsansicht und legen ein Steuerelement an, das die Eigenschaft <b>Steuerelementinhalt <\/b>enth&auml;lt. Klicken wir f&uuml;r diese auf die Schaltfl&auml;che mit den drei Punkten, erscheint ein Dialog zur Auswahl der verf&uuml;gbaren Assistenten, unter anderem auch <b>amvDom&auml;nenfunktionen<\/b> (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1485_010.png\" alt=\"Aufruf des Add-Ins &uuml;ber die Eigenschaft Steuerelementinhalt\" width=\"700\" height=\"304,5861\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Aufruf des Add-Ins &uuml;ber die Eigenschaft Steuerelementinhalt<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit dem Know-how aus diesem Beitrag kann man beliebige Add-Ins und Assistenten f&uuml;r die verschiedensten Anwendungszwecke programmieren. Die L&ouml;sung zum einfachen Zusammenstellen von Dom&auml;nenfunktionen l&auml;sst sich au&szlig;erdem prima im Programmieralltag einsetzen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvDomaenenfunktionen.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/93D15110-65DD-47D2-B501-2B8780117DE8\/aiu_1485.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dom&auml;nenfunktionen wie DomWert (DLookup), DomMax (DMax) oder DomAnzahl (DCount) sind praktische Helfer, wenn es um das schnelle Zugreifen auf verschiedene Informationen einer Datenbank geht. Wir k&ouml;nnen damit den Wert eines oder mehrerer Felder aus einem Datensatz mit einem bestimmten Kriterium ermitteln, die Gesamtanzahl von Datens&auml;tzen einer Tabelle mit oder ohne Kriterium oder auch Minimal- oder Maximalwerte. Der Assistent, den wir in diesem Beitrag vorstellen, hilft dabei auf verschiedene Arten. Die erste ist, dass Sie ihn einfach aufrufen k&ouml;nnen, um schnell die Werte f&uuml;r eine Dom&auml;nenfunktion einzutippen und das Ergebnis auszulesen. Aber der Assistent kann noch mehr: Sie k&ouml;nnen ihn auch von Eigenschaftsfeldern heraus aufrufen, um die gew&auml;hlte Dom&auml;nenfunktion direkt dort einzutragen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012024,662024,44000027],"tags":[],"class_list":["post-55001485","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Assistent f&uuml;r Dom&auml;nenfunktionen - 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\/Assistent_fuer_Domaenenfunktionen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Assistent f&uuml;r Dom&auml;nenfunktionen\" \/>\n<meta property=\"og:description\" content=\"Dom&auml;nenfunktionen wie DomWert (DLookup), DomMax (DMax) oder DomAnzahl (DCount) sind praktische Helfer, wenn es um das schnelle Zugreifen auf verschiedene Informationen einer Datenbank geht. Wir k&ouml;nnen damit den Wert eines oder mehrerer Felder aus einem Datensatz mit einem bestimmten Kriterium ermitteln, die Gesamtanzahl von Datens&auml;tzen einer Tabelle mit oder ohne Kriterium oder auch Minimal- oder Maximalwerte. Der Assistent, den wir in diesem Beitrag vorstellen, hilft dabei auf verschiedene Arten. Die erste ist, dass Sie ihn einfach aufrufen k&ouml;nnen, um schnell die Werte f&uuml;r eine Dom&auml;nenfunktion einzutippen und das Ergebnis auszulesen. Aber der Assistent kann noch mehr: Sie k&ouml;nnen ihn auch von Eigenschaftsfeldern heraus aufrufen, um die gew&auml;hlte Dom&auml;nenfunktion direkt dort einzutragen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T20:09:18+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=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Assistent f&uuml;r Dom&auml;nenfunktionen\",\"datePublished\":\"2024-02-02T20:09:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/\"},\"wordCount\":3549,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/cfd81f4dee5c45f8b0239b914c78f8e4\",\"articleSection\":[\"1\\\/2024\",\"2024\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/\",\"name\":\"Assistent f&uuml;r Dom&auml;nenfunktionen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/cfd81f4dee5c45f8b0239b914c78f8e4\",\"datePublished\":\"2024-02-02T20:09:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/cfd81f4dee5c45f8b0239b914c78f8e4\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/cfd81f4dee5c45f8b0239b914c78f8e4\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Assistent_fuer_Domaenenfunktionen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Assistent f&uuml;r Dom&auml;nenfunktionen\"}]},{\"@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":"Assistent f&uuml;r Dom&auml;nenfunktionen - 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\/Assistent_fuer_Domaenenfunktionen\/","og_locale":"de_DE","og_type":"article","og_title":"Assistent f&uuml;r Dom&auml;nenfunktionen","og_description":"Dom&auml;nenfunktionen wie DomWert (DLookup), DomMax (DMax) oder DomAnzahl (DCount) sind praktische Helfer, wenn es um das schnelle Zugreifen auf verschiedene Informationen einer Datenbank geht. Wir k&ouml;nnen damit den Wert eines oder mehrerer Felder aus einem Datensatz mit einem bestimmten Kriterium ermitteln, die Gesamtanzahl von Datens&auml;tzen einer Tabelle mit oder ohne Kriterium oder auch Minimal- oder Maximalwerte. Der Assistent, den wir in diesem Beitrag vorstellen, hilft dabei auf verschiedene Arten. Die erste ist, dass Sie ihn einfach aufrufen k&ouml;nnen, um schnell die Werte f&uuml;r eine Dom&auml;nenfunktion einzutippen und das Ergebnis auszulesen. Aber der Assistent kann noch mehr: Sie k&ouml;nnen ihn auch von Eigenschaftsfeldern heraus aufrufen, um die gew&auml;hlte Dom&auml;nenfunktion direkt dort einzutragen.","og_url":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-02T20:09:18+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Assistent f&uuml;r Dom&auml;nenfunktionen","datePublished":"2024-02-02T20:09:18+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/"},"wordCount":3549,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/cfd81f4dee5c45f8b0239b914c78f8e4","articleSection":["1\/2024","2024","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/","url":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/","name":"Assistent f&uuml;r Dom&auml;nenfunktionen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/cfd81f4dee5c45f8b0239b914c78f8e4","datePublished":"2024-02-02T20:09:18+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/cfd81f4dee5c45f8b0239b914c78f8e4","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/cfd81f4dee5c45f8b0239b914c78f8e4"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Assistent_fuer_Domaenenfunktionen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Assistent f&uuml;r Dom&auml;nenfunktionen"}]},{"@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\/55001485","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=55001485"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001485\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}