Controller: As the name implies, this class has great responsibility for initiating the operation. This class holds all the information regarding execution mode; it should show a progress form or dialog. It is best practice not to write the whole business login in the Controller class itself. That's why, in this demo, we have created one service class to write our business logic, and that service class reference is provided in this controller class main method.
class CustBalanceController extends
SysOperationServiceController
{
str packedQuery;
CustBalanceDataContract contract;
/// <summary>
/// Sets the query ranges based on caller.
/// </summary>
/// <param name="_query">
/// The hold the <c>Query</c> object of the service.
/// </param>
public void setRanges()
{
QueryBuildRange queryBuildRange;
QueryBuildDataSource queryBuildDataSource;
FormDataSource custTableDS;
CustTable custTable;
str range;
Query _query;
contract = this.getDataContractObject() as
CustBalanceDataContract;
_query = contract.getQuery();
if (this.parmArgs()
&& this.parmArgs().caller()
&& this.parmArgs().dataset() == tableNum(CustTable))
{
custTableDS = FormDataUtil::getFormDataSource
(this.parmArgs().record());
if (_query && custTableDS)
{
// build range
for (custTable = custTableDS.getFirst(true) ?
custTableDS.getFirst(true): custTableDS.cursor();
custTable;
custTable = custTableDS.getNext())
{
range = range == '' ? custTable.AccountNum :
range
+ ',' + custTable.AccountNum;
}
if (range)
{
queryBuildDataSource =
_query.dataSourceTable(tableNum(CustTable));
// check for QueryBuildDataSource
if (queryBuildDataSource)
{
// clear the old range,and then add it
queryBuildDataSource.clearRanges();
if (!queryBuildRange)
{
queryBuildRange
=queryBuildDataSource.addRange
(fieldNum(CustTable, AccountNum));
}
queryBuildRange.value(range);
}
}
}
}
contract .setQuery(_query);
}
public static void main(Args _args)
{
CustBalanceController controller = new
CustBalanceController(classStr(CustBalanceService),
methodStr(CustBalanceService,processData),
SysOperationExecutionMode::Synchronous);
controller.parmArgs(_args);
controller.setRanges();
controller.startOperation();
}
}
Here, we extend the SysOperationServiceController class to inherit controller capabilities. The main method is used to create an instance of the controller class, where we specify the service class and service method which need to be called to execute the business logic. The setRanges() method is called to specify ranges based on the caller.