Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Beaker s.a. am Januar 05, 2026, 18:17:02

Titel: Stringzuweisung erzeugt Fehler
Beitrag von: Beaker s.a. am Januar 05, 2026, 18:17:02
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
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: PhilS am Januar 05, 2026, 18:26:07
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.
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: Knobbi38 am Januar 06, 2026, 13:42:39
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
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: PhilS am Januar 06, 2026, 14:00:09
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)
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: Knobbi38 am Januar 06, 2026, 14:13:10
@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
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: Beaker s.a. am Januar 06, 2026, 17:51:39
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 Function
als 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


Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: Normalo0815 am Januar 06, 2026, 18:05:41
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)
Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: PhilS am Januar 06, 2026, 18:29:47
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

Titel: Re: Stringzuweisung erzeugt Fehler
Beitrag von: Beaker s.a. am Januar 07, 2026, 18:24:11
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