Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabellenwertfunktion in MSSQL 2008 (https://www.delphipraxis.net/153771-tabellenwertfunktion-mssql-2008-a.html)

Freiwilderer 15. Aug 2010 14:55

Datenbank: MSSQL • Version: 2008 • Zugriff über: ADODB

Tabellenwertfunktion in MSSQL 2008
 
Hallo,

ich benutze gerade zum ersten mal eine Tabellenwertfunktion und bin mir nicht ganz sicher, was ich falsch mache.
hier erstmal kurz der code (den Code habe ich abgeändert, da es nur um den Aufbau geht, also keine Fragen über den Sinn dieser funktion bitte ;D)
SQL-Code:
CREATE FUNCTION [gl].[Get_BelegMwSt]
(
    @FromBelegnr   BIGINT = 0
   ,@TillBeletnr   BIGINT = 99
        ,@MwStSatz     FLOAT
)

RETURNS @ResultTable TABLE(RecID BIGINT, Belegnr BIGINT, BetragNetto FLOAT, BetragBrutto FLOAT)
AS
BEGIN
DECLARE @iRecID    BIGINT
   ,@iBelegnr    BIGINT
   ,@iBetragNetto    FLOAT
   ,@iBetragBrutto FLOAT      

   INSERT INTO @ResultTable (RecID, Belegnr, BetragNetto)
   (SELECT RecID, Belegnr, BetragNetto
      FROM gl.Belege
     WHERE BelegNr >= @FromBelegnr   AND
                BelegNr <= @TillBelegnr                           
   
        --GetMwSt
   UPDATE @ResultTable
      SET BetragBrutto = (SELECT (B.BetragNetto * (100 + @MwStSatz)) /100 
                                 FROM gl.Belege B
                                WHERE B.RecID = @ResultTable.RecID )
   RETURN
So, wenn ich das jetzt richtig versatnden habe, wird eine Temporäre Tabelle mit dem namen @ResultTable angelegt.
da kann man dann daten einfügen und ändern und mit Return wird die komplette tabelle ausgegeben.
Wenn ich aber versuche die Funktion abzuspeichern, kommt die Fehlermeldung:

Meldung 137, Ebene 16, Status 1, Prozedur Get_EPLStatusContradictory, Zeile 80
Die '@ResultTable'-Skalarvariable muss deklariert werden.

Aber ich dachte, das hätte ich mit der Zeile schon erledigt....
RETURNS @ResultTable TABLE(RecID BIGINT, Belegnr BIGINT, BetragNetto FLOAT, BetragBrutto FLOAT)

wäre super, wenn jemand von euch n tipp für mich hätte

mfg

omata 15. Aug 2010 16:21

AW: Tabellenwertfunktion in MSSQL 2008
 
Das sieht soweit alles richtig aus.

Welche Zeile ist den konkret die Zeile 80?

FrankJ28 15. Aug 2010 16:40

AW: Tabellenwertfunktion in MSSQL 2008
 
Hallo,
ich sehe spontan @TillBeletnr als den Übeltäter.
Ciao
Frank

Freiwilderer 16. Aug 2010 07:15

AW: Tabellenwertfunktion in MSSQL 2008
 
hallo,
zeile 80 is quasi die hier
SQL-Code:
 WHERE B.RecID = @ResultTable.RecID )
das is die letzte über dem Return

@ Frank ... leider liegts nich daran, denn ich hab mich da einfach vertippt, als ich das hier rein geschrieben habe, wie gesagt, ging nur um die struktur ;)

aber danke schonmal für die antworten

mfg

edit:

ich hab gerade festgestellt, dass das wohl nur bei dieser Konstruktion auftaucht

UPDATE @ResultTable
SET BetragBrutto = B.BetragNetto * (100 + @MwStSatz)) /100
FROM gl.Belege B
WHERE B.RecID = @ResultTable.RecID

mfg

nochmal edit

habs hinbekommen!
das problem war, dass man das @ResultTable.RecID so nicht schreiben kann, wenn man das aber nich davor geschrieben hat, sagte er, dass das feld nicht gebunden werden kann. Wenn man also die Felder in der TempTabelle anders nennt, funktionierts.

quasi so:
Code:
CREATE FUNCTION [gl].[Get_BelegMwSt]
(
    @FromBelegnr  BIGINT = 0
   ,@TillBeletnr  BIGINT = 99
        ,@MwStSatz FLOAT
)

RETURNS @ResultTable TABLE(RecIDTmp BIGINT, Belegnr BIGINT, BetragNetto FLOAT, BetragBrutto FLOAT)
AS
BEGIN
DECLARE @iRecID   BIGINT
   ,@iBelegnr   BIGINT
   ,@iBetragNetto   FLOAT
   ,@iBetragBrutto FLOAT    

   INSERT INTO @ResultTable (RecIDTmp, Belegnr, BetragNetto)
   (SELECT RecID, Belegnr, BetragNetto
      FROM gl.Belege
     WHERE BelegNr >= @FromBelegnr  AND
                BelegNr <= @TillBelegnr                      
   
        --GetMwSt
   UPDATE @ResultTable
      SET BetragBrutto = B.BetragNetto * (100 + @MwStSatz)) /100 
     FROM gl.Belege B
    WHERE B.RecID = RecIDTmp

   RETURN
mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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