Entwickler-Ecke

Datenbanken - [firebird] Trigger zur Summenbildung in anderer Tabelle


jo-freaky - Mo 26.06.06 12:43
Titel: [firebird] Trigger zur Summenbildung in anderer Tabelle
Hi,

ich habe folgendes Problem:

Ich bin dabei ein kleineres Rechnungsprogramm zu schreiben und meine Struktur sieht wie folgt aus:

DB: Firebird Embedded
Tabelle Rechnungen und eine Tabelle Rechnungspositionen
Eine vereinfachte Version der Tabellen
Rechnungen: RENR (PK), KDNR, RESUMME || Rechnungspostionen: RENR (FK), ARTSUMME

Wird eine neue Rechnung erstellt, wird zuerst in der Tab Rechnungen ein neuer Datensatz angelegt und nur das Feld RESUMME bleibt leer. Dannach werden die einzelnen Artikel mit der zugehörigen RENR in Tab REPOS geschrieben.
Genau hier bräuchte ich einen Trigger, der mir after insert, after update und after delete das Ergebnis der Summe von ARTSUMME(tab REPOS) in RESUMME(Rechnungen) speichert.

Hab' versucht einen Lösungsansatz zu schaffen:

SELECT RENR FROM RECHNUNGEN;
SELECT SUM(ARTPREIS) FROM REPOS WHERE RENR='aktuelle RENR'; //????

Ich hoffe mir kann da jemand helfen.

Danke im Vorraus!!!!

Gruß
Johannes


jasocul - Mo 26.06.06 12:57


SQL-Anweisung
1:
2:
3:
update rechnungen
set RESUMME = (SELECT SUM(ARTPREIS) FROM REPOS WHERE repos.RENR='aktuelle RENR')
WHERE rechnungen.RENR='aktuelle RENR'

Man könnte das natürlich auch über ein View lösen. Dann muss die Rechnungssumme nie gespeichert werden.


jo-freaky - Mo 26.06.06 18:00
Titel: funktioniert leider noch nicht ganz
Hi,

erstmal super vielen Dank für die rasante Hilfe!

Mein Trigger sieht jetzt wie folgt aus:


SQL-Anweisung
1:
2:
3:
4:
5:
6:
AS
begin
  update rechnungen  
set RESUMME = (SELECT SUM(ARTSUMME) FROM REPOSITION WHERE reposition.RENR=NEW.RENR)
WHERE rechnungen.RENR=NEW.RENR;
end



diesen habe ich wie o.g. After Insert, Update und Delete.

Probleme macht Delete - wird ein Datensatz gelöscht, wird der Preis nichtmehr neu berechnet - es bleibt also der alte preis stehen.
Des Weiteren würde ich gerne nach einem delete überprüfen, ob überhaupt noch ein DS mit der RENR existiert und wenn nein dann den Wert von RESUMME wieder auf 'Null' setzen.


jasocul - Mo 26.06.06 20:50

IIRC musst du beim Delete als Referenz Old.RENR verwenden. Wenn nichts mehr da ist, sollte das ERgebnis automatisch "Null" sein.


mkinzler - Mo 26.06.06 20:56

Du kannst innerhalb des Triggers ja überprüfen, welcher Vorgang angestoßen wurde


SQL-Anweisung
1:
if (deleting) ...                    


jo-freaky - Mo 26.06.06 21:22

Jou, bin ich jetzt auch druafgekommen ;-)

Danke, es ist genauso wie du sagst jasocoul.
Ich muss aber doch Bei Delete und Update Old.RENR als Referenz verwenden, weil es doch nur beim Insert eine New.RENR gibt oder??

Vielen Dank!

Gruß
Johannes


mkinzler - Mo 26.06.06 21:25

Bein Update solltest du auch new.RENR nehmen, weil du sonst den alten Wert nimmst.


jo-freaky - Mo 26.06.06 21:37

sorry war gerade ein denkfehler - da habe ich auch in new.renr.

Also mir wurde von euch bestens geholfen, von mir aus könnt ihr den thread closen.

Thx a lot!!!


Gruß
Johannes