Einzelnen Beitrag anzeigen

Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Resultset einer Stored Procedure extern filtern

  Alt 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
  Mit Zitat antworten Zitat