Generische Anzeige von Änderungsprotokollposten

Häufig muss der Administrator umständlich schauen, wer, wann welche Daten im System erstellt, geändert oder gelöscht hat. Navision stellt hierzu im Standard die konfigurierbare Aufzeichnung von Datenänderungen zur Verfügung. Was aber fehlt, ist die Möglichkeit diese Änderung an der Stelle anzeigen zu lassen, die den Anwender interessiert. Neben den datenschutzrechtlichen Belangen, auf die ich an dieser Stelle nur hinweisen möchte, steht die einfache technische Umsetzung im Vordergrund. Nachfolgend möchte ich die Lösung präsentieren, die es erlaubt, über einen 2-Zeiler diese Ansicht zu konfigurieren.

Diese Funktion muss vor der eigentlichen Verwendung in die Codeunit 423 eingebunden werden oder in einer nach Ihrer Wahl.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PROCEDURE ShowLogEntries(RecRef : RecordRef);
VAR
  ChangeLogEntry : Record 405;
  KeyRef1 : KeyRef;
  KeyFldRef : FieldRef;
  i : Integer;
  IndexFields : Text[1024];
  Text001 : TextConst 'DEU=Keine Änderungsprotokollposten zu %1 (%2) gefunden.;ENU=No Change Log Entries were found on %1 (%2).';
BEGIN  
  ChangeLogEntry.SETRANGE("Table No.",RecRef.NUMBER);
  KeyRef1 := RecRef.KEYINDEX(1);
  FOR i := 1 TO KeyRef1.FIELDCOUNT DO BEGIN
	KeyFldRef := KeyRef1.FIELDINDEX(i);
	CASE i OF
	  1:
		BEGIN
		  ChangeLogEntry.SETRANGE("Primary Key Field 1 Value",FormatValue(KeyFldRef,RecRef.NUMBER));
		  IndexFields := STRSUBSTNO('%1 = %2', KeyFldRef.CAPTION, FormatValue(KeyFldRef,RecRef.NUMBER));
		END;
	  2:
		BEGIN
		  ChangeLogEntry.SETRANGE("Primary Key Field 2 Value",FormatValue(KeyFldRef,RecRef.NUMBER));
		  IndexFields := STRSUBSTNO(IndexFields+', %1 = %2', KeyFldRef.CAPTION, FormatValue(KeyFldRef,RecRef.NUMBER));
		END;
	  3:
		BEGIN
		  ChangeLogEntry.SETRANGE("Primary Key Field 3 Value",FormatValue(KeyFldRef,RecRef.NUMBER));
		  IndexFields := STRSUBSTNO(IndexFields+', %1 = %2', KeyFldRef.CAPTION, FormatValue(KeyFldRef,RecRef.NUMBER));
		END;
	END;
  END;
  IF ChangeLogEntry.FINDFIRST THEN BEGIN
	FORM.RUN(FORM::"Change Log Entries",ChangeLogEntry);
  END ELSE
	MESSAGE(Text001
	  , RecRef.CAPTION
	  , IndexFields
	  );
END;

Nochfolgend kann diese zentrale Funktion wie unten dargestellt verwendet werden:

1
2
3
4
5
6
7
8
PROCEDURE ShowChangeLog();
VAR
  RecRef : RecordRef;
  ChangeLogMgmt : Codeunit 423;
BEGIN
  RecRef.GETTABLE(Rec);
  ChangeLogMgmt.ShowLogEntries(RecRef);
END;

Schreibe einen Kommentar