[AX]AX2012 Number sequence framework :(三)再谈Number sequence
AX2012的number sequence framework中引入了两个Scope和segment两个概念,它们的具体作用从下面序列的例子说起。
法国/中国的法律要求财务凭证的Journal number包含公司代码和财务期间,比如这样的号码J-20-Jan11-000340,J表上Journal,20代表的是公司代码,Jan11为财务期间,000340才是系统生成的流水号。
在创建Numer sequence的界面上可以选择需要的Scope:

Company and fiscal calendar period是较为复杂的scope类型,要求选择相应的公司和财务日历期间:

Segment中自动包含company和Fiscal calendar period用于生成具体的序列号码,Segment仍然是可以修改的,包括Company和Fiscal calendar period segment都是可以的,也允许创建多个Company和Fiscal calendar period segment。
公司Scope的EDT序列引用
Sequence number常常用于EDT类型字段的自动生成,可以认为EDT类型和Sequence number refrence是一回事,在自定义NumberSeqApplicationModule.LoadModule()中注册EDT类型的序列号引用:
Sequence number常常用于EDT类型字段的自动生成,可以认为EDT类型和Sequence number refrence是一回事,在自定义NumberSeqApplicationModule.LoadModule()中注册EDT类型的序列号引用:
public void loadModule()
{
NumberSeqDatatype datatype = NumberSeqDatatype::construct();
;
/* Work Order Number */
datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum));
datatype.parmReferenceHelp("Unique identifier for work orders");
datatype.parmWizardIsContinuous(false);
datatype.parmWizardIsManual(NoYes::No);
datatype.parmWizardIsChangeDownAllowed(NoYes::No);
datatype.parmWizardIsChangeUpAllowed(NoYes::No);
datatype.parmSortField();
datatype.parmWizardHighest();
datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);
this.create(datatype);
}
注意datatype.addParameterType(NumberSeqParameterType::DataArea, true, false)的第一个参数NumberSeqParameterType::DataArea,它明确EDT引用的Sequence number的Scope类型为Company,使用Organization administration > Common > Number sequences > Number sequences界面的Generate为这个EDT类型自动创建Sequence number时会为每一个公司创建一个序列,序列scope为Company并指定相应的公司:

通常我们会在模块的参数表上创建numRefXXX()方法方便在代码中引用,上面例子中EDT的numRefXXX()方法类似:
client server static NumberSequenceReference numRefWorkOrderNum()
{
NumberSeqScope scope = NumberSeqScopeFactory::createDataAreaScope(selectableDataArea _dataArea = curext());
return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
}
注意调用NumberSeqScopeFactory::createDataAreaScope(curext())从基于当前公司创建的序列Scope。
Company and fiscal calendar period Scope的EDT序列引用
为EDT创建Company and fiscal calendar period Scope 的序列引用需要修改的第一个地方是LoadModule:
public void loadModule()
{
NumberSeqDatatype datatype = NumberSeqDatatype::construct();
;
/* Work Order Number - Company and fiscal calendar*/
datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_CompFiscal));
datatype.parmReferenceHelp("Unique identifier for work orders - Company and fiscal calendar");
datatype.parmWizardIsContinuous(false);
datatype.parmWizardIsManual(NoYes::No);
datatype.parmWizardIsChangeDownAllowed(NoYes::No);
datatype.parmWizardIsChangeUpAllowed(NoYes::No);
datatype.parmSortField();
datatype.parmWizardHighest();
datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);
datatype.addParameterType(NumberSeqParameterType::FiscalCalendarPeriod, true, false);
this.create(datatype);
}
注意调用了两次addParameterType()来添加DataArea和FiscalCalendarPeriod两种Scope类型,这种类型的Refrence在模块的Parameters form上可能看不到,通常在参数form的numberSeqPreInit()方法中我们通常是创建一个DataArea的Scope对象:
scope = NumberSeqScopeFactory::createDataAreaScope();
第二个需要修改的地方是参数表上的numRefXXX()方法,我们需要创建对应的DataAreaFiscalCalendarPeriod Scope:
client server static NumberSequenceReference numRefWorkOrderNum_CompFiscal(TransDate _date = systemdateget())
{
NumberSeqScope scope = NumberSeqScopeFactory::CreateDataAreaFiscalCalendarPeriodScope(
curext(),
FiscalCalendars::findPeriodByPeriodCodeDate(CompanyInfo::fiscalCalendarRecId(),_date).RecId
);
return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
}
对于Company and fiscal calendar period Scope的EDT,“Set up number sequence” wizard工具是不会为我们创建相应的序列的,我们只能手工创建,在Number sequence编辑窗口的Refrence下选择引用到具体的EDT类型。
Shared Scope的EDT序列引用
Shared scope是个比较特殊的序列Scope,它不和任何公司和财务日历关联,创建Shared Scope的EDT类型引用不需要调用addParameterType():
public void loadModule()
{
NumberSeqDatatype datatype = NumberSeqDatatype::construct();
;
/* Work Order Number - Shared*/
datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_Shared));
datatype.parmReferenceHelp("Unique identifier for work orders - Shared");
datatype.parmWizardIsContinuous(false);
datatype.parmWizardIsManual(NoYes::No);
datatype.parmWizardIsChangeDownAllowed(NoYes::No);
datatype.parmWizardIsChangeUpAllowed(NoYes::No);
datatype.parmSortField();
datatype.parmWizardHighest();
this.create(datatype);
}
同样需要修改numRefXXX()方法,我们需要创建Global Scope:
client server static NumberSequenceReference numRefWorkOrderNum_Shared()
{
NumberSeqScope scope = NumberSeqScopeFactory::CreateGlobalScope();
return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
}
“Set up number sequence” wizard工具能够为Shared scope的EDT类型创建引用序列,当然只会创建一个Sequence number,而不是一个公司一个Sequence number。
可配置的EDT序列引用
还没有讲到的datatype.addParameterType(NumberSeqParameterType::DataArea, true, false)的最后一个参数,这个参数为true上表示EDT引用的序列类型是可以配置的,看下面的例子:
public void loadModule()
{
NumberSeqDatatype datatype = NumberSeqDatatype::construct();
;
/* Work Order Number - Configurable*/
datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_Configurable));
datatype.parmReferenceHelp("Unique identifier for work orders - Configurable");
datatype.parmWizardIsContinuous(false);
datatype.parmWizardIsManual(NoYes::No);
datatype.parmWizardIsChangeDownAllowed(NoYes::No);
datatype.parmWizardIsChangeUpAllowed(NoYes::No);
datatype.parmSortField();
datatype.parmWizardHighest();
datatype.addParameterType(NumberSeqParameterType::DataArea, true, true);
this.create(datatype);
}
可配置体现在Organization Administration > Common > Number sequences > Segment configuration界面上可以修改Segments下的选项:

