Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
Delphi 2007 Professional
|
Re: Resultset einer Stored Procedure extern filtern
12. Jan 2006, 12:04
OK, kompliziert, aber ich hab eine ineffektive Lösung gefunden... Ineffektiv deshalb, weil trotzdem zuerst alle Artikel ermittelt werden, und erst anschliessen die WHERE Clause greift.
Stichwort: Functions im SQL Server. Damit kann man die skurilsten Dinge anstellen:
SQL-Code:
-- Author : Tom Peiffer
--
-- Diese Funktion liefert eine Artikelliste mit dem korrekten Preis zu angegebenem Datum. Es muss angegeben werden, ob
-- der EK Preis (0) oder der VK Preis (1) ausgegeben werden soll. Die Sprache der Artikelbezeichnung muss
-- mit angegeben werden (bislang 'D' oder 'F')
-- Wenn Null in einen Parameter angegeben wird, so wird der Default Wert genommen. Für Datum muss ein Wert angegeben werden
-- Für Datum klappt getdate() nicht da getdate in Funktionen nicht angewendet werden dürfen
--
-- INPUT : @Datum : Das Datum, für das der Preis übernommen werden soll
-- @EKVK : 0 = EK ; 1 = VK (defaul = 1)
-- @LanguageCode : 'D' oder 'F' für die Sprache der Bezeichnung Kurz und Bezeichnung Lang (default = 'D')
-- OUTPUT : Resultset mit allen Artikeln.
-- USE : select * from dbo.ArtikelPreise('2005-01-01',1,'D') where AR_Nr > '20000'
CREATE FUNCTION dbo.ArtikelPreise (@Datum datetime, @EKVK int, @LanguageCode varchar(3))
RETURNS @ArtikelPreise TABLE(AR_ID int, PR_ID int, AR_Nr varchar(50), PR_Preis float, PR_Datum datetime, PR_EKVK int, L_Code varchar(3),
BezeichnungKurz varchar(80), BezeichnungLang varchar(500))
AS
BEGIN
if @EKVK is null begin
set @EKVK = 1
end
if @LanguageCode is null begin
set @LanguageCode = 'D'
end
INSERT @ArtikelPreise
SELECT dbo.Artikel.id AS AR_ID, dbo.Preise.id AS PR_ID, dbo.Artikel.ArtikelNr AS AR_Nr, round(dbo.Preise.Preis/dbo.Preise.Menge,2) AS PR_Preis,
dbo.Preise.Datum AS PR_Datum, dbo.Preise.EKVK AS PR_EKVK, dbo.Language.Code AS L_Code, dbo.ArtikelBezeich.BezeichnungKurz,
dbo.ArtikelBezeich.BezeichnungLang
FROM dbo.Artikel INNER JOIN
dbo.Preise ON dbo.Artikel.ArtikelNr = dbo.Preise.fiArtikel INNER JOIN
dbo.ArtikelBezeich ON dbo.Artikel.ArtikelNr = dbo.ArtikelBezeich.fiArtikel INNER JOIN
dbo.Language ON dbo.ArtikelBezeich.Sprache = dbo.Language.ID INNER JOIN
( SELECT fiArtikel, ISNULL(MAX(Datum), dbo.Datum(@Datum)) AS Datum, EKVK
FROM dbo.Preise
WHERE (Datum <= @Datum)
GROUP BY fiArtikel, EKVK
HAVING (MAX(Datum) <= @Datum)
) pt
ON dbo.Preise.fiArtikel = pt.fiArtikel AND dbo.Preise.Datum = pt.Datum AND
dbo.Preise.EKVK = pt.EKVK
WHERE (dbo.Preise.Datum < @Datum) and pt.EKVK = @EKVK and dbo.Language.Code = @LanguageCode
RETURN
END
|
|
Zitat
|