L'astuce de la semaine !
Connaissez-vous la fonction Lotusscript
Exemple : Vous disposez de quelques documents qui contienent plusieurs champs, dont certains sont calculés. Vous disposez aussi d'un agent Lotuscript qui modifie un champ A sur ces documents. Ce champ A est également utilisé par les champs calculés.
Hé bien, lorsque vous sauvegardez avec
La solution : avant de sauvegarder, appellez la fonction
De plus, vous pouvez demander à cette fonction de lever une erreur lors de son appel,
si dans le masque se trouve un champ dont la formule de validation n'est pas respectée.
Cette fonction est fort gourmande en CPU : attention si vous traitez beaucoup de documents.
ComputeWithForm ? Elle peut se réveler d'une grande utilité dans certains cas. Exemple : Vous disposez de quelques documents qui contienent plusieurs champs, dont certains sont calculés. Vous disposez aussi d'un agent Lotuscript qui modifie un champ A sur ces documents. Ce champ A est également utilisé par les champs calculés.
Hé bien, lorsque vous sauvegardez avec
document.Save(), les champs calculés ne sont... pas calculés.La solution : avant de sauvegarder, appellez la fonction
document.ComputeWithForm() : cela va forcer le calcul des champs calculés du masque associé à document. De plus, vous pouvez demander à cette fonction de lever une erreur lors de son appel,
si dans le masque se trouve un champ dont la formule de validation n'est pas respectée.
Cette fonction est fort gourmande en CPU : attention si vous traitez beaucoup de documents.
Comment permettre aux utilisateurs de gérer eux-même les droits d'accès aux bases Lotus Notes
Il y a, dans ma société, plus de cinquantes bases Lotus Notes, pour plus de 600 employés. Avec les arrivées de personnel, départs, remplacements, et parfois la volonté soudaine de quelq'un d'avoir accès à une base... Cela fait beaucoup de travail pour maintenir les LCA à jour.
Autre problème : suis-je vraiment habilité à dire si untel à le droit d'accéder à une base ? Non ! Ce n'est pas aux services informatiques de valider une demande d'accès à une base : la descision appartient aux chefs de service et aux directeurs.
Alors, comment diminuer ce fastidieux travail de maintenance ? En reportant ce travail de maintenance vers l'utilisateur. En tenant compte d'un point important : toutes les bases Lotus Notes de ma société ne sont consultables que en web. Pas de client Notes pour les utilisateurs !
Pour cela, il faut au préalable définir un chef de projet utilisateur (CPU) pour chacune de vos bases Lotus Notes. Ce CPU est un utilisateur "normal", qui n'a pas un profil technique. Nous allons donner à cette personne la possibilité de gérer les droits d'accès à la base dont il est le CPU.
Première étape
Tout d'abord, la LCA de votre base doit vérifier un format particulier. Supposons que votre base comporte trois type d'accès utilisateur : Des lecteurs, des Editeurs, et des personnes ayant le droit de définir les droits d'accès.
Nous allons constituer trois groupes dans la LCA :
Dans l'annuaire Lotus Notes, ces trois groupes sont également présents, sous la forme de trois documents de type "Group". Ils contiennent, dans leur champ Members les différentes personnes qui ont accès à la base.
Attention, si vous mettez les personnes en dur dans la LCA, ce système ne fonctionne pas. Cela fonctionne uniquement si vos entrées de LCA sont des groupes.
Les rôles [Lecteur] [Editeur] servent pour les droits liées à l'application (droit de modifier un doc, etc.)
Les rôles [LCALecteur], [LCAEditeur] et [LCAGestionDroits] servent uniquement aux agents que je décris plus bas. Cela leur permet d'identifier le nom des groupes,
dans l'annuaire Lotus Notes, ils doivent modifier pour mettre à jour les droits.
Deuxième étape
Nous allons créer un nouveau masque "AdministrationDroitsAcces". Ce sera l'interface de l'utilisateur pour modifier les droits d'accès.
Ce document contient trois champs multi-valués : ListeLecteurs, ListeEditeurs, ListeGestionDroits. Sur le WebQueryOpen du document, un agent nommé "LectureAnnuaire" se déclenche. Cet agent se charge de remplir les champs ListeLecteurs, ListeEditeurs, ListeGestionDroits du masque avec les valeurs présentes dans les groupes de l'annuaire Lotus Notes. Voici son code :
On obtient donc une page ayant cet aspect :
Gestion des droits : Jean Dupont
Editeurs : Pierre Jacques, John Smith
Lecteurs : Marc Dupond, Jacques Duchemin
Troisème étape
Il est assez aisé, en furetant sur internet, de trouver en web un "sélecteur de personnes" équivalent à celui qui se trouve sur le client Notes. Il permet à l'utilisateur d'ajouter ou d'enlever des personnes de ces listes.
Il reste donc à répercuter ces modifications effectuées par l'utilisateur vers l'annuaire Lotus Notes. (Si vous suivez toujours, en changeant ces listes, l'utilisateur ne modifie que le masque AdministrationsDroitsAcces...)
Cela est fait par un agent nommé "EcritureAnnuaire" qui se déclenche en WebQuerySave. Voici son code :
Et voilà !
Avec ce système, les utilisateurs modifient les groupes de l'annuaire Lotus Notes - et donc les droits d'accès aux bases - sans s'en rendre compte et sans se connecter à l'annuaire.
Il ont ainsi une interface simplifiée qui leur permet de gérer les droits d'accès à la base sans client Notes !
Autre problème : suis-je vraiment habilité à dire si untel à le droit d'accéder à une base ? Non ! Ce n'est pas aux services informatiques de valider une demande d'accès à une base : la descision appartient aux chefs de service et aux directeurs.
Alors, comment diminuer ce fastidieux travail de maintenance ? En reportant ce travail de maintenance vers l'utilisateur. En tenant compte d'un point important : toutes les bases Lotus Notes de ma société ne sont consultables que en web. Pas de client Notes pour les utilisateurs !
Pour cela, il faut au préalable définir un chef de projet utilisateur (CPU) pour chacune de vos bases Lotus Notes. Ce CPU est un utilisateur "normal", qui n'a pas un profil technique. Nous allons donner à cette personne la possibilité de gérer les droits d'accès à la base dont il est le CPU.
Première étape
Tout d'abord, la LCA de votre base doit vérifier un format particulier. Supposons que votre base comporte trois type d'accès utilisateur : Des lecteurs, des Editeurs, et des personnes ayant le droit de définir les droits d'accès.
Nous allons constituer trois groupes dans la LCA :
| Nom de la LCA | Rôles | Niveau d'accès |
| LCA_NomBaseLotusNotes_Lecteurs | [Lecteurs], [LCALecteur] | Lecteurs |
| LCA_NomBaseLotusNotes_Editeurs | [Editeurs], [LCAEditeur] | Editeurs |
| LCA_NomBaseLotusNotes_GestionDroits | [LCAGestionDroits] | Editeurs |
Dans l'annuaire Lotus Notes, ces trois groupes sont également présents, sous la forme de trois documents de type "Group". Ils contiennent, dans leur champ Members les différentes personnes qui ont accès à la base.
Attention, si vous mettez les personnes en dur dans la LCA, ce système ne fonctionne pas. Cela fonctionne uniquement si vos entrées de LCA sont des groupes.
Les rôles [Lecteur] [Editeur] servent pour les droits liées à l'application (droit de modifier un doc, etc.)
Les rôles [LCALecteur], [LCAEditeur] et [LCAGestionDroits] servent uniquement aux agents que je décris plus bas. Cela leur permet d'identifier le nom des groupes,
dans l'annuaire Lotus Notes, ils doivent modifier pour mettre à jour les droits.
Deuxième étape
Nous allons créer un nouveau masque "AdministrationDroitsAcces". Ce sera l'interface de l'utilisateur pour modifier les droits d'accès.
Ce document contient trois champs multi-valués : ListeLecteurs, ListeEditeurs, ListeGestionDroits. Sur le WebQueryOpen du document, un agent nommé "LectureAnnuaire" se déclenche. Cet agent se charge de remplir les champs ListeLecteurs, ListeEditeurs, ListeGestionDroits du masque avec les valeurs présentes dans les groupes de l'annuaire Lotus Notes. Voici son code :
Sub Initialize
Dim dbannuaire As New notesdatabase ("", "")
Dim session As New notessession
Dim doc As notesdocument
Dim db As notesdatabase
Dim contexte As notesdocument
Dim view As notesview
Dim item As notesitem
Dim it As notesitem
Dim acl As NotesACL
Dim entry As NotesACLEntry
Set db = session.currentdatabase
Set contexte = session.DocumentContext
' d'abord on récupére les noms des LCA de l'on doit aller lire dans
l'annuaire
Set acl = db.ACL
Set entry = acl.getfirstentry
While Not entry Is Nothing
Forall role In entry.Roles
If role="[LCAGestionDroits]" Then
' c'est le nom du groupe pouvant gérer les droits !
lca_admin=entry.Name
End If
If role="[LCAEditeur]" Then
' c'est le nom du groupe d'éditeurs !
lca_editeur=entry.Name
End If
If role="[LCALecteur]" Then
' c'est le nom du groupe de lecteurs !
lca_lecteur=entry.Name
End If
End Forall
Set entry = acl.GetNextEntry(entry)
Wend
' ouverture de l'annuaire Lotus Notes
Call dbannuaire.open ("", "names.nsf")
' on va lire sur l'annuaire Notes le contenu de la liste GestionDroits
Set it = contexte.getfirstitem("ListeGestionDroits")
Set view = dbnames.getview("Groups")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=lca_admin Then
Set item = doc.getfirstitem("Members")
Forall v In item.values
it.appendtotextlist(v)
End Forall
End If
Set doc = view.getnextdocument(doc)
Wend
'maj de la liste editeurs
Set it = contexte.getfirstitem("Editeurs")
Set view = dbnames.getview("Groups")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=lca_editeur Then
Set item = doc.getfirstitem("Members")
Forall v In item.values
it.appendtotextlist(v)
End Forall
End if
Set doc = view.getnextdocument(doc)
Wend
'maj de la liste lecteurs
Set it = contexte.getfirstitem("Lecteurs")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=lca_lecteur Then
Set item = doc.getfirstitem("Members")
Forall v In item.values
it.appendtotextlist(v)
End Forall
End If
Set doc = view.getnextdocument(doc)
Wend
End Sub
On obtient donc une page ayant cet aspect :
Gestion des droits : Jean Dupont
Editeurs : Pierre Jacques, John Smith
Lecteurs : Marc Dupond, Jacques Duchemin
Troisème étape
Il est assez aisé, en furetant sur internet, de trouver en web un "sélecteur de personnes" équivalent à celui qui se trouve sur le client Notes. Il permet à l'utilisateur d'ajouter ou d'enlever des personnes de ces listes.
Il reste donc à répercuter ces modifications effectuées par l'utilisateur vers l'annuaire Lotus Notes. (Si vous suivez toujours, en changeant ces listes, l'utilisateur ne modifie que le masque AdministrationsDroitsAcces...)
Cela est fait par un agent nommé "EcritureAnnuaire" qui se déclenche en WebQuerySave. Voici son code :
Sub Initialize
Dim dbannuaire As New notesdatabase ("", "")
Dim session As New notessession
Dim doc As notesdocument
Dim db As notesdatabase
Dim contexte As notesdocument
Dim view As notesview
Dim item As notesitem
Dim it As notesitem
Set db = session.currentdatabase
Set contexte = session.DocumentContext
Call dbannuaire.open ("", "names.nsf")
'maj sur l'annuaire de la des personnes Gestion droits
Set view = dbnames.getview("Groups")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=contexte.NomLCAAdmin(0) Then
Call doc.replaceitemvalue("Members", "")
Set it = doc.getfirstitem("Members")
liste=Explode(contexte.Admins(0), ",")
For i = 0 To Ubound(liste)
it.appendtotextlist(liste(i))
Next i
doc.Save True, True
End If
Set doc = view.getnextdocument(doc)
Wend
'maj sur l'annuaire de la liste des editeurs
Set view = dbnames.getview("Groups")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=contexte.NomLCAEditeur(0) Then
Call doc.replaceitemvalue("Members", "")
Set it = doc.getfirstitem("Members")
liste=Explode(contexte.Editeurs(0), ",")
For i = 0 To Ubound(liste)
it.appendtotextlist(liste(i))
Next i
doc.Save True, True
End If
Set doc = view.getnextdocument(doc)
Wend
'maj sur l'annuaire de la liste des lecteurs
Set view = dbnames.getview("Groups")
Set doc = view.getfirstdocument
While Not doc Is Nothing
If doc.ListName(0)=contexte.NomLCALecteur(0) Then
Call doc.replaceitemvalue("Members", "")
Set it = doc.getfirstitem("Members")
liste=OTBExplode(contexte.Lecteurs(0), ",")
For i = 0 To Ubound(liste)
it.appendtotextlist(liste(i))
Next i
doc.Save True, True
End If
Set doc = view.getnextdocument(doc)
Wend
End Sub
Function Explode(src As Variant, separator As Variant)
Dim res() As String
Dim index As Long
Dim reste As String
Dim nbElts As Integer
reste = src
index = Instr(reste, separator)
While index <> 0
Redim Preserve res (nbElts)
res (nbElts) = Left$(reste, index - 1)
reste = Right$(reste, Len(reste) - index - Len(separator) + 1)
nbElts = nbElts + 1
index = Instr(reste, separator)
Wend
Redim Preserve res (nbElts)
res (nbElts) = reste
Explode = res
End function
Et voilà !
Avec ce système, les utilisateurs modifient les groupes de l'annuaire Lotus Notes - et donc les droits d'accès aux bases - sans s'en rendre compte et sans se connecter à l'annuaire.
Il ont ainsi une interface simplifiée qui leur permet de gérer les droits d'accès à la base sans client Notes !
Rédigé le 02/02/2006