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

}

测试如图:

AX2012全新的批处理方式的更多相关文章

  1. MySql8.0+全新身份验证方式

    我们在安装MySql8.0+的版本时MySql将会询问我们是否选择全新的身份验证方式,如下图 ⒈第一个是MySql推荐我们使用的强密码加密模式来进行身份验证 MySql8支持基于SHA256改进的更强 ...

  2. 清理C盘系统垃圾文件-批处理方式

    很多时候安装软件越来越多,部分软件产生的临时文件.垃圾文件常常存在于C盘系统盘中:日积夜累直接导致可用的系统盘空间越来越小,直到没有多余的空间为止, 最后可能的结果是系统异常.软件无法正常运行:此时可 ...

  3. 【收藏】Android AutoLayout全新的适配方式, 堪称适配终结者

    来源:http://blog.csdn.net/lmj623565791/article/details/49990941 更多:Android屏幕适配全攻略(最权威的Google官方适配指导) 一. ...

  4. Android AutoLayout全新的适配方式 堪称适配终结者(转)

    一.概述 相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的.个人也比较关注适配的问题,之前也发了几篇 ...

  5. jQuery选择器——全新的总结方式

    jQuery 选择器的总结 用于定位的选择器: 基本选择器:(用来进行绝对定位) $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档 ...

  6. 使用批处理方式从svn 检出DEMO

    Branching in Subversion¶ FROM:https://dev.geogebra.org/trac/wiki/SubversionBranching Some people wan ...

  7. C 自删除技术---批处理方式

    #include<stdio.h> #include<windows.h>#pragma comment(linker, "/subsystem:\"win ...

  8. ASP.NET Core 6框架揭秘实例演示[23]:ASP.NET Core应用承载方式的变迁

    ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来.从设计模式的角度来讲,"管道"是构建者( ...

  9. ContentProvider官方教程(7)3种访问形式:批处理、异步访问、intent间接访问(临时URI权限)

    Alternative Forms of Provider Access Three alternative forms of provider access are important in app ...

随机推荐

  1. android学习笔记15——Galley

    Gallery==>画廊视图 Gallery和Spinnery父类相同——AbsSpinner,表明Garrey和Spinner都是一个列表框. 两者之间的区别是:Spinner显示的是一个垂直 ...

  2. SVN并行开发管理策略

    总的原则:trunk保证相对稳定.分支合并到主干时将冲突降至最低. (1)       trunk用于集成.测试.发布,可以提交fixbug代码,但不允许直接提交新特性. (2)       特性在分 ...

  3. activiti自定义流程之整合(四):整合自定义表单部署流程定义

    综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...

  4. elasticsearch2

    简单认为是可以在命令行下访问url的一个工具 curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求. curl -x 指定http请求的方法 ...

  5. (C/C++ )Interview in English - Virtual

    Q: What is virtual function?A: A virtual function or virtual method is a function or method whose be ...

  6. Servlet间的跳转

       Forward        转向(Forward)是通过RequestDispatcher对象的forward(HTTPServletRequest req, HttpSerletRespon ...

  7. [Serializable]的应用--注册码的生成,加密和验证

    1.首先定义注册类RegisterEntity [Serializable] public class RegisterEntity { public string RegisterKey; publ ...

  8. Xcode7--坑无法运行iOS9以下的模拟器

    Unable to open liblaunch_sim.dylib. Try reinstalling Xcode or the simulator 解决办法 一.找到目标文件 /Applicati ...

  9. 解决Ubuntu 12.10中ZIP文件名乱码的方法

    转摘源地址:http://blog.csdn.net/jiangxinyu/article/details/8206395 安装(12.04及以上): 代码: sudo apt-get install ...

  10. Excel常用函数大全

    1.ABS函数  函数名称:ABS  主要功能:求出相应数字的绝对值.  使用格式:ABS(number)  参数说明:number代表需要求绝对值的数值或引用的单元格.  应用举例:如果在B2单元格 ...