 | SequenceExtension Class |
Provides way to implement an extension to CUSTOMTOOLS sequence making it possible to
implement custom sequence number generator. This can be used for instance to implement
logic to generate a number from number series generator of an external system such as from ERP.
Inheritance Hierarchy Namespace: CTExtensions.InterfacesAssembly: CTInterface (in CTInterface.dll) Version: 25.0
Syntaxpublic abstract class SequenceExtension : IExtensionInterface
Public MustInherit Class SequenceExtension
Implements IExtensionInterface
The SequenceExtension type exposes the following members.
Constructors
Methods | Name | Description |
---|
 | GenerateNextValue |
This is called when next number should be generated and reserved.
|
 | GetBehavior |
Modify the behavior of this sequence as defined in ctExtensionSequenceBehavior enumeration.
E.g. define ctExtensionSequenceBehaviorExclusive to
drop out all other serials from Get Code -dialog than exclusive one(s).
|
 | GetDependentPropertyID |
If you wish to get value of some property when generating serial,
return that property's id here so it value will be provided at
PeakNextValue and GenerateNextValue calls.
|
 | GetID |
ID of the sequence, should be unique in current extension.
|
 | GetName |
Name of the sequence that is shown in CUSTOMTOOLS UI
|
 | GetParent |
Return parent CTExtension of this options extension.
|
 | NotifyInitialized |
Notification that is called when this sequence is initialized by the CT core.
Note that ID might change and so DO NOT store any information based on this ID.
|
 | PeakNextValue |
Provide next value if possible to preview it in the GetCode dialog box but don't
reserve it yet. CUSTOMTOOLS supports showing the next number only when it's possible.
You can also return an empty string here.
|
 | Rollback |
This is called when previously reserved number should be rolled back. This may occur if user cancels
or an error occurs after number is generated (reserved) but before it's really used. In that case
previously reserved number should be released to be re-used.
|
Top
Example
This example shows how to use
SequenceExtension to implement own
number sequence generator in CUSTOMTOOLS. In this example, a text file to keep next available free number
is automatically created in the same folder than the script itself is compiled. This example creates a new
sequence
CT API Number Generator that generates a number that is composed from three different elements.
The first element is current year, the second one active project's number and the third one running number
sequence expressed in five digits so that number is padded with leading zeros. This example doesn't work
in multi-user environment as text file to keep record of next available number is saved to local computer
for simplicity. Code is relatively easy to change for your own purposes. Typically, this is used to retrieve
number from external system such as from ERP for example using REST ro SOAP web services.

using ATR.CT.CTInterface;
using CTExtensions;
using CTEngineLib;
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using CTExtensions.Interfaces;
public class MyAddin : CTExtension
{
private NumberGenerator oMyNumberGenerator;
private string oSequenceName = "CT API Number Generator";
public override bool Hook(CTInterface oCTInterface)
{
bool bHooked = false;
if (oCTInterface != null)
{
}
return bHooked;
}
public override void UnHook(CTInterface oCTInterface)
{
if (oCTInterface != null)
{
}
}
public override bool InitNotify()
{
Init();
return base.InitNotify();
}
public override IExtensionInterface[] GetInterface2(ctExtensionInterface eType)
{
if(oMyNumberGenerator != null && eType == ctExtensionInterface.ctExtensionInterfaceSequence)
{
return new[] { oMyNumberGenerator };
}
return base.GetInterface2(eType);
}
private void Init()
{
oMyNumberGenerator = new NumberGenerator(this, oSequenceName);
}
}
public class NumberGenerator : CTExtensions.Interfaces.SequenceExtension
{
private string moName;
private MyAddin moCTExtension;
private int moSeedNumber = 1;
private string moSequenceTextFile = "CTAPISerial.txt";
public NumberGenerator(MyAddin parent, string sequenceName)
{
moCTExtension = parent;
moName = sequenceName;
}
public override string GenerateNextValue(CTProject poActiveProject, string bsDependentPropVal, out string pbsExternalID)
{
pbsExternalID = Guid.NewGuid().ToString();
return GetNextAvailableNumber(poActiveProject, true);
}
public override string GetName()
{
return moName;
}
public override ICTExtension GetParent()
{
return moCTExtension;
}
public override void NotifyInitialized(int lSequenceID)
{
string sequenceTextFile = GetTextFileFullPath;
try
{
if (!File.Exists(sequenceTextFile))
{
File.WriteAllText(sequenceTextFile, moSeedNumber.ToString());
}
}
catch(Exception e)
{
MessageBox.Show(string.Format("Failed to initialize number generator. Reason: {0}",
e.Message));
}
}
public override string PeakNextValue(CTProject poActiveProject, string bsDependentPropVal)
{
return GetNextAvailableNumber(poActiveProject, false);
}
public override void Rollback(string bsExternalID)
{
}
#region Helper Functions
private string GetNextAvailableNumber(CTProject project, bool reserve)
{
string generatedNumber = string.Empty;
string sequenceTextFile = GetTextFileFullPath;
try
{
int nextAvailableNumber = int.Parse(File.ReadAllText(sequenceTextFile));
generatedNumber = string.Format("{0}-{2}-{1:00000}",
DateTime.Now.Year, nextAvailableNumber,
project == null ? string.Empty : project.ProjectNumber);
if (reserve)
{
File.WriteAllText(sequenceTextFile, (++nextAvailableNumber).ToString());
}
}
catch(Exception e)
{
MessageBox.Show(string.Format("Failed to get next available number. Reason: {0}",
e.Message));
}
return generatedNumber;
}
private string GetTextFileFullPath
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.Combine(Path.GetDirectoryName(path), moSequenceTextFile);
}
}
#endregion
}
Revision HistoryDate | Version | Description |
---|
- | 2019 SP0 | First Release |
See Also