AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Tabellenwertfunktion in MSSQL 2008
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellenwertfunktion in MSSQL 2008

Ein Thema von Freiwilderer · begonnen am 15. Aug 2010 · letzter Beitrag vom 16. Aug 2010
Antwort Antwort
Freiwilderer

Registriert seit: 26. Mai 2009
163 Beiträge
 
Delphi 7 Enterprise
 
#1

Tabellenwertfunktion in MSSQL 2008

  Alt 15. Aug 2010, 15:55
Datenbank: MSSQL • Version: 2008 • Zugriff über: ADODB
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

Geändert von mkinzler (15. Aug 2010 um 15:58 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Tabellenwertfunktion in MSSQL 2008

  Alt 15. Aug 2010, 17:21
Das sieht soweit alles richtig aus.

Welche Zeile ist den konkret die Zeile 80?
  Mit Zitat antworten Zitat
FrankJ28

Registriert seit: 7. Apr 2008
211 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Tabellenwertfunktion in MSSQL 2008

  Alt 15. Aug 2010, 17:40
Hallo,
ich sehe spontan @TillBeletnr als den Übeltäter.
Ciao
Frank
"Sage was du tust, und tue was du sagst"
Johannes Rau
  Mit Zitat antworten Zitat
Freiwilderer

Registriert seit: 26. Mai 2009
163 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Tabellenwertfunktion in MSSQL 2008

  Alt 16. Aug 2010, 08:15
hallo,
zeile 80 is quasi die hier
 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

Geändert von Freiwilderer (16. Aug 2010 um 08:57 Uhr)
  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 23:59 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