Number sequences


Number sequences in Axapta are a mechanism for generating unique numbers. These are generally used as a unique Id to identify a table record.
Every number sequence is linked to an ExtendedDataType inside Axapta. Therefore you will need to create separate datatypes for each number sequence which will be created.


You may wish to use one or more new number sequences when you create your own module inside Axapta.
[edit]
Adding a number sequence

The steps to add your own number sequence to Axapta are fairly straight-forward, but lengthy. The following description is based on the Axapta best-practice methodologies.
For this example, we will add one new number sequence called NSId for a new module called NS. This assumes that an ExtendedDataType called NSId already exists.
If not using an existing extended datatype, create a new string EDT, which extends datatype 'num'. Note that in Ax 3.0 this num is a string field, length of 20.

[edit]Add an element to the NumberSeqModule base enum

One element should be added to the enum for your module, irrespective of the number of actual number sequences which will be created.
Therefore we modify the NumberSeqModule enum and add the element NS.

[edit]Extend the NumberSeqReference class

Create a new sub-class of NumberSeqReference and implement the numberSeqModule() and loadModule() methods. Use an existing sub-class as a template to assist with this. This is shown below.
public class NumberSeqReference_NS extends NumberSeqReference
{
 
}
/*
Detailed description of how to setup references for number sequences can
be found i method loadModule() on the 'father' class: numberSeqReference.
*/
 
protected void loadModule()
{
    NumberSequenceReference numRef;
    ;
 
    // Setup Job TransId
    numRef.dataTypeId              = typeid2extendedtypeid(typeid(NSId));
    numRef.referenceHelp           = "Some description here";
    numref.WizardContinuous         = false;
    numRef.WizardManual             = NoYes::No;
    numRef.WizardAllowChangeDown    = NoYes::No;
    numRef.WizardAllowChangeUp      = NoYes::No;
    numRef.sortField               = 1;
 
    this.create(numRef);
 
}
public static NumberSeqModule numberSeqModule()
{
    return NumberSeqModule::NS;
}
In addition, you must modify the construct() and moduleList() methods on NumberSeqReference itself to add references to your new module class. Note the sections of code surrounded by //--- NS Begin and //--- NS End
static public container moduleList()
{
    container moduleList;
    ;
 
    moduleList += NumberSeqReference_Bank::numberSeqModule();
    moduleList += NumberSeqReference_BOM::numberSeqModule();
    moduleList += NumberSeqReference_Customer::numberSeqModule();
    moduleList += NumberSeqReference_Document::numberSeqModule();
    moduleList += NumberSeqReference_ForeignTrade::numberSeqModule();
    moduleList += NumberSeqReference_General::numberSeqModule();
    moduleList += NumberSeqReference_Inventory::numberSeqModule();
    moduleList += NumberSeqReference_Ledger::numberSeqModule();
    moduleList += NumberSeqReference_Location::numberSeqModule();
    moduleList += NumberSeqReference_MasterPlanning::numberSeqModule();
    moduleList += NumberSeqReference_Production::numberSeqModule();
    moduleList += NumberSeqReference_Project::numberSeqModule();
    moduleList += NumberSeqReference_PurchaseOrder::numberSeqModule();
    moduleList += NumberSeqReference_Route::numberSeqModule();
    moduleList += NumberSeqReference_SalesOrder::numberSeqModule();
    moduleList += NumberSeqReference_Tax::numberSeqModule();
    moduleList += NumberSeqReference_Vendor::numberSeqModule();
    moduleList += NumberSeqReference_Internet::numberSeqModule();
    moduleList += NumberSeqReference_Asset::numberSeqModule();
 
    //--- HRM Begin
    moduleList += NumberSeqReference_HRM::numberSeqModule();
    moduleList += NumberSeqReference_KnowledgeCollector::numberSeqModule();
    moduleList += NumberSeqReference_VirtualNetwork::numberSeqModule();
    //--- HRM End
 
    //--- CRM Begin
    moduleList += NumberSeqReference_CRM::numberSeqModule();
    //--- CRM End
 
    //--- SFC Begin
    moduleList += NumberSeqReference_JobManager::numberSeqModule();
    //--- SFC End
 
    //--- NS Begin
    moduleList += NumberSeqReference_NS::numberSeqModule();
    //--- NS End
 
    return moduleList;
}
public static numberSeqReference construct(NumberSeqModule _module)
{
    switch (_module)
    {
        case (NumberSeqReference_Ledger::numberSeqModule())         : return new NumberSeqReference_Ledger(_module);
        case (NumberSeqReference_Tax::numberSeqModule())            : return new NumberSeqReference_Tax(_module);
        case (NumberSeqReference_Bank::numberSeqModule())           : return new NumberSeqReference_Bank(_module);
        case (NumberSeqReference_SalesOrder::numberSeqModule())     : return new NumberSeqReference_SalesOrder(_module);
        case (NumberSeqReference_ForeignTrade::numberSeqModule())   : return new NumberSeqReference_ForeignTrade(_module);
        case (NumberSeqReference_Customer::numberSeqModule())       : return new NumberSeqReference_Customer(_module);
        case (NumberSeqReference_PurchaseOrder::numberSeqModule())  : return new NumberSeqReference_PurchaseOrder(_module);
        case (NumberSeqReference_Vendor::numberSeqModule())         : return new NumberSeqReference_Vendor(_module);
        case (NumberSeqReference_Inventory::numberSeqModule())      : return new NumberSeqReference_Inventory(_module);
        case (NumberSeqReference_BOM::numberSeqModule())            : return new NumberSeqReference_BOM(_module);
        case (NumberSeqReference_Route::numberSeqModule())          : return new NumberSeqReference_Route(_module);
        case (NumberSeqReference_Production::numberSeqModule())     : return new NumberSeqReference_Production(_module);
        case (NumberSeqReference_MasterPlanning::numberSeqModule()) : return new NumberSeqReference_MasterPlanning(_module);
        case (NumberSeqReference_Project::numberSeqModule())        : return new NumberSeqReference_Project(_module);
        case (NumberSeqReference_Location::numberSeqModule())       : return new NumberSeqReference_Location(_module);
        case (NumberSeqReference_Document::numberSeqModule())       : return new NumberSeqReference_Document(_module);
        case (NumberSeqReference_General::numberSeqModule())        : return new NumberSeqReference_General(_module);
        case (NumberSeqReference_Internet::numberSeqModule())       : return new NumberSeqReference_Internet(_module);
        case (NumberSeqReference_Asset::numberSeqModule())          : return new NumberSeqReference_Asset(_module);
 
        // CC begin
        case (NumberSeqReference_HRM::numberSeqModule())                 : return new NumberSeqReference_HRM(_module);
        case (NumberSeqReference_VirtualNetwork::numberSeqModule())      : return new NumberSeqReference_VirtualNetwork(_module);
        case (NumberSeqReference_KnowledgeCollector::numberSeqModule())  : return new  NumberSeqReference_KnowledgeCollector(_module);
        // CC end
 
        // Shop Floor Control begin
        case (NumberSeqReference_JobManager::numberSeqModule())          : return new NumberSeqReference_JobManager(_module);
        // Shop Floor Control end
 
        // CRM addition begin
        case (NumberSeqReference_CRM::numberSeqModule())                  : return new NumberSeqReference_CRM(_module);
        // CRM addition end
 
        // Product Builder addition begin
        case (NumberSeqReference_PBA::numberSeqModule())                 : return new NumberSeqReference_PBA(_module);
        // Product Builder addition end
 
        // NS begin
        case (NumberSeqReference_NS::numberSeqModule())                 : return new NumberSeqReference_NS(_module);
        // NS end
 
    }
 
    throw error(strFmt("@SYS53742"));
}

[edit]Create a parameters table and form

You should create a parameters table and form for your new module. The easiest way is generally to duplicate an existing Parameters table and modify it as required.
The important elements on the new parameter table are the numberSeqModule() and numberSeqReference() methods.
client server static NumberSeqModule numberSeqModule()
{
    return NumberSeqReference_NS::numberSeqModule();
}
client server static NumberSeqReference numberSeqReference()
{
    return NumberSeqReference::construct(NSParameters::numberSeqModule());
}
In the parameters form, you must ensure that the code in the numberSeqPreInit(), numberSeqPostInit() and NumberSequenceType.executeQuery() methods correctly reflect your new number sequence elements.

[edit]Calling a number sequence

The following code gets a number from the number sequence setting for EDT CustAccount
static void Job1(Args _args)
{
    ExtendedTypeId id = TypeID2ExtendedTypeId(TypeId(CustAccount));
 
    NumberSeq num = NumberSeq::newGetNum(NumberSequenceReference::find(id));
    ;
 
    num.used();  // mark the number as used
    info(num.num());        
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.