zoukankan      html  css  js  c++  java
  • 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();//开始操作

    }

    测试如图:

  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/dingkui/p/3401490.html
Copyright © 2011-2022 走看看