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.