[Résolu] Génération numéro unique

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

[Résolu] Génération numéro unique

Messagepar camilleB » 26 Mars 2012 à 14:10

Bonjour,
je souhaite créer un petit module affectant un numéro unique à un doc (exemple: 0000001) 7 digits et incrémental.
J'ai créé un doc permettant de stocker la référence qui sera incrémenté après chaque accès.
Mon souci c'est comment éviter les accès simultanés? Je pensais à un champ genre 'Public' qui permettrait l'accès ou pas au document tant que l'utilisateur actif ne l'aura pas quitté!
Sinon quelle est votre solution dans ce cas?
cdt
camille
Dernière édition par camilleB le 14 Avr 2012 à 17:00, édité 1 fois.
camilleB
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 176
Inscrit(e) le : 18 Jan 2012 à 23:45

Re: Génération numéro unique

Messagepar Michael DELIQUE » 26 Mars 2012 à 14:12

salut

j'ai fait plusieurs modules de ce genre, en LS avec une vue a rafraichissement automatique.

on prend le derniere numéro/doc de la vue et tant que ça existe +1

jusqu'a présent j'ai pas eu de souci de doublon.
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Re: Génération numéro unique

Messagepar camilleB » 26 Mars 2012 à 19:22

Michael DELIQUE a écrit:salut

j'ai fait plusieurs modules de ce genre, en LS avec une vue a rafraichissement automatique.

on prend le derniere numéro/doc de la vue et tant que ça existe +1

jusqu'a présent j'ai pas eu de souci de doublon.


Salut, je n'ai pas bien compris! aurais tu un exemple stp?

cdt
camille
camilleB
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 176
Inscrit(e) le : 18 Jan 2012 à 23:45

Re: Génération numéro unique

Messagepar roubech » 26 Mars 2012 à 19:57

tant que tout le monde attaque le même serveur, ça va
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Génération numéro unique

Messagepar Michael DELIQUE » 27 Mars 2012 à 09:02

Voila madame !

et comme le dis Roubech tant que tout le monde est sur le même serveur ça va apres faut gérer différement

- numérotation par serveur
- serveur unique de numérotation

Code : Tout sélectionner
Public Function CompteurPrincipal As String
   'function gérant le compteur de document en l'incrémentant
   
   'Déclaration Variable
   
   Dim nbNumero As Long
   Dim nbTaille As Integer
   Dim nbDigit As Integer
   Dim DocCompteur As NotesDocument
   Dim DocParamCompteur As NotesDocument
   Dim Prefix As String
   Dim vwNumeroSystem As NotesView
   
   On Error Goto ErreurHandle
   
   If db Is Nothing Or Session Is Nothing Then
      Set Session = New NotesSession
      Set db = Session.CurrentDatabase
   End If
   
   If Trim(db.server) = "" Then
      CompteurPrincipal = ""
      Exit Function
   End If   
   
   Set vwNumeroSystem = db.GetView("vwNumeroSystem")
   If vwNumeroSystem Is Nothing Then
      Error 9999,"vwNumeroSystem is nothing"
   End If
   vwNumeroSystem.Refresh
   
   Set DocParamCompteur = DocSystem("CPT","PARAM")
   
   If DocParamCompteur Is Nothing Then
      Error 9999, "DocParamCompteur is Nothing"
      Exit Function      
   End If
   
   If Ucase(Trim(DocParamCompteur.GetItemValue("ActiveCompteur")(0))) <> "OUI" Then
      CompteurPrincipal = ""
      Exit Function   
   Else
      Select Case Trim(Cstr(DocParamCompteur.GetItemValue("NbDigit")(0)))
      Case "","0"
         NBDigit = 0
      Case Else
         NBDigit=Cint(Trim(DocParamCompteur.GetItemValue("NbDigit")(0)))
      End Select
   End If
   
   Prefix = ""
   
   If Trim(DocParamCompteur.GetItemValue("Prefix")(0)) <> "" Then
      Prefix = Trim(Cstr(Formulatron(DocParamCompteur, DocParamCompteur,"FlagPrefix", "Prefix",False)(0)))
   End If
   
   CompteurPrincipal = ""
   
   'passe au numéro suivant et maj jour du doc param puis l'enregistre
   Select Case Trim(Cstr(DocParamCompteur.GetItemValue("numero")(0)))
   Case "","0"
      NBNumero=1
   Case Else
      NBNumero=Clng(Trim(DocParamCompteur.GetItemValue("numero")(0)))+1
   End Select
   
   CompteurPrincipal = Cstr(NBNumero)
   
   'formate le numéro => ajoute le nombre de zéro necessaire devant
   If NBDigit<1 Then
      Call DocParamCompteur.Save(True,False)
      Exit Function
   End If
   
   NBTaille= Len(Trim(CompteurPrincipal))
   While  NBTaille<NBDigit
      CompteurPrincipal = "0"+Trim(CompteurPrincipal)
      NBTaille= Len(Trim(CompteurPrincipal))
   Wend
   CompteurPrincipal = Prefix+CompteurPrincipal
   
   'test si un document est déjà numéroté, si rien renvoi le numéro
   Set DocCompteur =vwNumeroSystem.GetFirstDocument
   If DocCompteur Is Nothing Then
      Call DocParamCompteur.ReplaceItemValue( "numero", nbNumero )
      Call DocParamCompteur.Save(True,False)
      Exit Function
   End If
   Set DocCompteur = Nothing
   
   'boucle jusqu'a ce que le numéro n'est plus de doublon
   While Not DocCompteur Is Nothing
      CompteurPrincipal = ""
      nbNumero=nbNumero+1
      CompteurPrincipal= Cstr(nbNumero)
      nbTaille= Len(Trim(CompteurPrincipal))
      While  nbTaille<nbDigit
         CompteurPrincipal = "0"+Trim(CompteurPrincipal)
         nbTaille= Len(Trim(CompteurPrincipal))
      Wend
      CompteurPrincipal = Prefix+CompteurPrincipal
      Set DocCompteur = vwNumeroSystem.GetDocumentByKey(CompteurPrincipal,True)
   Wend
   
   'enregistre le derniere numéro
   Call DocParamCompteur.ReplaceItemValue( "numero", nbNumero )
   Call DocParamCompteur.Save(True,False)
   
   Set DocCompteur = Nothing
   Set DocParamCompteur = Nothing   
   
   Exit Function
