Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stored Procedure innerhalb anderer SP (https://www.delphipraxis.net/70512-stored-procedure-innerhalb-anderer-sp.html)

Hansa 31. Mai 2006 11:45

Datenbank: FB • Version: 1.5 • Zugriff über: FIBPlus

Stored Procedure innerhalb anderer SP
 
Hi,

Zuerst die SP :

SQL-Code:
CREATE PROCEDURE TESTPREISSP8 
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006')
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
   do
  suspend;
end^
Die liefert eine Datenmmenge zurück, die eben nur durch ID <= 111 eingeschränkt ist. Die innere SP ERMITTLE_ARTPREIS hat einen Rückgabewert PREIS und der steht immer auf 0. Lasse ich die einzeln laufen, dann wird der richtige Wert angezeigt. Allerdings sieht es so aus, daß der Wert Preis auf einem Wert stehenbleibt. Vorhin hat mit anderem WHERE überall als Preis 13,44 drin gestanden. Was ist da falsch ?

marabu 31. Mai 2006 12:05

Re: Stored Proceduree immerhalb anderer SP
 
Hallo Hansa,

das ist der seltsamste JOIN, den ich jemals gesehen habe. Führe doch SELECT und den Aufruf der inneren SP hintereinander aus.

Grüße vom marabu

jensw_2000 31. Mai 2006 12:11

Re: Stored Proceduree immerhalb anderer SP
 
Der Code von "Ermittle_ArtPreis" ist nicht uninteressant um den Fehler zu finden :o)

Ein direkter JOIN wäre ihmo am Besten.
Falls der Code in ERMITTLE_ARTPREIS sehr komplex ist, und du ihn auslagern möchtest, dann ist aus meiner Sicht eine eine UDF für diesen Zweck angebrachter.

Variante 1: (bei "relativ" wenigen Artikeln)
SQL-Code:
CREATE FUNCTION Ermittle_Artpreis
(
  Zeitpukt DATETIME
)
RETURNS TABLE
AS
SELECT ID,ArtNr,Preis FROM ... bla
Das Ganze dann mit deinem äußeren SELECT Joinen.

Variante 2: (bei "relativ" vielen Artikeln)

SQL-Code:
FUNCTION Get_ARTPREIS
(
  @ID INT,
  @Zeitpukt DATETIME
)
RETURNS MONEY
AS
RETURN
SELECT TOP 1 Preis FROM ... bla
WHERE ID = @ID
      AND
      @Zeitpunkt BETWEEN Preis_Startdatum AND Preis_EndDatum
[/sql]

verwenden:

SQL-Code:
SELECT ID,ArtNr,Preis FROM ... bla

SELECT ID, NR, BEZ, dbo.Get_ARTPREIS ('01.01.2006') FROM Artikel
WHERE ...
/ EDIT : UDF berbessert

Hansa 31. Mai 2006 12:13

Re: Stored Proceduree immerhalb anderer SP
 
Zitat:

Zitat von marabu
das ist der seltsamste JOIN, den ich jemals gesehen habe.

Habe mich selber gewundert, daß überhaupt was kam und zwar ohne Fehlermeldung. :lol: Das ist doch schon mal gut, oder geht das so doch nicht ? :gruebel:


Zitat:

Zitat von marabu
Führe doch SELECT und den Aufruf der inneren SP hintereinander aus.

Wie Du meinen ? :shock: Die SP braucht ja die ID um den richtigen Preis zu errechnen, was so aber noch nicht richtig ist.

marabu 31. Mai 2006 12:24

Re: Stored Procedure innerhalb anderer SP
 
Zitat:

Zitat von Hansa
Wie Du meinen ?

Hier kommt die Langfassung zu meinem Beitrag:

Du machst ein SELECT auf ART und ein singleton SELECT auf ERMITTLE_ARTPREIS. Dein JOIN bildet das kartesische Produkt - das singleton result wird nie mehr verändert und bezieht sich immer auf den Zufallswert von ID, bevor du die Variable in der INTO-Klausel befüllst. Klappen tut es schon, aber es tut nicht was du willst.

