Das Notes Forum

Domino 9 und frühere Versionen => ND6: Administration & Userprobleme => Thema gestartet von: Ozan am 03.05.06 - 14:44:13

Titel: Eindeutige Adressnummer vergabe!
Beitrag von: Ozan am 03.05.06 - 14:44:13
Hallo zusammen,

irgendwie ist diese Script immer noch zu langsam(Querysave):

If doc.adrnr(0)="" Then
 Dim eval2 As Variant
 eval2=Evaluate({@DbColumn("":"NoCache";"":"";"adrvergabe";1)})
 oldnumber=Clng(eval2(0))+1
 doc.AdrNr = Clng(OldNumber)
End If

Wenn gleichzeitig von 5 Arbeitsplätzen erfasst werden haben wir das Problemm dass
immer noch Adressnummern verdoppelt werden. Gibt es eine bessere technik bzw. Möglichkeit eine 99,99% iger eindeutige Adressnummer zu erzeugen?

Gruss

Ozan
Titel: Re: Eindeutige Adressnummer vergabe!
Beitrag von: Lossa am 03.05.06 - 15:04:24
Hi,

in Lotus Script gibt es die Möglichkeit mittel der Createlock und destroylock eine Umgebung zu erstellen, die eine gesichert ist solange ein lock darauf ist. Somit kannst du das erzeugen was du erreichen willst. Erreichen könntest du es über eine Agent der die Vergabe auf Serverseite macht (runonserver) beim Speichern des Dokumentes.

Hier ein Code Beispiel:

Sub Initialize
   Dim Sess As New NotesSession
   Dim Doc As NotesDocument
   Dim Count As NotesItem
   Dim Status As Integer
   Dim LockID As Integer
   Dim others As Integer
   
   '  Creating a Lock ID or getting the Lock ID
   '  For the event of "Addresses"
   LockID = Createlock("Addresses")
   
   '  Infinite loop that can only be exited
   '  when this agent has a successfull
   '  lock.  An unsuccessfull lock means
   '  that this agent is presently being
   '  run by someone else.
   Do While True
      If Codelock(LockID) Then
         Exit Do      '  We finally have a lock, exiting Loop
      End If
   Loop
      
   Set Doc = Sess.SavedData
   
   Set count = Doc.GetFirstItem("Addresses")
   If count Is Nothing Then
      Set count = New NotesItem(Doc, "Adresse", 0)
   End If
   
   count.Values = count.Values(0) + 1
   
   Call Doc.Save(True,False)
   
   '  Once completed, release and
   '  destroy this lock so another
   '  run of this agent can continue.
   Status = CodeUnlock(LockID)
   Status = DestroyLock(LockID)
   
End Sub
Titel: Re: Eindeutige Adressnummer vergabe!
Beitrag von: Ozan am 05.05.06 - 12:53:58
Hi,

jepp das Beispiel habe auch in der Hilfe gesehen, müssen dann die User so lange warten bis der Lock wieder freigegeben ist?

Gruss

Ozan
Titel: Re: Eindeutige Adressnummer vergabe!
Beitrag von: Lossa am 05.05.06 - 13:25:36
Hi,

wie schrieben muss der/die anderen Agenten in eine Warteschleife gehen, dann dauert es halt ein wenig länger, aber das sollte nicht in allzu grossen Dimensionen liegen.

Titel: Re: Eindeutige Adressnummer vergabe!
Beitrag von: smoki am 08.05.06 - 08:55:48
Hallo!

Nach meiner Meinung müsste sogar nur ein "RunOnServer" reichen, da ein Agent nur jeweils einmal (ich glaub es gibt einen notes.ini Eintrag mit dem man das ändern kann...) auf einem Server läuft.

Solange nur dieser Agent dieses Dokument hochzählt, sollte es keine doppelten Nummern geben. Zumindest konnte ich dies so bei mir verhindern!

Natürlich hat diese Lösung das Problem, dass diese mit Clusterausfällen usw. nicht klar kommt.

Gruss
Chris