Tuesday 25 July 2017

How to create a custom filter on list or inquiry form in Dynamics AX 2012

During development we have to create custom inquiry forms. Or Form where we can  search and filter records on different criteria.

Consider a scenario, where we have to build custom inquiry form for all saleline. In this inquiry or custom list form, we can filter on records on date, customer and amount or discount.
Lets do this,

Create a form with name custom Sales

From expend its designs and right click on design to open its property window

Design property

From property window set its design style to simplelist


Simple list

Now add new data source on form, and sets create and edit property to no, Because we did not want to insert , update and delete operation  on this form.

Drop down


Now drag and drop following fields form  data source to grid.

ItemId,CustNumber,SalesQty,SalesPrice,

selected fields

Now right click on grid and set its datasource to salesline.
Datasource for grid
Now run the form its look like similar

Grid with data
Now above grid, add  group control and set its column property to 2, also set its visible property to true.
Add String Edit control, and button here.
Right click on String Edit control and set its auto delecaration to true, so we can access this control in x++. Set its name as “txtCustomerNum”. And set its lookup property to always.


ControlName


lookup always

Now we are going to create Unbound control with lookup,
Right lock on methods under stringEditcontrol and add lookup method.
Add following code to fill the lookup to customer and Name which belongs to current legal entity.
public void lookup()
{
Query query = new Query();
QueryBuildDataSource queryBuildDataSource, qbds, dsView;
QueryBuildRange queryBuildRange;

SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(CustTable), this);

sysTableLookup.addLookupField(fieldNum(CustTable, AccountNum));
sysTableLookup.addLookupField(fieldNum(CustTable, Party), false);

queryBuildDataSource = query.addDataSource(tableNum(CustTable));

qbds = queryBuildDataSource.addDataSource(tableNum(DirPartyTable));
qbds.joinMode(JoinMode::InnerJoin);
qbds.addLink(fieldNum(CustTable, Party), fieldNum(DirPartyTable, RecId));

dsView = qbds.addDataSource(tableNum(DirPartyPostalAddressView));
dsView.joinMode(JoinMode::InnerJoin);
dsView.addLink(fieldNum(DirPartyTable, RecId), fieldNum(DirPartyPostalAddressView, Party));


sysTableLookup.parmQuery(query);

sysTableLookup.performFormLookup();


}

Now run the form lets see the how behave the lookup control.
Lookupdisplay
Man its working. Now check that selected value from this textbox is accessible, then we move to filter the records
Add Click event/ method on button we just added with this string edit button.

And right following code.
void clicked()
{
super();
info(  txtCustomerNumber.text());
}


Now run the form, select customer and click on button.
dd


Now right click on Salesline datasource and over rights its execute Query method.
And add following lines to filter it.
public void executeQuery()
{
QueryBuildRange QcustomerFilter;
QcustomerFilter = SysQuery::findOrCreateRange(SalesLine_q.datasourceTable(tableNum(SalesLine)),fieldNum(SalesLine,CustAccount));
if (txtCustomerNumber.text()!=””)
{
QcustomerFilter.value(queryValue(txtCustomerNumber.text()));

}
else
{
QcustomerFilter.value(SysQuery::valueUnlimited());
}
super();
}

In button click even add this line code
void clicked()
{
super();
SalesLine_ds.executeQuery();

}



Now run the form, select the customer and click on button, you will find the filter records on form
Column

An export format or a method of payment with an export format must be specified



 
An export format or a method of payment with an export format must be specified.


To reolve the error I had to move the current execution point from the CustVendSumForPaym class, constructor method “custVendSumForPaym.getLast();” Line to avoid looking in the cache (SysLastValue) and retrieving a payment method format that does not exist. I was asked to rename a file format method text that I had created, and had referenced this class during my testing. I tried both clearing the cache and restarting the AOS but was unsuccessful attempting to remove the reference to the previously selected payment settings.
 
The source of my woes.