Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Fehler in Abfrage mit Datumsfeld

Begonnen von Onkelwilli, Juli 29, 2016, 11:59:48

⏪ vorheriges - nächstes ⏩

Onkelwilli

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
    Loop


Dabei 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?

el_gomero

#1
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]
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Onkelwilli

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?

el_gomero

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 !!!


Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

MaggieMay

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.
Freundliche Grüße
MaggieMay

Onkelwilli

Hi,

leider immer noch der Datentypkonflikt in Kriterienausdruck.
Zur Info mal die Tabelle (keine Abfrage) Transaktionen in der Entwurfsansicht.

el_gomero

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?
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

MaggieMay

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.
Freundliche Grüße
MaggieMay

Onkelwilli

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 = Nothing


Ohne 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#

????

MaggieMay

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))
Freundliche Grüße
MaggieMay

el_gomero

und da Trans_Datum jetzt ein "gescheiter" ;) Feldname ist, braucht er nicht mehr in eckige Klammern gepackt zu werden ...
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Lachtaube

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.
Grüße von der (⌒▽⌒)

Onkelwilli

Hi,

vielen Dank nochmal für die Hilfen. Kann leider erst am Montag weiter testen und melde mich dann wieder.

Schönes WE

Onkelwilli

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! :)