Dimensions in NAV 2016.. – design overview

Standard

As stated here, beyond the setup and usage of dimensions, developing with NAV requires a better grasp of dimension’s internal design.

I’ll be diving shortly into the dimension related concepts: dimension set entries (Table 480 Dimension Set Entry), search trees (Table 481 Dimension Set Tree Node), dimension management (Codeunit 408 DimensionManagement).

The following use case will create a sales invoice, and add dimensions. We will inspect the main tables and the code in codeunit 408 DimensionManagement to understand what happens. But first, let’s setup some dimensions and their values:

  1. Open Page 536 “Dimension” and create a new dimension (DEPARTMENT), this will create a record in Table 348 “Dimension”
  2. On the same Page, in the Navigate FastTasb, launch “Dimension Values”. This will open Page 537 “Dimension Values” where you can create a few dimension values for this new dimension: these new values will be stored in Table 349 “Dimension Value”
  3. Repeat steps 1 and 2 for two more dimensions AREA and SALESPERSON.
  4. Assign Global Dimensions in General Ledger Setup (Open General Ledger Setup Page and launch “Change Global Dimensions …” action) to Department and Area. This will fill up General Ledger Setup fields: “Global Dimension 1 Code” and “Global Dimension 2 Code”. NAV will assign “Shortcut Dimension 1 Code” and “Shortcut Dimension 2 Code” with these two global dimensions.

GLS

Note: If you’ve updated the Global Dimensions you’ll be warned that the system will run an update on all posted entries to update the dimensions. After the update restart RTC, otherwise .

At the end of the 4 steps this is how the affected tables look like:

Table 348 “Dimension”:

T348

Table 349 “Dimension Value”:

DimVal

 

Let’s create now a Sales Invoice and note how the dimensions are handled.

On the Lines Fast Tab on the Sales Invoice add the columns for the newly picked dimensions: DEPARTMENT Code and AREA Code.

Assign AREA Code field the value “EAST”:

 

SL_1

Validating the “Department Code” involves updating the “Dimension Set ID” for the sales line. The core of this operation happens in Codeunit 408 DimensionManagement:

CU480_1

Looking into table 480 and 481 this is the current situation in our exercise:

480_481_1

NAV has created an entry in the table 480 Dimension Set Entry for the Dimension/Dimension Value pair AREA=EAST and assigned it an ID = 3254.

Additionally, NAV created a search tree in which at this point we only have a node(the root) for the just started dimension combination with one dimension (AREA=EAST).

Lets assign now a new dimension, the Department code to SALES:

SalesLine_Department

Let’s check what happened in Table 480 and 481:

480_481_2

 

In Table 480 “Dimension Set Entry” NAV inserted two more lines (2nd and 3rd) and assigned to both Dimension Set ID = 3255. This is to identify the 2-tuple AREA=EAST and DEPARTMENT =SALES uniquely with ID = 3255. I do expect that, if I add a new dimension that would be assigned an ID=3256 and we will have 3 new records with that ID.

In the left side we have the trees.

The middle one (0,5039;3254) was generated in the previous step when we assigned the first dimension (AREA=EAST); As part of assigning a second dimension (DEPARTMENT=SALES) the system generated two more trees:

  • first one is a tree with a single node for DEPATMENT=SALES
  • second tree has two nodes: as root we have the node with Dimension Set ID=1 (DEPARTMENT=SALES) and as branch from this root we have a node with Dimension Value= 5839 and Dimension Set ID = 3255 which we can see in Table 480 is the node for AREA=EAST.

Tree_2_Dims

Let’s fill up a third dimension and check if our expectations were right:

SL_3

By inspecting the two tables (480 and 481) we notice:

480_481_3

  • 3 new records in 480 to identify the 3-tuple (AREA=EAST,DEPARTMENT=SALES,SALESPERSON=SAM). All three records have been assigned Dimension Set ID = 3256.
  • In table 481, NAV created a 4th search tree, beside the 3 existing ones

4th_TREE

In code, if we want to update the “Dimension Set ID” we would do something similar to the code in ValidateShortcutDimValues function in Codeunit 408 “DimensionManagement”

UpdateDimSetID

If you need to get a combined Dimension Set ID based on two existing Dimension Set IDs you can use the function GetCombinedDimensionSetID to do it in one shot:

MultipleDimSets

To understand the benefit between old way of managing dimensions (Pre-2013) and the new way, check archerpoint article.

Thanks for reading, sharing commenting … Much appreciated!

Original article here.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s