Autor Beitrag
jo-freaky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 26.06.06 12:43 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 26.06.06 12:57 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mo 26.06.06 20:56 
Du kannst innerhalb des Triggers ja überprüfen, welcher Vorgang angestoßen wurde

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

_________________
Markus Kinzler.
jo-freaky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mo 26.06.06 21:25 
Bein Update solltest du auch new.RENR nehmen, weil du sonst den alten Wert nimmst.

_________________
Markus Kinzler.
jo-freaky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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