Implement GST (Goods & Services Tax) functionality in Microsoft Dynamics AX

We have successfully implemented GST patches for India localization for Dynamics AX. You can go through the link below:

Axpedite GST Implementation

Dynamics AX GST Solution

Please contact us at in case you need help in implementing GST patches for DAX.


Microsoft Dynamics AX Implementation Guide

My long time friends Yogesh Kasat of Real Dynamics and Jilajeet Yadav of Ignify have come out with an excellent book on handling Microsoft Dynamics AX Implementation Projects with ease and higher success rate.

The book describes about the common errors, issues and some real life experiences about AX implementation projects. This book caters to wide range of audience and is an all-in-one guide for DAX implementations.

You can read the article on this book here on Posts By Yogesh Kasat on LinkedIn or Dynamics World.

The book is available to be bought on Amazon, Packt Publishing, and other major places, both as an e-book or a hard copy.

Do get a copy for yourself. I have got mine 🙂

Why should SAP and Oracle consultants consider a career move into Dynamics AX


Here is a good article by Cognitive Group on reasons as to why other ERP consultants should rush to try their expertise in Dynamics AX. It’s a good read.

#DynamicsAX, #AXJobs

2012 in review

The stats helper monkeys prepared a 2012 annual report for this blog.

Here’s an excerpt:

19,000 people fit into the new Barclays Center to see Jay-Z perform. This blog was viewed about 61,000 times in 2012. If it were a concert at the Barclays Center, it would take about 3 sold-out performances for that many people to see it.

Click here to see the complete report.

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:


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



        if (custTable.DefaultDimension)


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




            custTable.DefaultDimension = dimensionDefault;







Dimensions after running the job:


Pretty Neat!

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

Reports and Data Methods

In this post, I will explain how to use data methods in Reports. We will use the same Report model and report that we created in Building a Simple Report–Precision Design.

In AX 2009, AX SSRS had good use of these data methods. But with much better integration, and Reporting framework in AX improving, Data Methods in AX SSRS are reduced to minimal use.

Also the reason is that MS is soon going to do away with .Net Business Connector from next version hence the usage of data methods for many things will be redundant. What I have also noticed is the data methods have return type only as System.String and you will not be able to change this return type. This means, data methods can only return strings.

What I will try and demonstrate here is how to add links in AX reports (to open the corresponding forms).

To achieve this first we will add the reference to SRSDrillThroughCommon project. Do the following:

  • Open the SKL_SampleReportProject (refer to link above)
  • In Application Explorer, right-click Visual Studio Projects > C Sharp Projects > SRSDrillThroughCommon and then click Edit. This adds the SRSDrillThroughCommon project to our current solution


  • Open the report SKL_SampleReportPrecision project
  • Right click on the Data Methods node and create a new DataMethod. Name it CustDrillDown
  • You will also notice that a Business Logic Project is automatically added


  • In Solution Explorer, right-click the business logic project and then click Add Reference


  • Go to “Projects” tab and select “SRSDrillThroughCommon” and click Ok


  • Double click the data method this opens the Code editor
  • Add this line of code the declaration

using Microsoft.Dynamics.AX.Application.Reports;


  • Your code editor should be like this

using System;

using System.Collections.Generic;

using System.Security.Permissions;

using System.Data;

using Microsoft.Dynamics.Framework.Reports;

using Microsoft.Dynamics.AX.Application.Reports;


public partial class SKL_SampleReportPrecision


    [DataMethod(), PermissionSet(SecurityAction.Assert, Name = “FullTrust”)]

    public static string CustDrillDown(string reportContext, string custAccount)


        return DrillThroughCommonHelper.ToCustomerForm(reportContext, custAccount);



  • Right click on Precision Design and open the designer
  • Select the AccountNum text box, underline the text and set font color to Blue


  • Now right click on this text box and select “Text Box Properties…”, Switch to Tab “Action”
  • Select option “Go to URL” and click button “fx


  • Set Expression “=CustDrillDown(Parameters!AX_ReportContext.Value, Fields!AccountNum.Value)”
  • Click Ok
  • Save report, go to AX, deploy the report and run it. You should see following


  • Click on the link and the customer form opens up