eb-stefan
Goto Top

Mit MS-SQL-Trigger ein Wert in eine andere Tabelle übertragen

Hallo zusammen,
ich habe ein kleines Problem. Ich habe 2 Tabellen die 1:n verknüpft sind.

Aufträge zu Liefertermine

Es gibt zu jedem Auftrag mehrere Termine. Ich will in der Tabelle vom Auftrag immer den frühestmöglichen Termin haben. Das wollte ich über ein Trigger machen... nur wie?

Ich hätte mir so etwas gedacht:

CREATE TRIGGER LieferterminGeaendert ON Liefertermine
AFTER UPDATE


BEGIN

SELECT TOP 1 @new_liefertermin = Liefertermin
FROM Liefertermine
WHERE Erledigt = 0 AND Auftragsnummer = ???
ORDER BY Liefertermin ASC;
Update Auftragsdaten SET NaechsterLiefertermin = @new_liefertermin WHERE Auftragsnummer = ???


END


Mein Problem: Es geht einfach nicht, wie mach ich denn die Zugriff auf den aktuellen DS der Liefertermine (um die Auftragsnummer zu bekommen) und wie übergebe ich dann den "errechneten" Liefertermin an die Auftragsdaten (so wie im moment mit @new_liefertermin versucht).

Ich denke das das Problem ganz simpel ist nur irgendwie komm ich hier nicht so richtig weiter...

Gruß
Stefan

Content-ID: 265000

Url: https://administrator.de/contentid/265000

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

MadMax
Lösung MadMax 02.03.2015 aktualisiert um 13:31:59 Uhr
Goto Top
Hallo Stefan,

Zugriff auf den aktuell geänderten Datensatz erhältst Du über die nur im Trigger vorhandenen Tabellen inserted und deleted, die alle eingefügten und gelöschten Datensätze enthalten. Bei einem insert-Befehl ist nur inserted gefüllt, bei einem delete-Befehl nur deleted und bei einem update sind die alten DS in deleted und die neuen in inserted, wobei die beiden Tabellen immer so aussehen von den Spalten her, wie die Tabelle oder Sicht, für die der Trigger definiert ist.

Wenn Du nur einen DS änderst, dann wäre so ein "SELECT TOP 1 @new_liefertermin = Liefertermin" noch ok, aber sobald mehrere DS vom update betroffen sind, mußt Du das anders machen. Für Deinen Trigger müßte folgender Befehl passen (ungetestet, mangels Tabellen):
update	Auftragsdaten
set	NaechsterLiefertermin = (select top (1) Liefertermin from Liefertermine where Auftragsnummer = a.Auftragsnummer and Erledigt = 0 order by Liefertermin)
from	Auftragsdaten a
	join (select distinct Auftragsnummer from inserted) i on i.Auftragsnummer = a.Auftragsnummer

Zur Erläuterung:
Ändern willst Du die Tabelle Auftragsdaten, und zwar alle Aufträge, die vom Update betroffen sind. Dabei reicht es, die betroffenen Aufträge einmal festzustellen (select distinct Auftragsnummer from inserted). Der Wert, der dann im set NaechsterLiefertermin verwendet wird, ist dann Dein select top 1 ..., wobei immer die passene Auftragsnummer eingesetzt wird.

Gruß, Mad Max
EB-Stefan
EB-Stefan 02.03.2015 um 13:32:42 Uhr
Goto Top
Danke! Ich war ja schon auf der richtigen Spur face-smile Der Trigger wird auch immer nur von einem DS angsprochen, das kommt dann über die Maske!