Dimension Set – czyli nowe wymiary w Dynamics NAV 2013

Nowe wymiary w Dynamics NAV 2013

Opisując moje pierwsze wrażenia dotyczące Microsoft Dynamics NAV 2013 celowo pominąłem temat wymiarów ponieważ uznałem, że zasługują one na poświęcenie im osobnego wpisu. Same w sobie niewątpliwe są jedną z najważniejszych cech Dynamics NAV i nikomu nie trzeba ich szczególnie przedstawiać. Do tej pory jednak stanowiły one poważne obciążenie dla systemu i były dość uciążliwe w implementacji. Tym bardziej cieszy fakt, że w nowym Dynamics NAV zostały one przeprojektowane. W konsekwencji czego my jako programiści musimy zapoznać się z zupełnie nowym pojęciem, a mianowicie – „Dimension Set”. Te dwa słowa stanowią kwintesencję Microsoft Dynamics NAV 2013 i zarazem najlepiej opisują zasadę działania „nowych” wymiarów.

Dimension Set

Czym zatem jest rzeczony „Dimension Set”? Otóż jest to kombinacja dowolnych wartości różnych wymiarów. Aby łatwiej można było to zrozumieć posłużę się ilustracją przedstawiającą możliwe kombinacje przy założeniu, że dwa wymiary (PROJEKT i SPRZEDAWCA), posiadają po dwie różne wartości. Daje to w sumie osiem możliwych kombinacji, z których każda otrzymuje unikalny numer ID.

Dimension Set ID PROJEKT SPRZEDAWCA
1 OPEL JAN
2 VOLVO MARTA
3 OPEL MARTA
4 VOLVO JAN
5 OPEL
6 VOLVO
7
JAN
8
MARTA

Dysponując unikalnym numerem kombinacji, wystarczy przypisać go do dokumentu, pojedynczego wiersza, bądź zapisu księgi. W związku z tym wszystkie tabele, które mogą zostać powiązane z wymiarami zyskały nowe pole o numerze 480 [Dimension Set ID]. Jest to niebywała oszczędność miejsca w porównaniu do rozwiązania znanego ze starszych wersji, co bezpośrednio przekłada się na wzrost wydajności. Warto w tym miejscu nadmienić, że do tej pory tabele wymiarów zajmowały w bazie danych nawet do jednej trzeciej jej objętości.

Dzięki zastosowaniu nowego rozwiązania podczas księgowania nie będą już tworzone osobne rekordy przechowujące informację o wymiarach, a do tej pory na jeden rekord tabeli [G/L Entry] mogło przypadać nawet kilka rekordów tabeli [Ledger Entry Dimension].

Nowe elementy

Wraz z przeprojektowaniem wymiarów pojawiło się kilka nowych elementów na które warto zwrócić uwagę, są to między innymi tabele:

  • Tabela 480 – Dimension Set Entry – służy do przechowywania informacji o kombinacjach wymiarów
ID Dimension Code Dimension Value Code Dimension Value ID Dimension Name Dimension Value Name
2 PROJEKT VOLVO 10 Projekt Volvo
2 SPRZEDAWCA MARTA 25 Sprzedawca Marta
  • Tabela 481 – Dimension Set Tree Node – tabela służy do sprawdzenia czy wybrane na dokumencie wymiary istnieją w tabeli 480, w przypadku ich braku dana kombinacja zostaje utworzona. Tabela 481 to nic innego jak reprezentacja tabli 480 w formie drzewa binarnego.
  • Tabela 482 – Reclas. Dimension Set Buffer – służy ona tylko do edycji już wprowadzonych wymiarów.

Poza tabelami znaczący lifting przeszedł także codeunit 408 – Dimension Management – pozostało w nim zaledwie kilka funkcji, które w zupełności wystarczą do obsługi wymiarów.

Wzorce projektowe

Spójrzmy teraz jak teraz wyglądają niektóre standardowe fragmenty kodu, które nieraz mogliśmy spotkać podczas pracy.

Księgowanie wiersza dziennika

Podstawową różnicą jest brak tabeli Journal Line Dimension, w zamian informacje o wszystkich wymiarach zapisane są w jednym polu „Dimension Set ID”

Microsoft Dynamics NAV 2013
[cc lang=”cside”]
ResJnlLine.”Qty. per Unit of Measure” := SalesLine.”Qty. per Unit of Measure”;
ResJnlLine.”Dimension Set ID” := SalesLine.” Dimension Set ID „;
ResJnlPostLine.Run(ResJnlLine);
[/cc]
Wcześniejsze wersje
[cc lang=”cside”]
ResJnlLine.”Qty. per Unit of Measure” := SalesLine.”Qty. per Unit of Measure”;
TempJnlLineDim.DELETEALL;
TempDocDim.RESET;
TempDocDim.SETRANGE(„Table ID”,DATABASE::”Sales Line”);
TempDocDim.SETRANGE(„Line No.”,SalesLine.”Line No.”);
DimMgt.CopyDocDimToJnlLineDim(TempDocDim,TempJnlLineDim);
ResJnlPostLine.RunWithCheck(ResJnlLine,TempJnlLineDim);
[/cc]

