Hi,
habe nach langem Suchen scheinbar endlich eine Lösung gefunden mein Datumsfeld mit dem Inhalt einer TextBox zu vergleichen.
strSQL = "SELECT [ID],[FK_KD_Nr],[Transaktionen.Datum] FROM [Transaktionen] WHERE ((DateValue([Transaktionen.Datum]) = DateValue('" & Datum_Var & "')))"
Set Datensatz = Datenbank.OpenRecordset(strSQL)
Do Until Datensatz.EOF
TransaktionsID = Datensatz.Fields(0)
Info_Transaktionsnummern = Info_Transaktionsnummern & TransaktionsID & " und "
Datensatz.MoveNext
LoopDabei sollen alle Transaktionen gefiltert werden, die der Kunde bereits an diesem Tag hat. Hierbei soll die mit im Datumsfeld gespeicherte Uhrzeit nicht berücksichtigt werden. Dazu bin ich auf die Funktion DateValue gestoßen.
Das funktioniert soweit auch ganz gut. ....bis ich dann mit einer Schleife durch die Datensätze laufen will, dann erscheint die folgende Fehlermeldung:
ZitatDieser Ausdruck wurde falsch eingegeben, oder er ist zu komplex, um ausgewertet zu werden. Beispielsweise kann ein numerischer Ausdruck zu viele komplizierte Elemente enthalten. Vereinfachen Sie den Ausdruck, indem Sie Teile des Ausdrucks Variablen zuweisen. (Fehler 3071)
Kann mir hier jemand weiter helfen?
Hallo,
Datumswerte in SQL-Anweisungen müssen ins richtige Format gebracht werden, vgl http://www.donkarl.com?FAQ6.8
Nachtrag: Datevalue kannst du dir sparen. Datum als Feldbezeichner ist sehr unglücklich, würde ich schleunigst umbenennen. Und die eckigen Klammer im Statement sind unvollständig:
[Transaktionen].[Datumsfeld]
Danke für die schnelle Antwort.
.... aber ich kapier's leider immer noch nicht.
Wenn, dann muss doch nur das Datum aus der TextBox formatiert werden? oder....
Der Code:
Dim Datenbank As Database
Dim Datensatz As DAO.Recordset
Dim strSQL As String
Dim Datum_Var As String
Dim TransaktionsID As Integer
Dim Info_Transaktionsnummern As String
'----------------------------------------------------------------------
txt_Verkaufsdatum.Value = Now
Set Datenbank = CurrentDb
Datum_Var = Format(txt_Verkaufsdatum.Value, "\#yyyy\-mm\-dd#")
strSQL = "SELECT [ID],[FK_KD_Nr],[Transaktionen.Datum] FROM [Transaktionen] WHERE (DateValue([Transaktionen.Datum]) = " & Datum_Var & ")"
Set Datensatz = Datenbank.OpenRecordset(strSQL)
'MsgBox (Datensatz.Fields(0) & " - " & Datensatz.Fields(1))
Do Until Datensatz.EOF
TransaktionsID = Datensatz.Fields(0)
Info_Transaktionsnummern = Info_Transaktionsnummern & TransaktionsID & " und "
Datensatz.MoveNext
Loop
..liefert mir immer noch einen "Datentypkonflikt in Kriterienausdruck".
Was mache ich hier falsch?
ich hab den Code mal ein wenig umgeschrieben, sollte so laufen, ist aber ungetestet:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strDatum As String
Dim lngTID As Long
Dim strInfo_TA As String
'----------------------------------------------------------------------
ME!txt_Verkaufsdatum = Now()
Set db = CurrentDb
strDatum = Format(Date(), "\#yyyy\-mm\-dd#")
strSQL = "SELECT ID, FK_KD_Nr, [Datum] FROM Transaktionen WHERE [Datum]='" & strDatum & "'"
debug.print strSQL ' zur Prüfung des Statements im Direktfenster
Set rs = db.OpenRecordset(strSQL)
'MsgBox (rs.Fields(0) & " - " & rs.Fields(1))
Do Until rs.EOF
lngTID = rs.Fields(0)
Me!Info_Transaktionsnummern = ME!Info_Transaktionsnummern & lngTID & " und "
rs.MoveNext
Loop
rs.close: Set rs = nothing
Set db = nothing
und tu dir selbst einen Gefallen und benenne das Feld Datum um !!!
Hallo,
wenn Transaktionen eine Abfrage ist, so zeige doch bitte auch deren SQL-Code.
[Transaktionen.Datum]
Solche Feldbezeichnungen können Probleme bereiten und sollten daher grundsätzlich vermieden werden. Gib den Datenfeldern gescheite Namen, damit keine Doppellungen vorkommen können, oder zumindest einen Aliasnamen in der Abfrage.
Hi,
leider immer noch der Datentypkonflikt in Kriterienausdruck.
Zur Info mal die Tabelle (keine Abfrage) Transaktionen in der Entwurfsansicht.
ich hab dir doch extra ein debug.print eingebaut ... was wird als SQL-Statement ausgegeben?
Und hast Du im Code Datum durch Trans_Datum ersetzt?
Wenn du eh mit dem Tagesdatum vergleichen willst, dann mach es doch einfach mal so:
strSQL = "SELECT ID, FK_KD_Nr, Trans_Datum FROM Transaktionen WHERE Trans_Datum=Date()"
PS:
Der Fehler liegt in den Hochkommata.
Hi,
erst nochmal vielen Dank für Eure Hilfe und die Gedult. :)
Hier nochmal der geänderte Code:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strDatum As String
Dim lngTID As Long
Dim strInfoTA As String
Dim strInfo_TA As String
'----------------------------------------------------------------------
Set db = CurrentDb
strDatum = Format(txt_Verkaufsdatum.Value, "\#yyyy\-mm\-dd#")
strSQL = "SELECT ID, FK_KD_Nr, [Trans_Datum] FROM Transaktionen WHERE ([Trans_Datum])=" & strDatum
Debug.Print strSQL ' zur Prüfung des Statements im Direktfenster
Set rs = db.OpenRecordset(strSQL)
MsgBox (rs.Fields(0) & " - " & rs.Fields(1))
Do Until rs.EOF
lngTID = rs.Fields(0)
strInfo_TA = strInfo_TA & lngTID & " und "
rs.MoveNext
Loop
Debug.Print strInfo_TA
rs.Close: Set rs = Nothing
Set db = NothingOhne die Hochkommata ist der Typkonflikt jetzt weg. Allerdings mein "Hauptproblem" noch nicht gelöst. Ich will leider nicht mit dem Tagesdatum vergleichen, sondern einem vom Benutzer ausgewählten mit dem aus der Tabelle Transaktionen. Beide Datumsfelder haben allerdings eine Uhrzeit mit im Gepäck (und sollen die auch haben) nur glingt mit "=" ebene keine Abfrage, da die Zeit immer mit berücksichtigt wird.
Deshalb bin ich auf die Funktion DateValue() gestoßen. (Eine Andere Lösung wäre mir natürlich auch recht) Doch wenn ich den SQL_String ersetzte durch:
strSQL = "SELECT ID, FK_KD_Nr, [Trans_Datum] FROM Transaktionen WHERE (DateValue([Trans_Datum]))=" & strDatum
.... dann hab ich wieder die Fehlermeldung "Datentypenkonlikt in Kriterienausdruck"
Der SQL-String aus dem Debugfenster nochmal zur Info:
ZitatSELECT ID, FK_KD_Nr, [Trans_Datum] FROM Transaktionen WHERE (DateValue([Trans_Datum]))=#2016-07-24#
bzw.:
SELECT ID, FK_KD_Nr, [Trans_Datum] FROM Transaktionen WHERE ([Trans_Datum])=#2016-07-24#
????
Du musst halt beide Seiten auf dasselbe Format bringen.
Versuche es mal hiermit:
strSQL = "SELECT ID, FK_KD_Nr, Trans_Datum FROM Transaktionen WHERE (Format(Trans_Datum, '\#yyyy\/mm\/dd\#'))=" & strDatum
Oder so:
strSQL = "SELECT ID, FK_KD_Nr, Trans_Datum FROM Transaktionen WHERE Int(Trans_Datum)=" & Int(DateValue(Me!txt_Verkaufsdatum))
und da Trans_Datum jetzt ein "gescheiter" ;) Feldname ist, braucht er nicht mehr in eckige Klammern gepackt zu werden ...
Hallo,
Du musst den Vergleich so aufbauen:
Datumsfeld >= TagesKriterium AND Datumsfeld < TagesKriterium - 1
Ich würde einen Parameter dafür in der Abfrage verwenden.
Private Sub DeinProzedere()
Const QRY$ = _
"PARAMETERS [@Trans_Datum] DateTime;" & _
"SELECT ID," & _
" FROM Transaktionen" & _
" WHERE Trans_Datum >= [@Trans_Datum] AND" & _
" Trans_Datum < [@Trans_Datum] +1;"
Dim strResult As String
'___________________________________________________________________________
'
On Error GoTo e
'___________________________________________________________________________
'
If Not IsDate(Me.txt_Verkaufsdatum) Then Exit Sub
'___________________________________________________________________________
'
With CurrentDb().CreateQueryDef(vbNullString, QRY)
.Parameters("@Trans_Datum") = Me.txt_Verkaufsdatum
With .OpenRecordset(dbOpenSnapshot, dbForwardOnly)
Do Until .EOF
strResult = strResult & .Collect("ID") & ", "
.MoveNext
Loop
.Close
End With
End With
'___________________________________________________________________________
'
If Len(strResult) > 0 Then Msbox Left$(strResult, Len(strResult) - 2)
'___________________________________________________________________________
'
Exit Sub
'___________________________________________________________________________
'
e:
MsgBox Err.Description, vbInformation, "Fehler-Nr.: " & Err.Number
End Sub
Mit einem ADODB-Recordset wäre die Verarbeitung schneller, weil es die Verkettung in seiner Methode GetString selbst vornehmen könnte.
Hi,
vielen Dank nochmal für die Hilfen. Kann leider erst am Montag weiter testen und melde mich dann wieder.
Schönes WE
Hallo nochmal,
ich hab jetzt nochmal Eure Vorschläge getestet.
@MaggieMay: Deine vorletzte Idee liefert bei mir leider auch einen Fehler. Die Formatierung des per SQL abgefragten Datenfeldes (Trans_Datum) will irgendwie nicht funktionieren. Aber mit der Funktion Int() scheint es zu klappen. Noch etwas umgebaut funktionieren jetzt folgende Zeilen:
strDatum = Format(txt_Verkaufsdatum.Value, "\#yyyy\/mm\/dd#")
strSQL = "SELECT ID, FK_KD_Nr, Trans_Datum FROM Transaktionen WHERE Int(Trans_Datum)= Int(" & strDatum & ")"
@Lachtaube: Auch Dein Vorschlag funktioniert. Allerdings habe ich auf den Parameter vorerst verzichtet. Zumindest liefern auch die folgenden Zeilen die gewünschten Daten:
strDatum = Format(txt_Verkaufsdatum.Value, "\#yyyy\/mm\/dd#")
strSQL = "SELECT ID, FK_KD_Nr, Trans_Datum FROM Transaktionen WHERE Trans_Datum >" & strDatum & " and Trans_Datum-1 <" & strDatum
Also allen nochmals vielen Dank für die schnelle und kompetente Hilfe! :)