![]() |
Re: Artikelpreis zu gegenem Datum
Ich würde den Einsatz einer SP in Betracht ziehen, z.B. so :
SQL-Code:
Da gehts zwar um die Ermittlung der Mwst., aber das dürfte egal sein. Es ist halt datumsgesteuert. Ob Mickysoft-SQL allerdings so was hat wie SELECT FIRST ? :gruebel: In Firebird gibts das auch erst seit vorletzter Version.
ALTER PROCEDURE NETTOSP (
BETRAG DECIMAL(15,2), MWSTSATZ SMALLINT, DATUM DATE) RETURNS ( GESNETTO DECIMAL(15,2)) AS DECLARE VARIABLE MWSTPROZ DECIMAL(15,2); BEGIN SELECT FIRST 1 MWSTWERT FROM MWST WHERE (MWSTSATZ=:MWSTSATZ) AND (ABDATUM <= :DATUM) ORDER BY ABDATUM DESC INTO :MWSTPROZ; IF (MWSTPROZ IS NULL) THEN MWSTPROZ = 0; /* GESNETTO = CAST (BETRAG / (1 + MWSTPROZ / 100) AS DECIMAL (15,2)); */ GESNETTO = BETRAG / (1 + MWSTPROZ / 100); SUSPEND; END |
Re: Artikelpreis zu gegenem Datum
Zitat:
|
Re: Artikelpreis zu gegenem Datum
Zitat:
FB scheint sich mit jedem bisschen was sie von Interbase rausschmeißen zu verbessern. ;) @Topic Eine selectable Procedure wäre hier nun wirklich witzlos, auch wennn SQL ziemlich schnell ziemlich eklig wird, wenn es um Aggregationen geht. (hässlich ist es ja sowieso immer ;) ) Als Erbchleicher wäre wahrscheinlich eine Liste der Ids aller Preise ausreichend um bereits vorher geholte Instanzen der Preise wiederzufinden:
SQL-Code:
Als RADieschen braucht man mehr Spalten, wodurch die Gruppierung aufwendiger wäre als die SubQuery aus Dominiks Beispiel. (MSSQL hatte vor 2005 leider den Hang dazu, SubQueries gerne mal für jeden Datensatz zu neu abzufragen :? )
SELECT p.Id
FROM Artikel a INNER JOIN Preise p ON p.Artikel = a.ID INNER JOIN Preise filter ON p.Artikel = a.ID WHERE filter.Datum <= @Suchdatum GROUP BY p.Id, p.Datum HAVING p.Datum = max(filter.Datum) |
Re: Artikelpreis zu gegenem Datum
Zitat:
|
Re: Artikelpreis zu gegenem Datum
Zitat:
|
Re: Artikelpreis zu gegenem Datum
Zitat:
Ich hab mir als Erstes eine temporäre View erstellt:
SQL-Code:
Für die eigentlich Abfrage greif ich dann über joins auf diese View zu, weil ich noch aus anderen Tabelle etliches Zeusch brauch. Aber im Grunde ist obige temporäre View schon das, was das Problem löst.
create view vwPreiseHeuteTemp
as SELECT fiArtikel, ISNULL(MAX(Datum), GETDATE() AS Datum, EKVK FROM dbo.Preise WHERE (Datum <= GETDATE()) GROUP BY fiArtikel, EKVK HAVING (MAX(Datum) <= GETDATE()) |
Re: Artikelpreis zu gegenem Datum
Du kannst es auch so lösen:
SQL-Code:
Die ORDER BY Klausel macht die Abfrage langsam. Wenn Du einen Clustered Index auf Preise.Datum setzt, ist die Welt aber wieder in Ordnung,weil das ORDER BY dann weggekürzt wird.
Select ID,
Bezeichnung, (select top 1 preis from Preise where Preise.ID = Artikel.ID and Preise.Datum <= '1.1.2006' order by Preise.Datum desc ) from Artikel Das würde ich für die schnellste und einfachste Lösung halten. |
Re: Artikelpreis zu gegenem Datum
Ah, Alzaimar hat mein Beispiel konkretisiert. Und ich habe mal in der richtigen Datenbank nachgeguckt, wie das geht :
Delphi-Quellcode:
PG steht für Artikel-Preisgruppe (extra Tabelle). Ist der Preis direkt dem Artikel zugeordnet, dann gehts noch kürzer. Der bisher gezeigte Code ist IMHO zu kompliziert / unleserlich für den Zweck.
CREATE PROCEDURE ERRECHNEPREIS (
ID_ART INTEGER, PGNR SMALLINT, ABDATUM DATE) RETURNS ( PREIS DECIMAL(15,2)) AS BEGIN SELECT FIRST 1 PREIS FROM ARTPG WHERE (PGNR=:PGNR) AND (ABDATUM <= :ABDATUM) ORDER BY ABDATUM DESC INTO :PREIS; IF (PREIS IS NULL) THEN PREIS = 0; SUSPEND; END^ |
Re: Artikelpreis zu gegenem Datum
@Hansa: Deine Procedure liefert mir aber nur den Preis eines Artikels. Ich brauche aber eine Liste (Resultsut) von allen Artikeln und dem zugehörigem Preis zu gegebenem Datum.
Aber meine Lösung klappt ja mittlerweilen, warum noch lange rumexperimentieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 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 by Thomas Breitkreuz