Replace a Financial Dimension in Default Dimensions–Condensed [AX 2012]

In my previous post on Replacing default dimensions, I had provided a job to replace one financial dimension within a default dimension. The job was pretty big and I always thought that Microsoft should have provided some way to do these operations easily. Luckily I found a class that has helped me to condense that job and make it pretty small. I am sharing that job here:

The dimensions for Customer record looks like this before running the job:

image

Here is the job to change the values. We will change the values for Business Unit, Department and Worker all with this simple job:

static void replaceDefaultDimensionsCondense(Args _args)

{

    /*

     * In this job, we will replace the Business Unit Value from BU-001 to BU-002

     * and fill in the values for Department as Dep-001 and Worker as 114

     */

    CustTable                       custTable = CustTable::find(‘CUS-00004’); //Customer Record containing Financial Dimension

    Struct                          struct = new Struct(); //Structure to hold the dimension values to replace

    container                       defDimensionCon; //Container to prepare the required values and dimension attribute combination

    DimensionDefault                dimensionDefault; //Get the replaced dimension recid

    DimensionAttributeSetItem       dimAttrSetItem; //Table to get active dimensions for the legal entity

    DimensionAttribute              dimAttribute; //Table to get the Financial dimensions

    int i; //For looping

 

    //Loop for required dimensions

    while select Name, BackingEntityType from dimAttribute

        where dimAttribute.BackingEntityType == tableNum(DimAttributeOMBusinessUnit) ||

              dimAttribute.BackingEntityType == tableNum(DimAttributeOMDepartment) ||

              dimAttribute.BackingEntityType == tableNum(DimAttributeHcmWorker) &&

              dimAttribute.Type              != DimensionAttributeType::DynamicAccount

              join dimAttrSetItem

                where dimAttrSetItem.DimensionAttribute == dimAttribute.RecId &&

                      dimAttrSetItem.DimensionAttributeSet == DimensionCache::getDimensionAttributeSetForLedger()

    {

        //Add the Dimension name and display value to struct

        if (dimAttribute.BackingEntityType == tableNum(DimAttributeOMBusinessUnit))

        {

            struct.add(dimAttribute.Name, ‘BU-002’);

        }

        else if (dimAttribute.BackingEntityType == tableNum(DimAttributeOMDepartment))

        {

            struct.add(dimAttribute.Name, ‘DEP-002’);

        }

        else if (dimAttribute.BackingEntityType == tableNum(DimAttributeHcmWorker))

        {

            struct.add(dimAttribute.Name, ‘114’);

        }

    }

 

    //Prepare the container

    defDimensionCon += struct.fields();

 

    for (i = 1; i <= struct.fields(); i++)

    {

        defDimensionCon += struct.fieldName(i);

        defDimensionCon += struct.valueIndex(i);

    }

 

    //if there are fields in struct

    if (struct.fields())

    {

        //Get the DimensionAttributeValueSet table’s Record ID

        dimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(defDimensionCon);

       

        //Update to Customer

        ttsBegin;

        custTable.selectForUpdate(true);

        if (custTable.DefaultDimension)

        {

            custTable.DefaultDimension = DimensionDefaultingService::serviceMergeDefaultDimensions(dimensionDefault, custTable.DefaultDimension);

        }

        else

        {

            custTable.DefaultDimension = dimensionDefault;

        }

        custTable.doUpdate();

        ttsCommit;

    }

}

 

Dimensions after running the job:

image

Pretty Neat!

The class AxdDimensionUtil is pretty handy to do all these stuff.

7 thoughts on “Replace a Financial Dimension in Default Dimensions–Condensed [AX 2012]

  1. Hi Sumit,

    I was Looking into the financial dimensions in Ax 2012. Somewhere, i read that we can use the Tables (Like vendTable/CustTable) as Financial Dimensions ? But how can I use a Ax table as
    financial Dimension in Ax 2012? please give one example.

    Anuj

    Like

    1. Hi Anuj,

      While setting up a new financial dimension, there is an option of selecting the source for financial dimension values. In the source, you can select existing list and that will allow you to select predefined tables.

      Sumit

      Like

  2. Hi Sumit,

    Thanks for the reply. I am following the above blog for the financial dimension but it gives error, “map is not initialize”. In my case I have around 6 dimension on CustTable form and 4 of them has values. Now I am trying to update the new value in one of 4 fields.

    How to do that ?

    Like

  3. Hi Sumit,

    Great post, thank you! If i want to replace the value of a custom dimension during PO creation, where is the best place to put this code? For example i have a custom dimension called ‘PO’ and now during PO creation i’m creating a new financial dimension value with the PO-Number (with financialTagCategory() and DimensionFinancialTag) and then would like to replace the defaulted value (is actually empty) with the newly creted value.

    Thanks for you help.

    Like

      1. Hi Sumit,
        With the use of project i’m creating purchase order. Here in the standard environment, i can able to see the financial dimension values in Line details, but the financial dimension values are not visible in Header.
        I need to update the line details of financial dimension values in header too. How can we achieve this? Any idea? Please share it ASAP.
        Regards,
        Zahir

        Like

Leave a comment