Księgowanie dokumentu

Nowością tutaj jest brak potrzeby kopiowania wymiarów za pomocą funkcji DimMgt.MoveOneDocDimToPostedDocDim(). Teraz wystarczy przypisać odpowiednią wartość do pola „Dimension Set ID”

Microsoft Dynamics NAV 2013
[cc lang=”cside”]
SalesShptLine.”Dimension Set ID” := SalesLine.”Dimension Set ID”
[/cc]
Wcześniejsze wersje
[cc lang=”cside”]
DimMgt.MoveOneDocDimToPostedDocDim(TempDocDim,DATABASE::”Sales Line”,”Document Type”, „No.”, SalesShptLine.”Line No.”, DATABASE::”Sales Shipment Line”, SalesShptHeader.”No.”);
[/cc]

Edycja wymiarów dla dokumentu

Edycja wymiarów także stała się prostsza w implementacji – wystarczy wywołanie jednej funkcji.

Microsoft Dynamics NAV 2013
Table 37, function ShowDimensions:
[cc lang=”cside”]
„Dimension ID” := DimSetEntry.EditDimensionSet(„Dimension ID”);
[/cc]
Wcześniejsze wersje
Table 37, function ShowDimensions: [cc lang=”cside”]
TESTFIELD(„Document No.”);
TESTFIELD(„Line No.”);
DocDim.SETRANGE(„Table ID”,DATABASE::”Sales Line”);
DocDim.SETRANGE(„Document Type”,”Document Type”);
DocDim.SETRANGE(„Document No.”,”Document No.”);
DocDim.SETRANGE(„Line No.”,”Line No.”);
DocDimensions.SETTABLEVIEW(DocDim);
DocDimensions.RUNMODAL;
[/cc]

Wyświetlanie wymiarów dla zaksięgowanych zapisów

Podobnie jak wyżej wystarczy użyć pojedynczej funkcji 🙂

Microsoft Dynamics NAV 2013
Table 111, function ShowDimensions:
[cc lang=”cside”]
DimSetEntry.ShowDimensionSet(„Dimension ID”);
[/cc]
Wcześniejsze wersje
Table 111, function ShowDimensions: [cc lang=”cside”]
TESTFIELD(„No.”);
TESTFIELD(„Line No.”);
PostedDocDim.SETRANGE( „Table ID”,DATABASE::”Sales Shipment Line”);
PostedDocDim.SETRANGE( „Document No.”,”Document No.”);
PostedDocDim.SETRANGE(„Line No.”,”Line No.”);
PostedDocDimensions.SETTABLEVIEW(PostedDocDim);
PostedDocDimensions.RUNMODAL;[/cc]

Pobieranie domyślnych wymiarów

Może bardziej skomplikowanie, ale nadal przy użyciu pojedynczej funkcji.

Microsoft Dynamics NAV 2013
Table 37, function CreateDim()
[cc lang=”cside””]
SourceCodeSetup.GET;
TableID[1] := Type1;
No[1] := No1;
TableID[2] := Type2;
No[2] := No2;
TableID[3] := Type3;
No[3] := No3;
„Shortcut Dimension 1 Code” := ”;
„Shortcut Dimension 2 Code” := ”;
GetSalesHeader;
„Dimension ID” := DimMgt.GetDefaultDimID(TableID,No,SourceCodeSetup.Sales,”Shortcut Dimension 1 Code”,”Shortcut Dimension 2 Code”,SalesHeader.”Dimension ID”,DATABASE::”Sales Header”);
[/cc]
Wcześniejsze wersje
Table 37, function CreateDim()
[cc lang=”cside”]
SourceCodeSetup.GET;
TableID[1] := Type1;
No[1] := No1;
TableID[2] := Type2;
No[2] := No2;
TableID[3] := Type3;
No[3] := No3;
„Shortcut Dimension 1 Code” := ”;
„Shortcut Dimension 2 Code” := ”;
DimMgt.GetPreviousDocDefaultDim(DATABASE::”Sales Header”,”Document Type”,”Document No.”,0,DATABASE::Customer,”Shortcut Dimension 1 Code”,”Shortcut Dimension 2 Code”);
DimMgt.GetDefaultDim(TableID,No,SourceCodeSetup.Sales,”Shortcut Dimension 1 Code”,”Shortcut Dimension 2 Code”);
IF „Line No.” = 0 THEN
DimMgt.UpdateDocDefaultDim(DATABASE::”Sales Line”,”Document Type”,”Document No.”,”Line No.”,”Shortcut Dimension 1 Code”,”Shortcut Dimension 2 Code”);
[/cc]

Wszystkie powyższe przykłady pochodzą ze strony: http://msdn.microsoft.com/en-us/library/jj552498(v=nav.70).aspx

Podsumowanie

Reasumując – nowe wymiary to przede wszystkim duży wzrost wydajności połączony ze znacznym spadkiem rozmiaru bazy danych, ale także znacznie uproszczone schematy dzięki, którym oprogramowanie wymiarów staje się łatwiejsze.

Zostaw odpowiedź

Twój adres e-mail nie zostanie opublikowany Wymagane pola są zaznaczone *