![]() |
ADO - Datenbank - Nächste Datum verwenden
Guten Tag,
ich habe eine Datenbank Tabelle mit Preisen für verschiedene Produkte. Diese Preise für die Produkte können sich ändern, jedoch muss dies auch nachvollziehbar sein und das Programm soll immer den aktuellen Preis benutzen. Deswegen habe ich ein Feld "valid_since" erstellt. Für den Kauf nutzt er dann immer die zu dem Zeitpunkt aktuelle Preis ID. Nun meine Frage: Wie kann er immer ermitteln, welches nun der aktuelle Preis ist. Es existieren ja mehrere Preise pro Produktnummer. Der SQL-Code ohne die Berücksichtigung, dass es mehrere Preise existieren:
Code:
Also muss da ja irgendwas mit:
SELECT bev_name, bev_ID, bev_active, prc_price FROM bev_beverages, prc_prices WHERE prc_bev_id = bev_id ORDER BY bev_name;
Code:
WHERE (prc_bev_ID = Bev_ID) AND (prc_valid_since = Am nächsten zum heutigen Datum)
|
AW: ADO - Datenbank - Nächste Datum verwenden
Welche DB verwendest Du.
Mit valid_since könnte man sowas machen: Select ID, max(valid_since) from mytable group by ID Dieses Statement setzt Du in Klammern statt der Originaltabelle ein. Das ist erstmal ok, je nach DB kann man andere Konstrukte verwenden, die dann idealerweise schneller sind. Wenn Du den Spielraum hast, würde ich über eine kleine Erweiterung dieser Mechanik nachdenken. Valid_since zu valid_from machen ggf. valid_to hinzufügen, was andere Abfragen erlaubt, die ohne Max oder ähnliche Aggregate auskommen. Denkbar ist der Vortrag von Preisen, die dann irgendwann automatisch greifen, .. |
AW: ADO - Datenbank - Nächste Datum verwenden
Ich benutze Access als Datenbank
Also Max würde mir dann das "höchste" Datum ausgeben, sprich also das letzte? Aber die Aggregatfunktion ist doch gar nicht in der WHERE Funktion verfügbar? Oder muss ich erstmal eine Price Abfrage vorher machen, um die PriceID herauszubekommen und mit der dann die WHERE Abfrage machen? //EDIT: Ich habe testweise mal die Anweisung dem Query übergeben daraufhin kommt die Fehlermeldung: Sie wollen eine Abfrage ausführen, die den angegebenen Ausdruck "prc_ID" nicht als Teil der Aggregatfunktion einschließt:
Code:
SELECT prc_bev_ID, MAX(prc_valid_since) FROM prc_Prices ORDER BY prc_ID
Bezüglich from und since, geht es hier nur von der Verständlichkeit bzw. Logik her, weil wie ich dem Boot nun einen Namen gebe ist ja egal oder worauf willst du mit dem since zu from aus? Mal was ganz anderes als Frage, will dadurch ein Theard sparen:
Code:
Also er akzeptiert nicht die Format Funktion nicht, woran könnte das Liegen? Also an den Umlauten liegt es nicht, das funktioniert!
F_UserManagem.ADOQuery.SQL.Text := 'SELECT acc_Date AS Wann, acc_title AS Wofür, FORMAT(acc_amount, "currency") AS Höhe FROM acc_account WHERE acc_usr_ID = :usr_ID';
|
AW: ADO - Datenbank - Nächste Datum verwenden
SQL-Code:
select Format(spalte,'currency') as Wert from tabelle
Funktioniert bei mir, einfache Hochkommata, nicht doppelte. Suchst Du sowas?
SQL-Code:
Maximaler Wert in prc_valid_since, der kleiner oder gleich dem aktuellen Datum ist und zur gewünschten prc_bev_ID gehört. das Ergebnis enthält dann nur einen Datensatz, daher kann Order By entfallen.
SELECT prc_bev_ID, MAX(prc_valid_since) As Max_prc_valid_since
FROM prc_Prices where prc_bev_ID = :gewuenschteID and prc_valid_since <= now group by prc_bev_ID now() = aktuelles Datum incl. Uhrzeit date() = nur aktuelles Datum time() = aktuelle Uhrzeit Diese Funktionen können als Spalten im Select oder auch in einer Wherebedingung genutzt werden. Rechenoperationen sind ebenfalls möglich.
SQL-Code:
Will man vom Datum Jahr, Monat oder Tag haben, nimmt man Year(), Month() oder Day(). Soll's auf die Uhrzeit gehen, kommen noch Hour(), Minute() und Second() hinzu. In die Klammern kommte die gewünschte Datumsspalte aus dem Selectstatement bzw. der Wherebedingung.
SELECT prc_bev_ID, MAX(prc_valid_since) As Max_prc_valid_since
FROM prc_Prices where prc_bev_ID = :gewuenschteID and prc_valid_since <= Date() + 1 /* prc_valid_since <= Morgen */ group by prc_bev_ID |
AW: ADO - Datenbank - Nächste Datum verwenden
Dankeschön schon mal, also ich glaube wir nähern uns hier einem Ergebnis!
Das ist leider aber noch nicht so ganz das was ich suche. Er ermittelt mir zwar das richtige Ergebnis mit dem ersten SQL Code jedoch benötige ich ja die Price_ID, um damit eine Verbindung zur anderen Tabelle zu schaffen. Und er spuckt mir bei jeder Änderung die ich mache einfach nur aus: Es ist kein Teil der Aggregatfunktion. |
AW: ADO - Datenbank - Nächste Datum verwenden
Hinweis:
Ich habe mich auch an ein anderes Forum gewandt, also bitte hier auch hinein schauen, ob bereits eine Lösung gefunden wurde: ![]() |
AW: ADO - Datenbank - Nächste Datum verwenden
Alles, was beim Select an Spalten aufgeführt ist und nicht per Max oder Sum ... zusammengefasst wird, muss auch ins Group By.
SQL-Code:
= Maximalwert in der Tabelle prc_Prices.
select max(prc_valid_since) from prc_Prices
SQL-Code:
= Maximalwert in der Tabelle prc_Prices je prc_bev_ID.
select prc_bev_ID, max(prc_valid_since) from prc_Prices group by prc_bev_ID
SQL-Code:
= Maximalwert in der Tabelle prc_Prices zur prc_bev_ID.
select max(prc_valid_since) from prc_Prices group by prc_bev_ID where prc_bev_ID = :GewuenschteID
SQL-Code:
= Maximalwert in der Tabelle prc_Prices zur ausgewählten prc_bev_ID, diese ist mit im Ergebnis enthalten.
select prc_bev_ID, max(prc_valid_since) from prc_Prices where prc_bev_ID = :GewuenschteID group by prc_bev_ID
Also: Alles, was mit Select ausgewählt wird und nicht durch eine Aggregatfunktion zusammengefasst wird, muss mit ins Group By. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz