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.
|
Contents
|
Adding a number sequence
You may wish to use one or
more new number sequences when you create your own module inside Axapta.
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.
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.
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″));
}
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.
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));
;
info(num.num());
}