2017-03-08 16 views
0

Ich habe 6 Datenbanktabellen, die Informationen zu Provisionssätzen speichern und welche Rate je nach Kunde/Lieferant/Produkt und Bestelldatum zu verwenden ist.SQL zwischen Datumsbereich Abfrage funktioniert für einige Tabellen, aber nicht für andere

Mit diesen Tabellen habe ich eine Prozedur, um den Betrag der Provision für den Benutzer zu berechnen. Dies funktioniert gut für die ersten Stufen der Ordnung, wie es das aktuelle Datum verwendet, so meine SQL ist nach dem Vorbild der

Dim p1Dt As New DataTable 
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND " & _ 
           "Product_Code=? AND Rate_Start_One <= DATE() AND " & _ 
           "Rate_End_One >= DATE()", con) 
pDa.SelectCommand.Parameters.Add("@supplier", OleDbType.VarChar).Value = cmbSupplier.Text 
pDa.SelectCommand.Parameters.Add("@product", OleDbType.VarChar).Value = ugr.Cells("Product_Code").Value 
pDa.Fill(p1Dt) 

Wenn jedoch die Bestellung geliefert wurde, wird die Kommission dann neu berechnet mit das Lieferdatum für das Produkt, das aus der Datenbank entnommen wird.

Mein Code dafür ist ein bisschen anders, da es nicht mit dem aktuellen Datum berechnet wird. Stattdessen bin ich mit diesem Code

Dim deliveryDate As Date 
deliveryDate = ugr.Cells("Final_Delivery").Value 

Dim p1Dt As New DataTable 
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? " & _ 
           "AND Product_Code=? AND Rate_Start_One <= #" & _ 
           deliveryDate & "# AND Rate_End_One >= #" & _ 
           deliveryDate & "#", con) 
pDa.SelectCommand.Parameters.Add("@supplier", OleDbType.VarChar).Value = cmbSupplier.Text 
pDa.SelectCommand.Parameters.Add("@product", OleDbType.VarChar).Value = ugr.Cells("Product_Code").Value 
pDa.Fill(p1Dt) 

Wenn ich den Final_Delivery Wert als 2017.11.03 (11. März) zu speichern, die deliveryDate Wert wird als 2017.11.03 zugeordnet.

Ich habe eine Rate in der Promotional Rates Tabelle für den gesamten März, so erwarte ich die obige Abfrage, um 1 Zeile in der Tabelle zu haben, jedoch gibt es 0 zurück, so verwendet die falschen Werte für die Kommission.

Das passiert nicht, wenn ich die DATE() Methode verwende, findet es alle Zeilen in den Tabellen korrekt, so liegt das Problem irgendwo in der Art, wie ich Daten in der zweiten Methode eingabe.

Warum sollte die zweite Methode die Zeile in der Datenbank nicht finden, wenn ich die Abfrage in diesem Format schreibe?

EDIT

Dies ist die vollständige CommandText, nachdem er über die OleDbDataAdapter Variable schweben und kopieren und einfügen und CommandText

"SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND Product_Code=? AND Rate_Start_One " & _ 
"<= #11/03/2017# AND Rate_End_One >= #11/03/2017#" 

Die Daten in der Datenbank, um zu beweisen, dass es die richtigen Daten bekommen hat in:

Vertriebslinien (Für den Final_Delivery Wert)

enter image description here

Werbe Preise (für den Datumsbereich)

enter image description here

+2

Sie haben Parameter für Lieferant und Produkt verwendet, Sie können/sollten die Daten als Datumsparameter angeben. Format und Kultur spielen keine Rolle mehr (sofern es sich um Termine in der Datenbank handelt). – Plutonix

Antwort

2

Die Antwort war, wie @Plutonix, erwähnt - Verwendung Parameter zum Übergeben der Daten in.

Ich habe völlig vergessen, dass dies sogar möglich war, in der Wahrheit, aber die Art und Weise um das Problem ist die Parametrisierung der Abfragen, wie zum Beispiel:

Dim deliveryDate As Date = ugr.Cells("Final_Delivery").Value 

Dim p1Dt As New DataTable 
Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND " & _ 
           "Product_Code=? AND Rate_Start_One <= ? AND Rate_End_One " & _ 
           ">= ?", con) 
pDa.SelectCommand.Parameters.Add("@supplier", OleDbType.VarChar).Value = cmbSupplier.Text 
pDa.SelectCommand.Parameters.Add("@product", OleDbType.VarChar).Value = ugr.Cells("Product_Code").Value 
pDa.SelectCommand.Parameters.Add("@dFrom", OleDbType.Date).Value = deliveryDate 
pDa.SelectCommand.Parameters.Add("@dTo", OleDbType.Date).Value = deliveryDate 
pDa.Fill(p1Dt) 
+0

Hallo, David, und danke für Beitrag zu Stack Overflow! Bitte machen Sie keine [Bearbeitungen wie diese] (/ review/successed-edits/15485370). Insbesondere ist "iOS" kein Programmcode und sollte daher nicht in [Backticks] (/ editing-help # code) eingeschlossen werden. Siehe z.B. [diese Antwort auf meta.SO] (https://meta.stackoverflow.com/a/303220), um zu erfahren, wie Posts ordnungsgemäß bearbeitet werden können (und [diese Frage] (https://meta.stackoverflow.com/q/ 313517) für einige Beispiele von Änderungen, die * nicht * hilfreich sind). Vielen Dank! (Ps. Ich werde diesen Kommentar in ein paar Tagen löschen, so dass es diese Antwort nicht für immer überladen wird.) –

0

Access interpretiert Daten in SQL-Strings als mm/tt/egal, was Ihre regionalen Einstellungen sind. Lesen Sie hier http://allenbrowne.com/ser-36.html für einige Methoden, um damit umzugehen.

Im Abfrage-Designer trifft dies nicht zu - was sehr verwirrend ist. Und es interpretiert Date() korrekt, egal wo Sie es verwenden.

+0

Das macht nicht viel Sinn - sind Sie sicher, dass Ihre Daten die Daten haben, nach denen Sie suchen? Und dass in keinem der Werte eine Zeitkomponente enthalten ist? – Minty

+0

Okay - das erste Datum wird als 14/03/2017 gelesen, weil es nichts anderes sein kann, aber das zweite wird als 03/11/2017 gelesen werden, z. 3. November wegen der oben beschriebenen Effekte. Sie müssen alle Daten in MM/TT/JJJJ-Format erzwingen, um korrekt zu funktionieren – Minty

+0

Es gibt jedoch in beiden Fällen 0 Zeilen zurück. – David

0

Ihre SQL sollte lauten:

"SELECT * FROM [Promotional Rates] WHERE Supp_Code=? AND Product_Code=? AND Rate_Start_One " & _ 
"<= #2017/03/11# AND Rate_End_One >= #2017/03/11#" 

so ändern wie folgt aus: zusammen mit ein paar anderen Leuten in einem anderen Forum

Dim pDa As New OleDbDataAdapter("SELECT * FROM [Promotional Rates] WHERE Supp_Code=? " & _ 
          "AND Product_Code=? AND Rate_Start_One <= #" & _ 
          deliveryDate.ToString("yyyy'/'MM'/'dd") & "# AND Rate_End_One >= #" & _ 
          deliveryDate.ToString("yyyy'/'MM'/'dd") & "#", con) 
Verwandte Themen