{"id":55001483,"date":"2024-02-01T00:00:00","date_gmt":"2024-02-02T20:00:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1483"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Abfragen_direkt_in_der_SQLAnsicht_erstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/","title":{"rendered":"Abfragen direkt in der SQL-Ansicht erstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/687ff8df67294899aed1b1960e1660af\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Microsoft hat neuerdings einen Befehl zum direkten Anzeigen von Abfragen in der SQL-Ansicht. Damit k&ouml;nnen wir eine Abfrage direkt in der SQL-Ansicht &ouml;ffnen statt den Umweg &uuml;ber den Abfrageentwurf zu w&auml;hlen. Leider hat Microsoft keine entsprechende Funktion f&uuml;r das Erstellen von Abfragen hinzugef&uuml;gt &#8211; also eine Schaltfl&auml;che im Ribbon, mit der wir eine neue SQL-Abfrage direkt in der SQL-Ansicht &ouml;ffnen k&ouml;nnen. Das ist allerdings gar nicht schlimm, denn wir r&uuml;sten diese Funktion einfach selbst nach. Zun&auml;chst schauen wir uns an, welche Befehle dazu notwendig sind, danach erstellen wir ein COM-Add-In, das die Funktion in der Benutzeroberfl&auml;che verankert &#8211; gleich neben den Schaltfl&auml;chen f&uuml;r den Abfrageassistenten und das Anlegen von neuen Abfragen &uuml;ber die Entwurfsansicht.<\/b><\/p>\n<p>In dem Beitrag, der die neuen Befehle zum direkten Anzeigen vorhandener Abfragen in der SQL-Ansicht vorstellt, gehen wir bereits kurz auf die notwendigen Anweisungen ein, die zum Erstellen einer neuen Abfrage und ihrer Anzeige in der SQL-Ansicht n&ouml;tig sind &#8211; siehe <b>Abfragen in der SQL-Ansicht &ouml;ffnen <\/b>(<b>www.access-im-unternehmen.de\/1482<\/b>).<\/p>\n<p>Dort stellen wir die folgende Prozedur vor:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>NewQueryInSQLView()\r\n     RunCommand acCmdNewObjectDesignQuery\r\n     RunCommand acCmdSQLView\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese ruft die <b>RunCommand<\/b>-Anweisung mit zwei verschiedenen Parametern auf, die wir auch &uuml;ber die Benutzeroberfl&auml;che aufrufen k&ouml;nnen.<\/p>\n<p>Der erste namens <b>acCmdNewObjectDesignQuery <\/b>&ouml;ffnet zun&auml;chst eine neue Abfrage in der Entwurfsansicht.<\/p>\n<p>Der zweite nutzt den Parameter <b>acCmdSQLView<\/b>, um die so erstellte Abfrage in der SQL-Ansicht anzuzeigen. Platzieren wir Access-Fenster und VBA-Editor nebeneinander und rufen die Prozedur auf, sehen wir ein kurzes Flackern und erhalten anschlie&szlig;end eine weitgehend leere SQL-Ansicht der neuen Abfrage (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_001.png\" alt=\"Neue, leere Abfrage per Code in der SQL-Ansicht\" width=\"424,5589\" height=\"201,1718\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Neue, leere Abfrage per Code in der SQL-Ansicht<\/span><\/b><\/p>\n<p>Das kurze Flackern resultiert daraus, dass zuerst die Entwurfsansicht eingeblendet wird, zu der standardm&auml;&szlig;ig auch noch der Bereich <b>Tabellen hinzuf&uuml;gen <\/b>eingeblendet wird (in &auml;lteren Access-Versionen erscheint ein Fenster mit dem Titel <b>Tabelle ausw&auml;hlen<\/b>). Dieser verschwindet beim Wechsel zur SQL-Ansicht allerdings direkt wieder.<\/p>\n<p>In &auml;lteren Versionen (zum Beispiel Access 2010) wird das Fenster <b>Tabelle ausw&auml;hlen <\/b>als modaler Dialog eingeblendet, den man erst schlie&szlig;en muss, bevor die Abfrage von der Entwurfsansicht in die SQL-Ansicht wechselt (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_002.png\" alt=\"Dieses Fenster erscheint in &auml;lteren Access-Versionen\" width=\"524,559\" height=\"354,5096\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Dieses Fenster erscheint in &auml;lteren Access-Versionen<\/span><\/b><\/p>\n<p>In diesem Fall k&ouml;nnen wir nicht viel ausrichten &#8211; beim Anzeigen eines modalen Dialogs wird der aufrufende Code unterbrochen und folgende Anweisungen, mit denen wir den Dialog ausblenden k&ouml;nnten, w&uuml;rden nicht ausgef&uuml;hrt werden.<\/p>\n<p>Benutzer &auml;lterer Access-Versionen m&uuml;ssen also diese Meldung noch schlie&szlig;en, bevor dann die SQL-Ansicht eingeblendet wird. Immerhin wird die Anweisung zum Wechseln zur SQL-Ansicht dann noch ausgef&uuml;hrt.<\/p>\n<h2>Funktion per COM-Add-In zum Ribbon hinzuf&uuml;gen<\/h2>\n<p>Wenn wir diese aus zwei Anweisungen bestehende Funktion &uuml;ber das Ribbon aufrufen wollen, haben wir verschiedene M&ouml;glichkeiten. Die nachhaltigste ist die Erstellen eines COM-Add-Ins. Dieses wird einmal installiert und die Funktion ist dauerhaft in der Benutzeroberfl&auml;che verankert &#8211; egal, welche Datenbank Sie damit &ouml;ffnen.<\/p>\n<p>Das k&ouml;nnte beispielsweise wie in Bild 3 aussehen. Es schien uns logisch, dass die betroffene Schaltfl&auml;che in den Bereich <b>Erstellen|Abfragen <\/b>integriert werden sollte. Ein Mausklick auf diese Abfrage ruft die beiden oben vorgestellten Anweisungen auf und &ouml;ffnet so eine neue Abfrage in der SQL-Ansicht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_003.png\" alt=\"Neue Schaltfl&auml;che zum Anlegen einer Abfrage in der SQL-Ansicht\" width=\"649,559\" height=\"278,7617\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Neue Schaltfl&auml;che zum Anlegen einer Abfrage in der SQL-Ansicht<\/span><\/b><\/p>\n<p>Ein solches COM-Add-In ist schnell erstellt. Wir nutzen dazu das schon oft referenzierte twinBASIC von Wayne Philips, das in der Version f&uuml;r das Erstellen von 32-Bit-Programmen kostenlos ist &#8211; erst die 64-Bit-Version ist kostenpflichtig (in DLLs, die mit der kostenlosen Version erstellt wurden, werden Hinweise auf twinBASIC eingeblendet). Die jeweils aktuelle Version kann hier heruntergeladen werden:<\/p>\n<pre>https:\/\/github.com\/twinbasic\/twinbasic\/releases<\/pre>\n<p>Nach dem Erstellen eines neuen Projekts auf Basis der Vorlage <b>Sample 5. MyCOMAddin <\/b>(siehe Bild 4) beginnen wir mit dem Speichern des Projekts unter dem von uns gew&auml;hlten Pfad und Dateinamen, zum Beispiel <b>amvSQLView.twinproj<\/b>. Merken Sie sich diesen Pfad, wir ben&ouml;tigen ihn sp&auml;ter noch. Danach fahren wir mit dem Anpassen der Projekteinstellungen fort.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_004.png\" alt=\"Neues Projekt auf Basis einer Vorlage\" width=\"474,5589\" height=\"380,4797\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Neues Projekt auf Basis einer Vorlage<\/span><\/b><\/p>\n<h2>Projekteinstellungen anpassen<\/h2>\n<p>Diese finden wir, wenn wir auf der linken Seite auf <b>Settings <\/b>klicken. Wir stellen nun den Projektnamen, die Projektbeschreibung und den Anwendungstitel auf den gew&uuml;nschten Wert ein, beispielsweise <b>amvSQLView<\/b>. Das sieht dann f&uuml;r den Projekttitel wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_005.png\" alt=\"Projekteinstellungen anpassen\" width=\"474,5589\" height=\"270,0077\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Projekteinstellungen anpassen<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir noch einen Verweis auf die Access-Bibliothek hinzu. Dazu scrollen wir unter <b>Settings<\/b> weiter nach unten bis zum Bereich <b>Library References<\/b>.<\/p>\n<p>Hier wechseln wir zur Registerseite <b>Available COM References <\/b>und suchen nach Access. Die nun erscheinende Bibliothek f&uuml;gen wir durch Setzen eines Hakens hinzu (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_006.png\" alt=\"Hinzuf&uuml;gen eines Access-Verweises\" width=\"474,5589\" height=\"338,7368\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Hinzuf&uuml;gen eines Access-Verweises<\/span><\/b><\/p>\n<h2>Registrierung der DLL programmieren<\/h2>\n<p>Damit kommen wir zu einem wichtigen Aspekt f&uuml;r ein COM-Add-In, das als DLL erstellt wird, n&auml;mlich die Registrierung. Damit Access beim Starten merkt, dass die Funktionen unseres COM-Add-Ins geladen werden sollen, m&uuml;ssen wir dies an bestimmten Stellen in der Registry vermerken.<\/p>\n<p>Die Funktionen des Moduls aus Listing 1 erledigen genau dies. Im oberen Teil finden wir einige Konstanten mit wichtigen Informationen, die w&auml;hrend der Installation ben&ouml;tigt werden. Die Funktion <b>DLLRegisterServer <\/b>schreibt die Eintr&auml;ge, die von Access beim Start abgefragt werden sollen und zum Laden des COM-Add-Ins f&uuml;hren, in einen bestimmten Bereich der Registry.<\/p>\n<pre>Module DllRegistration\r\n     Const AddinProjectName<span style=\"color:blue;\"> As String<\/span> = VBA.Compilation.CurrentProjectName\r\n     Const AddinClassName<span style=\"color:blue;\"> As String<\/span> = \"amvSQLView\"\r\n     Const AddinQualifiedClassName<span style=\"color:blue;\"> As String<\/span> = AddinProjectName & \".\" & AddinClassName\r\n     Const RootRegistryFolder<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\n     <span style=\"color:blue;\">Public <\/span>Function DllRegisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n         <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n         wscript.RegWrite RootRegistryFolder & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n         wscript.RegWrite RootRegistryFolder & \"Description\", AddinProjectName, \"REG_SZ\"\r\n         wscript.RegWrite RootRegistryFolder & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     RegError:\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"DllRegisterServer -- An error occured trying to write to the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n                 Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     End Function\r\n     <span style=\"color:blue;\">Public <\/span>Function DllUnregisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n         <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n         wscript.RegDelete RootRegistryFolder & \"FriendlyName\"\r\n         wscript.RegDelete RootRegistryFolder & \"Description\"\r\n         wscript.RegDelete RootRegistryFolder & \"LoadBehavior\"\r\n         wscript.RegDelete RootRegistryFolder\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     RegError:\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"DllUnregisterServer -- An error occured trying to delete from the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n                 Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     End Function\r\nEnd Module<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Modul f&uuml;r die Registrierung und die Deregistrierung des COM-Add-Ins<\/span><\/b><\/p>\n<p>Die Funktion <b>DllUnregisterServer <\/b>entfernt diese Eintr&auml;ge wieder, falls gew&uuml;nscht. Den Code des Moduls <b>DLLRegistration<\/b> des soeben erstellen Projekts k&ouml;nnen Sie durch den Code aus dem abgedruckten Listing ersetzen.<\/p>\n<p>Wann werden diese Funktionen aufgerufen?<\/p>\n<ul>\n<li>W&auml;hrend der Entwicklung erfolgt der Aufruf der ersten Funktion, wenn wir das COM-Add-In durch einen Klick auf die <b>Build<\/b>-Schaltfl&auml;che oben rechts in der Symbolleiste von twinBASIC bet&auml;tigen. Dann wird die DLL mit dem COM-Add-In erstellt, im Ordner <b>Build <\/b>abgelegt und registriert. Jedes Mal, wenn wir das tun, wird zuvor die Funktion <b>DLLUnregisterServer <\/b>aufgerufen, um die eventuell vorhandenen Eintr&auml;ge zuvor zu entfernen. Achtung: Wenn das COM-Add-In registriert und Access dieses nach dem Start geladen hat, kann dieses nicht deregistriert werden. Sie m&uuml;ssen Access zuvor schlie&szlig;en.<\/li>\n<li>Wir k&ouml;nnen die Funktion <b>DLLRegisterServer <\/b>auch manuell im Debugging-Modus aufrufen, indem wir auf den Pfeil &uuml;ber der ersten Zeile der Funktion klicken (siehe Bild 7). Auf die gleiche Weise starten wir <b>DLLUnregisterServer<\/b>, um die Registrierung der DLL aufzuheben.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_007.png\" alt=\"Start der Registrierung\" width=\"474,5589\" height=\"337,0793\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Start der Registrierung<\/span><\/b><\/p>\n<li>Die n&auml;chste M&ouml;glichkeit, f&uuml;r den Aufruf der Funktion <b>DLLRegisterServer <\/b>zu sorgen und das COM-Add-In zu registrieren, ist das Registrieren mit dem Kommandozeilentool <b>RegSvr32<\/b>. Diesem &uuml;bergeben Sie den Pfad zur DLL als Parameter, was dazu f&uuml;hrt, dass die enthaltene Funktion <b>DLLRegisterServer <\/b>ausgef&uuml;hrt und die DLL registriert wird. Der gleiche Befehl f&uuml;hrt mit dem Parameter <b>-u <\/b>zum Aufruf der Funktion <b>DLLUnregisterServer<\/b>.<\/li>\n<li>Schlie&szlig;lich k&ouml;nnen wir den COM-Add-Ins-Dialog &uuml;ber die Access-Optionen &ouml;ffnen (<b>Datei|Optionen, Bereich Add-Ins<\/b>, unten <b>COM-Add-Ins <\/b>ausw&auml;hlen und auf <b>Los&#8230; <\/b>klicken). Im nun erscheinenden Dialog klicken wir auf <b>Hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen die zuvor erstellte DLL aus, die dann registriert wird (siehe Bild 8). Durch Ausw&auml;hlen des neuen Eintrags und Anklicken der Schaltfl&auml;che <b>Entfernen <\/b>wird die DLL wieder deregistriert.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_008.png\" alt=\"Registrierung &uuml;ber die Access-Optionen\" width=\"649,559\" height=\"271,348\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Registrierung &uuml;ber die Access-Optionen<\/span><\/b><\/p>\n<li>Schlie&szlig;lich k&ouml;nnen wir in einem Inno Setup die DLL als Komponente im <b>Files<\/b>-Bereich angeben und mit dem Flag <b>regserver <\/b>versehen (mehr dazu in einem anderen Beitrag). Auch dies f&uuml;hrt bei der Installation zum Aufruf der Funktion <b>DLLRegisterServer<\/b>.<\/li>\n<\/ul>\n<h2>Programmieren der Ribbon-Erweiterung<\/h2>\n<p>Damit kommen wir zum Hauptteil der Arbeit, dem Klassenmodul <b>amvSQLView<\/b> (siehe Listing 2). Dieses enth&auml;lt eine eindeutige ID als Kennzeichnung.<\/p>\n<pre>[ ClassId (\"DC8E7154-FAC8-43B7-88E5-A9352753999F\") ]\r\n<span style=\"color:blue;\">Class<\/span> amvSQLView\r\n     Implements IDTExtensibility2\r\n     [ WithDispatchForwarding ]\r\n     Implements IRibbonExtensibility\r\n     <span style=\"color:blue;\">Private <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application\r\n     Sub OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n             ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnConnection\r\n         <span style=\"color:blue;\">Set<\/span> objAccess = Application\r\n     End Sub\r\n     Sub OnDisconnection(ByVal RemoveMode<span style=\"color:blue;\"> As <\/span>ext_DisconnectMode, ByRef custom<span style=\"color:blue;\"> As Variant<\/span>())    _\r\n         Implements IDTExtensibility2.OnDisconnection\r\n     End Sub\r\n     Sub OnAddInsUpdate(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnAddInsUpdate\r\n     End Sub\r\n     Sub OnStartupComplete(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnStartupComplete\r\n     End Sub\r\n     Sub OnBeginShutdown(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnBeginShutdown\r\n     End Sub\r\n     ... mehr Code\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Basis der Klasse amvSQLView<\/span><\/b><\/p>\n<p>Die Klasse implementiert die Schnittstelle <b>IDTExtensibility2<\/b>, die Ereignisse bereitstellt, die beispielsweise beim Verbinden von Access mit dem COM-Add-In ausgel&ouml;st werden. Au&szlig;erdem implementiert sie die Schnittstelle <b>IRibbonExtensibility<\/b>, die ein Ereignis bereitstellt, das beim Laden des Ribbons ausgel&ouml;st wird und das Anpassen des Ribbons erm&ouml;glicht.<\/p>\n<p>Wir deklarieren in der Klasse eine Variable, um die Access-Instanz zu referenzieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application<\/pre>\n<p>In der beim Verbinden ausgel&ouml;sten Ereignisprozedur <b>OnConnection <\/b>weisen wir dieser Variable den mit dem Parameter <b>Application <\/b>&uuml;bergebenen Verweis auf die aufrufende Access-Instanz zu. Die &uuml;brigen Elemente der Schnittstelle <b>IDTExtensibility2 <\/b>ben&ouml;tigen wir nicht, aber wir m&uuml;ssen diese dennoch implementieren.<\/p>\n<h2>Funktion zum Zusammenstellen der Ribbon-Anpassung<\/h2>\n<p>In dem mit <b>&#8230; mehr Code <\/b>markierten Teil des Listings finden wir noch die Funktion <b>GetCustomUI<\/b>. Diese stellt die Anpassungen zusammen, die das COM-Add-In am Ribbon vornehmen soll, damit wir unsere Funktion aufrufen k&ouml;nnen.<\/p>\n<p>Die Funktion soll eigentlich nur eine Schaltfl&auml;che zu der eingebauten Gruppe <b>Abfrage <\/b>des Tabs <b>Erstellen <\/b>hinzuf&uuml;gen.<\/p>\n<p>Nun lassen sich eingebaute <b>group<\/b>-Elemente aber nicht anpassen. Das hei&szlig;t, wir m&uuml;ssen das eingebaute <b>group<\/b>-Element <b>GroupCreateClientQuery <\/b>ausblenden, es nachbauen und dann unser zus&auml;tzliches <b>button<\/b>-Element hinzuf&uuml;gen.<\/p>\n<p>Den Code stellen wir wie in Listing 3 mit der Funktion <b>GetCustomUI<\/b> zusammen. Dazu verwenden wir die Variable <b>strXML<\/b>. Dieser weisen wir zuerst die Elemente <b>customUI<\/b>, <b>ribbon <\/b>und <b>tabs <\/b>hinzu. Als <b>tab<\/b>-Element geben wir mit dem Attribut <b>idMso <\/b>das eingebaute Element namens <b>TabCreate <\/b>an.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\" &gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;ribbon startFromScratch=\"\"false\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;tab idMso=\"\"TabCreate\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;group idMso=\"\"GroupCreateClientQuery\"\" visible=\"\"false\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;group id=\"\"grpGroupCreateClientQuery\"\" insertAfterMso=\"\"GroupCreateClientQuery\"\" \" _\r\n         & \"label=\"\"Abfragen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;button idMso=\"\"CreateQueryFromWizard\"\" size=\"\"large\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;button idMso=\"\"CreateQueryInDesignView\"\" size=\"\"large\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"              &lt;button id=\"\"btnCreateQueryInSQLView\"\" imageMso=\"\"ViewsAdpDiagramSqlView\"\" \" _\r\n         & \"size=\"\"large\"\" label=\"\"SQL-Ansicht\"\" onAction=\"\"onAction\"\" screentip=\"\"SQL-Ansicht\"\" \" _\r\n         & \"supertip=\"\"Erstellen Sie eine neue Abfrage, die direkt in der SQL-Ansicht ge&ouml;ffnet wird. Sie k&ouml;nnen \" _\r\n         & \"dann direkt SQL-Code eintippen.\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;\/tab&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion GetCustomUI<\/span><\/b><\/p>\n<p>Dann legen wir ein <b>group<\/b>-Element mit dem Wert <b>GroupCreateClientQuery <\/b>f&uuml;r das Attribut <b>idMso <\/b>an. Damit referenzieren wir das gleichnamige eingebaute Element und machen dieses durch Setzen des Attributs <b>visible <\/b>auf den Wert <b>false <\/b>unsichtbar.<\/p>\n<p>Danach definieren wir das neue benutzerdefinierte <b>group<\/b>-Element, das wir durch den Wert <b>GroupCreateClientQuery <\/b>f&uuml;r das Attribut <b>insertAfterMso <\/b>hinter dem soeben ausgeblendeten <b>group<\/b>-Element einf&uuml;gen. &Uuml;ber das Attribut <b>label <\/b>stellen wir den Text <b>Abfragen <\/b>ein.<\/p>\n<p>In der neuen Gruppe bauen wir nun die beiden Schaltfl&auml;chen ein, die durch das Ausblenden der eingebauten Gruppe nun nicht mehr vorhanden sind. Dazu legen wir f&uuml;r die beiden <b>button<\/b>-Elemente lediglich die <b>idMso<\/b>-Werte auf <b>CreateQueryFromWizard <\/b>und <b>CreateQueryInDesignView <\/b>fest und stellen die Gr&ouml;&szlig;e mit dem Parameter <b>size <\/b>auf <b>large <\/b>ein.<\/p>\n<p>Schlie&szlig;lich folgt die Definition der neuen Schaltfl&auml;che. Diese soll das gleiche Bild erhalten wie der Kontextmen&uuml;-Eintrag von Abfragen zum &Ouml;ffnen in der SQL-Ansicht, was wir mit dem Wert <b>ViewsAdpDiagramSqlView <\/b>f&uuml;r das Attribut <b>imageMso <\/b>einstellen.<\/p>\n<p>&Uuml;ber die Attribute <b>supertip<\/b> und <b>screentip <\/b>stellen wir die Texte ein, die beim &Uuml;berfahren des Ribbonbefehls mit der Maus angezeigt werden sollen.<\/p>\n<p>Schlie&szlig;lich schlie&szlig;en wir die <b>group<\/b>-, <b>tab<\/b>-, <b>tabs<\/b>-, <b>ribbon<\/b>&#8211; und <b>customUI<\/b>-Elemente wieder und geben den Inhalt von <b>strXML <\/b>als Funktionsergebnis zur&uuml;ck.<\/p>\n<p>Nun ben&ouml;tigen wir noch die Prozedur, die beim Anklicken der neuen Ribbon-Schaltfl&auml;che ausgel&ouml;st werden soll. Diese definieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     Select Case control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnCreateQueryInSQLView\"\r\n             objAccess.RunCommand acCmdNewObjectDesignQuery\r\n             objAccess.RunCommand acCmdSQLView\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir rufen also einfach nur die eingangs bereits vorgestellten Anweisungen auf und sorgen so daf&uuml;r, dass eine neue Abfrage in der SQL-Ansicht angezeigt wird.<\/p>\n<h2>M&ouml;gliche Erweiterungen<\/h2>\n<p>Damit haben wir bereits eine sehr spannende Funktion implementiert, mit welcher der Benutzer schnell eine neue Abfrage in der SQL-Ansicht erstellen kann. Wenn wir schon einmal dabei sind &#8211; gibt es nicht noch sinnvolle Erweiterungen?<\/p>\n<p>Aber nat&uuml;rlich! Wir k&ouml;nnen beispielsweise die folgenden Funktionen hinzuf&uuml;gen:<\/p>\n<ul>\n<li>Eine Schaltfl&auml;che, mit der wir eine neue Abfrage auf Basis der im Navigationsbereich aktuell markierten Tabelle erstellen, mit der wir &uuml;ber <b>SELECT * <\/b>alle Felder der Tabelle erfassen.<\/li>\n<li>Eine Schaltfl&auml;che, mit der wir eine neue Abfrage auf Basis der im Navigationsbereich aktuell markierten Tabelle erstellen, die eine <b>SELECT<\/b>-Anweisung mit Feldliste enth&auml;lt, zum Beispiel <b>SELECT ID, Vorname, Nachname FROM tblPersonen<\/b>.<\/li>\n<li>Beide Schaltfl&auml;chen so erweitern, dass diese auch mit Abfragen funktionieren.<\/li>\n<\/ul>\n<p>Wie wollen wir die beiden zus&auml;tzlichen Schaltfl&auml;chen im Ribbon organisieren? Wir k&ouml;nnten diese einfach wie in Bild 9 nebeneinander abbilden. Aber ehrlich gesagt ist die Funktion nun doch nicht so wichtig, dass die dazu notwendigen Schaltfl&auml;chen so viel Platz einnehmen m&uuml;ssen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_00).png\" alt=\"Erste Idee: Alle Buttons nebeneinander\" width=\"649,559\" height=\"254,1021\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erste Idee: Alle Buttons nebeneinander<\/span><\/b><\/p>\n<p>Also w&auml;hlen wir eine Alternative, bei welcher die Hauptfunktion &#8211; das Erstellen einer neuen Abfrage in der SQL-Ansicht &#8211; immer sichtbar ist und die weiteren Funktionen aufgeklappt werden k&ouml;nnen. Dies realisieren wir mithilfe eines <b>splitButton<\/b>-Elements.<\/p>\n<p>Das Ergebnis finden Sie in Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_009.png\" alt=\"Zweite Idee: Weitere Befehle zum Ausklappen\" width=\"549,559\" height=\"283,0272\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Zweite Idee: Weitere Befehle zum Ausklappen<\/span><\/b><\/p>\n<p>Die Definition des XML-Dokuments zur Anpassung des Ribbons &auml;ndern wir f&uuml;r das <b>group<\/b>-Element <b>grpGroupCreateClientQuery<\/b> wie in Listing 4. Hier sehen wir das <b>group<\/b>-Element, unter dem wir &#8211; im Listing nicht zu erkennen &#8211; zun&auml;chst die beiden nachgebauten Schaltfl&auml;chen einf&uuml;gen.<\/p>\n<pre>strXML &= \"        &lt;group id=\"\"grpGroupCreateClientQuery\"\" insertAfterMso=\"\"GroupCreateClientQuery\"\" \" _\r\n     & \"label=\"\"Abfragen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n...\r\nstrXML &= \"          &lt;splitButton id=\"\"spb\"\" size=\"\"large\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"              &lt;button id=\"\"btnCreateQueryInSQLView\"\" imageMso=\"\"ViewsAdpDiagramSqlView\"\" \" _\r\n     & \"label=\"\"SQL-Ansicht\"\" onAction=\"\"onAction\"\" screentip=\"\"SQL-Ansicht\"\" supertip=\"\"Erstellen Sie eine neue \" _\r\n     & \"Abfrage, die direkt in der SQL-Ansicht ge&ouml;ffnet wird. Sie k&ouml;nnen dann direkt SQL-Code eintippen.\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"              &lt;menu id=\"\"mnu\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"                  &lt;button id=\"\"btnCreateQueryInSQLViewStar\"\" imageMso=\"\"ViewsAdpDiagramSqlView\"\" \" _\r\n     & \"label=\"\"SQL-Ansicht (*)\"\" onAction=\"\"onAction\"\" screentip=\"\"SQL-Ansicht (*)\"\" supertip=\"\"Erstellen Sie eine \" _\r\n     & \"neue Abfrage, die alle Felder der aktuell markierten Tabelle oder Abfrage mit SELECT * ausgibt.\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"                  &lt;button id=\"\"btnCreateQueryInSQLViewList\"\" imageMso=\"\"ViewsAdpDiagramSqlView\"\" \" _\r\n     & \"label=\"\"SQL-Ansicht (Feldliste)\"\" onAction=\"\"onAction\"\" screentip=\"\"SQL-Ansicht (Feldliste)\"\" \" _\r\n     & \"supertip=\"\"Erstellen Sie eine neue Abfrage, die alle Felder der aktuell markierten Tabelle oder Abfrage \" _\r\n     & \"als Feldliste ausgibt.\"\" \/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"              &lt;\/menu&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"          &lt;\/splitButton&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML &= \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Erweiterung des Ribbons um das splitButton-Element<\/span><\/b><\/p>\n<p>Dann folgt das <b>splitButton<\/b>-Element, das immer aus einem <b>button<\/b>&#8211; und einem <b>menu<\/b>-Element mit den &uuml;brigen Steuerelementen besteht. Das erste <b>button<\/b>-Element definieren wir wie im vorherigen Beispiel, mit der Ausnahme, dass wir das hier nicht zul&auml;ssige Attribut <b>size <\/b>entfernen.<\/p>\n<p>Darunter folgt das <b>menu<\/b>-Element, dem wir die &uuml;brigen beiden <b>button<\/b>-Elemente unterordnen.<\/p>\n<h2>Erweitern der Prozedur onAction<\/h2>\n<p>Die <b>onAction<\/b>-Prozedur erweitern wir nun erstens um die Unterscheidung des <b>button<\/b>-Elements, welches das <b>onAction<\/b>-Ereignis ausl&ouml;st (siehe Listing 5). Dazu nutzen wir eine <b>Select Case<\/b>-Anweisung mit dem zu untersuchenden Ausdruck <b>control.Id<\/b>, welcher den Namen des aufrufenden Steuerelements liefert. Im Falle von <b>btnCreateQueryInSQLView <\/b>f&uuml;hren wir im ersten <b>Case<\/b>-Zweig die bereits bekannten Anweisungen aus.<\/p>\n<pre>    <span style=\"color:blue;\">Public <\/span>Sub OnAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n         <span style=\"color:blue;\">Dim <\/span>strObject<span style=\"color:blue;\"> As String<\/span>\r\n         <span style=\"color:blue;\">Dim <\/span>lngType<span style=\"color:blue;\"> As Long<\/span>\r\n         <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database, 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, fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n         <span style=\"color:blue;\">Dim <\/span>strFields<span style=\"color:blue;\"> As String<\/span>, strSQL<span style=\"color:blue;\"> As String<\/span>\r\n         Select Case control.Id\r\n             <span style=\"color:blue;\">Case <\/span>\"btnCreateQueryInSQLView\"\r\n                 objAccess.RunCommand acCmdNewObjectDesignQuery\r\n                 objAccess.RunCommand acCmdSQLView\r\n             <span style=\"color:blue;\">Case <\/span>\"btnCreateQueryInSQLViewStar\"\r\n                 lngType = objAccess.CurrentObjectType\r\n                 strObject = objAccess.CurrentObjectName\r\n                 Select Case lngType\r\n                     <span style=\"color:blue;\">Case <\/span>0, 1 ''Table, Query\r\n                         strSQL = \"SELECT * FROM [\" & strObject & \"];\"\r\n                         CreateSQLQuery strSQL\r\n                     <span style=\"color:blue;\">Case Else<\/span>\r\n                         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte markieren Sie eine Tabelle oder Abfrage.\", vbExclamation + vbOKOnly, _\r\n                            \"Ung&uuml;ltiges Objekt gew&auml;hlt\"\r\n                 <span style=\"color:blue;\">End Select<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>\"btnCreateQueryInSQLViewList\"\r\n                 lngType = objAccess.CurrentObjectType\r\n                 strObject = objAccess.CurrentObjectName\r\n                 <span style=\"color:blue;\">Set<\/span> db = objAccess.CurrentDb\r\n                 Select Case lngType\r\n                     <span style=\"color:blue;\">Case <\/span>0 ''Table\r\n                         <span style=\"color:blue;\">Set<\/span> tdf = db.TableDefs(strObject)\r\n                         For Each fld In tdf.Fields\r\n                             strFields = strFields & \", [\" & fld.Name & \"]\"\r\n                         <span style=\"color:blue;\">Next<\/span>\r\n                         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFields) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                             strFields = <span style=\"color:blue;\">Mid<\/span>(strFields, 2)\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                         strSQL = \"SELECT \" & strFields & \" FROM \" & strObject & \";\"\r\n                         CreateSQLQuery strSQL\r\n                     <span style=\"color:blue;\">Case <\/span>1 ''Query\r\n                         <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(strObject)\r\n                         strSQL = qdf.SQL\r\n                         CreateSQLQuery strSQL\r\n                     <span style=\"color:blue;\">Case Else<\/span>\r\n                         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte markieren Sie eine Tabelle oder Abfrage.\", vbExclamation + vbOKOnly, _\r\n                             \"Ung&uuml;ltiges Objekt gew&auml;hlt\"\r\n                     <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     End Sub<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die neue onAction-Prozedur<\/span><\/b><\/p>\n<h2>Erstellen einer SELECT *-Abfrage<\/h2>\n<p>Im Falle von <b>btnCreateQueryInSQLViewStar <\/b>ermitteln wir mit der Funktion <b>objAccess.CurrentObjectType <\/b>den Typ des aktuell im Navigationsbereich markierten Elements. Nur wenn es sich dabei um eine Tabelle (<b>0<\/b>) oder Abfrage (<b>1<\/b>) handelt, wird der erste Zweig der n&auml;chsten <b>Select Case<\/b>-Bedingung angesteuert.<\/p>\n<p>In diesem Fall stellt die Prozedur in der Variablen <b>strSQL <\/b>einen Ausdruck zusammen, der aus <b>SELECT * FROM <\/b>und dem Namen der Tabelle oder Abfrage besteht und ruft dann eine weitere Prozedur namens <b>CreateSQLQuery <\/b>auf.<\/p>\n<p>Falls der Objekttyp aus der Variablen <b>lngType <\/b>nicht <b>0 <\/b>oder <b>1 <\/b>lautet, zeigt die Prozedur eine Meldung an, die den Benutzer darauf hinweist, dass dieser eine Tabelle oder Abfrage markieren muss (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_010.png\" alt=\"Meldung, wenn der Benutzer eine Abfrage auf Basis einer Tabelle oder Abfrage erstellen will, aber einen anderen Objekttyp markiert hat.\" width=\"424,5589\" height=\"196,7468\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Meldung, wenn der Benutzer eine Abfrage auf Basis einer Tabelle oder Abfrage erstellen will, aber einen anderen Objekttyp markiert hat.<\/span><\/b><\/p>\n<h2>Erstellen einer SELECT [Feldliste]-Abfrage<\/h2>\n<p>Wollen wir nicht das Sternchen (*) verwenden, sondern hinter <b>SELECT <\/b>die Liste der Felder der Abfrage angeben, landen wir in der Prozedur im dritten <b>Case<\/b>-Zweig der &auml;u&szlig;eren <b>SELECT Case<\/b>-Bedingung.<\/p>\n<p>Hier erfassen wir mit den beiden Variablen <b>lngType <\/b>und <b>strObject <\/b>wieder Typ und Name des aktuell markierten Objekts. Wir erstellen in der Variablen <b>db <\/b>mit <b>objAccess.CurrentDb <\/b>einen Verweis auf das <b>Database<\/b>-Objekt der aktuellen Datenbank. Dann untersuchen wir wieder den Wert von <b>lngType<\/b>. Diesmal unterscheiden wir die beiden Werte <b>0 <\/b>(Tabelle) und <b>1 <\/b>(Abfrage) in jeweils einem eigenen <b>Case<\/b>-Zweig.<\/p>\n<p>Im Falle der Tabelle referenzieren wir die Definition der Tabelle &uuml;ber die <b>TableDef<\/b>-Variable <b>tdf<\/b> und f&uuml;llen diese mit <b>db.TableDefs(strObject)<\/b>. Dann durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Elemente der <b>Fields<\/b>-Auflistung des <b>TableDef<\/b>-Objekts. Darin f&uuml;gen wir alle Feldnamen zu einer durch Kommata getrennten Liste zusammen. Wir entfernen dann das erste Komma und f&uuml;gen die Liste mit den &uuml;brigen SQL-Schl&uuml;sselw&ouml;rtern zu einem Ausdruck wie dem folgenden zusammen:<\/p>\n<pre>SELECT ID, Vorname, Nachname FROM tblPersonen<\/pre>\n<p>Schlie&szlig;lich rufen wir auch von hier aus wieder die Prozedur <b>CreateSQLQuery <\/b>auf und &uuml;bergeben dieser den SQL-String aus <b>strSQL<\/b>.<\/p>\n<p>Danach folgt die gleiche Vorgehensweise f&uuml;r den Objekttyp <b>1 <\/b>(<b>Abfrage<\/b>). Hier k&ouml;nnen wir allerdings etwas abk&uuml;rzen beziehungsweise pr&auml;zisieren: Wir &uuml;bernehmen n&auml;mlich den genauen SQL-Code der eigentlichen Abfrage in unsere neue Abfrage. Deshalb deklarieren wir ein <b>QueryDef<\/b>-Objekt, das wir mit den entsprechenden Elementen der <b>QueryDefs<\/b>-Auflistung f&uuml;llen. Aus diesem k&ouml;nnen wir anschlie&szlig;end &uuml;ber die SQL-Eigenschaft direkt den SQL-Code entnehmen und in <b>strSQL <\/b>schreiben, bevor wir dieses an <b>CreateSQLQuery <\/b>&uuml;bergeben.<\/p>\n<p>Hat der Benutzer ein anderes Objekt als eine Tabelle oder Abfrage markiert, erscheint wieder die bereits oben vorgestellte Meldung.<\/p>\n<h2>Erstellen einer neuen SQL-Abfrage mit einem vorhandenen SQL-Code<\/h2>\n<p>Nun haben wir in allen F&auml;llen den SQL-Code, der in der neuen Abfrage angezeigt werden soll, in der Variablen <b>strSQL <\/b>zusammengefasst. Allerdings wissen wir noch nicht, wie wir den Inhalt in die neue Abfrage einf&uuml;gen k&ouml;nnen. Dazu schauen wir uns die Prozedur <b>CreateSQLQuery<\/b> aus Listing 6 an.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CreateSQLQuery(strSQL<span style=\"color:blue;\"> As String<\/span>)\r\n     objAccess.RunCommand acCmdNewObjectDesignQuery\r\n     objAccess.RunCommand acCmdSQLView\r\n     Inzwischenablage strSQL\r\n     objAccess.RunCommand acCmdPaste\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Prozedur CreateSQLQuery<\/span><\/b><\/p>\n<p>Die ersten beiden Befehle kennen wir bereits &#8211; damit erstellen wir die neue Abfrage, die zun&auml;chst in der Entwurfsansicht erscheint, und stellen die Ansicht auf die SQL-Ansicht ein. Danach nutzen wir eine Hilfsfunktion namens <b>InZwischenablage<\/b>, die wir im Modul <b>Clipboard <\/b>des Beispielprojekts abgelegt haben, um den Inhalt von <b>strSQL<\/b> in die Zwischenablage zu bef&ouml;rdern.<\/p>\n<p>Nun k&ouml;nnen wir ausnutzen, dass nach dem Wechsel der Abfrage in die SQL-Ansicht der komplette SQL-Ausdruck markiert ist und die Abfrage den Fokus hat.<\/p>\n<p>Wir brauchen also einfach nur den Inhalt der Zwischenablage an der Stelle der Einf&uuml;gemarke einzuf&uuml;gen, was wir mit dem letzten Befehl der Prozedur <b>CreateSQLQuery <\/b>erledigen &#8211; <b>objAccess.RunCommand acCmdPaste<\/b>.<\/p>\n<p>Damit ist unsere L&ouml;sung vollst&auml;ndig und wir k&ouml;nnen auch komplette Tabellen oder Abfragen als SQL-Ausdruck in eine neue Abfrage in der SQL-Ansicht einf&uuml;gen (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_01\/pic_1483_011.png\" alt=\"Erstellen einer neuen Abfrage auf Basis einer Tabelle\" width=\"549,559\" height=\"291,9771\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Erstellen einer neuen Abfrage auf Basis einer Tabelle<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir uns nur noch ansehen, wie wir das COM-Add-In auf die gew&uuml;nschten Rechner bekommen.<\/p>\n<h2>COM-Add-In auf die Schnelle installieren<\/h2>\n<p>Um das COM-Add-In auf einem anderen Rechner zu installieren, sind nur wenige Schritte erforderlich:<\/p>\n<ul>\n<li>Auffinden der Datei <b>amvSQLView_win32.dll<\/b>. Diese Datei wird in der Regel in einem Unterverzeichnis namens <b>Build <\/b>erstellt, das twinBASIC im gleichen Ordner anlegt, in der sich auch die <b>.twinproj<\/b>-Datei befindet.<\/li>\n<li>Diese Datei kopieren Sie auf den gew&uuml;nschten Zielrechner. Welches Verzeichnis sie dazu w&auml;hlen, bleibt Ihnen &uuml;berlassen &#8211; Sie k&ouml;nnen beispielsweise das Verzeichnis w&auml;hlen, in dem &uuml;blicherweise Access-Add-Ins gespeichert werden (in der Regel <b>C:\\Users\\[Benutzername]\\AppData\\Roaming\\Microsoft\\AddIns<\/b>) oder auch ein Unterverzeichnis in <b>Programme (x86)<\/b>.<\/li>\n<li>Dann &ouml;ffnen Sie Access, &ouml;ffnen eine beliebige Datenbankdatei, klicken auf <b>Datei|Optionen<\/b>, w&auml;hlen hier den Bereich <b>Add-Ins <\/b>aus und klicken unten neben <b>Verwalten: COM-Add-Ins <\/b>auf <b>Los&#8230; <\/b>&#8211; dies &ouml;ffnet den Dialog <b>COM-Add-Ins<\/b>.<\/li>\n<li>Hier klicken Sie auf <b>Hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen im n&auml;chsten Dialog die soeben auf dem Rechner hinterlegte DLL-Datei aus. Hier wird sogar der oben erw&auml;hnte Add-In-Ordner vorgeschlagen &#8211; Microsoft scheint diesen also mehr oder weniger auch f&uuml;r diesen Zweck vorzusehen und nicht nur f&uuml;r Access-Add-Ins.<\/li>\n<li>Nach dem Ausw&auml;hlen der Datei wird die enthaltene Funktion <b>DLLRegisterServer <\/b>aufgerufen, welche die notwendigen Eintragungen in der Registry vornimmt.<\/li>\n<li>Danach ist das COM-Add-In verf&uuml;gbar, wie ein Blick in das Tab <b>Erstellen <\/b>zeigt.<\/li>\n<\/ul>\n<p>Diese M&ouml;glichkeit ist auf jeden Fall einfacher, als die Registrierung &uuml;ber die Eingabeaufforderung durchzuf&uuml;hren. Wenn man ein solches COM-Add-In schnell und professionell verteilen will, ohne dass der Benutzer in die Access-Optionen abtauchen soll, kann man auch ein Setup-Skript erstellen. Ein beispielhaftes Setup f&uuml;r COM-Add-Ins beschreiben wir am Beispiel der vorliegenden L&ouml;sung im Beitrag <b>Setup f&uuml;r COM-Add-Ins mit Inno Setup <\/b>(<b>www.access-im-unternehmen.de\/1484<\/b>).<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In dem Beitrag ging es um den Einbau neuer Befehle zur direkten Anzeige frisch erstellter Abfragen in der SQL-Ansicht von Access. Dabei zeigen wir, wie man leere Abfragen erstellt oder Abfragen auf Basis von bestehenden Tabellen oder Abfragen mit <b>SELECT * <\/b>oder <b>SELECT [Feldliste] <\/b>anlegt und in der SQL-Ansicht anzeigt. <\/p>\n<p>Die M&ouml;glichkeit, diese Funktion &uuml;ber das Ribbon aufzurufen, wird ebenfalls behandelt. Dazu wird ein COM-Add-In erstellt, das die Funktion dauerhaft in der Benutzeroberfl&auml;che verankert. Au&szlig;erdem haben wir die notwendigen Schritte zur Erstellung und Registrierung des Add-Ins erl&auml;utert.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvSQLView.twinproj<\/p>\n<p>amvSQLView_win32.dll<\/p>\n<p>amvSQLView_win64.dll<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/3874017E-29B0-419C-A784-B92645FC4F40\/aiu_1483.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft hat neuerdings einen Befehl zum direkten Anzeigen von Abfragen in der SQL-Ansicht. Damit k&ouml;nnen wir eine Abfrage direkt in der SQL-Ansicht &ouml;ffnen statt den Umweg &uuml;ber den Abfrageentwurf zu w&auml;hlen. Leider hat Microsoft keine entsprechende Funktion f&uuml;r das Erstellen von Abfragen hinzugef&uuml;gt &#8211; also eine Schaltfl&auml;che im Ribbon, mit der wir eine neue SQL-Abfrage direkt in der SQL-Ansicht &ouml;ffnen k&ouml;nnen. Das ist allerdings gar nicht schlimm, denn wir r&uuml;sten diese Funktion einfach selbst nach. Zun&auml;chst schauen wir uns an, welche Befehle dazu notwendig sind, danach erstellen wir ein COM-Add-In, das die Funktion in der Benutzeroberfl&auml;che verankert &#8211; gleich neben den Schaltfl&auml;chen f&uuml;r den Abfrageassistenten und das Anlegen von neuen Abfragen &uuml;ber die Entwurfsansicht.<\/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,44000029],"tags":[],"class_list":["post-55001483","post","type-post","status-publish","format-standard","hentry","category-66012024","category-662024","category-Abfragetechnik_und_SQL"],"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>Abfragen direkt in der SQL-Ansicht erstellen - 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\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abfragen direkt in der SQL-Ansicht erstellen\" \/>\n<meta property=\"og:description\" content=\"Microsoft hat neuerdings einen Befehl zum direkten Anzeigen von Abfragen in der SQL-Ansicht. Damit k&ouml;nnen wir eine Abfrage direkt in der SQL-Ansicht &ouml;ffnen statt den Umweg &uuml;ber den Abfrageentwurf zu w&auml;hlen. Leider hat Microsoft keine entsprechende Funktion f&uuml;r das Erstellen von Abfragen hinzugef&uuml;gt - also eine Schaltfl&auml;che im Ribbon, mit der wir eine neue SQL-Abfrage direkt in der SQL-Ansicht &ouml;ffnen k&ouml;nnen. Das ist allerdings gar nicht schlimm, denn wir r&uuml;sten diese Funktion einfach selbst nach. Zun&auml;chst schauen wir uns an, welche Befehle dazu notwendig sind, danach erstellen wir ein COM-Add-In, das die Funktion in der Benutzeroberfl&auml;che verankert - gleich neben den Schaltfl&auml;chen f&uuml;r den Abfrageassistenten und das Anlegen von neuen Abfragen &uuml;ber die Entwurfsansicht.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-02T20:00:06+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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Abfragen direkt in der SQL-Ansicht erstellen\",\"datePublished\":\"2024-02-02T20:00:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/\"},\"wordCount\":3362,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/687ff8df67294899aed1b1960e1660af\",\"articleSection\":[\"1\\\/2024\",\"2024\",\"Abfragetechnik und SQL\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/\",\"name\":\"Abfragen direkt in der SQL-Ansicht erstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/687ff8df67294899aed1b1960e1660af\",\"datePublished\":\"2024-02-02T20:00:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/687ff8df67294899aed1b1960e1660af\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/687ff8df67294899aed1b1960e1660af\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Abfragen direkt in der SQL-Ansicht erstellen\"}]},{\"@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":"Abfragen direkt in der SQL-Ansicht erstellen - 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\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Abfragen direkt in der SQL-Ansicht erstellen","og_description":"Microsoft hat neuerdings einen Befehl zum direkten Anzeigen von Abfragen in der SQL-Ansicht. Damit k&ouml;nnen wir eine Abfrage direkt in der SQL-Ansicht &ouml;ffnen statt den Umweg &uuml;ber den Abfrageentwurf zu w&auml;hlen. Leider hat Microsoft keine entsprechende Funktion f&uuml;r das Erstellen von Abfragen hinzugef&uuml;gt - also eine Schaltfl&auml;che im Ribbon, mit der wir eine neue SQL-Abfrage direkt in der SQL-Ansicht &ouml;ffnen k&ouml;nnen. Das ist allerdings gar nicht schlimm, denn wir r&uuml;sten diese Funktion einfach selbst nach. Zun&auml;chst schauen wir uns an, welche Befehle dazu notwendig sind, danach erstellen wir ein COM-Add-In, das die Funktion in der Benutzeroberfl&auml;che verankert - gleich neben den Schaltfl&auml;chen f&uuml;r den Abfrageassistenten und das Anlegen von neuen Abfragen &uuml;ber die Entwurfsansicht.","og_url":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-02-02T20:00:06+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Abfragen direkt in der SQL-Ansicht erstellen","datePublished":"2024-02-02T20:00:06+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/"},"wordCount":3362,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/687ff8df67294899aed1b1960e1660af","articleSection":["1\/2024","2024","Abfragetechnik und SQL"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/","url":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/","name":"Abfragen direkt in der SQL-Ansicht erstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/687ff8df67294899aed1b1960e1660af","datePublished":"2024-02-02T20:00:06+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/687ff8df67294899aed1b1960e1660af","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/687ff8df67294899aed1b1960e1660af"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Abfragen_direkt_in_der_SQLAnsicht_erstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Abfragen direkt in der SQL-Ansicht erstellen"}]},{"@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\/55001483","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=55001483"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001483\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}