因为这是Company socpe的EDT,所有能修改的选项只有“Company”一个。如果我们取消勾选“Company”,Work orders-Configurable EDT就变成了Shared scope类型。
另外这个窗口上的“Countries/regions”内容来自于EDT类型的CountryRegionCodes属性设置。
需要指出的是不能将Number sequence指派给不同Scope类型的EDT,AX会报“Unable to find a unique Number sequence code record corresponding to the entered values.”错误信息,在Number sequence编辑窗口的Refrence添加Refrence时下拉框中自动过滤掉不兼容的EDT。
删除EDT序列引用
最后要说的是调用NumberSeqApplicationModule.create()创建EDT的序列引用,但是没有对应的方法在不需要时删除EDT的序列引用,NumberSeqApplicationModule.create()内部调用的是NumberSeqDatatype.Create(),观察NumberSeqDatatype.Create()涉及到的表是NumberSequenceDatatype和NumberSequenceDatatypeParameterType,于是删除EDT序列引用可以这样写:
static void DeleteNumSeqRef(Args _args)
{
NumberSeqDatatype datatype= NumberSeqDatatype::construct();
NumberSequenceDatatype record;
NumberSequenceDatatypeParameterType parameter;
;
datatype.find(extendedTypeNum(WorkOrderNum2));
if(datatype.parmRecId())
{
ttsBegin;
delete_from parameter where parameter.NumberSequenceDatatype == datatype.parmRecId();
delete_from record where record.RecId==datatype.parmRecId();
ttsCommit;
}
}
参考资料:White Paper: Using the Enhanced Number Sequence Framework in Microsoft Dynamics AX 2012
[AX]AX2012 Number sequence framework :(三)再谈Number sequence的更多相关文章
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- python-小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- GoF设计模式三作者15年后再谈模式
Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85 ...
- 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器
目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...
- 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...
- 再谈JavaScript的数据类型问题
JavaScript的数据类型问题已经讨论过很多次了,但许多人还有许多书仍然沿用着错误的.混乱的一些观点,所以就再细讲一回. 提及这个讨论的原因在于argb同学在我的MSN博客上的一段回复,又更早的起 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- mui初级入门教程(四)— 再谈webview,从小白变“大神”!
文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...
- [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
[转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15 | 0 Comments | 阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...
随机推荐
- 捉BUG记(To Catch a Bug)
大约有一年整没有写一篇博客了,由于各种原(jia)因(ban)导致闲暇时间要么拿着IPad看岛国奇怪的片(dong)子(hua).要么拿着kindle看各种各样的资(xiao)料(shuo).本来想写 ...
- Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...
- Apache Mina(一)
原文链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应 ...
- (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点
这篇文章是我从网上找来的,我觉得他非常详细的解释了VR发展的需求和必要.我认为通过这篇文章可以让大家了解VR. 译者写在最前: 来到追光动画有好几个月了,抱歉这段时间也没有什么文章与大家分享,我现在在 ...
- 实验六 序列信号检测器的VHDL设计
一.实验目的 (1)进一步熟悉Quartus II软件和GW48-PK2S实验系统的使用方法: (2)用状态机实现序列检测器的设计,了解一般状态机的设计与应用 二.实验内容 1. 基本命题 利用Qua ...
- [异常] Download interrupted: Connection to https://dl-ssl.google.com refused 安卓SDK下载被拒 3步解决
1.SDK Manager 的 Tools ->Options打开SDK Manager的Settings,选中“Force https://… sources to be fetched us ...
- jQuery的XX如何实现?——3.data与cache机制
往期回顾: jQuery的XX如何实现?——1.框架 jQuery的XX如何实现?——2.show与链式调用 -------------------------- 源码链接:内附实例代码 jQuery ...
- Sharing count on Facebook, Twitter, and LinkedIn
最近一段时间一直在研究有关Social Network的东西,这里有几个在当前国外主流社交网站上用来显示分享数量的API,记录一下,今后可能会用得着. Facebook Facebook将FQL(Fa ...
- mysql悲观锁总结和实践
使用场景举例:以MySQL InnoDB为例商品t_goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品s ...
- C#课外实践——校园二手平台(技术篇1)
前面分享了这次的课外实践的心得,这次,就分享一下从这次的课外实践的过程中学到的知识技能吧.虽然有句话说的好,不要做没有准备的战争,但是,我想说的是,生活中有很多的事情是不允许我们有准备的.遇到事情必须 ...