blog for Dynamics Axapta

Archive for the ‘Microsoft Dynamics Ax 2012’ 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

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


Hello world!

Welcome to This is your first post. Edit or delete it and start blogging!

YouTube – 【CCTV2010春节联欢晚会】22.杂技《试比天高》