Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ADO - Datenbank - Nächste Datum verwenden (https://www.delphipraxis.net/194708-ado-datenbank-naechste-datum-verwenden.html)

Asura 25. Dez 2017 15:00


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:
SELECT bev_name, bev_ID, bev_active, prc_price FROM bev_beverages, prc_prices WHERE prc_bev_id = bev_id ORDER BY bev_name;
Also muss da ja irgendwas mit:
Code:
WHERE (prc_bev_ID = Bev_ID) AND (prc_valid_since = Am nächsten zum heutigen Datum)

jobo 25. Dez 2017 15:39

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, ..

Asura 25. Dez 2017 16:20

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:
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';
Also er akzeptiert nicht die Format Funktion nicht, woran könnte das Liegen? Also an den Umlauten liegt es nicht, das funktioniert!

Delphi.Narium 25. Dez 2017 22:10

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:
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
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.

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:
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
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.

Asura 26. Dez 2017 18:12

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.

Asura 26. Dez 2017 18:32

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:
ms-office-Forum

Delphi.Narium 26. Dez 2017 18:39

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:
select max(prc_valid_since) from prc_Prices
= Maximalwert in der Tabelle prc_Prices.

SQL-Code:
select prc_bev_ID, max(prc_valid_since) from prc_Prices group by prc_bev_ID
= Maximalwert in der Tabelle prc_Prices je prc_bev_ID.

SQL-Code:
select max(prc_valid_since) from prc_Prices group by prc_bev_ID where prc_bev_ID = :GewuenschteID
= Maximalwert in der Tabelle prc_Prices zur prc_bev_ID.

SQL-Code:
select prc_bev_ID, max(prc_valid_since) from prc_Prices where prc_bev_ID = :GewuenschteID group by prc_bev_ID
= Maximalwert in der Tabelle prc_Prices zur ausgewählten prc_bev_ID, diese ist mit im Ergebnis enthalten.

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 16:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz