AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Preisanpassung

Ein Thema von Luckner · begonnen am 13. Dez 2022 · letzter Beitrag vom 13. Jan 2023
Antwort Antwort
Seite 4 von 4   « Erste     234   
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#31

AW: Preisanpassung

  Alt 23. Dez 2022, 11:48
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

Geändert von Luckner (23. Dez 2022 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Preisanpassung

  Alt 23. Dez 2022, 12:07
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?
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#33

AW: Preisanpassung

  Alt 23. Dez 2022, 12:24
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
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#34

AW: Preisanpassung

  Alt 23. Dez 2022, 12:47
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
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Preisanpassung

  Alt 23. Dez 2022, 12:59
Und wenn Du da mal die Werte vertauschst? WHERE Bestelldatum >= a.DATUM

Also in etwa so:
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#36

AW: Preisanpassung

  Alt 23. Dez 2022, 13:01
Order by a.Datum, da der gesuchte Satz der Satz sein soll, dessen Datum größer dem Bestelldatum ist.
Wenn es dann noch ein AND a.Datum <= Now gibt, dann kann man zukünftige Änderungen auch schon in Ruhe vorher eingeben, welche dann erst ab dem Stichtag gelten.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#37

AW: Preisanpassung

  Alt 23. Dez 2022, 13:38
Hallo,

Bei SELECT first 1 * FROM ARTIKELPREISE a WHERE 'Bestelldatum' >= a.DATUM AND a.DATUM <= 'NOWAND a.ID_ARTIKEL = 1 order by a.Datum DESC scheint es zu funktionieren. Schließt sich das 'Bestelldatum' >= a.DATUM AND a.DATUM <= 'NOW', mit dem = gleichzeitig auf beiden Seiten, nicht aus?

Luckner
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#38

AW: Preisanpassung

  Alt 13. Jan 2023, 15:00
Habe jetzt folgende Routine geschrieben:

Delphi-Quellcode:
  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;
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'.

Gruß, Luckner
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Preisanpassung

  Alt 13. Jan 2023, 15:40
Du benötigst doch nur das Datum. Warum dann select * from ARTIKELPREISE order by Datum ?

Dazu benötigst Du nur den höchsten Datumswert, da wäre doch eventuell ein select max(Datum) as Datum from ARTIKELPREISE angebracht.

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:
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;
Statt select * from nutze ich immer select Liste der tatsächlich benötigten Spalten from . Warum soll mir die Datenbank 1000ende Werte liefern, wenn ich nur einen oder 4 oder ... benötige?
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;

Geändert von Delphi.Narium (13. Jan 2023 um 15:49 Uhr) Grund: Fehler behoben, keine Gewähr, dass jetzt fehlerfrei ;-)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 05:15 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