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(1);datatype.parmWizardHighest(999999);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(1);datatype.parmWizardHighest(999999);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(1);datatype.parmWizardHighest(999999);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(1);datatype.parmWizardHighest(999999);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

转载于:https://www.cnblogs.com/duanshuiliu/p/4760311.html

[AX]AX2012 Number sequence framework :(三)再谈Number sequence相关推荐

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

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

  2. python基础教程第三版怎么样-Python基础教程(第三版)(七)再谈抽象

    菜鸡的学习笔记. 7.1 对象魔法 多态:可对不同类型的对象执行相同的操作,但是操作将随对象所属的类型而异: 封装:对外隐藏对象内部工作原理的细节: 继承:可基于通用类创建出专用类. 按作者的意思,多 ...

  3. python基础教程第三版-Python基础教程(第三版)(七)再谈抽象

    菜鸡的学习笔记. 7.1 对象魔法 多态:可对不同类型的对象执行相同的操作,但是操作将随对象所属的类型而异: 封装:对外隐藏对象内部工作原理的细节: 继承:可基于通用类创建出专用类. 按作者的意思,多 ...

  4. 透过数字化转型再谈数据中台(三):一文遍历大数据架构变迁史

    编者按:<透过数字化转型再谈数据中台>系列连载 6-8 篇左右,作者结合自己在数据中台领域多年实践经验,总结了数据架构知识.BI 知识,以及分享给大家一些产业互联网实施经验.本文是系列文章 ...

  5. 敏捷的三个中心;再谈Buffer

    内心要有标准.正见.正道 <悲惨世界>里有几个典型人物:市侩代表纳拿第夫妇;法统代表沙威警官;道统代表冉阿让.你要以哪个为标准? ​ 标准是道生一二.三生万物,三十二相.八十种好.Scru ...

  6. 程序人生 - 996(三)马云长文再谈“996”:和被剥削没关系,现在的人不傻

    IT之家4月14日消息:针对于近日热议的"996"工作制度,马云今天再发文表示,"真正的996不是简单的加班,不是单调的体力活,和被剥削没有关系,因为现在的人并不傻,可选 ...

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

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

  8. 程序员》推荐C++ 图书三人谈

    程序员>推荐C++ 图书三人谈 主持人:熊节(透明),<程序员>杂志编辑,C-View成员 嘉 宾:孟岩(梦魇),联想公司掌上设备事业部应用开发处任职,C-View成员.与侯捷先生合 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 如果有java基础的同学,可以回顾下<再谈Java数据结构-分析底层实现与应用注意事项>:java把内存分两种:一 ...

  10. (轉貼)《程序员》推荐C++ 图书三人谈 (C/C++)

    轉貼自http://bbs.cnitexam.com/simple/index.php?t22602.html 主持人:熊节(透明),<程序员>杂志编辑,C-View成员 嘉   宾:孟岩 ...

最新文章

  1. 使用TensorFlow训练WDL模型性能问题定位与调优
  2. 实战|渗透学校某内网服务器
  3. 一个人到底申请几张信用卡最合适?
  4. 浅谈webpack打包原理
  5. 面试:InnoDB 并发控制
  6. DB2 SQL性能调优秘笈
  7. AD16从两层切到显示一层的视图shift+s
  8. JAVA 中的 CAS
  9. AppSettings
  10. apache日志文件 accesslog
  11. 2019杭州云栖大会探营:神龙的秘密
  12. 计算机专业英语第六版考试试卷,计算机专业英语试题及答案(A卷)
  13. 中国象棋ai人工智能(网页版)
  14. 小白的程序员自学之路
  15. css幻灯片样式,纯CSS3全屏响应式幻灯片特效
  16. 趁年轻,别把自己关在笼子里
  17. netscreenfortinet
  18. Ubuntu 16.04 LTS 初体验
  19. 【使用zookpeer】模拟 hadoop的 datenode与namenode 的master-slaves的 关系
  20. Android 应用清单简介1

热门文章

  1. HyperVolume多目标评价指标概述
  2. leetcode刷题日记-两数之和系列
  3. python图像exif信息复制
  4. day3--numpy
  5. ArcGIS图像配准方法
  6. zabbix安装 监控mysql
  7. 实习踩坑之路:parallelStream并发流+快速失败导致线上CPU300%的血泪史
  8. Flutter之Align和AlignmentGeometry
  9. android ResideMenu使用
  10. 是的,我开始做这么一件事了