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类型的序列号引用:

  1. Sequence number常常用于EDT类型字段的自动生成,可以认为EDT类型和Sequence number refrence是一回事,在自定义NumberSeqApplicationModule.LoadModule()中注册EDT类型的序列号引用:
  2.  
  3. public void loadModule()
  4.  
  5. {
  6.  
  7. NumberSeqDatatype datatype = NumberSeqDatatype::construct();
  8.  
  9. ;
  10.  
  11. /* Work Order Number */
  12.  
  13. datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum));
  14.  
  15. datatype.parmReferenceHelp("Unique identifier for work orders");
  16.  
  17. datatype.parmWizardIsContinuous(false);
  18.  
  19. datatype.parmWizardIsManual(NoYes::No);
  20.  
  21. datatype.parmWizardIsChangeDownAllowed(NoYes::No);
  22.  
  23. datatype.parmWizardIsChangeUpAllowed(NoYes::No);
  24.  
  25. datatype.parmSortField();
  26.  
  27. datatype.parmWizardHighest();
  28.  
  29. datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);
  30.  
  31. this.create(datatype);
  32.  
  33. }

注意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()方法类似:

  1. client server static NumberSequenceReference numRefWorkOrderNum()
  2.  
  3. {
  4.  
  5. NumberSeqScope scope = NumberSeqScopeFactory::createDataAreaScope(selectableDataArea _dataArea = curext());
  6.  
  7. return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
  8.  
  9. }

注意调用NumberSeqScopeFactory::createDataAreaScope(curext())从基于当前公司创建的序列Scope。

Company and fiscal calendar period Scope的EDT序列引用

为EDT创建Company and fiscal calendar period Scope 的序列引用需要修改的第一个地方是LoadModule:

  1. public void loadModule()
  2.  
  3. {
  4.  
  5. NumberSeqDatatype datatype = NumberSeqDatatype::construct();
  6.  
  7. ;
  8.  
  9. /* Work Order Number - Company and fiscal calendar*/
  10.  
  11. datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_CompFiscal));
  12.  
  13. datatype.parmReferenceHelp("Unique identifier for work orders - Company and fiscal calendar");
  14.  
  15. datatype.parmWizardIsContinuous(false);
  16.  
  17. datatype.parmWizardIsManual(NoYes::No);
  18.  
  19. datatype.parmWizardIsChangeDownAllowed(NoYes::No);
  20.  
  21. datatype.parmWizardIsChangeUpAllowed(NoYes::No);
  22.  
  23. datatype.parmSortField();
  24.  
  25. datatype.parmWizardHighest();
  26.  
  27. datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);
  28.  
  29. datatype.addParameterType(NumberSeqParameterType::FiscalCalendarPeriod, true, false);
  30.  
  31. this.create(datatype);
  32.  
  33. }

注意调用了两次addParameterType()来添加DataArea和FiscalCalendarPeriod两种Scope类型,这种类型的Refrence在模块的Parameters form上可能看不到,通常在参数form的numberSeqPreInit()方法中我们通常是创建一个DataArea的Scope对象:

  1. scope = NumberSeqScopeFactory::createDataAreaScope();

第二个需要修改的地方是参数表上的numRefXXX()方法,我们需要创建对应的DataAreaFiscalCalendarPeriod Scope:

  1. client server static NumberSequenceReference numRefWorkOrderNum_CompFiscal(TransDate _date = systemdateget())
  2.  
  3. {
  4.  
  5. NumberSeqScope scope = NumberSeqScopeFactory::CreateDataAreaFiscalCalendarPeriodScope(
  6.  
  7. curext(),
  8.  
  9. FiscalCalendars::findPeriodByPeriodCodeDate(CompanyInfo::fiscalCalendarRecId(),_date).RecId
  10.  
  11. );
  12.  
  13. return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
  14.  
  15. }

对于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():

  1. public void loadModule()
  2.  
  3. {
  4.  
  5. NumberSeqDatatype datatype = NumberSeqDatatype::construct();
  6.  
  7. ;
  8.  
  9. /* Work Order Number - Shared*/
  10.  
  11. datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_Shared));
  12.  
  13. datatype.parmReferenceHelp("Unique identifier for work orders - Shared");
  14.  
  15. datatype.parmWizardIsContinuous(false);
  16.  
  17. datatype.parmWizardIsManual(NoYes::No);
  18.  
  19. datatype.parmWizardIsChangeDownAllowed(NoYes::No);
  20.  
  21. datatype.parmWizardIsChangeUpAllowed(NoYes::No);
  22.  
  23. datatype.parmSortField();
  24.  
  25. datatype.parmWizardHighest();
  26.  
  27. this.create(datatype);
  28.  
  29. }

同样需要修改numRefXXX()方法,我们需要创建Global Scope:

  1. client server static NumberSequenceReference numRefWorkOrderNum_Shared()
  2.  
  3. {
  4.  
  5. NumberSeqScope scope = NumberSeqScopeFactory::CreateGlobalScope();
  6.  
  7. return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);
  8.  
  9. }

“Set up number sequence” wizard工具能够为Shared scope的EDT类型创建引用序列,当然只会创建一个Sequence number,而不是一个公司一个Sequence number。

可配置的EDT序列引用

