Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1284to1288
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SQL-Abfrage variabel

SQL-Abfrage variabel
08.11.2012 09:22:50
Martin
Hallo zusammen,
nach mehr als zweitägiger erfolgloser Suche hoffe ich nun, mit diesem Beitrag eine Hilfe zu erhalten.
Via Excel versuche ich, aus einer MySQL-Datenbank Werte zu erhalten. Die Abfrage lautet:
SELECT woz_wo_wo_nr , woz_wo_shortdesc , woz_wo_ist_text , woz_wo_soll_text , woz_wo_wov , woz_wo_mand_nbr , woz_wo_mand_name , woz_wo_int_flag FROM `bugs`.`woz_wo` WHERE woz_wo_wo_nr = '28432 - 04'
Ich muss dazu sagen, dass ich von SQL fast keine Ahnung habe. Die hier stehende Abfrage habe ich anhand des Assistenten und mithilfe eines SQL Versierten erstellt.
Das in Anführungszeichen stehende Filterkriterium '28432 - 04' ist ein (einmalig vorkommendes) Schlüsselfeld der Datenbank `bugs`.`woz_wo`.
Nun möchte ich, dass die Filterung abhängig vom Inhalt der Zelle Werte!A1 wird. Hier hinterlegt ist eine Formel, die mir die Nummer im gewünschten Format ausgibt. Allerdings scheiterten bisher alle Versuche, dass variabel zu gestalten.
Bei folgenden Versuchen wurde eine leere Tabelle ausgegeben (also Suchkriterium nicht gefunden, wenn ich es richtig verstehe):
WHERE woz_wo_wo_nr = '[Werte$A1]'
WHERE woz_wo_wo_nr = 'Werte$A1'
Bei folgenden Versuchen kommt Fehlermeldung '...You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... at line 3' (... am Anfang ist die Version des ODBC-Treibers, ... in der Mitte der Begriff in der where-Variante):
WHERE woz_wo_wo_nr = [Werte$A1]
WHERE woz_wo_wo_nr = "'" & [Werte$A1] & "'"
(WHERE woz_wo_wo_nr = '[Werte$A1]')
(WHERE woz_wo_wo_nr = 'Werte$A1')
(WHERE woz_wo_wo_nr = [Werte$A1])
(WHERE woz_wo_wo_nr = "'" & [Werte$A1] & "'")
(WHERE woz_wo_wo_nr = "'" & Werte$A1 & "'"
"(" & WHERE woz_wo_wo_nr = "'" & [Werte$A1] & "'" & ")"
"(" & WHERE woz_wo_wo_nr = '[Werte$A1]' & ")"
"(" & WHERE woz_wo_wo_nr = [Werte$A1] & ")"
"(" & WHERE woz_wo_wo_nr = "'" & Werte$A1 & "'" & ")"
"(" & WHERE woz_wo_wo_nr = 'Werte$A1' & ")"
Bei folgendem Versuch kommt Fehlermeldung '...Unknown column ... in 'where clause'' (... am Anfang ist die Version des ODBC-Treibers, ... in der Mitte der Begriff in der where-Variante):
WHERE woz_wo_wo_nr = "'" & Werte$A1 & "'"
Mir fällt nix mehr ein...
Bei meiner Recherche habe ich herausgefunden, dass man das Ganze wohl auch mit VBA lösen kann. Allerdings will ich nicht noch einen weiteren Prozess einbauen (Nachdem die Tabelle in Excel korrekt angezeigt wird muss ich das Ganze noch irgendwie nach Word exportieren). Habt Ihr eine Lösung? Eine VBA-Lösung nehme ich gerne erst einmal auf, würde mich über eine andere Lösung aber mehr freuen!
Vielen Dank im Voraus
Grüße
Martin

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SQL-Abfrage variabel
08.11.2012 13:38:25
fcs
Hallo Martin,
hier kommst du um eine VBA-Lösung nicht herum, um den SQL-String Variabel zu gestalten. Man kann den Text in den Eigenschaften der Abfrage nicht durch Formeln/Tabellenverweise dynamisieren.
Zeichne den Import der Daten mit dem Makrorecorder auf, dann hast du zumindest die richtige Syntax, die erforderlich ist, auch wenn der aufgezeichnete Code meist nicht sehr schön ist, da oft geschachtelte Datenarrays erzeugt werden, die den SQL-String aufnehmen. Das läßt sich aber bereinigen, indem man den String der Verbindung in einer Variablen zusammenstellt, die dann auch den variablen Text der Zelle im Tabellenblatt integriert.
Gruß
Franz

Anzeige
Entwurf einer VBA-Anweisung
08.11.2012 14:14:24
Martin
Hallo Franz,
danke für Deine schnelle Antwort. Gemäß Deines Hinweises habe ich meine bescheidenen VBA-Kenntnisse sowie die noch bescheideneren SQL-Kenntniss zusammengeworfen. Heraus gekommen ist folgende VBA-Anweisung:
Sub SQL()
' SQL Makro
' SQL-Abfrage zu aktueller WO
' Tastenkombination: Strg+m
Dim woz_wo As String
woz_wo = " woz_wo_wo_nr , woz_wo_shortdesc , woz_wo_ist_text , woz_wo_soll_text ,  _
woz_wo_wov , woz_wo_mand_nbr , woz_wo_mand_name , woz_wo_int_flag FROM `bugs`.`woz_wo`"
"SELECT " & woz_wo & " WHERE woz_wo_wo_nr = " & Sheets("Tabelle1").Range("A1").Value
End Sub

Allerdings kommt bei der "SELECT " ... Zeile ein Fehler beim Kompilieren mit der genaueren Meldung Erwartet: Zeilennummer oder Sprungmarke oder Anweisung oder Anweisungsende.
Kannst Du den Code reparieren?

Anzeige
AW: SQL für Abfrage per VBA modifizieren
09.11.2012 01:09:49
fcs
Hallo Martin,
nachfolgend die reparierten Anweisungen zur Berechnung des SQL-Befehls.
Sub SQL()
' SQL Makro
' SQL-Abfrage zu aktueller WO
' Tastenkombination: Strg+m
Dim woz_wo As String
woz_wo = " woz_wo_wo_nr , woz_wo_shortdesc , woz_wo_ist_text , woz_wo_soll_text , "
woz_wo = woz_wo & "woz_wo_wov , woz_wo_mand_nbr , woz_wo_mand_name , woz_wo_int_flag "
woz_wo = woz_wo & "FROM `bugs`.`woz_wo` SELECT woz_wo "
woz_wo = woz_wo & "WHERE woz_wo_wo_nr = " & Sheets("Tabelle1").Range("A1").Text
End Sub

Zusätzlich muss du natürlich auch noch die Anweisung zur Aktualisierung der Abfrage einfügen.
Das geht meistam einachsten, indem man die Änderung der Abfrage mit dem Makrorekorder ausführt.
Wie bereits erwähnt, erzeugt der Rekorder hier keinen besonders schönen Code.
Nachfolgend ein Beispiel zur Datenabfrage via MS-Quwerry in eine ACCESS-Datenbank.
Die vom Rekorder erzeugten Datenarrays wurden von mir aufgelöst und in einen Textstring eingebaut.
Gruß
Franz
Sub Modify_SQL_in_Querry()
Dim strCon As String
Dim strSQL As String
Dim strSourceDB As String, strDefaultDir As String, strTab As String, strWert As String
strSourceDB = "C:\Users\Admin\Documents\Stueckliste_Peter.accdb" 'Quelldatenbank
strDefaultDir = "C:\Users\Admin\Documents"
strTab = "`Stückliste Beispiel mit Importierten Daten`"   'Quelltabelle
'Connection-String generieren - dieser ist spezifisch für den Typ der Quelldaten
'hier eine Access-Datenbank ist nur erforderlich, wenn sich auch die Daten-
'quelle dynamisch ändern können soll
strCon = "ODBC;DSN=MS Access Database;DBQ=" & strSourceDB
strCon = strCon & ";DefaultDir=" & strDefaultDir
strCon = strCon & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
'Variabler Wert in der Abfrage für Material
strWert = Worksheets("Tabelle1").Range("A1").Text
'SQL-String generieren, variert ggf. etwas mit dem Typ der Quelldatenbank
'aus Tabelle auszulesende Felder
strSQL = "SELECT " & strTab & ".ID, " _
& strTab & ".Material, " _
& strTab & ".Stückliste, " _
& strTab & ".Stück, " _
& strTab & ".Einheit, " _
& strTab & ".Bezug, " _
& strTab & ".Benennung, " _
& strTab & ".Menge "
strSQL = strSQL & "FROM `" & strSourceDB & "`." & strTab & " " & strTab
'Filterkriterien
strSQL = strSQL & "WHERE (" & strTab & ".Material='" & strWert & "') " _
& "AND (" & strTab & ".Einheit='Stck') " _
& "AND (" & strTab & ".Menge>=0.5)"
'Sortierung
strSQL = strSQL & "ORDER BY " & strTab & ".Material, " _
& strTab & ".Menge DESC"
'Abfrage für Tabellenobjekt in Blatt "Tabelle2" aktualisieren
With Worksheets("Tabelle3").ListObjects(1).QueryTable
'    .Connection = strCon 'Muss nur neu gesetzt werden, wenn Quelldatei sich ändert.
.CommandText = strSQL
.Refresh BackgroundQuery:=False
End With
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige