Number Sequence

1)Method 1

  useing X++ Code creating Number sequence module.

  wrote by Jimmy

  

public static void Jimmy_NumberSequences()
{
    NumberSequenceTable     numberSequenceTable;
    NumberSequenceReference numberSequenceReference;
    NumberSequenceCode      NumberSequence = "WHS_PDJ";
    Name                    Txt            = "PO Delivery Journal";
    ExtendedDataTypeName    QVS_POJournalId;
    ExtendedTypeId          extendedTypeId = typeId2ExtendedTypeId(typeid(QVS_POJournalId));//method 1
    //ExtendedTypeId          extendedTypeId = extendedTypeName2Id("QVS_POJournalId");//parameter must be string type //method 2
;
    ttsbegin;
//Created number sequences parameter and reference

    //table 1 base setup
    delete_from numberSequenceTable
        where numberSequenceTable.NumberSequence == NumberSequence;

    numberSequenceTable.NumberSequence  = NumberSequence;
    numberSequenceTable.Txt             = Txt;
    numberSequenceTable.Lowest          = 1;
    numberSequenceTable.Highest         = 99999999;
    numberSequenceTable.NextRec         = 1;
    numberSequenceTable.Format          = 'PDJ########CN';
    numberSequenceTable.Continuous      = NoYes::Yes;
    numberSequenceTable.insert();

    //table 2 reference
    print extendedTypeId;
    print extendedTypeName2Id("QVS_POJournalId");//must be string type
    pause;
    delete_from numberSequenceReference
        where numberSequenceReference.DataTypeId == extendedTypeId;

    numberSequenceReference.DataTypeId      = extendedTypeId;
    numberSequenceReference.NumberSequence  = NumberSequence;
    numberSequenceReference.insert();

    ttscommit;

//get number sequences value
//   print numberSeq::newGetNumFromCode("WHS_PDJ",true,false).num();//这种方法不会容易报错。本人推荐这种方法
//   print NumberSeq::newGetNum(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(QVS_POJournalId)))).num();

    //Test extend type id
    print global::extendedTypeName2Id("AmountCurDebCred");//parameter must be string type
    print global::typeId2ExtendedTypeId(typeid(AmountCurDebCred));//804
    pause;
}

2)method 2

作者:廖源 Daniel.Intelzon
我觉得Axapta中的number Sequence一直以来都是一个重点,现在就让我们尝试手工创建一个Number Sequence
引用模块:
实例中,我们假设要做一个SMS的短信管理系统的主数据表SMS_Content,这个表中的SMS_ContentId我们需要指定一个Number
Sequence来生成。步骤如下:
1.在名为NumberSeqModule的BaseEnum中增加一个值的名称为SMS,数值为当前最大值加一;
2.创建一个用来装载SMS系统中使用Number
Sequence的numberSeqReference子类,这里我命名为NumberSeqReference_SMS。在这个类中需要覆盖父类中的方法:LoadModule和增加
一个用于返回在步骤一中定义好的枚举值的静态方法。
代码如下:
public class NumberSeqReference_SMS extends
numberSeqReference
{
protected void loadModule()
{
NumberSequenceReference numRef;
;
numRef.configurationKeyId =
16001;//这里指定一个Configuration Key,可以在AOT的Data
Dictionary下面的ConfigurationKeys定义一个,我在这里
使用的是自己创建的SMS,它的值为16001
/*
Setup SMS Content number */
numRef.dataTypeId =
typeId2ExtendedTypeId(typeid(SMS_ContentId));//定义此number
Sequence的数据类型是SMS_ContentId这个字段的数据
类型
numRef.referenceHelp =
literalStr('@SMS151');//这里的Label定义了方便在引用的时候精确理解的帮助内容
numRef.wizardContinuous
= true;//定义在通过向导生成number sequence的连续性
numRef.wizardManual =
NoYes::No;//定义是否手动录入number sequence的值
numRef.wizardAllowChangeDown =
NoYes::No;//定义是否允许把自动获取的number sequence的值改成更小的值
numRef.wizardAllowChangeUp =
NoYes::No;//定义是否允许把自动获取的number sequence的值改成更大的值
numRef.wizardLowest =
1;//number Sequence的最小值
numRef.wizardHighest = 9999999;//number
Sequence的最大值
numRef.sortField = 1;//在SMS模块中number
Sequence中的排序值
this.create(numRef);//创建此number Sequence引用
}
public
static NumberSeqModule numberSeqModule()
{
return
NumberSeqModule::SMS;
}
}
3.到Class
NumberSeqReference中的construct方法中增加以下内容:
case
(NumberSeqReference_SMS::numberSeqModule()) : return new
NumberSeqReference_SMS(_module);
位置是在系统已有的case语句块中,意思是让系统加载刚才我们自己的number
sequence引用模块
4.到Class NumberSeqReference中的moduleList方法中增加以下内容:
moduleList
+= NumberSeqReference_SMS::numberSeqModule();
位置是在return
moduleList之前的地方,意思是将我们自己的number sequence引用模块加入到系统的moduleList当中去
至此我们自己的number
Sequence引用模块添加完毕。
接下来我们来考虑如何使用自己新增加的number
sequence引用。
考虑到系统设计,SMS_ContentId的新增和删除的动作直接放在Table层:
在表的initValue方法中加入以下代码新增序列值:
NumberSeq
numberSeq;//定义一个序列
SMS_Content sms_Content;

numberSeq =
NumberSeq::newGetNum(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(SMS_ContentId))),
true);//实例化这个序列
sms_Content.SMS_ContentId
=
numberSeq.num();//获取当前的序列值
在表的delete方法中加入以下代码删除序列值:
NumberSeq::release(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(SMS_ContentId))).NumberSequence,
sms_Content.SMS_ContentId);
至此我们先去basic-Setup-Number Sequence-Number
Sequence中定义一个被我们定义好的引用来使用的序列,然后在basic-Setup-Number
Sequence-Reference中找到module名为
SMS,reference为我们刚才定义的SMS_ContentId的Label值的引用,定义这个引用的序列。接下来我们就可以到AOT-Data
Dictionary-Tables-SMS_Content的右键中找到Add-ins,
然后选择Table
Browser,点击新增和删除按钮就可以看到我们的SMS_ContentId值是由numberSequence自动生成的效果了。

原文地址:https://www.cnblogs.com/Fandyx/p/1877358.html