ErreurHandle:
   Set DocCompteur = Nothing
   Msgbox "("+Structure_Log+" : "+Cstr(Getthreadinfo (1))+" Call by "+Cstr(Getthreadinfo(10))+")"+Chr(10)+"Erreur N° " + Str(Err) + " : "+Chr(10) + Cstr(Error)+". "+Chr(10)+"Ligne N° "+Cstr(Erl),16," ERREUR !"
   Set Session = New NotesSession
   Call Error_LOG(Session.CurrentDatabase,Cstr(Session.Username),Cstr(Now),Structure_Log,Cstr(Getthreadinfo(10)),Cstr(Getthreadinfo (1)),Cstr(Err),Cstr(Error),Cstr(Erl))
   CompteurPrincipal = ""
   Exit Function
End Function
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Re: Génération numéro unique

Messagepar camilleB » 27 Mars 2012 à 20:52

Michael DELIQUE a écrit:Voila madame !

et comme le dis Roubech tant que tout le monde est sur le même serveur ça va apres faut gérer différement

- numérotation par serveur
- serveur unique de numérotation

Code : Tout sélectionner
Public Function CompteurPrincipal As String
   'function gérant le compteur de document en l'incrémentant
   
   'Déclaration Variable
   
   Dim nbNumero As Long
   Dim nbTaille As Integer
   Dim nbDigit As Integer
   Dim DocCompteur As NotesDocument
   Dim DocParamCompteur As NotesDocument
   Dim Prefix As String
   Dim vwNumeroSystem As NotesView
   
   On Error Goto ErreurHandle
   
   If db Is Nothing Or Session Is Nothing Then
      Set Session = New NotesSession
      Set db = Session.CurrentDatabase
   End If
   
   If Trim(db.server) = "" Then
      CompteurPrincipal = ""
      Exit Function
   End If   
   
   Set vwNumeroSystem = db.GetView("vwNumeroSystem")
   If vwNumeroSystem Is Nothing Then
      Error 9999,"vwNumeroSystem is nothing"
   End If
   vwNumeroSystem.Refresh
   
   Set DocParamCompteur = DocSystem("CPT","PARAM")
   
   If DocParamCompteur Is Nothing Then
      Error 9999, "DocParamCompteur is Nothing"
      Exit Function      
   End If
   
   If Ucase(Trim(DocParamCompteur.GetItemValue("ActiveCompteur")(0))) <> "OUI" Then
      CompteurPrincipal = ""
      Exit Function   
   Else
      Select Case Trim(Cstr(DocParamCompteur.GetItemValue("NbDigit")(0)))
      Case "","0"
         NBDigit = 0
      Case Else
         NBDigit=Cint(Trim(DocParamCompteur.GetItemValue("NbDigit")(0)))
      End Select
   End If
   
   Prefix = ""
   
   If Trim(DocParamCompteur.GetItemValue("Prefix")(0)) <> "" Then
      Prefix = Trim(Cstr(Formulatron(DocParamCompteur, DocParamCompteur,"FlagPrefix", "Prefix",False)(0)))
   End If
   
   CompteurPrincipal = ""
   
   'passe au numéro suivant et maj jour du doc param puis l'enregistre
   Select Case Trim(Cstr(DocParamCompteur.GetItemValue("numero")(0)))
   Case "","0"
      NBNumero=1
   Case Else
      NBNumero=Clng(Trim(DocParamCompteur.GetItemValue("numero")(0)))+1
   End Select
   
   CompteurPrincipal = Cstr(NBNumero)
   
   'formate le numéro => ajoute le nombre de zéro necessaire devant
   If NBDigit<1 Then
      Call DocParamCompteur.Save(True,False)
      Exit Function
   End If
   
   NBTaille= Len(Trim(CompteurPrincipal))
   While  NBTaille<NBDigit
      CompteurPrincipal = "0"+Trim(CompteurPrincipal)
      NBTaille= Len(Trim(CompteurPrincipal))
   Wend
   CompteurPrincipal = Prefix+CompteurPrincipal
   
   'test si un document est déjà numéroté, si rien renvoi le numéro
   Set DocCompteur =vwNumeroSystem.GetFirstDocument
   If DocCompteur Is Nothing Then
      Call DocParamCompteur.ReplaceItemValue( "numero", nbNumero )
      Call DocParamCompteur.Save(True,False)
      Exit Function
   End If
   Set DocCompteur = Nothing
   
   'boucle jusqu'a ce que le numéro n'est plus de doublon
   While Not DocCompteur Is Nothing
      CompteurPrincipal = ""
      nbNumero=nbNumero+1
      CompteurPrincipal= Cstr(nbNumero)
      nbTaille= Len(Trim(CompteurPrincipal))
      While  nbTaille<nbDigit
         CompteurPrincipal = "0"+Trim(CompteurPrincipal)
         nbTaille= Len(Trim(CompteurPrincipal))
      Wend
      CompteurPrincipal = Prefix+CompteurPrincipal
      Set DocCompteur = vwNumeroSystem.GetDocumentByKey(CompteurPrincipal,True)
   Wend
   
   'enregistre le derniere numéro
   Call DocParamCompteur.ReplaceItemValue( "numero", nbNumero )
   Call DocParamCompteur.Save(True,False)
   
   Set DocCompteur = Nothing
   Set DocParamCompteur = Nothing   
   
   Exit Function
