FIELDNO bei änderungen Dokumentieren

31. März 2006 12:16

Hallo,

ich möchte in einer Änderungshistorie (Tabelle) gerne die FIELDNO speichern in der etwas Verändert wurde.

Da ich nicht auf jedem Feld Code Programmieren möchte, frage ich Euch, ob Ihr eine Möglichkeit kennt, mit der ich den gesamten Record überwachen kann?

Gruß Mikka

31. März 2006 12:29

Ich sehe, dass Du noch mit einer 2.x-Version arbeitest. Da ist das nicht so schön möglich zu lösen, wie es Version 4.0 anbietet. Dort gibt es im Standard die ChangeLog-Funktion, die wahlweise ein Logging für jedes beliebige Feld zulässt. In der Einrichtung kann das pro Mandant bestimmt werden.

Ich musst diese Anforderung früher auch einmal umsetzen auf einer Version 2.6. Der einzig mögliche war ein Funktionsaufruf im OnModify-Trigger der betroffenen Tabelle für ein Logging. Dabei wird aber immer der gesamte Record weggeschrieben, so in der Art:

Code:
COMMIT;

AdressLog.SETRANGE(Nummer, Adresse.Nummer);
IF AdressLog.FIND('+') THEN NeueLaufNr := AdressLog."Laufnr." + 10000
ELSE                        NeueLaufNr := 10000;

CLEAR(AdressLog);
AdressLog.Nummer := Adresse.Nummer;
AdressLog."Laufnr." := NeueLaufNr;
AdressLog.INSERT;

AdressLog.TRANSFERFIELDS(Adresse, FALSE);

AdressLog.Datum := TODAY;
AdressLog.Zeit := TIME;
AdressLog.Benutzer := USERID;

AdressLog.MODIFY;


Version 4.0 löst das eleganter mit globalen OnModify und OnInsert-Triggern in der Codeunit 1, die automatisch aufgerufen werden und das Loggen auslösen.

Ich glaube sogar (bin mir aber nicht sicher), das in Version 2.x der OnModify-Trigger mehrmals aufgerufen wird (1x pro geändertes Feld).

Für Dein Problem würde sich ein technisches Upgrade auf 4.0 auf jeden Fall empfehlen. Dann könntest Du die Logging-Funktion pfannenfertig 1:1 übernehmen und in Deine 2.x einbauen

31. März 2006 12:59

rotsch hat geschrieben:Der einzig mögliche war ein Funktionsaufruf im OnModify-Trigger der betroffenen Tabelle für ein Logging. Dabei wird aber immer der gesamte Record weggeschrieben, so in der Art:


Danke für den Beitrag:
Da ich für mehrere Tabellen ein Logging erstellen möchte, würde ich den Befehl TRANSFERFIELDS weglassen.
Aber dann habe ich das Problem, das ich nicht weiß auf welchem Feld etwas geändert wurde!

Gibt es eine Möglichkeit festzustellen welches Feld geändert wurde?
Gruß Michael

31. März 2006 13:09

Ich denke, dann musst du den mühsamen Weg gehen und Feld für Feld vergleichen im OnModify - Trigger, so in der Art

Code:
IF Rec.Feldname <> xRec.Feldname THEN
  loggen...


Also auf dem gleichen Weg, wie das bei Synchronisation zwischen Adresse, Debitor und Kreditor gemacht wird

31. März 2006 13:18

:shock:

Genau das was ich eigentlich nicht will!
Aber ich habe soetwas vermutet.
Gruß Mikka

31. März 2006 13:28

Ja, da würde ich mich auch mit Händen und Füssen dagegen wehren :wink:

Wie gesagt, nach einem technischen Upgrade der Lösung wäre dies viel eleganter zu handhaben.

Hier ein Codebeispiel:
Code:
LogModification(VAR RecRef : RecordRef;VAR xRecRef : RecordRef)

IF NOT IsLogActive(RecRef.NUMBER,0,1) THEN
  EXIT;
FOR i := 1 TO RecRef.FIELDCOUNT DO BEGIN
  FldRef := RecRef.FIELDINDEX(i);
  xFldRef := xRecRef.FIELDINDEX(i);
  IF IsNormalField(RecRef.NUMBER,FldRef.NUMBER) THEN
    IF FORMAT(FldRef.VALUE) <> FORMAT(xFldRef.VALUE) THEN
      IF IsLogActive(RecRef.NUMBER,FldRef.NUMBER,1) THEN
        InsertLogEntry(FldRef,xFldRef,RecRef,1);
END;


Mit einer Funktion lassen sich alle Tabellen und Felder abhandeln

31. März 2006 17:47

Wäre es denn bei euch möglich, zumindest ein technisches Update auf 4.0 (also nur die Programmdateien, nicht die Datenbank) durchzuführen?
Dann könntest du wenigstens die komfortable Funktionalität in die 2.x Datenbank portieren.
Ich vermute, dass wäre die einfachere und günstigere Lösung.

1. April 2006 10:03

Danke für Eure Beiträge.
Da ich in der V2.6 sehr aufwendig Arbeiten müsste um alle gewünschten Fekder zu Protokollieren und wir seit ca. 1 Monat die 4.0 Lizenz haben, werde ich das technische Update in Erwägung ziehen. (Ist je keine große Sache!).
Aber nicht vor Mai, da ich keine Zeit habe!
Wenn es soweit ist, werde ich auf diesen Beitrag zurückkommen, falls ich nicht zurechtkommen sollte!
Gruß Mikka