AX2012全新的批处理方式

AX2009 的批处理操作我们是通过RunBaseBatch framework,我们所要做的事情就是继承RunBaseBatch class,实现里面该实现的方法来执行批处理。

AX2012 的批处理操作是采用SysOperation framework,SysOperation framework是采用运行WCF服务来运行批处理以及处理客户端与服务端的会话。

还有一个更大的不同就是编程的模式不同,在09,我们是继承RunBaseBatch class,所有的逻辑都混杂在一起,二12的模式采用的MVC模式(Model-View-
Controller)具体可以参考.net的MVC模式,这种模式的好处可以让代码更有健壮性,及松耦合,坏处 就是我们得写好几个类

现在具演示一个2012处理批处理的实例

按照上面图片的显示,我们需要创建4个类

首先,我们创建服务类,服务类需要继承 SysOperationServiceBase

class IWS_TestBatchService extends SysOperationServiceBase

{

}

添加一个方法,该方法的参数必须指定是哪个契约contract

public void getData(IWS_TestBatchContract _contract)
{
    ItemId                  formItemId;
    ;
    formItemId  =   _contract.parmFromItemId();
    //dosomething
}

第二个类 数据契约类

[
DataContractAttribute,//表示是一个数据契约类
SysOperationContractProcessingAttribute(classStr(IWS_TestBatchBuilder)),//这个属性指定与哪个Builder关联
SysOperationGroupAttribute('Item'      , "物料"   , '1')//可以多个组//相当于dialogGroup
]
class IWS_TestBatchContract implements SysOperationValidatable//实现该类,可以验证数据元素的合规性
{
    ItemId      itemid;
}

添加一个数据元素

[DataMemberAttribute,//表示该方法是一个元数据
//SysOperationLabelAttribute("物料编号"),//该元数据的标签
SysOperationDisplayOrderAttribute("1"),//在组里的位置
SysOperationGroupMemberAttribute("Item") ]//相当于dialogGroup
ItemId  parmItemId(ItemId   _itemId = itemId)
{
    itemId  =   _itemId;
    return itemId;
}

由于实现了SysOperationValidatable这个类,所以我们必须实现Validate方法

public boolean validate()
{
    //检查数据的合理性
    return true;
}

第三个类,就是Builder,也就是界面,该类应该继承SysOperationAutomaticUIBuilder

class IWS_TestBatchBuilder extends SysOperationAutomaticUIBuilder
{
    DialogField             fldFromItemId;
    IWS_TestBatchContract   batchContract;
}

private boolean itemId_modified(FormStringControl _control)//控件Modify方法
{
    boolean             ret = _control.modified();
    if(ret)
    {
        info("modify itemId");
    }
    return ret;
}

private void itemId_Lookup(FormStringControl _control)//控件lookup方法

{    

ItemId                          itemId =    fldFromItemId.value();    

SysTableLookup                  sysTableLookup;    

Query                           query          = new Query();    

QueryBuildDataSource            queryBuildDataSource;    

QueryBuildDataSource            qbds1,qbds2;    

;    

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

sysTableLookup = SysTableLookup::newParameters(tableNum(InventTable),_control);    

sysTableLookup.addLookupfield(fieldNum(InventTable, ItemId));    

sysTableLookup.addLookupfield(fieldNum(InventTable, ItemType));    

sysTableLookup.parmQuery(query);    

sysTableLookup.performFormLookup();

}

 

protected DialogField addDialogField(IdentifierName methodName, Object _dataContract=this.dataContractObject())//与契约的元数据进行一一绑定

{     DialogField ret;

    ret = super(methodName, _dataContract);    

   switch(methodName)    

   {        

       case methodStr(IWS_TestBatchContract, parmItemId):            

             fldFromItemId = ret;            

             break;    

    }     return ret;

}

protected void buildGroup(SysOperationGroupInfo groupInfo, FormBuildGroupControl groupControl) //对控件的排版分配

{    

    super(groupInfo, groupControl);

    if (groupControl.name() == 'Item')    

    {        

         groupControl.columns(3);    

     }

}

public void postBuild() //该方法非常关键,主要用来获取契约,然后可以对我们的控件进行事件的注册及相关的方法

{    

super();    

//获取数据契约信息     batchContract    =   this.controller().getDataContractObject(identifierStr('_dataContract'));    

//得到数据契约的原数据,相当于09的getDialogField     fldFromItemId           =   this.bindInfo().getDialogField(batchContract,methodStr(IWS_TestBatchContract,parmItemId));        

   //注册我们刚刚创建的modify,lookup方法    

    fldFromItemId.registerOverrideMethod(     methodStr(FormStringControl,modified),     methodStr(IWS_TestBatchBuilder,itemId_modified),this);

    fldFromItemId.registerOverrideMethod(     methodStr(FormStringControl,lookup),     methodStr(IWS_TestBatchBuilder,itemId_Lookup),this);

}

public void postRun()//此方法运行在POST BUILD之后,可以做一些后续逻辑的分配

{    

   FormStringControl      formStringControl;    

   int                    controlId;     ;

    super();    

    fldFromItemId.enabled(true);

}

 

最后一步就是Controller,逻辑的入口,也应该继承SysOpSampleBaseController

class IWS_TestBatchController extends SysOpSampleBaseController
{
}

public static IWS_TestBatchController constuct() //该方法可以为了在实例化的时候与服务对象进行绑定

{    

  IWS_TestBatchController controller;    

  //通过参数将控制器和服务进行绑定    

  controller =  new IWS_TestBatchController();    

  controller.parmClassName(classStr(IWS_TestBatchService));    

  controller.parmMethodName(methodStr(IWS_TestBatchService, getData));

      return controller;

}

public void formInit() //该方法根据传递的对象对契约的元数据进行一些默认值的设置

{    

   IWS_TestBatchContract       dataContractInfo;    

   Common                      tmpcom;    

   InventTable                 inventTable;   

  ;

    dataContractInfo    =   this.getDataContractObject(identifierStr('_dataContract'));    

    dataContractInfo    =   this.getDataContractObject(identifierStr('_dataContract'));    

    tmpcom=  args.record();    

    if(tmpcom.TableId   ==  tableNum(InventTable))    

    {         inventTable           =   tmpcom as InventTable;         dataContractInfo.parmItemId(inventTable.ItemId);

    }    

    //else if{}       

}

public ClassDescription caption()//标题
{
    return "物料测试";
}

public static void main(Args args)

{    

  IWS_TestBatchController  controller;

  controller = IWS_TestBatchController::constuct();    

  //controller.parmArgs(args);     //是否有对象传递

  //controller.parmLoadFromSysLastValue(false);  //是否保存上一次的值

  //controller.formInit();//初始化对象及默认值

     controller.startOperation();//开始操作

}

 

测试如图:

posted @ 2013-11-01 12:15  adingkui  阅读(1792)  评论(0编辑  收藏  举报