Wednesday 22 January 2014

RunBase in Ax

The RunBase framework provides a standardized approach to creating processes and batch jobs in Microsoft Dynamics AX.

The framework is implemented by the RunBase application class and supplies many features, which include the following:
  • Query
  • Dialog, with persistence of the last values entered by the user
  • Validate
  • Batch execution for users to schedule jobs. This functionality uses the RunBaseBatch class) and the pack and unpack methods with versioning.
  • Progress bar
  • Run
  • Client/server-optimized
Following are descriptions of some of the most important RunBase methods.
new Method

Always call super() in the new method.
The new method must not be too slow for your needs (it is periodically called for administrative purposes).
description Method

You must create a static description method that returns a class description—the class's role in the UI.
The description method must have the RunAs property set to Called or the equivalent behavior. If the class is defined as client or server, define the method as client server.
For example:
client server static ClassDescription description()
{
return "@SYS54106";
}
run Method

The RunBase.run method is the central method of the class. The job is done in the run method.
Skeleton:
void run()
{
    // Local declarations.
    try
    {
        this.progressInit
        ttsBegin;
        // Reset the variables that were changed in the transaction.
        ...
        // Do the job.
        while select forUpdate myTrans...
        {
            progress.incCount();
            progress.setText
            ...
            ...
        ttsCommit;
    }
    catch (Exception::Deadlock)
    {
        retry;
    }
}
pack and unpack Methods

For information about the pack and unpack methods, see the pack-unpack design pattern.
RunBaseReport.initQuery Method

Place code that modifies the RunBase query in the RunBaseReport.initQuery method. The RunBaseReport.initQueryRun method calls initQuery.
If the query in a RunbaseReport depends on values from the dialog, call this.initQueryRun after the data is moved from the fields to the variables.

Example

private boolean getFromDialog()
{
    ;
    perDate = dialogDate.value();
    this.initQueryRun();
    return super();
}
 
The initQueryRun method in the previous code calls initQuery.
private Query initQuery()
{
    query query = super();
    queryBuildRange qbr;
    ;
    qbr = query.dataSourceTable(
        tableNum(InventTrans)).findRange(
            fieldNum(InventTrans,DatePhysical));
    if (!qbr)
    {
        qbr = query.dataSourceTable(
            tableNum(InventTrans)).addRange(
                fieldNum(InventTrans,DatePhysical));
    }
    qbr.value(SySQuery::range(prevYr(PerDate),PerDate));
    qbr = query.dataSourceTable(
        tableNum(InventTrans)).findRange(
            fieldNum(InventTrans,DateFinancial));
    if (!qbr)
    {
        qbr = query.dataSourceTable(
            tableNum(InventTrans)).addRange(
                fieldNum(InventTrans,dateFinancial));
    }
    qbr.value(SysQuery::value(perDate+1) 
    + '..' + ',' + sysQuery::valueEmptyString());
    return query;
}

RunBase class: The RunBase class is a framework for classes that need a dialog for user interaction and that need the dialog values to be saved per user. The RunBase application framework runs or batches an operation. An operation is a unit of work, such as the posting of a sales order or calculation of a master schedule.The RunBase framework uses the Dialog framework to prompt a user for data input. It uses the SysLastValue framework to persist usage data and the Operation Progress framework to show operation progress.

class RunBase extends Object implements SysSaveable, SysRunable

RunBaseBatch class: All jobs that must be able to run in a batch must inherit from this class. The RunBaseBatch framework extends the RunBase framework, and X++ classes that extend this framework can have their operations enlisted in the batch queue.

class RunBaseBatch extends RunBase implements Batchable

RunBaseReport class: The RunBaseReport class makes all reports batchable and creates a standard dialog box. 

class RunBaseReport extends RunBaseBatch

This class is instantiated through the SysReportRun Class. It should be used by all reports. The purpose of the class is to: 

- Make all reports batchable 
- Create a standard dialog 

If you are creating more complex reports, it might be necessary to inherit from this class. If this is the case, you must create the following methods: 

lastValueElementName(). Returns the report name. 
description(). Static. 
main(). Static. 

No comments:

Post a Comment