AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi ADO - Datenbank - Nächste Datum verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

ADO - Datenbank - Nächste Datum verwenden

Ein Thema von Asura · begonnen am 25. Dez 2017 · letzter Beitrag vom 26. Dez 2017
Antwort Antwort
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#1

ADO - Datenbank - Nächste Datum verwenden

  Alt 25. Dez 2017, 15:00
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)

Geändert von Asura (25. Dez 2017 um 15:13 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 25. Dez 2017, 15:39
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, ..
Gruß, Jo
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#3

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 25. Dez 2017, 16:20
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!

Geändert von Asura (25. Dez 2017 um 16:52 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 25. Dez 2017, 22:10
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.
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#5

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 26. Dez 2017, 18:12
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.
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#6

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 26. Dez 2017, 18:32
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#7

AW: ADO - Datenbank - Nächste Datum verwenden

  Alt 26. Dez 2017, 18:39
Alles, was beim Select an Spalten aufgeführt ist und nicht per Max oder Sum ... zusammengefasst wird, muss auch ins Group By.
select max(prc_valid_since) from prc_Prices = Maximalwert in der Tabelle prc_Prices.

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.

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.

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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 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