Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Access DB - LIKE Schlüsselwort - Query funktioniert in Access, jedoch nicht in VBA





Frage

Hallo allerseits, bevor ich folgendes Ereigniss in die Schublade "Kuriositäten" möchte ich euch nochmal um eure Meinung fragen, falls doch ein Fehler enthalten sein sollte - was ich mir partout nicht vorstellen kann: Folgendes SQL Query funktioniert (über Abfragen)in Access selbst einwandfrei: SELECT tabVerbrauchsZeitraum.ID_VerbrauchsZeitraum, tabVerbrauchsZeitraum.datZeitraum_Von, tabVerbrauchsZeitraum.datZeitraum_Bis FROM tabVerbrauchsZeitraum WHERE (tabVerbrauchsZeitraum.datZeitraum_Bis) Like "*2006" ORDER BY tabVerbrauchsZeitraum.datZeitraum_Bis DESC; das selbe Query, mit statischem LIKE Argument, wird auch über VBA korrekt ausgeführt. Soll jedoch das Argument für das Schlüsselwort "LIKE" dynamisch eingetragen werden, kommt es zu keinem Ergebnis obwohl der generierte Query EXAKT so aussieht wie oben. In VBA sieht die Generierung des Queries so aus: sQuery = "SELECT tabVerbrauchsZeitraum.ID_VerbrauchsZeitraum, tabVerbrauchsZeitraum.datZeitraum_Von, tabVerbrauchsZeitraum.datZeitraum_Bis FROM tabVerbrauchsZeitraum WHERE (tabVerbrauchsZeitraum.datZeitraum_Bis) LIKE ""*" & CStr(iYearLimit) & """ ORDER BY tabVerbrauchsZeitraum.datZeitraum_Bis DESC;" Die Queries sind also exakt gleich, liefern aber unterschiedliche Ergebnisse (1 Datensatz bzw. garkeinen) Kann mir das jemand erklären ??? :(

Antwort 1 von lleopard

hei dethix

Für dich sind also

...Like "*2006" ORDER BY ...

und

...LIKE ""*" & CStr(iYearLimit) & """ ORDER BY ...

gleich?

Der VBA-Teil sollte aber so aussehen:
Dim stg as String

stg = "*" & CStr(iYearLimit)
...LIKE '" & stg & "' ORDER BY ...

dann sollte es klappen! ;-) Wichtig is in VBA nach Like ein Leerzeichen, ein Hochkomma, dann die Gänsefüsschen und dahinter dann das Gleiche nochmal andersrum... Übernimm es einfach so wie ich es eingetickert habe... sollte klappen.

Gruß Leo

Antwort 2 von dethix

Hallo Leo!
Danke erstmal für die Blitzantwort!

Hab's jetzt genau so gemacht... leider ist das Recordset immernoch leer
Mit Hochkommas statt Anführungszeichen hab ich's auch schon probiert, da funktioniert aber nichtmal der hardcoded Query. Es sieht so aus als bräuchte Access in dem Fall wirklich die Anführungszeichen um das LIKE Argument um zu funktionieren... *confused*

Antwort 3 von firefox

Kurze Gegenfrage:

Dein Feld "datZeitraum_Bis" ist doch ein Datumsfeld, warum nutzt du nicht die Funktion year() ?

p.s. " oder ' werden in SQL gleich behandelt, sollten also nicht das Problem sein.

Antwort 4 von lleopard

Hallo dethix

wo liegt der Fehler?

Ich habe mal die Tabelle und die Abfrage in einer DB abgebildet. Dann habe ich mal folgendes gemacht: Statt nach *2006 zu filtern, habe ich den ersten und den letzten Tag des jeweiligen Jahres hinterlegt. Das hat den Vorteil nun nach Datum in einem Datumsfeld einzugrenzen:

SELECT tabVerbrauchsZeitraum.ID_VerbrauchsZeitraum, tabVerbrauchsZeitraum.datZeitraum_Von, tabVerbrauchsZeitraum.datZeitraum_Bis
FROM tabVerbrauchsZeitraum
WHERE (((tabVerbrauchsZeitraum.datZeitraum_Bis) Between #1/1/2006# And #12/31/2006#))
ORDER BY tabVerbrauchsZeitraum.datZeitraum_Bis DESC;

und jetzt bauen wir wieder das ein:

stg = CStr(iYearLimit)

und übergeben das an den Query-String:

SELECT tabVerbrauchsZeitraum.ID_VerbrauchsZeitraum, tabVerbrauchsZeitraum.datZeitraum_Von, tabVerbrauchsZeitraum.datZeitraum_Bis
FROM tabVerbrauchsZeitraum
WHERE (((tabVerbrauchsZeitraum.datZeitraum_Bis) Between #1/1/" & stg & "# And #12/31/" & stg & "#))
ORDER BY tabVerbrauchsZeitraum.datZeitraum_Bis DESC;

Nun bauen wir mal ein Recordset auf und schauen was diese Abfrage zurückgibt:

dim ssql as string
dim rst as dao.Recordset
dim cc as long

ssql = "SELECT tabVerbrauchsZeitraum.ID_VerbrauchsZeitraum, tabVerbrauchsZeitraum.datZeitraum_Von, tabVerbrauchsZeitraum.datZeitraum_Bis
FROM tabVerbrauchsZeitraum
WHERE (((tabVerbrauchsZeitraum.datZeitraum_Bis) Between #1/1/" & stg & "# And #12/31/" & stg & "#))
ORDER BY tabVerbrauchsZeitraum.datZeitraum_Bis DESC;"

set rst = currentdb.openrecordset (ssql)

rs.movelast
cc = rs.recordcount

msgbox "es wurden " & cc & " Datensätze gefunden",vbInformation,"Datensätze suchen"

rs.close
set rs = Nothing

Wenn du das mal einbaust, solltest du eine Meldung bekommen, die dir sagt wieviele Datensätze er gefunden hat.

Klappt das, kannst du nun auch diese Anweisung zum Beispiel als Query in einem Formular als Datensatzherkunft nutzen...

Viel Glück

Leo