blog for Dynamics Axapta

Author Archive

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

Enhanced SysTableBrowser – View only the fields you want in table browser

Hi Folks,

Please find the link below to download the project for Enhanced Table Browser in Ax 2012. No need to scroll left / right any more on big table, just select and view only the fields you want.

You can download the project from this blog


You no need to do deploy the changes in form getRadioControl() from the project.

Hope it will help you well.

//Vasanth Arivali

Filter Second lookup based on First Value – Ax 2012 SSRS

Hi Folks,

I got one requirement to get invoices of a customer on the particular month range in SSRS Report Dialog. I have achieved that and want share. Here we go…..

Create a Contract Class with 4 parameter methods for Customer account, Month, Year, InvoiceId and follow the below code

1) Create a class for UI Builder

class SampleReportUIBuilder extends SrsReportDataContractUIBuilder
    DialogField                         dialogCustomer;
    DialogField                         dialogMonth;
    DialogField                         dialogYear;
    DialogField                         dialogInvoiceId;

    SampleDataContract                  dataContract;

2) override the build method

public void build()
    Dialog  dialogLocal;

    dialogLocal             = this.dialog();

    dataContract = this.dataContractObject();

    this.addDialogField(methodStr(SampleDataContract, parmCustAccount), dataContract);
    this.addDialogField(methodStr(SampleDataContract, parmMonth), dataContract );
    this.addDialogField(methodStr(SampleDataContract, parmYear), dataContract );
    this.addDialogField(methodStr(SampleDataContract, parmInvoiceId), dataContract );

3) override the initializeFields method

public void initializeFields()
    dataContract= this.dataContractObject();

4) override the getFromDialog Method

public void getFromDialog()
    comparisionDataContract = this.dataContractObject();


5) add new method for CustomerAccount Lookup

public void lookupCustomerAcc(FormStringControl _control)
    Query                   query = new Query();
    QueryBuildDataSource    qbdsCustomer;

    QueryBuildFieldList     qbfsCustomerFieldList;

    SysTableLookup          sysTableLookup;

    sysTableLookup  = SysTableLookup::newParameters(tableNum(CustTable), _control);
    qbdsCustomer  = query.addDataSource(tableNum(CustTable));

    qbfsCustomerFieldList= qbdsCustomer  .fields();
    qbfsCustomerFieldList.addField(fieldNum(CustTable, AccountNum));
    qbfsCustomerFieldList.addField(fieldNum(CustTable, Party));        

    // Perform Lookup
    sysTableLookup.addLookupfield(fieldnum(CustTable, Id));
    sysTableLookup.addLookupfield(fieldnum(CustTable, Party));

6) add Modified method for CustomerAcc

public boolean customerAccModified(FormStringControl _control)

    return true;

7) add new method for Year Lookup

//BP deviated
public void lookupYear(FormStringControl _control)
    Query                       query                       = new Query();

    YearBase                    maxYear;
    YearBase                    minYear;
    YearBase                    currentYear;

    // new own tmp table to hold year
    MyOwnYearTmp                yearTmp;
    SysTableLookup              sysTablelookup;

    sysTablelookup  = SysTableLookup::newParameters(tableNum(KepYearTmp),_control);

    minYear         = 1965;
    maxYear         = year(systemDateGet());

    for(currentYear = maxYear; currentYear >= minYear; currentYear--)
        yearTmp.YearBase = currentYear;



8) add new Modified method for Year

public boolean yearModified(FormStringControl _control)

    return true;

9) add InvoiceId lookup, this lookup will get data based on the selected customer, month and year

public void lookupInvoiceId(FormStringControl _control)
    Query                   query = new Query();

    QueryBuildDataSource    qbdsCustInvoiceTable;
    QueryBuildRange         qbrCustInvoiceTable;
    QueryBuildFieldList     qbfsCustInvoiceTableFieldList;

    SysTableLookup          sysTableLookup;

    TransDate               invStDate, invEndDate;
    container                 conDates;

    sysTableLookup  = SysTableLookup::newParameters(tableNum(CustInvoiceTable), _control);

    // my own class to get month startdate and enddate from dialog
    conDates= MyDateClass::getDateRange(dialogMonth.value() , dialogYear.value() , false, true);

    invStDate   = conPeek(conDates, 1);
    invEndDate  = conPeek(conDates, 2);

    // CustInvoiceTable DataSource
    qbdsCustInvoiceTable    = query.addDataSource(tableNum(CustInvoiceTable));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceAccount)).value(queryValue(dialogCustomer.value()));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceDate)).value(queryValue(invStDate));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceDate)).value(queryValue(invEndDate));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceStatus)).value(queryValue(InvoiceStatuses::Posted));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceType)).value(queryValue(InvoiceTypes::Invoice));

    // CustInvoiceTable FieldList
    qbfsCustInvoiceTableFieldList = qbdsCustInvoiceTable.fields();
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, InvoiceAccount));
    qbfsCustInvoiceTableFieldList.addField(fieldnum(CustInvoiceTable, InvoiceId));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilStartDate));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilEndDate));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilInvoiceStatus));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilInvoiceType));

    // Perform Lookup
    sysTableLookup.addLookupfield(fieldnum(CustInvoiceTable, InvoiceId));
    sysTableLookup.addLookupfield(fieldnum(CustInvoiceTable, McsConnectionId));

10) add new Modified method for InvoiceId

public boolean InvoiceIdModified(FormStringControl _control)

    return true;

11) override the PostBuild method

public void postBuild()

    dialogCustomer = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmCustomer));
    if (dialogCustomer)

    // register override method for lookup
    dialogCustomer.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupCustomerAcc), this);

    // register override method for modified
    dialogCustomer.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , customerAccModified), this);

    // From binding info, get the dialog field for racecode attribute
    dialogMonth = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmMonth));

    // From binding info, get the dialog field for racecode attribute and add button
    dialogYear = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract,parmYear));
    if (dialogYear)

    // register override method for lookup
    dialogYear.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupYear), this);
    // register override method for modified
    dialogYear.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , yearModified), this);

    dialogInvoiceId = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmInvoiceId));
    if (dialogInvoiceId)

    // register override method for lookup
    dialogInvoiceId.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupInvoiceId), this);
    // register override method for modified
    dialogInvoiceId.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , InvoiceIdModified), this);

11) Use the UI Builder class in Contract Calss as below

    SysOperationGroupAttribute('Criteria', "@SYS13128", "1")
class SampleDataContract implements SysOperationInitializable, SysOperationValidatable
    CustomerAcc         CustomerAcc;
    TransDate           invoiceDate;
    MonthsOfYear        invoiceMonth;
    Year                invoiceYear;
    InvoiceId           invoiceId;


Hope it will help……

// 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