collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 61
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13996
  • stats Beiträge insgesamt: 66787
  • stats Themen insgesamt: 9006
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Trigger Problem mit inserted deleted  (Gelesen 457 mal)

Offline Klaus S. aus B

  • Access-Profi
  • **
  • Beiträge: 237
Trigger Problem mit inserted deleted
« am: April 26, 2018, 16:15:20 »
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
 

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 347
    • Tipps zu Access, VBA, SQL und Co.
Re: Trigger Problem mit inserted deleted
« Antwort #1 am: April 27, 2018, 13:27:18 »
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.
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.
Neues Access 2019 Feature angekündigt: Modern Charts
 

Offline Klaus S. aus B

  • Access-Profi
  • **
  • Beiträge: 237
Re: Trigger Problem mit inserted deleted
« Antwort #2 am: April 27, 2018, 14:09:42 »
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
 

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 347
    • Tipps zu Access, VBA, SQL und Co.
Re: Trigger Problem mit inserted deleted
« Antwort #3 am: April 27, 2018, 14:47:26 »
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?
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.
Neues Access 2019 Feature angekündigt: Modern Charts
 
Folgende Mitglieder bedankten sich: Klaus S. aus B

Offline Klaus S. aus B

  • Access-Profi
  • **
  • Beiträge: 237
Re: Trigger Problem mit inserted deleted
« Antwort #4 am: Mai 03, 2018, 15:46:48 »
Hallo Phil.

Super, das mit IsNull hat perfekt funktioniert.

Danke!
Klaus