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();//开始操作
}
测试如图:

AX2012全新的批处理方式的更多相关文章
- MySql8.0+全新身份验证方式
我们在安装MySql8.0+的版本时MySql将会询问我们是否选择全新的身份验证方式,如下图 ⒈第一个是MySql推荐我们使用的强密码加密模式来进行身份验证 MySql8支持基于SHA256改进的更强 ...
- 清理C盘系统垃圾文件-批处理方式
很多时候安装软件越来越多,部分软件产生的临时文件.垃圾文件常常存在于C盘系统盘中:日积夜累直接导致可用的系统盘空间越来越小,直到没有多余的空间为止, 最后可能的结果是系统异常.软件无法正常运行:此时可 ...
- 【收藏】Android AutoLayout全新的适配方式, 堪称适配终结者
来源:http://blog.csdn.net/lmj623565791/article/details/49990941 更多:Android屏幕适配全攻略(最权威的Google官方适配指导) 一. ...
- Android AutoLayout全新的适配方式 堪称适配终结者(转)
一.概述 相信Android的开发者对于设配问题都比较苦恼,Google官方虽然给出了一系列的建议,但是想要单纯使用这些建议将设备很轻松的做好,还是相当困难的.个人也比较关注适配的问题,之前也发了几篇 ...
- jQuery选择器——全新的总结方式
jQuery 选择器的总结 用于定位的选择器: 基本选择器:(用来进行绝对定位) $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档 ...
- 使用批处理方式从svn 检出DEMO
Branching in Subversion¶ FROM:https://dev.geogebra.org/trac/wiki/SubversionBranching Some people wan ...
- C 自删除技术---批处理方式
#include<stdio.h> #include<windows.h>#pragma comment(linker, "/subsystem:\"win ...
- ASP.NET Core 6框架揭秘实例演示[23]:ASP.NET Core应用承载方式的变迁
ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来.从设计模式的角度来讲,"管道"是构建者( ...
- ContentProvider官方教程(7)3种访问形式:批处理、异步访问、intent间接访问(临时URI权限)
Alternative Forms of Provider Access Three alternative forms of provider access are important in app ...
随机推荐
- GCC 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- /proc 文件系统
linux提供了一种特殊的文件系统procfs,通常以/proc目录的形式呈现.该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问.只要应用程序有正确的访问全息,就可以通过读写这些文件 ...
- shell下root用户切换其他用户运行程序
工作中,一些程序,需要随机启动,但是不是以root用户运行,于是需要在rc.local中通过shell,从root用户切换到其他用户运行程序,命令如下: su -c 'command' - user ...
- SpringMVC4.0.3 @ResponseBody JSON 中文乱码问题
@RequestMapping(value="listUserJson.html",produces="text/html;charset=UTF-8") @R ...
- Form_Form树形结构HTree的开发(案例)
2014-06-09 Created By BaoXinjian
- PLSQL_基础系列05_视图控制WITH CHECK OPTION(案例)
2014-12-09 Created By BaoXinjian
- IREP_SOA Integration WSDL概述(概念)
20150827 Created By BaoXinjian
- USACO CHAPTER 1 1.1 Ride 水题
水题,主要是学习文件输入输出. /* ID: ijustwa1 LANG: C++ TASK: ride */ #include<cstdio> #include<cstring&g ...
- js复习(一)
一.常用数据框1.alert(""):警告对话框,作用是弹出一个警告对话框 2.confirm(""):确定对话框,弹出一个带确定和取消按钮的对话框--确定返回 ...
- 关于java MulticastSocket中的joinGroup(SocketAddress mcastAddr,NetworkInterface netif)
今天复习了一下java网络编程这方面(其实是之前没有学好),之前在linux下用c来做过一些例子,不过不好久没有用也就忘得一干二净了.不知道c/c++的东西不太好记,还是当初没好好学. 关于组播这方面 ...