还没有讲到的datatype.addParameterType(NumberSeqParameterType::DataArea, true, false)的最后一个参数,这个参数为true上表示EDT引用的序列类型是可以配置的,看下面的例子:

  1. public void loadModule()
  2.  
  3. {
  4.  
  5. NumberSeqDatatype datatype = NumberSeqDatatype::construct();
  6.  
  7. ;
  8.  
  9. /* Work Order Number - Configurable*/
  10.  
  11. datatype.parmDatatypeId(extendedTypeNum(WorkOrderNum_Configurable));
  12.  
  13. datatype.parmReferenceHelp("Unique identifier for work orders - Configurable");
  14.  
  15. datatype.parmWizardIsContinuous(false);
  16.  
  17. datatype.parmWizardIsManual(NoYes::No);
  18.  
  19. datatype.parmWizardIsChangeDownAllowed(NoYes::No);
  20.  
  21. datatype.parmWizardIsChangeUpAllowed(NoYes::No);
  22.  
  23. datatype.parmSortField();
  24.  
  25. datatype.parmWizardHighest();
  26.  
  27. datatype.addParameterType(NumberSeqParameterType::DataArea, true, true);
  28.  
  29. this.create(datatype);
  30.  
  31. }

可配置体现在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序列引用可以这样写:

  1. static void DeleteNumSeqRef(Args _args)
  2.  
  3. {
  4.  
  5. NumberSeqDatatype datatype= NumberSeqDatatype::construct();
  6.  
  7. NumberSequenceDatatype record;
  8.  
  9. NumberSequenceDatatypeParameterType parameter;
  10.  
  11. ;
  12.  
  13. datatype.find(extendedTypeNum(WorkOrderNum2));
  14.  
  15. if(datatype.parmRecId())
  16.  
  17. {
  18.  
  19. ttsBegin;
  20.  
  21. delete_from parameter where parameter.NumberSequenceDatatype == datatype.parmRecId();
  22.  
  23. delete_from record where record.RecId==datatype.parmRecId();
  24.  
  25. ttsCommit;
  26.  
  27. }
  28.  
  29. }

参考资料:White Paper: Using the Enhanced Number Sequence Framework in Microsoft Dynamics AX 2012

[AX]AX2012 Number sequence framework :(三)再谈Number sequence的更多相关文章

  1. python之路--小数据池,再谈编码,is和 == 的区别

    一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...

  2. python-小数据池,再谈编码,is和 == 的区别

    一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...

  3. GoF设计模式三作者15年后再谈模式

    Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85 ...

  4. 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器

    目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...

  5. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  6. 再谈JavaScript的数据类型问题

    JavaScript的数据类型问题已经讨论过很多次了,但许多人还有许多书仍然沿用着错误的.混乱的一些观点,所以就再细讲一回. 提及这个讨论的原因在于argb同学在我的MSN博客上的一段回复,又更早的起 ...

  7. 再谈js对象数据结构底层实现原理-object array map set

    如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...

  8. mui初级入门教程(四)— 再谈webview,从小白变“大神”!

    文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...

  9. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例

    [转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15   |   0 Comments   |   阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...

随机推荐

  1. oracle 10g在redhat5下的安装

    [root@localhost ~]# groupadd dba -g 111 [root@localhost ~]# groupadd oinstall -g 110 [root@localhost ...

  2. 实际遭遇并解决:类型“ASP.global_asax”同时存在的问题

    将一个ASP.NET项目由预编译方式改为动态编译方式时,删除了bin文件夹中所有扩展名为.compiled文件以及文件名以App_Web_开头的文件. 访问却出现下面的错误: System.Web.H ...

  3. Nginx学习笔记(五) 源码分析&内存模块&内存对齐

    Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...

  4. [ACM_图论] 棋盘问题 (棋盘上放棋子的方案数)

    不能同行同列,给定形状和大小的棋盘,求摆放k个棋子的可行方案 Input 2表示是2X2的棋盘,1表示k,#表示可放,点不可放(-1 -1 结束) Output 输出摆放的方案数目C Sample I ...

  5. 分布式icinga2安装与使用

    目标 配置分布式的icinga2监控系统.分布式监控适用于服务器遍布在多个区域,且需要一个master做统一管理. 搭建环境 服务器 系统: ubuntu 15.04/ubuntu 14.04 ici ...

  6. AngularJS快速入门指南09:SQL

    我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...

  7. Qt之Dialog\widget\ mainwindow的区别和布局管理器 & 分裂器的区别

    1.Dialog\widget\ mainwindow的区别 注意mainwindow和widget的区别,mainwindow都工具栏和菜单栏 Dialog and mainwinodws 都是继承 ...

  8. 相对路径获取项目文件 及报错 No mapping found for HTTP request with URI XXX in DispatcherServlet with name ‘springmvc’解决方法

    首先一点,WebRoot目录下的文件是都可以通过浏览器输入路径,直接读取到的 例如这样: 而WebRoot下面WEB-INF是无法浏览器输入路径直接读取的. 因为是受保护的. 如果jsp读取一个图片的 ...

  9. 布局神器display:table-cell

    元素两端对齐 第一个案例是让两个元素分别向左和向右对齐,如果是过去,我一定会用float来实现,但其实用table可以这么做: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  10. webview长按事件js监听

    做app开发时,用到了webview,需要监听webview的长按事件,使用原生的js处理监听如下: ; //定时器 //开始按 function gtouchstart() { timeOutEve ...