T-SQL per Formular

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

T-SQL per Formular

Wer Access-Frontends mit einem SQL Server-Backend entwickelt, wird früher oder spä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öner wäre es doch, wenn man dies direkt vom Access-Fenster aus erledigen könnte! Kein Problem: Da wir in den vorherigen Ausgaben ohnehin schon Add-Ins für den Einsatz mit dem SQL Server vorgestellt haben, machen wir hier gleich weiter.

In den Beiträgen RDBMS-Tools: Verbindungen verwalten (www.access-im-unternehmen.de/976), RDBMS-Tools: Tabellen verknüpfen (www.access-im-unternehmen.de/977) und RDBMS-Tools als Add-In nutzen (www.access-im-unternehmen.de/978) haben wir bereits zwei kleine Tools vorgestellt und als Add-In aufbereitet.

Diese Add-In-Datei namens RDBMSTools.mda bauen wir jetzt weiter aus, indem wir ein Formular hinzufügen, mit dem Sie direkt Abfragen an die Datenbank eines SQL Servers absetzen können.

Dieses Formular sieht wie in Bild 1 aus und soll ebenfalls über einen Befehl des Add-In-Menüs verfügbar sein.

Formular zur direkten Eingabe von SQL-Anweisungen gegen ein SQL Server-Backend

Bild 1: Formular zur direkten Eingabe von SQL-Anweisungen gegen ein SQL Server-Backend

Das Formular soll zunächst über das obere Kombinationsfeld die Auswahl einer Verbindung ermöglichen. Diese haben wir natürlich zuvor mit einem der anderen beiden Add-Ins hergestellt, nämlich mit dem aus dem Beitrag RDBMS-Tools: Verbindungen verwalten.

Das Kombinationsfeld zeigt also, soweit bereits eingegeben, die vorhandenen Verbindungen an. Alternativ klicken Sie auf die Schaltfläche rechts vom Kombinationsfeld und öffnen so den Dialog aus Bild 2.

Verwalten der zu verwendenden Verbindungszeichenfolge

Bild 2: Verwalten der zu verwendenden Verbindungszeichenfolge

Nach dem Auswählen der Verbindungszeichenfolge können Sie dann gleich mit der Eingabe von SQL-Anweisungen loslegen. Diese tragen Sie einfach in das große Textfeld direkt unter der Verbindungsauswahl ein. Dabei können Sie dort eine oder mehrere SQL-Anweisungen unterbringen.

Der Clou ist: Wenn Sie mehrere Anweisungen unterbringen, werden diese auch nacheinander abgearbeitet. Manchmal möchten Sie aber vielleicht ein paar Anweisungen eingeben und diese nacheinander ausführen.

Dann können Sie die jeweils auszuführende Anweisung einfach markieren und diese dann durch Betätigen der Schaltfläche Ausführen oder der Taste F5 starten.

Damit Sie wissen, welche Anweisungen aktuell für die Ausführung vorgesehen sind, zeigt das Formular diese Zeilen unter dem Eingabefeld für die SQL-Anweisungen an. Wenn Sie also nur eine einzige Zeile wie in Bild 3 markieren, dann wird auch nur diese angezeigt – und durch F5 oder Ausführen auch ausgeführt.

Markieren der auszuführenden SQL-Anweisung

Bild 3: Markieren der auszuführenden SQL-Anweisung

Fehlt noch das Unterformularsteuerelement im unteren Bereich des Formulars: Dieses zeigt die Ergebnisse der ausgeführten Anweisungen an.

Bei Datensatzänderungen wie dem Löschen, Ändern oder Hinzufügen wird hier beispielsweise die Anzahl der betroffenen Datensätze ausgegeben. Wenn Sie eine SELECT-Abfrage ausführen, liefert das Unterformular bis zu zehn Felder des Abfrageergebnisses.

Sie können also die folgenden Abfragetypen mit dem hier vorgestellten Formular ausführen:

  • Auswahlabfragen (SELECT)
  • Aktualisierungsabfragen (INSERT INTO, SELECT INTO, UPDATE, DELETE)
  • Datendefinitionsabfragen (CREATE TABLE et cetera)

