Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Xoar am Juni 16, 2011, 13:41:54

Titel: sql in VBA -> where Bedingungen..
Beitrag von: Xoar am Juni 16, 2011, 13:41:54
Hallo, ich hab irgendwie öfters Probleme mit meinen sql Abfragen in VBA.
Habs in meinem Buch leider nicht gefunden, deshalb mal hier die Profis fragen.

Wann gehören bei den where Bedingungen welche Sonderzeichen, wie " oder ' oder &

ich muss da immer so oft rumprobieren bis es dann mal klappt.

Wenn ich Bezug auf ein Steuerelement nehme:   " & Steuerelement & "
Wenn ich Bezug auf eine in VBA deklarierte Variable nehme:  " & Variable & "
Wenn ich einen Text als Bedingung habe:' Text '
Ist soweit richtig, oder?
Manchmal aber, muss auch ein Hochkomma vor den Gänsefüßchen... wisst ihr warum?

Grüße
Titel: Re: sql in VBA -> where Bedingungen..
Beitrag von: DF6GL am Juni 16, 2011, 14:10:27
Hallo,

ja...

Es spiel keine Rolle, ob Where-Bedingung oder nicht und man befindet sich auch nicht in "SQL" zu diesem Zeitpunkt, sondern man setzt im Prinzip mit VBA-Operatoren einen "String" zusammen. Dieser String bedeutet lediglich später ein SQL-Statement, wenn er dem DB-System (der Access-Jet-Engine) "mitgeteilt" wird.

Weil in VBA ein (Literal-) String in Gänsefüße eingeschlossen werden muß, im String selber aber auch Gänsefüße als Teil der SQL-Syntax vorkommen können, muß zur Unterscheidung dieses Sachverhaltes ein Hochkomma (als Bestandteil des Strings)benutzt werden, oder alternativ muss ein Gänsefuß verdoppelt werden.



Wenn ich Bezug auf ein Steuerelement nehme:   " & Steuerelement & "

Dim strSQL as String
strSQL = "... Where tblTabelle.Feld1 =" & nz(Me!Steuerelement,0)  & " And ......."  'Hier ist "Feld1" vom Datentyp Zahl,long, Hochkommata um das Kriterium fehlen
Die NZ()-Funktion sorgt für definierten Wert (0) , wenn das Steuerlement "leer" (NULL) sein sollte. Ansonsten gäbe es einen (SQL-) Laufzeitfehler




Wenn ich Bezug auf eine in VBA deklarierte Variable nehme:  " & Variable & "

dito

Dim strSQL as String
strSQL = "... Where tblTabelle.Feld1 =" & Variable  & " And ......."  'Hier ist "Feld1" und "Variable" vom Datentyp Zahl,long, Hochkommata um das Kriterium fehlen



Wenn ich einen Text als Bedingung habe:' Text '
Dim strSQL as String, strText As String
strSQL = "... Where tblTabelle.Feld1 ='" & strText  & "' And ......."  'Hier ist "Feld1" und "strTex"t vom Datentyp Text, Hochkommata um das Kriterium müssen vorhanden sein


oder
strSQL = "... Where tblTabelle.Feld1 =""" & strText  & """ And ......."  
Titel: Re: sql in VBA -> where Bedingungen..
Beitrag von: Xoar am Juni 16, 2011, 14:34:18
ah super danke, nun ist mir einiges klarer :)
Titel: Re: sql in VBA -> where Bedingungen..
Beitrag von: Josef P. am Juni 17, 2011, 09:06:03
Hallo!

Eine kleine Anwerkung hätte ich noch.
Falls innerhalb des Textes auch ein ' oder " vorkommen kann, muss dieses (falls es als Begrenzungszeichen für den Text innerhalb SQL verwendet wird) beim Zusammensetzen des SQL-Strings verdoppelt werden.

Prinzip:
strText  = replace(MeFilterwertSteuerelement.Value, "'", "''")
strSQL = "... Where tblTabelle.Feld1 ='" & strText  & "' And ......."


Bei Dezimalzahlen darf man sich außerdem nicht auf die implizite Konvertierung zu Text verlassen, das kann je nach Ländereinstellung zu einem Komma als Dezimaltrennzeichen in der SQL-Anweisung führen und somit einen Fehler auslösen, da SQL einen Punkt als Dezimaltrennzeichen benötigt.
=>
strSQL = "... Where tblTabelle.Feld2 =" & str(DoubleVariable)  & " And ......."

Eine Alternative zu der Variante mit dem Zusammensetzen einer SQL-Anweisung per VBA ist der Einsatz von Parameterabfragen, die man auch dynamisch erstellen kann (diese müssen nicht als Abfrage gespeichert sein). Wenn diese Parameterabfragen per DAO.QueryDef oder als ADODB.Command eingesetzt werden, muss man im VBA-Code nicht auf die Sonderbehandlung von ' oder " sowie Komma als Dezimaltrennzeichen achten.
Der Code ist zwar auf den ersten Blick etwas aufwendiger - steckt man ihn aber in eine Hilfsprozedur, ist damit schnell eine Recordset geöffnet bzw. eine SQL-Anweisung ausgeführt.
Beispiel: Insert oder Update als Parameter-Abfrage (http://wiki.access-codelib.net/Insert_oder_Update_als_Parameter-Abfrage)

mfg
Josef