seltsames Verhalten in CU 423

14. Dezember 2005 16:06

Beim einfügen eines Änderungsprotokollposten (Tabelle 405) wird in der CU
423 Change Log Mng. im Trigger InsertLogEntry eine Funktion ausgeführt,
die den Wert des Feldes "NewValue" prüft.
Diese Prüfung soll bei jedem Insert ausgeführt werden - dies erfolgt aber
leider immer versetzt. D.h. nach Neustart von Navision und dem Durchlauf der Prüfungsroutine geschieht zunächst nichts, aber beim zweiten Druchlauf wird auf den vorherigen Wert geprüft.
In in diesem InsertLogEntry Trigger werden vorher Filter auf TabelNo und TableName gesetzt.

Kann sich jemand dieses Verhalten erklären?

Hier der Code:
Code:
InsertLogEntry(VAR FldRef : FieldRef;VAR xFldRef : FieldRef;VAR RecRef : RecordRef;TypeOfChange : 'Insertion,Modification,Deletion')
ChangeLogEntry.INIT;
ChangeLogEntry."Date and Time" := ROUNDDATETIME(CURRENTDATETIME,1000);
ChangeLogEntry.Time := DT2TIME(ChangeLogEntry."Date and Time");
ChangeLogEntry."User ID" := USERID;
ChangeLogEntry."Table No." := RecRef.NUMBER;
ChangeLogEntry."Field No." := FldRef.NUMBER;
ChangeLogEntry."Type of Change" := TypeOfChange;
IF (RecRef.NUMBER = DATABASE::User) AND (FldRef.NUMBER = 2) THEN BEGIN // Password
  ChangeLogEntry."Old Value" := '*';
  ChangeLogEntry."New Value" := '*';
END ELSE BEGIN
  IF TypeOfChange <> TypeOfChange::Insertion THEN
    ChangeLogEntry."Old Value" := FormatValue(xFldRef,RecRef.NUMBER);
  IF TypeOfChange <> TypeOfChange::Deletion THEN
    ChangeLogEntry."New Value" := FormatValue(FldRef,RecRef.NUMBER);
END;

//bsw1000+
CLEAR(Check_value_rec);
Check_value_rec.SETRANGE(Check_value_rec."Table No.",ChangeLogEntry."Table No.");
Check_value_rec.SETRANGE(Check_value_rec."Field No.",ChangeLogEntry."Field No.");
IF Check_value_rec.FIND('-') THEN BEGIN
  ChangeLogEntry.Prüfwert := Check_value_rec.ValidString;
  MESSAGE('Prüfwert %1',ChangeLogEntry.Prüfwert);
  IF ChangeLogEntry.Prüfwert <> ChangeLogEntry."New Value" THEN
    ERROR(Text000,Check_value_rec.ValidString);
END;
//bsw1000-


Danke schonmal.

redStripe.

15. Dezember 2005 11:04

Da zwischenzeitlich auf mibuso.com die Antwort gegeben wurde, übersetze ich diese hier mal sinngemäß:
kine (übersetzt) hat geschrieben:Dies ist ein bekanntes Problem in allen Navision Versionen, wenn ERROR() aus einem Global Trigger der Codeunit 1 aufgerufen wird. Workaround:

Verwende MESSAGE() um die Fehlermeldung anzuzeigen und anschließend einen leeren ERROR() ...
Code:
  MESSAGE(Text000,Check_value_rec.ValidString);
  ERROR('');


kine (Original) hat geschrieben:It is know issue with all versions of Navision that Error called from global triggers in CU1 (ChangeLog management) has this behavior. Workaround:

Use message for showing the error and after that call empty error...
Code:
  MESSAGE(Text000,Check_value_rec.ValidString);
  ERROR('');

16. Dezember 2005 11:37

danke für die Übersetzung ;-)