Entwickler-Ecke

Datenbanken - IB: Stored Procedure zur Berechnung


UGrohne - Di 18.03.03 19:47
Titel: IB: Stored Procedure zur Berechnung
Moin,
ich bin jetzt dazu übergegangen eine Stored Procedure für die Berechnung der Gesamtkosten eines Auftrags zu verwenden. Folgendermaßen sieht sie aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
CREATE PROCEDURE auftragskosten(anr integer)
RETURNS (auftragssumme integer) AS
DECLARE VARIABLE summe integer;
DECLARE VARIABLE preis integer;
DECLARE VARIABLE menge integer;
DECLARE VARIABLE anrtemp integer;
BEGIN
summe=0;
FOR SELECT art.e_preis, pos.menge, pos.anr
    FROM positionen pos
    LEFT OUTER JOIN artikel art ON pos.artikel=art.artnr
    WHERE (pos.anr=:anr)
    INTO :preis, :menge, :anrtemp
DO
    summe=summe+(preis*menge);
    END;
:auftragssumme=:summe;
END;


Sie funktioniert, außer dass ich einen Fehler bekomm, wenn ich das oben ausführe (Listenindex ausserhalb gültigen Bereichs, oder so), aber sie ist richtig da.

Wenn ich sie jetzt aber ausführe, bekomme ich ein leeres Ergebnis zurück. Warum? Hab auch schon auftragssumme und summe ohne : gehabt, ist auch nix anderes. Wer kann mir den erlösenden Tipp geben?

Gruß


Lemmy - Mi 19.03.03 11:33
Titel: Re: IB: Stored Procedure zur Berechnung
Hi,

wie wärs mit folgendem:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
CREATE PROCEDURE auftragskosten(anr integer)
RETURNS (auftragssumme integer) AS

BEGIN

FOR SELECT SUM(art.e_preis*pos.menge)
    FROM positionen pos
    LEFT OUTER JOIN artikel art ON pos.artikel=art.artnr
    WHERE (pos.anr=:anr)
    INTO :auftragssumme
DO
  SUSPEND;
    END
END^


1. Die Summe müsste jetzt auch so berechnet werden können.

2. Um Daten von der SP an die aufrufende Stelle zu übertragen wird ein SUSPEND; oder EXIT; benötigt!!!

Grüße
Lemmy


Lemmy - Mi 19.03.03 11:35
Titel: Re: IB: Stored Procedure zur Berechnung
Hi,

wie wärs mit folgendem:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
CREATE PROCEDURE auftragskosten(anr integer)
RETURNS (auftragssumme integer) AS

BEGIN

FOR SELECT SUM(art.e_preis*pos.menge)
    FROM positionen pos
    LEFT OUTER JOIN artikel art ON pos.artikel=art.artnr
    WHERE (pos.anr=:anr)
    INTO :auftragssumme
DO
  SUSPEND;
    END
END^


1. Die Summe müsste jetzt auch so berechnet werden können.

2. Um Daten von der SP an die aufrufende Stelle zu übertragen wird ein SUSPEND; oder EXIT; benötigt!!!

Grüße
Lemmy


delphiDeveloper - Mi 19.03.03 12:09
Titel: Ich wuerde hier den left outer join vermeiden

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
CREATE PROCEDURE auftragskosten(anr integer) 
RETURNS (auftragssumme integer) AS 

BEGIN 

FOR SELECT SUM(art.e_preis*pos.menge) 
    FROM positionen pos , artikel art
    WHERE (pos.anr=:anr) and (pos.artikel=art.artnr)
    INTO :auftragssumme 
DO 
  SUSPEND; 
    END 
END^


Da ein Fulljoin viel schneller ist, würde ich hier den Left Outer Join vermeiden.