Hallo zusammen,
ich komme mit einem Trigger nicht weiter. Ich nutze die Trigger Funktion, um mir eine "Historie" zu einem DS zu speichern.
Wenn ein neuer DS erstellt wird, trägt ein Trigger "After Insert"  alle Werte des DS in eine "Historie Tabelle" ein.
Wird ein DS geändert, dann trägt ein Trigger "After Update" die alten Werte der Felder, die sich geändert haben, in die "Historie Tabelle" ein, nicht geänderte Felder werden als "" oder Null eingetragen (je nach Datentyp).
Die Werte zum Eintragen ermittle ich mit IIF() Prüfungen.
 AFTER UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	INSERT INTO tbl_DocTransHist ( Doctrans_ID, doc_ID, Date_act, Comment, DocName_ID, Revision, Trns_GAT, Trns_cust, Trns_GSPL, ChgTrans, Changed, ChgBy )
				SELECT Inserted.ID_doctrans, IIf([Inserted].[doc_ID]<>[Deleted].[doc_ID],[Inserted].[doc_ID],Null) AS chgDocID, IIF([inserted].[Date_act]<>[deleted].[Date_act],[inserted].[Date_act],Null) AS chgDateAct, IIf([Inserted].[Comment]<>[Deleted].[Comment],[Inserted].[Comment],'') AS chgCom, IIf([Inserted].[DocName_ID]<>[Deleted].[DocName_ID],[Inserted].[DocName_ID],Null) AS chgDNID, IIf([Inserted].[Revision]<>[Deleted].[Revision],[Inserted].[Revision],'') AS chgRev, Inserted.Trns_GAT, Inserted.Trns_cust, Inserted.Trns_GSPL, Inserted.lastChange, getdate(), SUSER_SNAME()
				FROM Deleted INNER JOIN Inserted ON Deleted.ID_doctrans = Inserted.ID_doctrans;
END
Das klappt hervorragend mit einer Ausnahme: Wenn ich ein Datumfeld habe, das "Null" war (im ursprünglichen DS leer war) und das im geänderten DS ein Datum enthält, schreibt es in die "Historie Tabelle" immer noch "Null".
Es scheint als wäre [inserted].[Date_act] leer.
???
Hat irgendjemand eine Idee was ich falsch mache?
Gruß
Klaus 
			
			
			
				Zitat von: Klaus S. aus B am April 26, 2018, 16:15:20Wenn ich ein Datumfeld habe, das "Null" war (im ursprünglichen DS leer war) und das im geänderten DS ein Datum enthält, schreibt es in die "Historie Tabelle" immer noch "Null".
Es scheint als wäre [inserted].[Date_act] leer.
Nein. Wie du selbst schreibst, hat [deleted].[Date_act] den Wert 
NULL!
NULL ist undefiniert!Folglich ergibt sowohl der Vergleich 
NULL = 'Irgendwas' als auch 
NULL <> 'Irgendwas'  immer nur NULL => 
undefiniert, aber niemals 
Wahr.
			
 
			
			
				Hallo Phil.
OK. Null = undefiniert, aber im Feld in inserted sollte doch ein Datum stehen. Das wäre dann nicht undefiniert und damit müsste die Abfrage 'true' ergeben, oder? 
Oder wie kann ich die Abfrage definieren, dass sie funktioniert? 
Gruß
Klaus 
			
			
			
				Zitat von: Klaus S. aus B am April 27, 2018, 14:09:42OK. Null = undefiniert, aber im Feld in inserted sollte doch ein Datum stehen. Das wäre dann nicht undefiniert und damit müsste die Abfrage 'true' ergeben, oder? 
Du vergleichst NULL (aus 
deleted) mit dem neuen, konkreten Wert (aus 
inserted).
Ergebnis: NULL, weil jeder Vergleich mit NULL auch NULL als Ergebnis hat.
Entweder prüfst du explizit mit 
IS NULL auf NULL, oder du verwendest die 
IsNull()-Funktion (Äquivalent zu 
NZ in Access), um die Nullwerte in ein definiertes Datum, das höchstwahrscheinlich nie in echten Daten vorkommen wird, z.b. 01.01.1900, umzuwandeln.
			
 
			
			
				Hallo Phil.
Super, das mit IsNull hat perfekt funktioniert.
Danke!
Klaus