Kategorie: Howto

Howto

T309 „No. Series Line“

In Addition to the Post of Jörg Stryk regarding the bottleneck “No. Series Line” I will present you another solution. Here is his mentioned problem:

Problem:
Technically the Table 309 „No. Series Line“ is pretty small and contains a fixed (more or less) number of records. Whenever a new number is drawn from No. Series, the corresponding record is locked, the last number is read and increased, then the record is updated. When updating the record the lines is locked (ROW X). In some cases this could also mean that the whole data page is also locked (PAG IX), which could lead to blocking issues. Means, for example, if a „No. Series“ is used (e.g. „S-INV+“) the line is locked (ROW X), also the page (PAG IX) blocking another process even when using a different „No. Series“ (e.g. „P-ORD“).

Solution:

If two processes try to lock exactly the same „No. Series Line“ (e.g. „S-INV+“) there’s nothing we could do. In other cases it could be feasible to use dedicated „No. Series Line“-Tables. In my solution I work with temporary „No. Series Line“-Table and RecordRef. We had to change Table 308 and 309, Codeunit 396 and Page 456 and of cause create one or more new „No. Series Line“-Table. Every Time the Codeunit or a user attempts to access or change data this will be redirected to the right „No. Series Line“-Table by using RecordRef and the temporary Table 309.

Performance Table 309

Posted by Thomas Marquardt
Howto

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
39PROCEDURE 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
8PROCEDURE ShowChangeLog();
VAR
RecRef : RecordRef;
ChangeLogMgmt : Codeunit 423;
BEGIN
RecRef.GETTABLE(Rec);
ChangeLogMgmt.ShowLogEntries(RecRef);
END;

Posted by Thomas Marquardt