Hallo,
Kann mir jemand sagen, warum dieser Code direkt, also bereits OHNE
Zuweisung an einen RS den Fehler 13, Typen unverträglich erzeugt?
ZitatsSQL = _
"SELECT Min(T.Spieltag) AS DateFrom " & vbCrLf & _
"FROM (" & vbCrLf & _
" SELECT TOP " & lLastN & " Q.Spieltag " & vbCrLf & _
" FROM qSpieltage AS Q " & vbCrLf & _
" WHERE Q.Spieltag < " & SQLDateString(sMatchDate) & vbCrLf & _
" ORDER BY Q.Spieltag DESC" & vbCrLf & _
") AS T"
Die Variablen lLastN und sMatchDate sind korrekt befüllt, sSQL als String
deklariert.
Danke.
gruss ekkehard
Ich denke, der Fehler kann eigentlich nur bei diesem Teil entstehen:
... SQLDateString(sMatchDate) ...
Erwartet diese Funktion einen Date-Datentyp als Argument? Das Prefix "s" lässt vermuten, dass das nicht gegeben ist.
Hallo Ekkehard,
für solche Fälle verwende ich gerne so eine Codestruktur:
Dim sSQL As String
Const SQL_MIN = _
"SELECT Min(T.Spieltag) AS DateFrom" _
& " FROM ( " _
& " SELECT TOP {0} Q.Spieltag" _
& " FROM qSpieltage AS Q" _
& " WHERE Q.Spieltag < {1} " _
& " ORDER BY Q.Spieltag DESC" _
& ") AS T"
sSQL = Replace(SQL_MIN, "{0}", CStr(lLastN))
sSQL = Replace(sSQL, "{1}", SQLDateString(sMatchDate))
Debug.Print "SQL > "; sSQL
Ist zwar etwas aufwendiger, aber relativ einfach zu handhaben, auch weil hier gut CP angewendet werden kann. Man könnte sich dafür auch eine Funktion mit variabler Anzahl an Parametern schreiben, was das Ganze noch etwas vereinfacht.
Knobbi38
Zitat von: Knobbi38 am Januar 06, 2026, 13:42:39Man könnte sich dafür auch eine Funktion mit variabler Anzahl an Parametern schreiben, was das Ganze noch etwas vereinfacht.
Dazu hatte ich mal was geschrieben...
->
Eine printf oder String.Format Funktion für VBA (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=vba-printf-string-format-function)
@PhilS Sicherlich hast du schon so etwas gemacht :) , nur hatte ich das nicht mehr ganz parat.
Für die Ersetzungen in SQL Strings hatte ich da gar nicht an so eine aufwendige Funktion mit den Formatieroptionen gedacht, da reicht auch oft ein einfaches Replace. Wenn man wirklich Formatierungen benötigt, kann man dieses ja schon vorher bei der Parameterübergabe machen.
Aber warum nicht ... ? ;)
Grüße
Knobbi38
Hallo,
Vielen Dank für eure Antworten.
Sorry, habe leider vergessen zu erwähnen, dass wenn ich den String in einer
Testprozedur zusammensetze,
Public Function testSQL()
Dim dDate As Date
Dim sSQL As String
dDate = "15.11.2025"
sSQL = "SELECT Min(T.Spieltag) AS DateFrom " & vbCrLf & _
"FROM (" & vbCrLf & _
" SELECT TOP " & 50 & " Q.Spieltag " & vbCrLf & _
" FROM qSpieltage AS Q " & vbCrLf & _
" WHERE Q.Spieltag < " & SQLDateString(dDate) & vbCrLf & _
" ORDER BY Q.Spieltag DESC" & vbCrLf & _
") AS T"
SqlDebug sSQL
End Functionals Ergebnis
ZitatSELECT Min(T.Spieltag) AS DateFrom
FROM (
SELECT TOP 50 Q.Spieltag
FROM qSpieltage AS Q
WHERE Q.Spieltag < #2025/11/15#
ORDER BY Q.Spieltag DESC
) AS T
erhalte.
Im Direktfenster:
Zitat?SQLDateString("15.11.2025")
#2025/11/15#
sMatchdate kommt so
Zitat#2025/11/15 00:00:00#
in der Prozedur an, die den Fehler produziert.
Public Function SQLDateString( _
ByVal dValue As Date, _
Optional ByVal bIncludeTime As Boolean = False) As String
If bIncludeTime Then
SQLDateString = "#" & Format$(dValue, "yyyy\/mm\/dd hh:nn:ss") & "#"
Else
SQLDateString = "#" & Format$(dValue, "yyyy\/mm\/dd") & "#"
End If
End Function
Dies funzt sowohl mit "15.11.2025" als auch mit Date(). Da kommt doch wohl die
explizite Typumwandlung durch VBA ins Spiel. Der übergebene Wert ist auf jeden
Fall ein Ausdruck, der ein gültiges Datum übergibt. I.Ü. habe ich diese schon
x-mal in meinen DBn verwendet.
gruss ekkehard
Hallo,
Format nicht so yyyy\/mm\/dd sondern so yyyy\-mm\-dd
Siehe auch
https://www.donkarl.com?FAQ6.8 (https://www.donkarl.com/?FAQ6.8)
Zitat von: Beaker s.a. am Januar 06, 2026, 17:51:39sMatchdate kommt so
Zitat#2025/11/15 00:00:00#
in der Prozedur an, die den Fehler produziert.
Mir ist unklar, welche Prozedur du hier genau meinst und ob du den obigen Wert als String oder als Datum meinst.
Warum letzteres relevant ist:
? cdate("#2025/11/15 00:00:00#")
=> Type mismatch Error
? cdate("2025/11/15 00:00:00")
=> 15.11.2025
Hallo Philip,
Danke. Es gibt zwar bei mir in dem Zusammenhang kein CDate(), aber dadurch
bin ich drauf gekommen warum es im Test (anscheinend) funzt und im Code
relevanten Code nicht. Man sieht im Direktfenster die Quote vorn und hinten
nicht.
Bin dadurch aber auch auf die ursprüngliche Ursache des Fehlers gestossen.
Man wird doch irgendwie alt. Bei der Idee das Matchdate als String zu verwenden
(wird an einen SQL-Builder weitergereicht) hatte ich die SQLDatum-Funktion völlig
vergessen.
Ist also alles in Ordnung, muss nur ein paar kleine Änderungen an vorgelagertem
Code durchführen.
Dank nochmal für eure Anteilnahme.
gruss ekkehard