ErreurHandle:
   Set DocCompteur = Nothing
   Msgbox "("+Structure_Log+" : "+Cstr(Getthreadinfo (1))+" Call by "+Cstr(Getthreadinfo(10))+")"+Chr(10)+"Erreur N° " + Str(Err) + " : "+Chr(10) + Cstr(Error)+". "+Chr(10)+"Ligne N° "+Cstr(Erl),16," ERREUR !"
   Set Session = New NotesSession
   Call Error_LOG(Session.CurrentDatabase,Cstr(Session.Username),Cstr(Now),Structure_Log,Cstr(Getthreadinfo(10)),Cstr(Getthreadinfo (1)),Cstr(Err),Cstr(Error),Cstr(Erl))
   CompteurPrincipal = ""
   Exit Function
End Function


:lol: Bonjour, merci mais mais je préfère Monsieur!

Cela dit Michael, tu pourrais mettre la fonction Formulatron pour voir ce que çà donne!
Sinon j'ai glané çà sur le net:https://www.ibm.com/developerworks/lotus/library/ls-sequential_numbers/side1.html
Il permet de gérer justement les applications sur des serveurs multiples!
cdt
Mr. camille :)
camilleB
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 176
Inscrit(e) le : 18 Jan 2012 à 23:45


Retour vers Développement