Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 18.03.03 19:47 
Moin,
ich bin jetzt dazu übergegangen eine Stored Procedure für die Berechnung der Gesamtkosten eines Auftrags zu verwenden. Folgendermaßen sieht sie aus:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 19.03.03 11:33 
Hi,

wie wärs mit folgendem:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 19.03.03 11:35 
Hi,

wie wärs mit folgendem:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Mi 19.03.03 12:09 
Titel: Ich wuerde hier den left outer join vermeiden
ausblenden 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.