Kannst du nicht erst dein SELECT FROM ART INTO machen und anschließen über das dann determinierte ID deine SP aufrufen?

marabu

alex517 31. Mai 2006 12:45

Re: Stored Procedure innerhalb anderer SP
 
Hi Hansa,

versuchs doch mal damit
SQL-Code:
CREATE PROCEDURE TESTPREISSP8 
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select A.ID, A.NR, A.BEZ, P.PREIS
    from
      ART A
      join ERMITTLE_ARTPREIS (A.ID, 5, '01.01.2006') P on (1=1)
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
  do
    suspend;
end^
alex

Hansa 31. Mai 2006 15:21

Re: Stored Procedure innerhalb anderer SP
 
@jens : hier die SP

SQL-Code:
CREATE PROCEDURE TESTPREISSP8 (
    ID_ART INTEGER,
    ABDATUM DATE)
RETURNS (
    PREIS DECIMAL(15,2))
AS
BEGIN
  SELECT FIRST 1 PREIS FROM ART WHERE
    (ID_ART = :ID_ART) AND (ABDATUM <= :ABDATUM)
  ORDER BY ABDATUM DESC INTO :PREIS;
  IF (PREIS IS NULL) THEN PREIS = 0;
  SUSPEND;
END^
@Marabu : Du meinst ein "Select from select from select" in der Richtung, oder was ?

@Alex : wie es aussieht ist das genau das, wie ich das eigentlich vorhatte.

Aktuell hat sich allerdings noch herausgestellt, daß es auch gut wäre, ein Anfangs- und Enddatum zu haben, also BETWEEN. Wie ich das sehe, wäre der Join mit der SP dann eher ein Umweg. Muß das alles jetzt erst mal testen. Und daß solch "seltsamer Code" geht, das weiß ich ! Aber nicht mehr wie genau. :mrgreen:

Noch eine Frage
Zitat:

Zitat von alex517
on (1=1)

Was hat es damit genau auf sich ?

alex517 31. Mai 2006 15:45

Re: Stored Procedure innerhalb anderer SP
 
Zitat:

Zitat von Hansa
Noch eine Frage
SQL-Code:
on (1=1)
Was hat es damit genau auf sich ?

Join-Syntax:
JOIN <tableref> ON <search_condition>

und da <search_condition> nun mal verlangt wird, kommt da auch eine hin (1=1) ;-)

alex

Hansa 31. Mai 2006 15:59

Re: Stored Procedure innerhalb anderer SP
 
Also praktisch nur Dummy-Funktion ? :shock: Dein Code geht übrigens ! Mit folgender Änderung :

SQL-Code:
    from
      ART A left join...
Verstehe zwar nicht wieso, aber so gehts. Noch weniger verstehe ich allerdings, wieso mein Anfangscode nicht ging. 8)

sancho1980 10. Jun 2006 23:54

Re: Stored Procedure innerhalb anderer SP
 
SQL-Code:
CREATE PROCEDURE TESTPREISSP8 
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006')
    where (ID <= 111)
    into :ID,:NR,:BEZ, :PREIS
   do
  suspend;
end^
Ich schätze hier liegt eine Verwechslung vor zwischen ID und ID.
Da steht ERMITTLE_ARTPREIS (ID,5,'01.01.2006'): Das ID bezieht sich aber auf den Rückgabeparameter ID und nicht auf das ID, das du aus ART liest. Eigentlich müsste da zwar noch ein Doppelpunkt davor stehen, aber der Compiler beschwert sich oftmals trotzdem nicht. Hab ich mir auch schon paar mal die Zähne ausgebissen...
Was du wolltest, war wohl eher:

SQL-Code:
CREATE PROCEDURE TESTPREISSP8 
RETURNS (
    ID INTEGER,
    NR INTEGER,
    BEZ CHAR(30),
    PREIS DECIMAL(15,2))
AS
begin
  for
    select ID, NR, BEZ from ART
    where (ID <= 111)
    into :ID,:NR,:BEZ
   do
     begin
       select PREIS from ERMITTLE_ARTPREIS(:ID,5,'01.01.2006') into :PREIS;
       suspend;
     end
end^


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.
Seite 1 von 2  1 2      

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