• 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();//开始操作

    }

    测试如图:

  • 相关阅读:
    CSS选择器
    CSS的语法规范
    CSS简介
    spring 工厂模式解耦的升级版(多例转单例)
    Html label标签
    Java 多线程入门详解
    Html 表单
    Html 列表
    web项目的建立(idea版本)
    工厂模式详解
  • 原文地址:https://www.cnblogs.com/dingkui/p/3401490.html
Copyright © 2020-2023  润新知