{"id":55000989,"date":"2015-08-01T00:00:00","date_gmt":"2020-05-22T19:21:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=989"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"TSQL_per_Formular","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/","title":{"rendered":"T-SQL per Formular"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer Access-Frontends mit einem SQL Server-Backend entwickelt, wird fr&uuml;her oder sp&auml;ter nicht immer zum SQL Server Management Studio wechseln wollen, um mal eben eine Abfrage auf die Daten der SQL Server-Datenbank abzusetzen. Viel sch&ouml;ner w&auml;re es doch, wenn man dies direkt vom Access-Fenster aus erledigen k&ouml;nnte! Kein Problem: Da wir in den vorherigen Ausgaben ohnehin schon Add-Ins f&uuml;r den Einsatz mit dem SQL Server vorgestellt haben, machen wir hier gleich weiter.<\/b><\/p>\n<p>In den Beitr&auml;gen <b>RDBMS-Tools: Verbindungen verwalten <\/b>(<b>www.access-im-unternehmen.de\/976<\/b>), <b>RDBMS-Tools: Tabellen verkn&uuml;pfen <\/b>(<b>www.access-im-unternehmen.de\/977<\/b>) und <b>RDBMS-Tools als Add-In nutzen <\/b>(<b>www.access-im-unternehmen.de\/978<\/b>) haben wir bereits zwei kleine Tools vorgestellt und als Add-In aufbereitet.<\/p>\n<p>Diese Add-In-Datei namens <b>RDBMSTools.mda <\/b>bauen wir jetzt weiter aus, indem wir ein Formular hinzuf&uuml;gen, mit dem Sie direkt Abfragen an die Datenbank eines SQL Servers absetzen k&ouml;nnen.<\/p>\n<p>Dieses Formular sieht wie in Bild 1 aus und soll ebenfalls &uuml;ber einen Befehl des Add-In-Men&uuml;s verf&uuml;gbar sein.<\/p>\n<p class=\"image\"><img loading=\"lazy\" decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_001.png\" alt=\"Formular zur direkten Eingabe von SQL-Anweisungen gegen ein SQL Server-Backend\" width=\"650\" height=\"468\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular zur direkten Eingabe von SQL-Anweisungen gegen ein SQL Server-Backend<\/span><\/b><\/p>\n<p>Das Formular soll zun&auml;chst &uuml;ber das obere Kombinationsfeld die Auswahl einer Verbindung erm&ouml;glichen. Diese haben wir nat&uuml;rlich zuvor mit einem der anderen beiden Add-Ins hergestellt, n&auml;mlich mit dem aus dem Beitrag <b>RDBMS-Tools: Verbindungen verwalten<\/b>.<\/p>\n<p>Das Kombinationsfeld zeigt also, soweit bereits eingegeben, die vorhandenen Verbindungen an. Alternativ klicken Sie auf die Schaltfl&auml;che rechts vom Kombinationsfeld und &ouml;ffnen so den Dialog aus Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_002.png\" alt=\"Verwalten der zu verwendenden Verbindungszeichenfolge\" width=\"650\" height=\"491,7007\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Verwalten der zu verwendenden Verbindungszeichenfolge<\/span><\/b><\/p>\n<p>Nach dem Ausw&auml;hlen der Verbindungszeichenfolge k&ouml;nnen Sie dann gleich mit der Eingabe von SQL-Anweisungen loslegen. Diese tragen Sie einfach in das gro&szlig;e Textfeld direkt unter der Verbindungsauswahl ein. Dabei k&ouml;nnen Sie dort eine oder mehrere SQL-Anweisungen unterbringen.  <\/p>\n<p>Der Clou ist: Wenn Sie mehrere Anweisungen unterbringen, werden diese auch nacheinander abgearbeitet. Manchmal m&ouml;chten Sie aber vielleicht ein paar Anweisungen eingeben und diese nacheinander ausf&uuml;hren.<\/p>\n<p>Dann k&ouml;nnen Sie die jeweils auszuf&uuml;hrende Anweisung einfach markieren und diese dann durch Bet&auml;tigen der Schaltfl&auml;che <b>Ausf&uuml;hren <\/b>oder der Taste <b>F5 <\/b>starten.<\/p>\n<p>Damit Sie wissen, welche Anweisungen aktuell f&uuml;r die Ausf&uuml;hrung vorgesehen sind, zeigt das Formular diese Zeilen unter dem Eingabefeld f&uuml;r die SQL-Anweisungen an. Wenn Sie also nur eine einzige Zeile wie in Bild 3 markieren, dann wird auch nur diese angezeigt &#8211; und durch <b>F5 <\/b>oder <b>Ausf&uuml;hren<\/b> auch ausgef&uuml;hrt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_003.png\" alt=\"Markieren der auszuf&uuml;hrenden SQL-Anweisung\" width=\"650\" height=\"339,9671\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Markieren der auszuf&uuml;hrenden SQL-Anweisung<\/span><\/b><\/p>\n<p>Fehlt noch das Unterformularsteuerelement im unteren Bereich des Formulars: Dieses zeigt die Ergebnisse der ausgef&uuml;hrten Anweisungen an.<\/p>\n<p>Bei Datensatz&auml;nderungen wie dem L&ouml;schen, &auml;ndern oder Hinzuf&uuml;gen wird hier beispielsweise die Anzahl der betroffenen Datens&auml;tze ausgegeben. Wenn Sie eine <b>SELECT<\/b>-Abfrage ausf&uuml;hren, liefert das Unterformular bis zu zehn Felder des Abfrageergebnisses.<\/p>\n<p>Sie k&ouml;nnen also die folgenden Abfragetypen mit dem hier vorgestellten Formular ausf&uuml;hren:<\/p>\n<ul>\n<li>Auswahlabfragen (<b>SELECT<\/b>)<\/li>\n<li>Aktualisierungsabfragen (<b>INSERT INTO<\/b>, <b>SELECT INTO<\/b>, <b>UPDATE<\/b>, <b>DELETE<\/b>)<\/li>\n<li>Datendefinitionsabfragen (<b>CREATE TABLE <\/b>et cetera)<\/li>\n<\/ul>\n<p>Das Unterformular liefert sogar eine entsprechende Fehlermeldung, wenn Sie eine ung&uuml;ltige SQL-Abfrage absetzen (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_004.png\" alt=\"Ausgabe von Fehlermeldungen\" width=\"650\" height=\"448,7672\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe von Fehlermeldungen<\/span><\/b><\/p>\n<p>Und noch ein wichtiges Feature: M&ouml;glicherweise ben&ouml;tigen Sie die eine oder andere SQL-Anweisung im Laufe der Entwicklung der Anwendung mehrmals. Die eingegebenen Daten samt Bezeichnung, Verbindungszeichenfolge und SQL-Befehlen werden in einer Tabelle gespeichert, sodass Sie durch Bl&auml;ttern durch die Datens&auml;tze die verschiedenen SQL-Befehle ansteuern k&ouml;nnen.<\/p>\n<h2>Formular erstellen<\/h2>\n<p>Das Formular sieht in der Entwurfsansicht wie in Bild 5 aus. Da die eingegebenen SQL-Befehle gespeichert und bei Bedarf wieder aufrufbar sein sollen, binden wir das Formular an die Tabelle <b>tblSQLBefehle <\/b>als Datenherkunft. Das Feld <b>SQLBefehl <\/b>soll dabei als Memofeld ausgelegt sein, da eine SQL-Anweisung leicht einmal mehr als 255 Zeichen umfasst. <b>VerbindungID <\/b>ist ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblVerbindungszeichenfolgen <\/b>und <b>Bezeichnung <\/b>ein einfaches Textfeld.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_005.png\" alt=\"Entwurf des Formulars frmSQLBefehle\" width=\"500\" height=\"540,039\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf des Formulars frmSQLBefehle<\/span><\/b><\/p>\n<p>Diese Tabelle finden Sie in der Entwurfsansicht in Bild 6. Die Felder der Tabelle werden &#8211; mit Ausnahme des Prim&auml;rschl&uuml;sselfeldes &#8211; im oberen Teil des Formulars <b>frmSQLBefehle <\/b>angezeigt. Das Feld <b>VerbindungID<\/b> f&uuml;hren wir dabei als Kombinationsfeld aus, damit Sie damit leicht die Eintr&auml;ge der Tabelle <b>tblVerbindungszeichenfolgen <\/b>ausw&auml;hlen k&ouml;nnen. Rechts neben dem Kombinationsfeld finden Sie eine Schaltfl&auml;che namens <b>cmdVerbindungenBearbeiten<\/b>, mit der Sie das bereits im Beitrag <b>RDBMS-Tools: Verbindungen verwalten <\/b>beschriebene Formular &ouml;ffnen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_006.png\" alt=\"Entwurf der Tabelle zum Speichern der SQL-Befehle\" width=\"650\" height=\"423,8304\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf der Tabelle zum Speichern der SQL-Befehle<\/span><\/b><\/p>\n<p>Dieses zeigt dann direkt die aktuell im Kombinationsfeld ausgew&auml;hlte Verbindung an. Das Kombinationsfeld <b>cboVerbindung <\/b>erh&auml;lt also die folgende Abfrage als Datensatzherkunft:<\/p>\n<pre>SELECT VerbindungszeichenfolgeID, Bezeichnung \r\nFROM tblVerbindungszeichenfolgen;<\/pre>\n<p>Damit die Schaltfl&auml;che <b>cmdVerbindungenBearbeiten<\/b> auf Knopfdruck das Formular <b>frmVerbindungszeichenfolgen <\/b>&ouml;ffnet, hinterlegen Sie die Ereignisprozedur aus Listing 1 f&uuml;r das Ereignis <b>Beim Klicken<\/b>. Dieses &ouml;ffnet das Formular <b>frmVerbindungszeichenfolgen <\/b>und &uuml;bergibt den Prim&auml;rschl&uuml;sselwert der aktuell im Kombinationsfeld <b>cboVerbindung <\/b>ausgew&auml;hlten Verbindungszeichenfolge per &ouml;ffnungsargument.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVerbindungenBearbeiten_Click()\r\n     DoCmd.OpenForm \"frmVerbindungszeichenfolgen\", OpenArgs:=Nz(Me!cboVerbindung, 0)\r\n     <span style=\"color:blue;\">Set<\/span> frmVerbindungszeichenfolgen = Forms!frmVerbindungszeichenfolgen\r\n     <span style=\"color:blue;\">With<\/span> frmVerbindungszeichenfolgen\r\n         .Modal = <span style=\"color:blue;\">True<\/span>\r\n         .OnUnload = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Formular zum Ausw&auml;hlen der Verbindungszeichenfolge &ouml;ffnen<\/span><\/b><\/p>\n<p>Dann speichert die Prozedur einen Verweis auf das Formular in einer Objektvariablen namens <b>frmVerbindungszeichenfolgen<\/b>, die im Kopf des Klassenmoduls wie folgt deklariert wird:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents frmVerbindungszeichenfolgen<span style=\"color:blue;\"> As <\/span>Form<\/pre>\n<p>Der Hintergrund ist, dass wir im Klassenmodul des aufrufenden Formulars <b>frmSQLBefehle <\/b>eine Ereignisprozedur definieren wollen, die beim Schlie&szlig;en des Formulars <b>frmVerbindungszeichenfolgen <\/b>ausgel&ouml;st wird. Dazu m&uuml;ssen wir die Objektvariable mit dem Schl&uuml;sselwort <b>WithEvents <\/b>auszeichnen. Nun k&ouml;nnen wir per VBA eine Ereignisprozedur f&uuml;r die Ereigniseigenschaft <b>Beim Entladen <\/b>angeben (<b>OnUnload = [Event Procedure]<\/b>).<\/p>\n<p>Damit brauchen wir nun nur noch die folgende Ereignisprozedur im Klassenmodul des Formulars <b>frmSQLBefehle<\/b> zu hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>frmVerbindungszeichenfolgen_Unload(Cancel _\r\n        <span style=\"color:blue;\"> As Integer<\/span>)\r\n     Me!cboVerbindung.Requery\r\n     Me!cboVerbindung = _\r\n         frmVerbindungszeichenfolgen!VerbindungszeichenfolgeID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit rufen wir nun das Formular <b>frmVerbindungszeichenfolgen <\/b>auf und k&ouml;nnen im Formular <b>frmSQLBefehle <\/b>auf das <b>Beim Schlie&szlig;en<\/b>-Ereignis von <b>frmVerbindungszeichenfolgen <\/b>reagieren.<\/p>\n<p>Dort aktualisieren wir den Inhalt von <b>cboVerbindung <\/b>(falls im Formular <b>frmVerbindungszeichenfolgen <\/b>neue Verbindungszeichenfolgen hinzugef&uuml;gt oder welche gel&ouml;scht wurden) und stellen das Kombinationsfeld <b>cboVerbindung <\/b>auf die zuletzt im Formular <b>frmVerbindungszeichenfolgen <\/b>gew&auml;hlte Verbindungszeichenfolge ein.<\/p>\n<p>Das Textfeld <b>txtSQL <\/b>ist an das Feld <b>SQLBefehl <\/b>der Tabelle <b>tblSQLBefehle <\/b>gebunden. Damit Sie darin Zeilenumbr&uuml;che einfach mit der Eingabetaste herbeif&uuml;hren k&ouml;nnen, ohne dass der Fokus auf das n&auml;chste Steuerelement verschoben wird, stellen wir die Eigenschaft <b>Eingabetastenverhalten <\/b>auf <b>Neue Zeile im Feld <\/b>ein.<\/p>\n<p>Das Bezeichnungsfeld <b>lblSQL <\/b>soll jeweils den SQL-Ausdruck aus dem Textfeld <b>txtSQL <\/b>anzeigen, der beim Bet&auml;tigen von <b>F5 <\/b>beziehungsweise beim Anklicken der Schaltfl&auml;che <b>cmdAusfuehren <\/b>ausgef&uuml;hrt w&uuml;rde.Das ist normalerweise der komplette SQL-Text, au&szlig;er der Benutzer markiert nur einen Teil des enthaltenen Textes. Dann wird nur dieser Teil in <b>lblSQL <\/b>abgebildet und auch ausgef&uuml;hrt.<\/p>\n<p>Das Formular enth&auml;lt au&szlig;erdem eine Schaltfl&auml;che namens <b>cmdAusfuehren<\/b>, auf deren Funktion wir weiter unten eingehen.<\/p>\n<p>Au&szlig;erdem enth&auml;lt das Formular ein Unterformular-Steuerelement, dessen Eigenschaft <b>Herkunftsobjekt <\/b>wir auf das Formular <b>sfmSQLBefehle <\/b>einstellen.<\/p>\n<p>Dieses Formular enth&auml;lt zehn Textfelder mit den Namen <b>txt01<\/b>, <b>txt02 <\/b>und so weiter (s. Bild 7). Die zehn dazu geh&ouml;renden Bezeichnungsfelder hei&szlig;en entsprechend <b>lbl01<\/b>, <b>lbl02 <\/b>und so weiter. Das Unterformular und die Textfelder sind standardm&auml;&szlig;ig nicht an eine Datenherkunft gebunden. Dies geschieht erst sp&auml;ter, wenn ein Ergebnis einer Abfrage vorliegt oder ein Fehler beim Ausf&uuml;hren einer Abfrage auftritt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_007.png\" alt=\"Entwurf des Unterformulars sfmSQLBefehle\" width=\"500\" height=\"378,6496\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Entwurf des Unterformulars sfmSQLBefehle<\/span><\/b><\/p>\n<p>Die Begrenzung auf zehn Textfelder haben wir nur f&uuml;r diese Beispieldatenbank vorgenommen. Sie sorgt daf&uuml;r, dass das Ergebnis einer Ad-hoc-Abfrage nicht mehr als zehn Felder zur&uuml;ckliefert beziehungsweise anzeigt. Wenn Sie mehr ben&ouml;tigen, legen Sie einfach weitere Textfelder entsprechend der Namenskonvention der vorhandenen Felder an.<\/p>\n<h2>Die Fehlertabelle<\/h2>\n<p>Es wird vorkommen, dass Sie Fehler in die SQL-Anweisungen einbauen. Diese wollen wir dann in einer daf&uuml;r vorgesehenen Tabelle speichern und dann im Unterformular <b>sfmSQLBefehle <\/b>anzeigen. Die Tabelle sieht im Entwurf wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_008.png\" alt=\"Entwurf der Tabelle tblFehler\" width=\"500\" height=\"388,9846\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Entwurf der Tabelle tblFehler<\/span><\/b><\/p>\n<h2>Eingabe des SQL-Ausdrucks<\/h2>\n<p>In dem Moment, in dem Sie ein Zeichen in das Textfeld <b>txtSQL <\/b>eingeben, soll das Formular bereits den Ausdruck im Bezeichnungsfeld <b>lblSQL <\/b>anzeigen, der bei Bet&auml;tigen von <b>F5 <\/b>oder der Schaltfl&auml;che <b>cmdAusfuehren <\/b>ausgef&uuml;hrt wird. Daher muss der Inhalt von <b>lblSQL <\/b>immer auf dem aktuellen Stand gehalten werden. Daf&uuml;r sorgt zun&auml;chst einmal die Ereignisprozedur <b>Bei Maustaste auf<\/b>, die nach der Eingabe eines jeden Zeichens in das Textfeld <b>txtSQL <\/b>ausgel&ouml;st wird, und eine weitere Prozedur namens <b>SQLAusdruckErmitteln <\/b>aufruft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSQL_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     SQLAusdruckErmitteln\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>SQLAusdruckErmitteln<\/b> finden Sie in Listing 2. Sie pr&uuml;ft, ob das Textfeld <b>txtSQL <\/b>eine Markierung enth&auml;lt, das hei&szlig;t, dass der Benutzer einen Bereich einer Zeile oder gar eine oder mehrere Zeilen markiert hat. Dies geschieht mit der Abfrage der Eigenschaft <b>SelLength<\/b>, die dann einen Wert gr&ouml;&szlig;er als <b>0 <\/b>aufweisen m&uuml;sste. Ist dies der Fall, ermittelt die Prozedur den Inhalt der Markierung und tr&auml;gt diesen in die Variable <b>strSQL <\/b>ein, die wie folgt im Kopf des Klassenmoduls deklariert ist:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SQLAusdruckErmitteln()\r\n     <span style=\"color:blue;\">If <\/span>Me!txtSQL.SelLength &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = <span style=\"color:blue;\">Mid<\/span>(Me!txtSQL.Text, Me!txtSQL.SelStart + 1, Me!txtSQL.SelLength)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = Me!txtSQL.Text\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!lblSQL.Caption = strSQL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ermitteln des aktuell markierten SQL-Ausdrucks im Textfeld txtSQL<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Falls keine Markierung vorliegt, landet schlicht der komplette Inhalt von <b>txtSQL <\/b>in der Variablen <b>strSQL<\/b>.<\/p>\n<p>Der Inhalt von <b>strSQL <\/b>wird dann als Beschriftung des Bezeichnungsfeldes <b>lblSQL <\/b>eingetragen.<\/p>\n<h2>Markierten Ausdruck abfragen<\/h2>\n<p>Nun erfassen wir den aktuellen Ausdruck nach der Eingabe eines jeden Zeichens, also auch, wenn der Benutzer bei gedr&uuml;ckter Umschalttaste die Cursor-Tasten verwendet und so einen Bereich markiert. Wie aber registrieren wir es, wenn der Benutzer einen Bereich mit der Maus markiert Auch daf&uuml;r gibt es nat&uuml;rlich eine geeignete Ereignisprozedur, n&auml;mlich <b>Bei Maus nach oben<\/b>. Daf&uuml;r hinterlegen wir die folgende Prozedur, die ebenfalls die Routine <b>SQLAusdruckErmitteln <\/b>aufruft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtSQL_MouseUp(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     SQLAusdruckErmitteln\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>SQL-Abfrage ausf&uuml;hren<\/h2>\n<p>Die offensichtliche M&ouml;glichkeit, die SQL-Abfrage auszuf&uuml;hren, ist das Anklicken der Schaltfl&auml;che <b>cmdAusfuehren<\/b>. Dies l&ouml;st die Ereignisprozedur aus Listing 3 aus. Diese Prozedur pr&uuml;ft zun&auml;chst, ob die Variable <b>strSQL<\/b>, die den aktuell auszuf&uuml;hrenden SQL-Ausdruck speichert, nicht leer ist, und gibt gegebenenfalls eine entsprechende Meldung aus und bricht die Prozedur ab.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAusfuehren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database, qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef, rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSQL) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Bitte markieren Sie den auszuf&uuml;hrenden SQL-Befehl.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     db.QueryDefs.Delete \"qryTemp\"\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(\"qryTemp\")\r\n     <span style=\"color:blue;\">With<\/span> qdf\r\n         .Connect = DLookup(\"Verbindungszeichenfolge\", \"tblVerbindungszeichenfolgen\", \"VerbindungszeichenfolgeID = \" _\r\n             & Me!cboVerbindung)\r\n         .SQL = LeerzeichenEntfernen(strSQL)\r\n         Select Case <span style=\"color:blue;\">Left<\/span>(.SQL, 6)\r\n             <span style=\"color:blue;\">Case <\/span>\"SELECT\"\r\n             <span style=\"color:blue;\">Case <\/span>\"DELETE\": .SQL = \"SET NOCOUNT ON;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS AnzahlGeloescht\"\r\n             <span style=\"color:blue;\">Case <\/span>\"INSERT\": .SQL = \"SET NOCOUNT ON;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS AnzahlEingefuegt\"\r\n             <span style=\"color:blue;\">Case <\/span>\"UPDATE\": .SQL = \"SET NOCOUNT ON;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS AnzahlAktualisiert\"\r\n             <span style=\"color:blue;\">Case <\/span>\"CREATE\": .SQL = \"SET NOCOUNT ON;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS AnzahlAktualisiert\"\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(.SQL, 5) = \"ALTER\"<span style=\"color:blue;\"> Then<\/span>\r\n                     .SQL = \"SET NOCOUNT ON ;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS Aktualisiert\"\r\n                 <span style=\"color:blue;\">Else<\/span>If <span style=\"color:blue;\">Left<\/span>(.SQL, 4) = \"DROP\" Then\r\n                     .SQL = \"SET NOCOUNT ON ;\" & <span style=\"color:blue;\">vbCrLf<\/span> & .SQL & <span style=\"color:blue;\">vbCrLf<\/span> & \"SELECT @@ROWCOUNT AS Aktualisiert\"\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     <span style=\"color:blue;\">MsgBox<\/span> \"Die Anweisung muss mit SELECT, DELETE, INSERT, UPDATE, CREATE, ALTER oder DROP beginnen.\"\r\n                     <span style=\"color:blue;\">Exit Sub<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         .ReturnsRecords = <span style=\"color:blue;\">True<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> rst = .OpenRecordset\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             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n             db.Execute \"DELETE FROM tblFehler\", dbFailOnError\r\n             For i = 0 To DAO.Errors.Count - 1\r\n                 db.Execute \"INSERT INTO tblFehler(FehlerID, Fehler) VALUES(\" & DAO.Errors(i).Number & \", ''\" _\r\n                     & <span style=\"color:blue;\">Replace<\/span>(DAO.Errors(i).Description, \"''\", \"''''\") & \"'')\", dbFailOnError\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> DAO.Errors(i).Source\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n             <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblFehler\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     UnterdatenblattFuellen rst\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ausf&uuml;hren einer SQL-Anweisung<\/span><\/b><\/p>\n<p>Ist <b>strSQL <\/b>nicht leer, wird eine neue tempor&auml;re Abfrage namens <b>qryTemp <\/b>auf Basis der angegebenen SQL-Anweisung erstellt.<\/p>\n<p>Da gegebenenfalls von vorherigen Anwendungen bereits eine gleichnamige Abfrage vorhanden ist, l&ouml;scht die Prozedur diese unter Deaktivierung der Fehlerbehandlung. Anderenfalls w&uuml;rde ein Fehlen der zu l&ouml;schenden Abfrage zu einem Fehler f&uuml;hren.<\/p>\n<p>Die <b>CreateQueryDef<\/b>-Methode legt die Abfrage dann neu an und referenziert sie mit der Objektvariablen <b>qdf<\/b>. Die <b>Connect<\/b>-Eigenschaft f&uuml;llt die Prozedur dann mit der in der Tabelle <b>tblVerbindungszeichenfolgen <\/b>gespeicherten Verbindungszeichenfolge f&uuml;r diese Abfrage.<\/p>\n<p>Ein Aufruf der Funktion <b>LeerzeichenEntfernen <\/b>sorgt daf&uuml;r, dass unn&ouml;tige Leerzeichen und Zeilenumbr&uuml;che aus der SQL-Abfrage entfernt werden. Diese Funktion erwartet die SQL-Abfrage als Parameter und liefert die bereinigte SQL-Anweisung zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>LeerzeichenEntfernen(strSQL<span style=\"color:blue;\"> As String<\/span>) _\r\n        <span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLaengeVorher<span style=\"color:blue;\"> As Integer<\/span>\r\n     strTemp = strSQL\r\n     intLaengeVorher = <span style=\"color:blue;\">Len<\/span>(strTemp) + 1\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Len<\/span>(strTemp) &lt; intLaengeVorher\r\n         intLaengeVorher = <span style=\"color:blue;\">Len<\/span>(strTemp)\r\n         <span style=\"color:blue;\">Mid<\/span>(strTemp, 1, 1) = _\r\n             <span style=\"color:blue;\">Replace<\/span>(<span style=\"color:blue;\">Mid<\/span>(strTemp, 1, 1), Chr(13), \" \")\r\n         <span style=\"color:blue;\">Mid<\/span>(strTemp, 1, 1) = _\r\n             <span style=\"color:blue;\">Replace<\/span>(<span style=\"color:blue;\">Mid<\/span>(strTemp, 1, 1), Chr(10), \" \")\r\n         strTemp = <span style=\"color:blue;\">Trim<\/span>(strTemp)\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     LeerzeichenEntfernen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Nach diesem Schritt pr&uuml;ft <b>cmdAusfuehren_Click<\/b>, um was f&uuml;r eine Art von Abfrage es sich handelt. Die vorliegende Version unterst&uuml;tzt <b>SELECT<\/b>-, <b>DELETE<\/b>-, <b>INSERT<\/b>-, <b>UPDATE<\/b>-, <b>CREATE<\/b>-, <b>DROP<\/b>&#8211; und <b>ALTER<\/b>-Anweisungen. Beim Auffinden des <b>SELECT<\/b>-Schl&uuml;sselwortes geschieht nichts weiter.<\/p>\n<p>Bei den &uuml;brigen Anweisungen stellt die Prozedur ein, dass die Anweisung <b>SELECT @@ROWCOUNT AS Anzahl&#8230; <\/b>an die SQL-Anweisung angeh&auml;ngt wird. Dies sorgt daf&uuml;r, dass bei Aktionsabfragen die Anzahl der betroffenen Datens&auml;tze als Abfrageergebnis zur&uuml;ckgegeben wird. Wird keines dieser Schl&uuml;sselworte verwendet, wird die Prozedur mit einer entsprechenden Meldung beendet.<\/p>\n<p>Die Prozedur stellt die Eigenschaft <b>ReturnRecords <\/b>f&uuml;r die Abfrage auf <b>True <\/b>ein und &ouml;ffnet dann mit der <b>OpenRecordset<\/b>-Methode ein neues Recordset auf Basis dieser Abfrage. Dieses referenziert sie dann mit der Objektvariablen <b>rst<\/b>. Sollte nun ein Fehler auftreten, erfolgt die Protokollierung des Fehlers in der Tabelle <b>tblFehler<\/b>.<\/p>\n<p>Dazu leert die Prozedur diese Tabelle zun&auml;chst und tr&auml;gt dann f&uuml;r jedes Element der <b>Errors<\/b>-Auflistung des <b>DAO<\/b>-Objekts einen neuen Datensatz in die Tabelle <b>tblFehler <\/b>ein. Den Inhalt der Tabelle <b>tblFehler <\/b>liest die Prozedur dann wiederum in das Recordset <b>rst <\/b>ein. <b>rst <\/b>enth&auml;lt nun entweder das Ergebnis der Abfrage oder aber den aktuellen Inhalt der Tabelle <b>tblFehler<\/b>. Mithilfe der Routine <b>UnterdatenblattFuellen <\/b>erscheint der Inhalt von <b>rst <\/b>dann als Datenherkunft des Unterformulars <b>sfmSQLBefehle<\/b>.<\/p>\n<h2>Ergebnis im Unterformular anzeigen<\/h2>\n<p>Nachdem das Abfrageergebnis nun in Form eines Recordsets vorliegt, m&uuml;ssen wir es nur noch im Unterformular <b>sfmSQLBefehle <\/b>anzeigen. Weiter oben haben Sie ja bereits gesehen, dass dieses Unterformular einen Vorrat von zehn ungebundenen Textfeldern samt Bezeichnungsfeldern enth&auml;lt.<\/p>\n<p>Die Aufgabe der Prozedur <b>UnterdatenblattFuellen <\/b>aus Listing 4 ist es nun, die Bezeichnungsfelder mit den Feldnamen des Recordsets zu f&uuml;llen, die Textfelder an die Felder des Abfrageergebnisses zu binden und die Spaltenbreiten zu optimieren, sodass alle enthaltenen Texte sichtbar sind. Au&szlig;erdem sollen bei Abfragen, die weniger als zehn Felder liefern, die nicht verwendeten Textfelder ausgeblendet werden.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterdatenblattFuellen(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> Me!sfmErgebnis.Form.Recordset = rst\r\n     For i = 0 To rst.Fields.Count - 1\r\n         <span style=\"color:blue;\">If <\/span>i = 10<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmErgebnis.Form.Controls(\"txt\" & Format(i + 1, \"00\"))\r\n             .ColumnHidden = <span style=\"color:blue;\">False<\/span>\r\n             .ControlSource = rst.Fields(i).Name\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmErgebnis.Form.Controls(\"lbl\" & Format(i + 1, \"00\"))\r\n             .Caption = rst.Fields(i).Name\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     ''ColumnWidth muss sp&auml;ter eingestellt werden, da sonst nicht zuverl&auml;ssig\r\n     For i = 0 To rst.Fields.Count - 1\r\n         <span style=\"color:blue;\">If <\/span>i = 10<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmErgebnis.Form.Controls(\"txt\" & Format(i + 1, \"00\"))\r\n             .ColumnWidth = -2\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     For j = i To 9\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmErgebnis.Form.Controls(\"txt\" & Format(j + 1, \"00\"))\r\n             .ColumnHidden = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> j\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Anzeigen des Abfrageergebnisses im Unterformular sfmSQLBefehle<\/span><\/b><\/p>\n<p>Die Prozedur weist dem im Unterformularsteuerelement <b>sfmErgebnis <\/b>enthaltenen Unterformular (hier also <b>sfm-SQL-Befehle<\/b>) das als Parameter &uuml;bergebene Recordset zu.<\/p>\n<p>Dann durchl&auml;uft es eine <b>For&#8230;Next<\/b>-Schleife von <b>0 <\/b>bis zur Anzahl der Felder des Recordsets <b>rst<\/b>. Die Schleife wird abgebrochen, sobald zehn Felder durchlaufen wurden (<b>i=10<\/b>).<\/p>\n<p>F&uuml;r die ersten zehn Felder referenziert die Prozedur dynamisch jeweils das dem aktuellen Wert entsprechende Textfeld und stellt zwei Eigenschaften ein: <b>ColumnHidden <\/b>enth&auml;lt den Wert <b>False<\/b>, was dieses Feld einblendet und <b>ControlSource <\/b>wird mit dem Namen des aktuellen Feldes des Recordsets gef&uuml;llt. Dies bindet das Textfeld an das entsprechende Recordset-Feld.<\/p>\n<p>Dann referenziert es das zu diesem Textfeld geh&ouml;rende Bezeichnungsfeld und stellt mit dessen Eigenschaft <b>Caption <\/b>die Spalten&uuml;berschrift f&uuml;r dieses Feld ein.<\/p>\n<p>Danach durchl&auml;uft die Prozedur die Felder des Recordsets in einer zweiten <b>For&#8230;Next<\/b>-Schleife ein zweites Mal. Diesmal stellt es die Eigenschaft <b>ColumnWidth <\/b>auf den Wert <b>-2 <\/b>ein, was eine Optimierung der Spaltenbreite f&uuml;r die aktuell angezeigten Zeilen ausl&ouml;st. Dies k&ouml;nnen wir leider nicht direkt im ersten Durchlauf der <b>For&#8230;Next<\/b>-Schleife ausl&ouml;sen, da sonst ein Fehler auftritt.<\/p>\n<p>Sollte das Abfrageergebnis weniger als zehn Felder enthalten, m&uuml;ssen wir die &uuml;brigen Felder noch ausblenden. Da die zuletzt durchlaufene <b>For&#8230;Next<\/b>-Schleife in diesem Fall nur bis zum letzten Feld des Recordsets durchlaufen wurde, k&ouml;nnen wir den aktuellen Wert der Laufvariable <b>i <\/b>als Startwert f&uuml;r eine weitere <b>For&#8230;Next<\/b>-Schleife verwenden.<\/p>\n<p>Diese nutzt diesmal die Laufvariable <b>j <\/b>und l&auml;uft von <b>i <\/b>bis <b>10<\/b>. Dabei stellt sie die Eigenschaft <b>ColumnHidden <\/b>des entsprechenden Textfeldes jeweils auf den Wert <b>True <\/b>ein und blendet die Spalten somit aus.<\/p>\n<p>Damit erscheinen nun die Daten der angegebenen Abfrage (oder eine Fehlermeldung) im Unterformular <b>sfmSQLBefehle<\/b>.<\/p>\n<h2>Abfrage mit F5 ausf&uuml;hren<\/h2>\n<p>Fehlt noch die M&ouml;glichkeit, auf die Schnelle mit der Taste <b>F5 <\/b>auszuf&uuml;hren. Dazu fragen wir in der Ereignisprozedur <b>Bei Maustaste ab <\/b>einfach den KeyCode der gedr&uuml;ckten Taste ab. Betr&auml;gt dieser 116, was der Taste F5 entspricht, rufen wir auch in diesem Fall die soeben beschriebene Prozedur <b>cmdAusfuehren_Click <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case KeyCode\r\n         <span style=\"color:blue;\">Case <\/span>116\r\n             KeyCode = 0\r\n             <span style=\"color:blue;\">Call<\/span> cmdAusfuehren_Click\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Formular in das Add-In einbinden<\/h2>\n<p>Nun soll dieses Tool auch noch als Add-In verf&uuml;gbar sein. Dazu sind noch ein paar kleine Handgriffe n&ouml;tig. Als Erstes m&uuml;ssen Sie der Tabelle <b>USysRegInfos<\/b>, die in der Beispieldatenbank des Beitrags <b>RDBMS-Tools als Add-In nutzen <\/b>bereits enthalten ist, um ein weiteres Set von Datens&auml;tzen f&uuml;r das neue Add-In erweitern. Diese sehen wie in Bild 9 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_009.png\" alt=\"Erweiterung der Tabelle USysRegInfo\" width=\"700\" height=\"271,7817\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erweiterung der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Au&szlig;erdem f&uuml;gen Sie noch die in der ersten Zeile der neuen Eintr&auml;ge in die Tabelle <b>USysRegInfo <\/b>genannte VBA-Funktion zum Modul <b>mdlGlobal <\/b>hinzu. Dieses sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AutostartSQLBefehleAusfuehren()\r\n     TabellenErstellen\r\n     DoCmd.OpenForm \"frmSQLBefehle\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese Funktion wird aufgerufen, wenn der Benutzer sp&auml;ter auf den entsprechenden Eintrag im Add-In-Men&uuml; klickt.<\/p>\n<p>Damit dies geschieht, m&uuml;ssen Sie das Add-In noch neu installieren (beziehungsweise &uuml;berhaupt installieren, falls noch nicht geschehen). Dazu &ouml;ffnen Sie mit <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>den Add-In-Manager und f&uuml;gen das Add-In hinzu. Dadurch erscheint anschlie&szlig;end ein neuer Eintrag im Ribbon unter <b>Datenbanktools|Add-Ins|Add-Ins <\/b>(s. Bild 10). Klicken Sie auf diesen, &ouml;ffnet sich das oben beschriebene Formular <b>frmSQLBefehle<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_989_010.png\" alt=\"Neuer Eintrag in der Add-In-Liste\" width=\"650\" height=\"418,7231\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Neuer Eintrag in der Add-In-Liste<\/span><\/b><\/p>\n<h2>Besonderheiten bei den gespeicherten Daten<\/h2>\n<p>Das Add-In legt zum Speichern der Daten die Tabellen <b>tblVerbindungszeichenfolgen<\/b>, <b>tblTreiber<\/b>, <b>tblFehler <\/b>und <b>tblSQLBefehle <\/b>in der jeweiligen Zieldatenbank an. Dort m&uuml;ssen Sie die Verbindungszeichenfolgen et cetera, die Sie bei der Verwendung der jeweiligen Datenbank nutzen wollen, anlegen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit diesem Tool haben wir die Sammlung der Add-Ins f&uuml;r den Zugriff auf den SQL Server nochmals erweitert, sodass Sie nun drei Tools zur Verf&uuml;gung haben.<\/p>\n<p>Bei dem vorliegenden Add-In k&ouml;nnte man noch eine globale Speicherung aller Verbindungszeichen vorsehen, sodass der Benutzer aus allen bislang verwendeten Verbindungen diejenigen zur Zieldatenbank hinzuf&uuml;gen kann, die er dort ben&ouml;tigt.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RDBMSTools.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{C1F94E30-CE22-422E-92FF-9090493F126E}\/aiu_989.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer Access-Frontends mit einem SQL Server-Backend entwickelt, wird fr&uuml;her oder sp&auml;ter nicht immer zum SQL Server Management Studio wechseln wollen, um mal eben eine Abfrage auf die Daten der SQL Server-Datenbank abzusetzen. Viel sch&ouml;ner w&auml;re es doch, wenn man dies direkt vom Access-Fenster aus erledigen k&ouml;nnte! Kein Problem: Da wir in den vorherigen Ausgaben ohnehin schon Add-Ins f&uuml;r den Einsatz mit dem SQL Server vorgestellt haben, machen wir hier gleich weiter.<\/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":[662015,66042015,44000022],"tags":[],"class_list":["post-55000989","post","type-post","status-publish","format-standard","hentry","category-662015","category-66042015","category-SQL_Server_und_Co"],"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>T-SQL per Formular - 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\/TSQL_per_Formular\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"T-SQL per Formular\" \/>\n<meta property=\"og:description\" content=\"Wer Access-Frontends mit einem SQL Server-Backend entwickelt, wird fr&uuml;her oder sp&auml;ter nicht immer zum SQL Server Management Studio wechseln wollen, um mal eben eine Abfrage auf die Daten der SQL Server-Datenbank abzusetzen. Viel sch&ouml;ner w&auml;re es doch, wenn man dies direkt vom Access-Fenster aus erledigen k&ouml;nnte! Kein Problem: Da wir in den vorherigen Ausgaben ohnehin schon Add-Ins f&uuml;r den Einsatz mit dem SQL Server vorgestellt haben, machen wir hier gleich weiter.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:21:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"T-SQL per Formular\",\"datePublished\":\"2020-05-22T19:21:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/\"},\"wordCount\":2873,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a5366bc866704de5862b63dfcafa12c1\",\"articleSection\":[\"2015\",\"4\\\/2015\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/\",\"name\":\"T-SQL per Formular - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a5366bc866704de5862b63dfcafa12c1\",\"datePublished\":\"2020-05-22T19:21:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a5366bc866704de5862b63dfcafa12c1\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/a5366bc866704de5862b63dfcafa12c1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/TSQL_per_Formular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"T-SQL per Formular\"}]},{\"@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":"T-SQL per Formular - 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\/TSQL_per_Formular\/","og_locale":"de_DE","og_type":"article","og_title":"T-SQL per Formular","og_description":"Wer Access-Frontends mit einem SQL Server-Backend entwickelt, wird fr&uuml;her oder sp&auml;ter nicht immer zum SQL Server Management Studio wechseln wollen, um mal eben eine Abfrage auf die Daten der SQL Server-Datenbank abzusetzen. Viel sch&ouml;ner w&auml;re es doch, wenn man dies direkt vom Access-Fenster aus erledigen k&ouml;nnte! Kein Problem: Da wir in den vorherigen Ausgaben ohnehin schon Add-Ins f&uuml;r den Einsatz mit dem SQL Server vorgestellt haben, machen wir hier gleich weiter.","og_url":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:21:26+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"T-SQL per Formular","datePublished":"2020-05-22T19:21:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/"},"wordCount":2873,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1","articleSection":["2015","4\/2015","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/","url":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/","name":"T-SQL per Formular - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1","datePublished":"2020-05-22T19:21:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/a5366bc866704de5862b63dfcafa12c1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/TSQL_per_Formular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"T-SQL per Formular"}]},{"@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\/55000989","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=55000989"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000989\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}