blog for Dynamics Axapta

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));


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));



Create LookUps Using X++

Hi All,

Here I create Lookups using X++ Code(without Ax Table or EDT relation). For that i override a String(Text) Control’ s lookup method.

public void lookup()


// Added by Vasanth Arivali

// Declaration
Query   LookupQuery    =   new Query();

QueryBuildDataSource     LookupQueryBuildDataSource;

QueryBuildRange                  LookupQueryBuildRange;
SysTableLookup CustomSysTableLookup =       SysTableLookup::newParameters(tableNum(InventTable), this);


// Add fields that you want in Lookups

CustomSysTableLookup.addLookupField(fieldNum(InventTable, ItemId));






// Add DataSource, Range and Value

LookupQueryBuildDataSource =





// Execute the Query


// Added by Vasanth Arivali




Here i write a sample code to find the Table Name of Ax Tables using the TableId.


static void findTables(Args _args)


Dictionary            dictionary;

TableId                                  tableId;

tableName         tableName;



dictionary            =             new Dictionary();

// tableId             =             dictionary.tableNext(0);

tableId                  =             359;       //366; //62;

tableName         =             dictionary.tableName(tableId);


info(strfmt(“%1 – %2”,int2str(tableId), tableName));


//while (tableId)


// tableId = dictionary.tableNext(tableId);

// tableName = dictionary.tableName(tableId);





Thank You,

Vasanth Arivali.


Here a sample code to pass argument to one form to another form and using of Args() class.
1) Create two Forms named FormA and FormB
2)Use the EmplTable as the Datasource of both forms
3)Design FormA with one Grid and add 4 data fields to the Grid(EmplId,DEL_Name,Grade,EmplStatus…..)
4)Assign the datasource for the grid and the data fields
5)Add a Button in FormA
6)Override the Clicked() method and write the below code:
void Clicked()
Args    _args;
FormRun _formRun;
EmplId   _empId;

_empId = EmplTable.EmplId;  // Selected employee id in the Grid is assigned to the variable which is pass to the next form_args = new Args(); // creating a object for args class;  // Form Menuitem
_args.caller(this);  // Form Caller(Current Form is mentioned as this)_args.parm(_empId); // Employee Number is passed to next form[but parm() is not a best practise]
_args.record(EmplTable); // Table name is passed

_formRun = ClassFactory.formRunClass(_args); //new FormRun(_args);   // Creating object for FormRun
_formRun.init();   // Form Initialization for Load;  // Form Run for process
_formRun.wait(); // Form Wait for Display

7) Open the Second Form – FormB
8) Add one Grid Control and set the Data Source is EmplTable
9) Add 4 data fields as same in the Form A
10)Now Override the Init() of Form
public void init()

parmid      _parmId;
EmplTable   _EmplTable;
//     DictTable   _dictTable;    FormBuildDataSource   _ds;    FormBuildGridControl frmGrid; // These are for dynamic Form creation so leave it
_parmId =  element.args().parm(); // Getting the argument value from the Caller

if(!element.args().caller())   // Check the form is called by caller or directly, if directly it throw error
throw error(“Cant Run Directly”);
if(element.args().record().TableId == tablenum(EmplTable))   // check if the sent Table and the Current form table are equal or not

//        _EmplTable = element.args().record();  // Assign the Received Table name to Local Variable
//_dictTable = new DictTable(element.args().record().TableId);  // leave it , is used for Dynamic Form Creation
//_ds = form.addDataSource(;  // leave it , is used for Dynamic Form Creation

//_ds.table(;   // leave it , is used for Dynamic Form Creation
//frmGrid = form.addControl(FormControlType::Grid, “Grid”);   // leave it , is used for Dynamic Form Creation

//frmGrid.dataSource(;   // leave it , is used for Dynamic Form Creation
//info(strfmt(“%1     %2”,_EmplTable.EmplId,_EmplTable.DEL_Name));

//frmGrid.addDataField(,fieldnum(EmplTable, DEL_Name));  // leave it , is used for Dynamic Form Creation
//        EmplTable_EmplId.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation

//        EmplTable_EmplId.dataField(fieldnum(EmplTable,EmplID));   // leave it , is used for Dynamic Form Creation

//        EmplTable_DEL_Name.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation

//        EmplTable_DEL_Name.dataField(fieldnum(EmplTable,EmplId));  // leave it , is used for Dynamic Form Creation//        EmplTable_DEL_Email.dataSource(_EmplTable);   // leave it , is used for Dynamic Form Creation

//        EmplTable_DEL_Email.dataField(fieldnum(EmplTable,EmplId));   // leave it , is used for Dynamic Form Creation

super();  // Form Initialization
info(“DataSet Not Received”);  // throw error

11)Override the Init() of the DataSource

public void init()

switch(element.args().dataset())// get the table id sent by caller
case tablenum(EmplTable):  // check the table if matches with this tableid
_EmplID  =   element.args().parm();  // get the argument value
query   = new Query();            queryBuildRangeProj =                                          query.addDataSource(tablenum(EmplTable)).addRange(fieldnum(EmplTable,EmplId));          // query build for the form to display
queryBuildRangeProj.value(_emplId); // Criteria for the form
EmplTable_ds.query(query); // execution of the query

super(); //datasource  initialization on the form based on the criteria

12) Save it, and create two menu items for each.
13) It is important to change the runon property of the FormB as CalledFrom.
14)Run the FormA and select an Employee Record and click the button.
15)The FormB opens with the Related information of the Selected Employee on form.

Thanks & Regards,
Vasanth Arivali

This is the example to connect the External Database to Ax
void ODBCConnection()
LoginProperty LP                =  new LoginProperty();
OdbcConnection                  myConnection;
TableName                            TableName;
Statement                              myStatement;
ResultSet                                 myResult;

myConnection = new OdbcConnection(LP);
info(“Check username/password.”);

myStatement = myConnection.createStatement();
new SqlStatementExecutePermission(“SELECT * from TableNamewhere bImportflag = 0”).assert();
myResult = myStatement.executeQuery(“SELECT * from TableNamewhere bImportflag = 0”);
while (
TableName.nMember                = Member;
TableName.tMemberName            = MembName;
TableName.tMemberAddress         = Address;
TableName.tRescountry            = Country;
TableName.tResState              = State;

Thank & Regards

Vasanth Arivali

Hello world!

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