Getting Individual Dimension Combination Values–Dimension Storage class [AX 2012]

In this post, I will be explaining the method to get individual values for each dimension combination that is created and stored.

Dimension combinations are stored are DimensionAttributeValueCombination class. But they are stored as a combination ex: (100010-AX-00001- – – -). How would you know the value in each combination belongs to what dimension?

The answer is through dimension storage class. This class is used to manipulate these combinations.

The job below helps you in finding out the required values. The job has lots of self explanatory comments.

static void getDimensionCombinationValues(Args _args)


    // DimensionAttributeValueCombination stores the combinations of dimension values

    // Any tables that uses dimension  combinations for main account and dimensions

    // Has a reference to this table’s recid

    DimensionAttributeValueCombination  dimAttrValueComb;

    //GeneralJournalAccountEntry is one such tables that refrences DimensionAttributeValueCombination

    GeneralJournalAccountEntry          gjAccEntry;

    // Class Dimension storage is used to store and manipulate the values of combination

    DimensionStorage        dimensionStorage;

    // Class DimensionStorageSegment will get specfic segments based on hierarchies

    DimensionStorageSegment segment;

    int                     segmentCount, segmentIndex;

    int                     hierarchyCount, hierarchyIndex;

    str                     segmentName, segmentDescription;

    SysDim                  segmentValue;



    //Get one record for demo purpose

    gjAccEntry = GeneralJournalAccountEntry::find(5637765403);


    setPrefix("Dimension values fetching");

    //Fetch the Value combination record

    dimAttrValueComb = DimensionAttributeValueCombination::find(gjAccEntry.LedgerDimension);

    setPrefix("Breakup for " + dimAttrValueComb.DisplayValue);


    // Get dimension storage

    dimensionStorage = DimensionStorage::findById(gjAccEntry.LedgerDimension);

    if (dimensionStorage == null)


        throw error("@SYS83964");



    // Get hierarchy count

    hierarchyCount = dimensionStorage.hierarchyCount();

    //Loop through hierarchies to get individual segments

    for(hierarchyIndex = 1; hierarchyIndex <= hierarchyCount; hierarchyIndex++)


        setPrefix(strFmt("Hierarchy: %1", DimensionHierarchy::find(dimensionStorage.getHierarchyId(hierarchyIndex)).Name));

        //Get segment count for hierarchy

        segmentCount = dimensionStorage.segmentCountForHierarchy(hierarchyIndex);


        //Loop through segments and display required values

        for (segmentIndex = 1; segmentIndex <= segmentCount; segmentIndex++)


            // Get segment

            segment = dimensionStorage.getSegmentForHierarchy(hierarchyIndex, segmentIndex);


            // Get the segment information

            if (segment.parmDimensionAttributeValueId() != 0)


                // Get segment name

                segmentName = DimensionAttribute::find(DimensionAttributeValue::find(segment.parmDimensionAttributeValueId()).DimensionAttribute).Name;

                //Get segment value (id of the dimension)

                segmentValue        = segment.parmDisplayValue();

                //Get segment value name (Description for dimension)

                segmentDescription  = segment.getName();

                info(strFmt("%1: %2, %3", segmentName, segmentValue, segmentDescription));





Here is a sample output after running the code:


Note: Hiearchies: CEEBD_Dept-CostCenter-Purpose and CorpShared_Dept-CostCenter-Purpose are child hierarchies of “Account structure”.

14 thoughts on “Getting Individual Dimension Combination Values–Dimension Storage class [AX 2012]

  1. Hi Sumit,
    Great work on digging into the ledger dimension framwork!

    I am curious as to how I should approach this scenario:

    From X++ I would like to create records in LedgerJournalTrans and I have all the necessary values at hand (accountnum, amount, dato and – of course – financial dimensions but as separate values).

    So if I have the accountnum+dimension values how would I find/create the dimension combination to be referred from the create LedgerJournalTrans?

    Thanks and keep up the good work!!

  2. Hi,
    I have values for Department and Cost Centre,i need to obtain a default dimesion (DimensionDefault) for the same. I mean to say i need to merge using just values of department and cost centre and merge into a return type of DimensionDefault. Can you please give me some tips on same.

  3. Hi Sumit,

    I have requirement to import ledger journal trans and I am currently using the classes LedgerGeneralJournal_LedgerJournalTable and LedgerGeneralJournal_LedgerJournalTrans to import the ledger journal transactions.

    The import file consists of Main Account and Dimensions. Here I would like to know based on the Mainaccount what would be my valid dimensions, then I can pass on the dimension name and dimension values to above classes to do the import.

    Can you please help me in getting the valid dimensions (dimension names) for a Main account.


  4. Is there a way to get a list of next dimension values using the rules without using the Account entry dropdown control in AX. I would like to replicate the same functionality using dropdowns but not sure how to fetch the next set of possible values.

    In the original example:
    Dropdown1 value = 110180
    Dropdown2 should populate with possible values for the next dimension

    Is there service or a SQL query that could do that?

  5. Is there a way to get a list of the next dimension value list based on what was previously entered such as main account code? Basically I am trying to see how I can list the next set of dimension values using the advanced segment rules setup in AX2012. Example: if mainaccount = 9999 only departmens 10 to 15 should showup.

Leave a Reply

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

You are commenting using your 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