Posts Tagged ‘Add-ons’

Dynamics Ax add-ons from FastPath

August 5, 2010 Leave a comment

Recently Jill Peterson from GoFastPath introduced me to their range of Products on top of Dynamics Ax. ¬†He also asked me to review their products on my blog and that’s in fact the reason behind this post.

GoFastPath is developing add ons basically on the data security(SQL Level) and AD (Active Directory) integration front. I particularly liked their AD integration product called “Config AD“. Config AD seamlessly integrates user management in Ax with Active Directory. Through Config AD ¬†a new user created in the Active directory can be directly added to the Ax user group. This user is enabled and disabled depending on changes in the AD. With this the hassle of managing users in two different systems go away.

You can see “Config AD” in action here

Also look at other products of GoFastPath here..

[tweetmeme source=”casperkamal” only_single=false]

Adding a breakpoint through code in Dynamics Ax

July 6, 2010 2 comments

Every time I see a warning or error, the default place where i place my debugger was at “\Class\Info\add”. I was really not happy of going each time to the same class to place a breakpoint. This week i got rid of it finally ūüôā

What I did was develop a small piece of code that will automatically add a breakpoint and called this piece of code from the internal development toolbar that we have. The internal development toolbar is something like Tabax.  You can also do the same and integrate with your own toolbar/ Tabax / Ax Assist.

static void addBreakPoint(Args _args)
    container bpCon;
    int       vers, i;
    //Get the breakpoint
    bpcon = infolog.breakpoint();

   //Version just for reference not really needed
    vers = conpeek(bpCon, i); i++;

    //set the breakpoint
    bpCon += [@"\Classes\Info\add"];    //AOT Path
    bpCon += [1]; //Row number
    bpCon += [true]; //Enabled


Refer to the article below if you want to know or create toolbar for Ax.

Lately i saw a discussion in one of the russian forums relating to where the code was inspired from. It’s been inspired from “\Forms\SysBreakpoints”.

Solving the Id conflict issue during import of XPO in Dynamics Ax

May 2, 2010 Leave a comment

When you try to import an XPO with an Id conflict(Two different components sharing the same name), then Ax prompts with an dialog. This dialog informs the conflict and skips importing the specific component.

This is specifically more trouble some when you are developing application connected to TFS. Especially when you synchronize an component with ID conflict the synchronize skips it and to get the object again you will have to either do a Checkout/checkin from another machine or do a forced synchronize. So i was often made to spend more time because of these issue.

To avoid this after some time i developed a small workaround that worked well and served the cause. Here it goes…

it is basically the following line which makes the call to the function that imports as well as show the dialog.

\Classes\SysImportElements\importElements – Line 51

“flag = infolog.importElement(_exportId, tmpImportAot.UtilFileType, tmpImportAot.UtilElementType, name, tmpImportAot.FilePos, flag);”

What i did was built a small condition that validates if there is any existing component with the same Id and if so, then it asks the user if it can delete and import the new one. If yes then it deletes the existing one and then imports the new component. This way the dialog allows you to perform an action rather being just an blocking prompt information.

Here is the code which does the job.
For the purpose of convenience i added this as an method that returns a boolean variable and modified the actually call with an if condition.

//This method is helpful in finding ID conflicts earlier.
//Through this method we can avoid the VSS error where an element is updated in the file system but not in the AOT
protected boolean I4C_validateImport(TmpAotImport _tmpImportAot)
    UtilIdElements elements;
    str            userString;
    TreeNode        node;
    TreeNode        parentNode;

    select firstonly elements
           where            == _tmpImportAot.UtilElementId   &&
                     elements.recordType    == _tmpImportAot.UtilElementType &&
                     != _tmpImportAot.TreeNodeName;

    if (elements.RecId)
        userString  = strfmt("Importing AOT object '%2' with Id %1  is already occupied by element '%3'. Do you want to delete the existing tree node object '%3' and import '%2'? Cancel will abort the import.",
                             _tmpImportAot.UtilElementId, _tmpImportAot.TreeNodeName,;
        if (DialogButton::Ok == Box::okCancel(userString, DialogButton::Ok, "Id conflict"))
            node = xutilIdElements::getNode(elements);
            if (node)

                parentNode = TreeNode::findNode(SysTreeNode::pathParent(node.treeNodePath()));
                if (parentNode)

                return true;

         return false;

    return true;


And modify the code in the following location as show below

\Classes\SysImportElements\importElements – Line 51

if (this.I4C_validateImport()
    flag         = infolog.importElement(_exportId, tmpImportAot.UtilFileType, tmpImportAot.UtilElementType, name, tmpImportAot.FilePos, flag);