[AX]AX2012 Number sequence framework :(三)再谈Number sequence

AX2012number sequence framework中引入了两个Scopesegment两个概念,它们的具体做用从下面序列的例子提及。web

法国/中国的法律要求财务凭证的Journal number包含公司代码和财务期间,好比这样的号码J-20-Jan11-000340J表上Journal20表明的是公司代码,Jan11为财务期间,000340才是系统生成的流水号。ide

 

在建立Numer sequence的界面上能够选择须要的Scope工具

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

 

 

Segment中自动包含companyFiscal calendar period用于生成具体的序列号码,Segment仍然是能够修改的,包括CompanyFiscal calendar period segment都是能够的,也容许建立多个CompanyFiscal calendar period segmentgoogle

公司ScopeEDT序列引用

 

Sequence number经常用于EDT类型字段的自动生成,能够认为EDT类型和Sequence number refrence是一回事,在自定义NumberSeqApplicationModule.LoadModule()中注册EDT类型的序列号引用:url

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 numberScope类型为Company,使用Organization administration > Common > Number sequences > Number sequences界面的Generate为这个EDT类型自动建立Sequence number时会为每个公司建立一个序列,序列scopeCompany并指定相应的公司:spa

一般咱们会在模块的参数表上建立numRefXXX()方法方便在代码中引用,上面例子中EDTnumRefXXX()方法相似:code

 

client server static NumberSequenceReference numRefWorkOrderNum()

{

    NumberSeqScope scope = NumberSeqScopeFactory::createDataAreaScope(selectableDataArea _dataArea = curext());

    return NumberSeqReference::findReference(extendedtypenum(WorkOrderNum), scope);

}

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

Company and fiscal calendar period ScopeEDT序列引用

 

EDT建立Company and fiscal calendar period Scope 的序列引用须要修改的第一个地方是LoadModuleserver

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()来添加DataAreaFiscalCalendarPeriod两种Scope类型,这种类型的Refrence在模块的Parameters form上可能看不到,一般在参数formnumberSeqPreInit()方法中咱们一般是建立一个DataAreaScope对象:

 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 ScopeEDT,“Set up number sequence wizard工具是不会为咱们建立相应的序列的,咱们只能手工建立,在Number sequence编辑窗口的Refrence下选择引用到具体的EDT类型。

Shared ScopeEDT序列引用

 

Shared scope是个比较特殊的序列Scope,它不和任何公司和财务日历关联,建立Shared ScopeEDT类型引用不须要调用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 scopeEDT类型建立引用序列,固然只会建立一个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 socpeEDT,全部能修改的选项只有“Company”一个。若是咱们取消勾选“Company”,Work orders-Configurable EDT就变成了Shared scope类型。

另外这个窗口上的“Countries/regions”内容来自于EDT类型的CountryRegionCodes属性设置。

 

须要指出的是不能将Number sequence指派给不一样Scope类型的EDTAX会报“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()涉及到的表是NumberSequenceDatatypeNumberSequenceDatatypeParameterType,因而删除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 

相关文章
相关标签/搜索