Juni 24, 2021, 21:30:19

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Trigger Problem mit inserted deleted

Begonnen von Klaus S. aus B, April 26, 2018, 16:15:20

⏪ vorheriges - nächstes ⏩

Klaus S. aus B

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

PhilS

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.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Klaus S. aus B

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

PhilS

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.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Klaus S. aus B

Hallo Phil.

Super, das mit IsNull hat perfekt funktioniert.

Danke!
Klaus