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


    AX2012number sequence framework中引入了两个Scopesegment两个概念,它们的具体作用从下面序列的例子说起。

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

     

    在创建Numer sequence的界面上可以选择需要的Scope

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

    Segment中自动包含companyFiscal calendar period用于生成具体的序列号码,Segment仍然是可以修改的,包括CompanyFiscal calendar period segment都是可以的,也允许创建多个CompanyFiscal calendar period segment

    公司ScopeEDT序列引用

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

    通常我们会在模块的参数表上创建numRefXXX()方法方便在代码中引用,上面例子中EDTnumRefXXX()方法类似:

    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 ScopeEDT序列引用

    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()来添加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 

  • 相关阅读:
    20191331 《信息安全专业导论》第12周学习总结
    20191331 《信息安全专业导论》第11周学习总结
    20191331 《信息安全专业导论》第10周学习总结
    20191331 《信息安全专业导论》第9周学习总结
    20191331《信息安全专业导论》第7周学习总结
    20191331 《信息安全专业导论》第6周学习总结
    20191331《信息安全专业导论》第5周学习总结
    20191331 《信息安全专业导论》第4周学习总结
    2013暑假心愿单
    怎样产生一个app的idea?
  • 原文地址:https://www.cnblogs.com/duanshuiliu/p/4760311.html
Copyright © 2020-2023  润新知