AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Resultset einer Stored Procedure extern filtern
Thema durchsuchen
Ansicht
Themen-Optionen

Resultset einer Stored Procedure extern filtern

Ein Thema von Jelly · begonnen am 12. Jan 2006 · letzter Beitrag vom 13. Jan 2006
Antwort Antwort
Benutzerbild von Jelly
Jelly

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

Resultset einer Stored Procedure extern filtern

  Alt 12. Jan 2006, 10:08
Datenbank: MSSQL • Version: 2000 • Zugriff über: /
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
exec spArtikelPreise null,null,null klappt.

Ich suche was wie
select * from (exec spArtikelPreise null,null,null) where AR_Nr > '10000' Das klappt so natürlich nicht, aber Ihr wisst was ich meine.
  Mit Zitat antworten Zitat
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, 11: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
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: Resultset einer Stored Procedure extern filtern

  Alt 12. Jan 2006, 12:16
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

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

Re: Resultset einer Stored Procedure extern filtern

  Alt 12. Jan 2006, 12:59
@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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Resultset einer Stored Procedure extern filtern

  Alt 12. Jan 2006, 21:18
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 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)

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 ? Das kann doch kaum noch viel sein.
Angehängte Dateien
Dateityp: txt jelly_141.txt (4,6 KB, 6x aufgerufen)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

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

Re: Resultset einer Stored Procedure extern filtern

  Alt 13. Jan 2006, 00:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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