Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Resultset einer Stored Procedure extern filtern (https://www.delphipraxis.net/60790-resultset-einer-stored-procedure-extern-filtern.html)

Jelly 12. Jan 2006 10:08

Datenbank: MSSQL • Version: 2000 • Zugriff über: /

Resultset einer Stored Procedure extern filtern
 
In Bezug auf diesen Artikel möchte ich meine Abfrage von aussen eingrenzen.

Ich hab jetzt eine Stored Procedure erstellt, die mir für ein gegebenes Datum eine Liste aller Artikel mit zu dem Zeitpunkt gültigem Datum gibt. Die Stored Procedure klappt an sich wunderbar.

Nur, wie kann ich diese SP jetzt von aussen aufrufen, und noch zusaätzliche Filterbedingungen einbringen, wie z.B. nur Artikel mit einer Artikelnummer > irgendwas.

Hier mal die SP:
SQL-Code:
CREATE procedure spArtikelPreise (@Datum datetime, @EKVK int, @LanguageCode varchar(3))
as

if @Datum is null begin
   set @Datum = dbo.Datum(getdate())
end

if @EKVK is null begin
   set @EKVK = 1
end

if @LanguageCode is null begin
   set @LanguageCode = 'D'
end

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
ORDER BY dbo.Artikel.id
Der Aufruf
SQL-Code:
exec spArtikelPreise null,null,null
klappt.

Ich suche was wie
SQL-Code:
select * from (exec spArtikelPreise null,null,null) where AR_Nr > '10000'
Das klappt so natürlich nicht, aber Ihr wisst was ich meine.

Jelly 12. Jan 2006 11:04

Re: Resultset einer Stored Procedure extern filtern
 
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

Hansa 12. Jan 2006 12:16

Re: Resultset einer Stored Procedure extern filtern
 
Jelly, das ist doch alles viel zu kompliziert. Die Prozedur aus dem anderen Thread kann ich auch mit einer Tabelle joinen, z.B. so :

SQL-Code:
SELECT DISTINCT EAP.PREIS FROM artpg AP JOIN
ERMITTLEARTPREISSP8 (1906,3,'01.01.2006') EAP ON AP.ID_ART < 1906
Und dabei wird definitiv eine Ergebnismenge zurückgeliefert. Guck mal besser in der Richtung. Das Bsp. ist auch als solches angesehen. Ich wollte nur für einen anderen Fall diy Syntax testen. Wenn da jetzt richtige Parameter gesetzt werden und geeignete Where-Klauseln, dann muß das so gehen.

Jelly 12. Jan 2006 12:59

Re: Resultset einer Stored Procedure extern filtern
 
@Hansa: Was ist denn bei Dir ERMITTLEARTPREISSP8, wenn nicht eine eigene Funktion. An deinem Code ist daher nichts anders als an meinem, oder überseh ich da was.

Hansa 12. Jan 2006 21:18

Re: Resultset einer Stored Procedure extern filtern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jelly
@Hansa: Was ist denn bei Dir ERMITTLEARTPREISSP8, wenn nicht eine eigene Funktion.

Das steht doch in dem anderen Thread. Vor allem ist das keine Funktion, sondern eine Stored Procedure. Habe mal auf die schnelle DB gebaut, die das Problem reduziert. Hiermit kriege ich jetzt eine Ergebnismenge :

SQL-Code:
SELECT P.*, A.*,TP.* FROM art8 A,PREIS8 P, TESTPREISSP8 (:DATUM,:ID_ART) TP
WHERE (P.ID_ART = A.ID) ORDER BY ABDATUM DESC
Wenn ich das auf die Schnelle richtig sehe, wird da allerdings noch zuviel zurückgeliefert. 8) Das muß noch eingegrenzt werden, aber mir fällt jetzt nach langem Tag nicht ein wie genau.

Zitat:

Zitat von Jelly
An deinem Code ist daher nichts anders als an meinem, oder überseh ich da was.

Dein Code ist mir viel zu lang. Oder wird da ungefähr dasselbe gemacht wie mit meinen 2 Zeilen ?(bei denen allerdings ca. 1 fehlt) :mrgreen:

Egal, die DB hängt hier dran (mit Test-Datendef.). Für Micky-SQL gibts ja wohl auch so was wie IBExpert. Ist denn hier keiner, der sich mit den ganzen Klammeraffen auskennt ? :shock: Das kann doch kaum noch viel sein.

Jelly 13. Jan 2006 00:33

Re: Resultset einer Stored Procedure extern filtern
 
Hansa, danke für die Mühe, aber mein Problem ist ja mittlerweilen gelöst.

Meine Funktion/Stored Procedure ist deshalb länger, weil da noch ein paar andere Tabellen mit einfliessen. Die Ausführdauer ist minimal, und das bei 10000 Artikel, von denen es in den nächsten 10 Jahren auch nur unwesentlich mehr werden. Meine Lösung klappt, mehr brauchts ja nicht.

OT: ich mag das Wort Mickysoft nicht... Der SQL Server schlägt jeden Firebird/Interbase Server um Längen in jedem Performance Test. Deswegen Microsoft durch den Dreck zu ziehen halt ich für nicht gerade angebracht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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-2025 by Thomas Breitkreuz