Computer Associates sells a sequential number generator as part of the QXCOM Tools.
A company called Sentor Communications also has a product called SequelNum. Call (+61 2 9391 0544) or email for more info. The list price is US$155 or AU$195.
I company called SISDAM also has Loyal Sequencer.
Under Version 4, you can use a triggered agent on the server which uses a locked file like so:
Sub Initialize file% = Freefile Open "c:\\seqnum.bin" For Binary Access Read Write Lock Read As file% ' You can also use Open "\\NotesServer\SharedDirectory\seqnum.bin" ' if your client and server are Win95 or NT based. Open can take ' a UNC path Get #file%, 1, SeqNum% SeqNum% = SeqNum% + 1 Put #file%, 1, SeqNum% Close file% End Sub
Here is another technique that will work only if your client machines access a non-replicated database on a single server:
' MBCounter&(CounterName$, CounterToSave%) ' ' Marco Beri ' marcob@equalis.it ' ' This functions give one or more progressive unique counters without race conflict condition ' ' Parameters: ' CounterName$: counter name; every counter name represents a different counter; you could have as many counters as you want ' CounterToSave%: if false MBCounter& just returns next free number, if true it gives you next free number and increment it by one ' ' Return value: ' a long integer ' ' Usage: ' MBCounter("EveryCounterNameYouWant", False) in QueryOpen if and only if it is a new document and just to display the next free number. ' MBCounter("EveryCounterNameYouWant", True) in QuerySave if and only if it is a new document, just before exiting and only if you really ' save the document (so you are sure not to waste a free number) ' '
Attention: ' - you cannot use form, view or folder with a name like (MBCounters); if you need this name change COUNTER_FOLDER_FORM_NAME$ constant value ' - if you want you can create a view to visualize the document with form COUNTER_FOLDER_FORM_NAME$ to check the counter values ' Option Public Option Explicit Const COUNTER_FOLDER_FORM_NAME$="(MBCounters)"
Function MBCounter&(Byval CounterName$, Byval CounterToSave%) On Error Goto MBCounterError Dim CounterFieldName$ Dim session As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim docNext As NotesDocument Dim CounterValue& Dim FieldValue As Variant Dim Ret% Dim item As NotesItem Dim FolderToBeCreated% CounterFieldName$ = "MB"+CounterName$ Set db = session.CurrentDatabase Set view = db.GetView(COUNTER_FOLDER_FORM_NAME$) If view Is Nothing Then FolderToBeCreated%=True End If Do If Not FolderToBeCreated% Then view.refresh Set doc = nothing Set doc = view.GetFirstDocument() End If If doc Is Nothing Or FolderToBeCreated% Then Set doc = New NotesDocument(db) doc.Form = COUNTER_FOLDER_FORM_NAME$ Call doc.Save(True, False) doc.putinfolder COUNTER_FOLDER_FORM_NAME$ If FolderToBeCreated% Then Set view = db.GetView(COUNTER_FOLDER_FORM_NAME$) FolderToBeCreated% = False End If Else Set item=doc.GetFirstItem(CounterFieldName$) If item Is Nothing Then Call doc.ReplaceItemValue( CounterFieldName$, 0 ) Call doc.Save(False, False) Else FieldValue=doc.GetItemValue(CounterFieldName$) If Not CounterToSave% Then CounterValue&=FieldValue(0)+1 Exit Do Else Call doc.ReplaceItemValue( CounterFieldName$, FieldValue(0)+1) Ret%=doc.Save(False,False) If Ret% Then CounterValue&=FieldValue(0)+1 Exit Do End If End If End If End If Loop ' This deletes double docs incidentally created in the Loop (almost impossible ' to happen, just first time and not a problem, but just to be clean) ' [For the race condition at the start if two users access an uninitialized ' counter at the same time. The best workaround for this is to create ' the initial counter by hand..Ed.] Set doc = view.GetNextDocument(doc) Do While Not doc Is Nothing Set docNext = view.GetNextDocument(doc) Call doc.Remove(True) Set doc=docNext Loop MBCounter& = CounterValue& MBCounterExit: Exit Function MBCounterError: Msgbox "MBCounter", Err, Error$ MBCounter& = -1 Goto MBCounterExit End Function