Das Unterformular liefert sogar eine entsprechende Fehlermeldung, wenn Sie eine ungültige SQL-Abfrage absetzen (s. Bild 4).

Ausgabe von Fehlermeldungen

Bild 4: Ausgabe von Fehlermeldungen

Und noch ein wichtiges Feature: Möglicherweise benö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ättern durch die Datensätze die verschiedenen SQL-Befehle ansteuern können.

Formular erstellen

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 tblSQLBefehle als Datenherkunft. Das Feld SQLBefehl soll dabei als Memofeld ausgelegt sein, da eine SQL-Anweisung leicht einmal mehr als 255 Zeichen umfasst. VerbindungID ist ein Fremdschlüsselfeld zur Tabelle tblVerbindungszeichenfolgen und Bezeichnung ein einfaches Textfeld.

Entwurf des Formulars frmSQLBefehle

Bild 5: Entwurf des Formulars frmSQLBefehle

Diese Tabelle finden Sie in der Entwurfsansicht in Bild 6. Die Felder der Tabelle werden – mit Ausnahme des Primärschlüsselfeldes – im oberen Teil des Formulars frmSQLBefehle angezeigt. Das Feld VerbindungID führen wir dabei als Kombinationsfeld aus, damit Sie damit leicht die Einträge der Tabelle tblVerbindungszeichenfolgen auswählen können. Rechts neben dem Kombinationsfeld finden Sie eine Schaltfläche namens cmdVerbindungenBearbeiten, mit der Sie das bereits im Beitrag RDBMS-Tools: Verbindungen verwalten beschriebene Formular öffnen können.

Entwurf der Tabelle zum Speichern der SQL-Befehle

Bild 6: Entwurf der Tabelle zum Speichern der SQL-Befehle

Dieses zeigt dann direkt die aktuell im Kombinationsfeld ausgewählte Verbindung an. Das Kombinationsfeld cboVerbindung erhält also die folgende Abfrage als Datensatzherkunft:

SELECT VerbindungszeichenfolgeID, Bezeichnung 
FROM tblVerbindungszeichenfolgen;

Damit die Schaltfläche cmdVerbindungenBearbeiten auf Knopfdruck das Formular frmVerbindungszeichenfolgen öffnet, hinterlegen Sie die Ereignisprozedur aus Listing 1 für das Ereignis Beim Klicken. Dieses öffnet das Formular frmVerbindungszeichenfolgen und übergibt den Primärschlüsselwert der aktuell im Kombinationsfeld cboVerbindung ausgewählten Verbindungszeichenfolge per Öffnungsargument.

Private Sub cmdVerbindungenBearbeiten_Click()
     DoCmd.OpenForm "frmVerbindungszeichenfolgen", OpenArgs:=Nz(Me!cboVerbindung, 0)
     Set frmVerbindungszeichenfolgen = Forms!frmVerbindungszeichenfolgen
     With frmVerbindungszeichenfolgen
         .Modal = True
         .OnUnload = "[Event Procedure]"
     End With
End Sub

Listing 1: Formular zum Auswählen der Verbindungszeichenfolge öffnen

Dann speichert die Prozedur einen Verweis auf das Formular in einer Objektvariablen namens frmVerbindungszeichenfolgen, die im Kopf des Klassenmoduls wie folgt deklariert wird:

Dim WithEvents frmVerbindungszeichenfolgen As Form

Der Hintergrund ist, dass wir im Klassenmodul des aufrufenden Formulars frmSQLBefehle eine Ereignisprozedur definieren wollen, die beim Schließen des Formulars frmVerbindungszeichenfolgen ausgelöst wird. Dazu müssen wir die Objektvariable mit dem Schlüsselwort WithEvents auszeichnen. Nun können wir per VBA eine Ereignisprozedur für die Ereigniseigenschaft Beim Entladen angeben (OnUnload = [Event Procedure]).

Damit brauchen wir nun nur noch die folgende Ereignisprozedur im Klassenmodul des Formulars frmSQLBefehle zu hinterlegen:

Private Sub frmVerbindungszeichenfolgen_Unload(Cancel _
         As Integer)
     Me!cboVerbindung.Requery
     Me!cboVerbindung = _
         frmVerbindungszeichenfolgen!VerbindungszeichenfolgeID
