blog for Dynamics Axapta

Archive for the ‘Microsoft Dynamics AX 2009’ Category

Export your AOT Custom Objects Automatically


Here I have posted a job to export all our newly created projects / jobs / any AOT objects as XPO automatically.

static void VAS_ExportXPO(Args _args)

FileIoPermission perm;
ProjectListNode projectListNode;
ProjectNode projectTreeNode;
TreeNode treeNode, jobTreeNode;
TreeNodeIterator iterator, jobIterator;
str projName;
str exportProjName = ‘VAS_’;
str jobName;
str exportJobName = ‘VAS_’;
int noOfProjects;
int noOfJobs;
str folderpathProj, folderpathJobs;


folderpathProj = strfmt(@’C:\Vasanth Arivali\XPO Backup\%1\SharedProject’, date2str(today(), 321, 2, 3, 2, 3, 4));
folderpathJobs = strfmt(@’C:\Vasanth Arivali\XPO Backup\%1\Jobs’, date2str(today(), 321, 2, 3, 2, 3, 4));

perm = new FileIoPermission(folderpathProj, #ExportMode);
if (perm == null)

projectListNode = SysTreeNode::getSharedProject();
iterator = projectListNode.AOTiterator();

treeNode =;
while (treeNode)
projName = treeNode.AOTname();
if ( exportProjName == substr(projName, 1, 8))
// BP deviation documented.
treeNode.treeNodeExport(folderpathProj + ‘\\SharedProject_’ + projName + “.xpo”);
treeNode =;


jobIterator = TreeNode::findNode(@’\Jobs’).AOTiterator();
jobTreeNode =;
while (jobTreeNode)
jobName = jobTreeNode.AOTname();
if ( exportJobName == substr(jobName, 1, 8))
// BP deviation documented.
jobTreeNode.treeNodeExport(folderpathJobs + ‘\\Job_’ + jobName + “.xpo”);
jobTreeNode =;



if (noOfProjects > 0)
info(strfmt(‘%1 Projects exported sucessfully’, noOfProjects));
if (noOfJobs > 0)
info(strfmt(‘%1 Jobs exported sucessfully’, noOfJobs));

Hope this will help you guys.

// Vasanth Arivali

Auto comments on our customization codes by Editor Script Class

Hi Friends,

Here I have posted the code for auto comments by amending Editor Scripts class.

Adding auto script CODE comments
// Changes: XYZ to your intial name
public void addCommentsCODE(Editor _e)
int startLine = _e.selectionStartLine();
int endLine = _e.selectionEndLine();
str prefixCompany = “CONTOSO”;
str developerID;
str tagStart;
str tagEnd;

switch (curUserId())
case “vasan”: developerID = “Vasanth”;
case “steve”: developerID = “Steven”;
developerID = “XYZ”;

tagStart = strFmt(“//–> %1 modified on %2 %3 by %4: %5 ~ mod description\n”,
date2str(today(), 321, 2, 3, 3, 3, 4), time2str(timeNow(), 1, 1),
tagEnd = strfmt(“//<– by %1\n”, prefixCompany);




Once done, got to code window, right click -> scripts -> you find the method created. Hope it will help you.

// Vasanth Arivali

Add Query Range for Same Table with Different DataSources

Hi Friends,

Here I have posted the code(not entire job/program) for adding multiple ranges/relations with the same table using Query object

Code Starts Here:

QueryRun qr;

//1st DataSource

QueryBuildDataSource qbdTableSourcefromQuery; // get query from the AOT Query which used by System in SysQuery()
QueryBuildDataSource qbdTableSourcefromCode; // newly added Query for Account Number Range

qr = new QueryRun(“your Query”);

qbdCustTableSourcefromQuery = SysQuery::findOrCreateDataSource(qr.query(), tableNum(TableName1));

SysQuery::findOrCreateRange(qbdCustTableSourcefromQuery, fieldNum(TableName1, FieldName)).value(“QueryValue”);

//2nd DataSource

qbdCustTableSourcefromCode = qbdCustTableSourcefromQuery.addDataSource(tableNum(TableName1), “TableNameNew”);
qbdCustTableSourcefromCode.addRange(fieldNum(TableName1, FieldName)).value(queryValue(“QueryValue”));


// Vasanth Arivali

Go To Main Table Functionality in Axapta

Hi All,

We all know about “Go To Main Table” Option in our Axapta Forms and Tables. Here I wrote one sample for how to get that functionality in our forms or table. This is done by three ways:

1) By EDT Relations

2) By using JumpRef method

3) By using FormRef property in Table

