I created a new query in AOT with only dataSource ‘CustTable’, as I want to loop on selected customers only. I created a class extending from RunBase (did not want to touch existing report and class for customer account statement) being considering it a custom process of generating customer account statement using X++ code opposed to what exists in system.
New query looks like this with three ranges, these ranges will show on dialog form
Created a new class with following methods which are common for every dialog class;
- main
- construct
- new
- pack
- unpack
- dialog
- getFromDialog
- run
- showQueryValues
- queryRun
I will explain important methods from the class which I think need discussion.
QueryRun method – this method will be called from Pack() method from this line of code return [#CurrentVersion,#CurrentList,this.queryRun().pack()];
public QueryRun queryRun()
{
QueryRun ret;
QueryBuildDataSource qbds;
CustTable custTable =
CustTable::findRecId(selectedRec);
if
(!queryRun)
{
query
= new
query(queryStr(FF_CustAccountStatement));
qbds = query.dataSourceTable(tableNum(custTable));
if(selectedRec)
{
SysQuery::findOrCreateRange(qbds, fieldNum(custTable, AccountNum)).value(custTable.AccountNum);
SysQuery::findOrCreateRange(qbds, fieldNum(custTable,
CustGroup)).value(custTable.CustGroup);
SysQuery::findOrCreateRange(qbds, fieldNum(custTable,
AccountStatement)).value(SysQuery::value(custTable.AccountStatement));
}
else
{
SysQuery::findOrCreateRange(qbds, fieldNum(custTable,
AccountNum)).value(SysQuery::valueUnlimited());
SysQuery::findOrCreateRange(qbds, fieldNum(custTable,
CustGroup)).value(SysQuery::valueUnlimited());
SysQuery::findOrCreateRange(qbds, fieldNum(custTable,
AccountStatement)).value(SysQuery::valueUnlimited());
}
queryRun = new QueryRun(query);
}
ret = queryRun;
return
ret;
}
This method generates customer account statement for each provided customer in query. This method is called from run() method;
while (queryRun.next())
{
custTable = queryRun.get(tableNum(custTable));
//this.setParameters(custTable);
filename = WinAPI::getTempPath()+”Customer “+ custTable.AccountNum+ ” Customer Account Statement.pdf”;
this.createCustAccountStatement(custTable, filename);
}
It generates report in user’s temp folder for each selected customer on below screen [this is custom screen created by a class which I referred above]