End Sub

Damit rufen wir nun das Formular frmVerbindungszeichenfolgen auf und können im Formular frmSQLBefehle auf das Beim Schließen-Ereignis von frmVerbindungszeichenfolgen reagieren.

Dort aktualisieren wir den Inhalt von cboVerbindung (falls im Formular frmVerbindungszeichenfolgen neue Verbindungszeichenfolgen hinzugefügt oder welche gelöscht wurden) und stellen das Kombinationsfeld cboVerbindung auf die zuletzt im Formular frmVerbindungszeichenfolgen gewählte Verbindungszeichenfolge ein.

Das Textfeld txtSQL ist an das Feld SQLBefehl der Tabelle tblSQLBefehle gebunden. Damit Sie darin Zeilenumbrüche einfach mit der Eingabetaste herbeiführen können, ohne dass der Fokus auf das nächste Steuerelement verschoben wird, stellen wir die Eigenschaft Eingabetastenverhalten auf Neue Zeile im Feld ein.

Das Bezeichnungsfeld lblSQL soll jeweils den SQL-Ausdruck aus dem Textfeld txtSQL anzeigen, der beim Betätigen von F5 beziehungsweise beim Anklicken der Schaltfläche cmdAusfuehren ausgeführt würde.Das ist normalerweise der komplette SQL-Text, außer der Benutzer markiert nur einen Teil des enthaltenen Textes. Dann wird nur dieser Teil in lblSQL abgebildet und auch ausgeführt.

Das Formular enthält außerdem eine Schaltfläche namens cmdAusfuehren, auf deren Funktion wir weiter unten eingehen.

Außerdem enthält das Formular ein Unterformular-Steuerelement, dessen Eigenschaft Herkunftsobjekt wir auf das Formular sfmSQLBefehle einstellen.

Dieses Formular enthält zehn Textfelder mit den Namen txt01, txt02 und so weiter (s. Bild 7). Die zehn dazu gehörenden Bezeichnungsfelder heißen entsprechend lbl01, lbl02 und so weiter. Das Unterformular und die Textfelder sind standardmäßig nicht an eine Datenherkunft gebunden. Dies geschieht erst später, wenn ein Ergebnis einer Abfrage vorliegt oder ein Fehler beim Ausführen einer Abfrage auftritt.

Entwurf des Unterformulars sfmSQLBefehle

Bild 7: Entwurf des Unterformulars sfmSQLBefehle

Die Begrenzung auf zehn Textfelder haben wir nur für diese Beispieldatenbank vorgenommen. Sie sorgt dafür, dass das Ergebnis einer Ad-hoc-Abfrage nicht mehr als zehn Felder zurückliefert beziehungsweise anzeigt. Wenn Sie mehr benötigen, legen Sie einfach weitere Textfelder entsprechend der Namenskonvention der vorhandenen Felder an.

Die Fehlertabelle

Es wird vorkommen, dass Sie Fehler in die SQL-Anweisungen einbauen. Diese wollen wir dann in einer dafür vorgesehenen Tabelle speichern und dann im Unterformular sfmSQLBefehle anzeigen. Die Tabelle sieht im Entwurf wie in Bild 8 aus.

Entwurf der Tabelle tblFehler

Bild 8: Entwurf der Tabelle tblFehler

Eingabe des SQL-Ausdrucks

In dem Moment, in dem Sie ein Zeichen in das Textfeld txtSQL eingeben, soll das Formular bereits den Ausdruck im Bezeichnungsfeld lblSQL anzeigen, der bei Betätigen von F5 oder der Schaltfläche cmdAusfuehren ausgeführt wird. Daher muss der Inhalt von lblSQL immer auf dem aktuellen Stand gehalten werden. Dafür sorgt zunächst einmal die Ereignisprozedur Bei Maustaste auf, die nach der Eingabe eines jeden Zeichens in das Textfeld txtSQL ausgelöst wird, und eine weitere Prozedur namens SQLAusdruckErmitteln aufruft:

Private Sub txtSQL_KeyUp(KeyCode As Integer, _
         Shift As Integer)

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]