[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 

相關文章
相關標籤/搜索