AW: Preisanpassung
Jetzt bitte noch eine Hilfestellung,
habe jetzt eine neue Tabelle, mit Artikel_ID, Grundpreis und Datum, in die Datenbank eingesetzt. Jezt fehlt mir eine Idee, aus welchem Datumabschnitt ich den Preis nehmen soll. Als Kriterium ist das Bestelldatum des Auftrages. Bei nur einer Preisanpassung ist das kein Problem. Würde ich ein 'SELECT * FROM ARTIKELPREISE a WHERE a.DATUM > Bestelldatum AND a.ARTIKELNR = Artikelnr' machen. Bei mehreren Preisanpassungen habe ich dann zu jedem Artikel mehrere Datum in der Tabelle. Bei alten Aufträgen müsste ich den richtigen Preis aus dem entsprechendem Zeitraum nehmen. Da fehlt mir die Idee. Gruß, Luckner |
AW: Preisanpassung
SQL-Code:
SELECT first 1 * FROM ARTIKELPREISE a WHERE a.DATUM > Bestelldatum AND a.ARTIKELNR = Artikelnr order by a.Datum
First 1, da Du nur einen Datensatz als Ergebnis haben möchtest. Order by a.Datum, da der gesuchte Satz der Satz sein soll, dessen Datum größer dem Bestelldatum ist. Was ist, wenn am Tag der Bestellung auch eine Preisanpassung stattfand? Also z. B. Bestellung am 01.06.2022 und Preisanpassung am 01.06.2022. Damit würden dann die Preise, die bis zum 31.05.2022 gültig waren, auch für die Bestellung am 01.06.2022 herangezogen. Müsste es von daher nicht a.Datum >= Bestelldatum heißen? |
AW: Preisanpassung
Ja, hast Du recht. Bin davon ausgegangen, dass solche Anpassungen immer zum 01.01. gemacht werden und an diesem Tage Keiner arbeitet. Aber ja, Dein Vorschlag ist besser.
Gruß, Luckner |
AW: Preisanpassung
Hallo Delphi.Narium,
jetzt sehe ich noch einen Logig-Fehler. Bei ' ... WHERE a.DATUM > Bestelldatum ...'. Bestelldatum ist immer > als a.DATUM. Das Ergebnis dieser Abfrage wäre leer. Gruß, Luckner |
AW: Preisanpassung
Und wenn Du da mal die Werte vertauschst?
SQL-Code:
WHERE Bestelldatum >= a.DATUM
Also in etwa so:
SQL-Code:
SELECT first 1 * FROM ARTIKELPREISE a WHERE Bestelldatum >= a.Datum AND a.ARTIKELNR = Artikelnr order by a.Datum desc
First 1, da Du nur einen Datensatz als Ergebnis haben möchtest. Order by a.Datum desc, da der gesuchte Satz der Satz sein soll, bei dem das Datum das größte Datum ist, welches kleiner oder gleich dem Bestelldatum ist. |
AW: Preisanpassung
Zitat:
SQL-Code:
gibt, dann kann man zukünftige Änderungen auch schon in Ruhe vorher eingeben, welche dann erst ab dem Stichtag gelten.
AND a.Datum <= Now
|
AW: Preisanpassung
Hallo,
Bei
Delphi-Quellcode:
scheint es zu funktionieren. Schließt sich das 'Bestelldatum' >= a.DATUM AND a.DATUM <= 'NOW', mit dem = gleichzeitig auf beiden Seiten, nicht aus?
SELECT first 1 * FROM ARTIKELPREISE a WHERE 'Bestelldatum' >= a.DATUM AND a.DATUM <= 'NOW' AND a.ID_ARTIKEL = 1 order by a.Datum DESC
Luckner |
AW: Preisanpassung
Habe jetzt folgende Routine geschrieben:
Delphi-Quellcode:
Routine funktioniert soweit. Ich frage mich nur, ob man es besser schreiben kann. Benutze jetzt 2 Datasets, aber es geht möglicherweise auch im einem Dataset und einem 'insert-Befehl'.
Faktor := 1 + StrToFloat(JvEditPreiszuschlag.Text)/100; //Preiszuschlag ist in % für alle Artikel
ShowMessage('Faktor ist ' + FloatToStr(Faktor)); DatamoduleArtikel.DataModule1.IBDatabaseArtikel.Connected := False; //Hier wird das Datum der letzten Preiserhöhung ermittelt DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Close; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SelectSQL.Clear; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SelectSQL.Add('select * from ARTIKELPREISE order by Datum'); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Open; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Last; DatumPreiserhoehung := DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGridDATUM.AsDateTime; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Close; ShowMessage('Datum der letzten Preisehöhung ist ' + DateToStr(DatumPreiserhoehung)); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SelectSQL.Clear; //Alle Artikelpreise seit der letzten Preisanpassung ermitteln DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SelectSQL.Add('select * from ARTIKELPREISE WHERE DATUM = ' + QuotedStr(DateToStr(DatumPreiserhoehung)) + ' ORDER BY ARTIKELNR'); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Open; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.FetchAll; ShowMessage('Anzahl der Datensätze ist ' + IntToStr(DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.RecordCount)); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.First; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreise.Open; for i := 0 to DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.RecordCount -1 do begin DatamoduleArtikel.DataModule1.IBDataSetArtikelpreise.Append; //Tabelle mit neuen Preisen ergänzt DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseID_ARTIKEL.AsInteger := DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGridID_ARTIKEL.AsInteger; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseARTIKELNR.AsString := DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGridARTIKELNR.AsString; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGRUNDPREIS.AsFloat := DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGridGRUNDPREIS.AsFloat * Faktor; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseDATUM.AsDateTime := StrToDate(JvDateDatePreisanpassung.Text); //ShowMessage('Neuer Preis ist ' + FloatToStr(DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGRUNDPREIS.AsFloat)); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreise.Post; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.Next; end; if DatamoduleArtikel.DataModule1.IBTransactionArtikel.InTransaction then DatamoduleArtikel.DataModule1.IBTransactionArtikel.Commit; Gruß, Luckner |
AW: Preisanpassung
Du benötigst doch nur das Datum. Warum dann
SQL-Code:
?
select * from ARTIKELPREISE order by Datum
Dazu benötigst Du nur den höchsten Datumswert, da wäre doch eventuell ein
SQL-Code:
angebracht.
select max(Datum) as Datum from ARTIKELPREISE
QuotedStr ist für Pascal/Delphi, aber (eigentlich) nicht für SQL, auch wenn's da meist klappt, da scheint mir der Verwendung von Parametern eher angebracht.
Delphi-Quellcode:
Statt
DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SelectSQL.Add('select ID_ARTIKEL, ARTIKELNR, GRUNDPREIS, DATUM from ARTIKELPREISE WHERE DATUM = :datum ORDER BY ARTIKELNR');
DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.ParamByName('Datum').AsDateTime := DatumPreiserhoehung;
SQL-Code:
nutze ich immer
select * from
SQL-Code:
. Warum soll mir die Datenbank 1000ende Werte liefern, wenn ich nur einen oder 4 oder ... benötige?
select Liste der tatsächlich benötigten Spalten from
Und weiterer Vorteil: Wenn mal wer die Datenbankstruktur ändert und es gibt eine Spalte nicht mehr, so erhalte ich hier einen entsprechenden, verständlichen SQL-Fehler und nicht irgendwo eine Schutzverletzung, wenn z. B. ein persistentes Feld noch Nil ist oder sowas in der Richtung. Und den Inhalt von neuen Spalten, den ich im Programm nicht benötige, muss mir die Datenbank auch nicht liefern ;-) Keine Ahnung, ob (mit Deinen Datenbankkomponenten und FireBird zusammen) sowas sinngemäß funktionieren könnte:
Delphi-Quellcode:
DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.SQL.Add('insert into ARTIKELPREISE select ID_ARTIKEL, ARTIKELNR, GRUNDPREIS * :faktor as GRUNDPREIS, :datum_neu as DATUM from ARTIKELPREISE where datum = :datum');
DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.ParamByName('datum').AsDateTime := DatumPreiserhoehung; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.ParamByName('datum_neu').AsDateTime := StrToDate(JvDateDatePreisanpassung.Text); DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.ParamByName('faktor').AsFloat := faktor; DatamoduleArtikel.DataModule1.IBDataSetArtikelpreiseGrid.ExecSQL; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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