Benutzer mit den meisten Antworten
Trigger will einfach nicht

Frage
-
Hallo Community,
ich möchte eine Tabelle über einen Trigger updaten.
1. Tabelle: tblRechnungsdetails
Relevante Spalten: RechnDetailsID (Datentyp int identity), RechnDetailsEinzelpreis Datentyp (decimal(18,2))
2. Tabelle: tblAusgaben
Relevanten Spalten: AusgabenID (Datentyp int), AusgabenBetrag (decimal(18,2))
Das soll passieren:
Wenn ein neuer Datensatz in die Tabelle "tblRechnungsdetails" geschrieben wird, dann sollen die ID und der Einzelpreis in die Tabelle "Ausgaben" übernommen werden. Um dies zu realisieren, verwende ich einen INSERT-Trigger. Hier der Code:
ALTER TRIGGER [dbo].[tblRechnungsdetails_INS] ON [dbo].[tblRechnungsdetails] AFTER INSERT AS BEGIN SET NOCOUNT ON DECLARE @id int DECLARE @einzelpreis decimal(10,2) SET @id = (SELECT RechnDetailsID FROM inserted) SET @einzelpreis = (SELECT RechnDetailsEinzelpreis FROM inserted) UPDATE dbo.tblAusgaben SET AusgabenID = @id, AusgabenBetrag = AusgabenBetrag + @einzelpreis END
Das Problem:
Leider passiert aber rein garnicht in der Tabelle "tblAusgaben". Meinem Verständnis nach sollten bei Einfügen eines neuen Datensatzes in die Tabelle "tblRechnungsdetails" die Werte aus den Spalten "RechnDetailsID" und "RechnDetailsIDEinzelpreis" in die jeweiligen Spalten der Tabelle "tblAusgaben" übernommen werden.
Wo liegt hier der Fehler? Hat jemand eine Idee?
Viele Grüße
zachy123
- Bearbeitet zachy123 Freitag, 10. August 2012 10:24
Antworten
-
Grundsätzlich sollte so etwas bei einem Fakturierungslauf berechnet werden und nicht per Trigger.
Ein Trigger wird per Statement aufgerufen, d.h. dein Trigger ist per se schon mal fehleranfällig, da in der virtuellen Tabelle INSERTED mehr als eine Zeile enthalten sein kann.
Zu deinem eigentlichen Problem: Wo sieht die (relationale) Verbindung zwischen Rechnugsdetail und Ausgaben aus? Der UPDATE macht so nämlich gar keinen Sinn. Hier stellt sich ernsthaft die Frage nach der Korrektheit des Datenmodells..
Am ehesten sollte es wohl so aussehen:
ALTER TRIGGER [dbo].[tblRechnungsdetails_INS] ON [dbo].[tblRechnungsdetails] AFTER INSERT AS SET NOCOUNT ON; INSERT INTO dbo.tblAusgaben ( RechnungsID , Summe ) SELECT RechnDetailsID , SUM(RechnDetailsEinzelpreis) FROM INSERTED GROUP BY RechnDetailsID;
btw, eine Rechnungsposition kann auch ein negativer Betrag sein (eine Gutschrift). Die hat in Ausgaben nix zu suchen..- Bearbeitet Stefan HoffmannModerator Freitag, 10. August 2012 10:38
- Als Antwort vorgeschlagen KostjaMVP Freitag, 10. August 2012 11:07
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:56
Alle Antworten
-
Habe gerade selbst das Problem erkannt:
In der UPDATE-Anweisung steht ja überhaupt nicht, wo er das Update ausführen soll. Die WHERE-Klausel fehlt.
Habe die UPDATE-Anweisung nun durch eine INSERT-Anweisung ersetzt, jetzt funktioniert es.
Manchmal sieht man ahlt den Wald vor lauter Bäumen nicht...
-
Grundsätzlich sollte so etwas bei einem Fakturierungslauf berechnet werden und nicht per Trigger.
Ein Trigger wird per Statement aufgerufen, d.h. dein Trigger ist per se schon mal fehleranfällig, da in der virtuellen Tabelle INSERTED mehr als eine Zeile enthalten sein kann.
Zu deinem eigentlichen Problem: Wo sieht die (relationale) Verbindung zwischen Rechnugsdetail und Ausgaben aus? Der UPDATE macht so nämlich gar keinen Sinn. Hier stellt sich ernsthaft die Frage nach der Korrektheit des Datenmodells..
Am ehesten sollte es wohl so aussehen:
ALTER TRIGGER [dbo].[tblRechnungsdetails_INS] ON [dbo].[tblRechnungsdetails] AFTER INSERT AS SET NOCOUNT ON; INSERT INTO dbo.tblAusgaben ( RechnungsID , Summe ) SELECT RechnDetailsID , SUM(RechnDetailsEinzelpreis) FROM INSERTED GROUP BY RechnDetailsID;
btw, eine Rechnungsposition kann auch ein negativer Betrag sein (eine Gutschrift). Die hat in Ausgaben nix zu suchen..- Bearbeitet Stefan HoffmannModerator Freitag, 10. August 2012 10:38
- Als Antwort vorgeschlagen KostjaMVP Freitag, 10. August 2012 11:07
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. August 2012 09:56
-
Hallo zachy123,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.