EDT Relations:

If you use an EDT in tables which have relation with some other table fileds, that time you can able to navigate the main table or main form.

FormRef Property:

Select the Table and go to properties and select the required form in the FormRef property.

JumpRef method:

If you are not having that option, simply write a override the JumpRef method in a field of DataSource or in a Form Control. Here i show you a sample jumpRef method code:

public void jumpRef()
Args            args;
MenuFunction    menuFunction;

args = new Args();
menuFunction = new MenuFunction(menuitemDisplayStr(“FormName”), MenuItemType::Display);
args = new Args(menuFunction.object());
args.record(“RecordName”); // to be a datasource which added in the current form;

In the form init() which we called here, we have to check the condition whether the form is called by any dataset or not.

Thanks & Regards

Vasanth Arivali

Using Regular Expression in Ax 2009

Hi Guys,

Here i posted a small job , to explain how we use regular expressin in Axapta. Try it.

static void RegularExpression_Test()


int nameLength,myStringLength;

str myname = “Vasanth”;

str myString = “1234″;

str formatString , formatString1;

System.Text.RegularExpressions.Regex regEx;

System.Text.RegularExpressions.Regex regEx1;

System.Text.RegularExpressions.Match regMatch;

InteropPermission permission = new InteropPermission(InteropKind::ClrInterop);

boolean retVal, retVal1;


nameLength = strLen(myname);

myStringLength = strLen(myString);

formatString   = strfmt(@”^[0-9]{%1}”, myStringLength);

formatString1   = strfmt(@”^[a-zA-Z ]{%1}”, nameLength);


//BP Deviation documented

regEx = new System.Text.RegularExpression.Regex(formatString);

regEx1 = new System.Text.RegularExpression.Regex(formatString1);

regMatch = regEx.Match(myString);

retVal = regMatch.get_Success();

print retVal; // Returns True;

regMatch = regEx1.Match(myname);

retVal1 = regMatch.get_Success();

print retVal1 // Returns True;


Thanks & Regards,

Vasanth Arivali

Dynamic Query Using Aggregative Functions and Joins

Hi All,

Here i written the code to use the Aggregate functions and Joins inDynamic Query in spite of using normal Select statement in Ax 2009

Normal Select Statement:

while select sum(qty) from inventTrans where inventTrans.ItemId ==

“OL-2500” join inventDimgroup by inventBatchId where

inventDim.InventDimId == inventTrans.InventDimId


// Our Code Here


Dynamic Query:

static void Vasanth_Query_Eg1(Args _args)


Query                   query;

QueryBuildDataSource    queryBuildDataSource;

QueryBuildRange         queryBuildRange;

QueryRun                queryRun;

Qty                     total;

InventTrans             inventTrans;


query = new Query();    queryBuildDataSource    = query.addDataSource(tableNum(InventTrans));




queryBuildRange         = queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId));

queryBuildDataSource    = queryBuildDataSource.addDataSource(tableNum(InventDim));




queryRun = new QueryRun(query);

if (queryRun.prompt())


while (


inventTrans = queryRun.get(tableNum(InventTrans));

total = inventTrans.Qty;



info(strFmt(“Quantity: %1″, total));

Using AOT Query Object in X++ Code


Here i posted the code to use the AOT Query Object in our X++ code.


1) Create a AOT Query Object as your requirement.

2) Create a Job and paste the below code to check the Query Object.

static void ExecuteAOTQuery(Args _args)


QueryRun queryRun;

Counter totalRecords;


queryRun = new QueryRun(queryStr(CreatedAOTQueryName));

if (queryRun.prompt())


while (





info(strFmt(“Total Records : %1”, totalRecords));