En LotusScript, lorsque l'on ouvre un document avec un client lourd, on peut en exploiter le document frontal (frontend document, client side). Dans les évènements du masque, on le retrouve souvent en paramètre nommé "Source" mais on peut aussi récupérer cet objet par la propriété "CurrentDocument" de l'objet NotesUIWorkspace.
Le document frontal est un document en mémoire qui est spécifique au client qui ouvre ce document. Lorsque l'on veut mettre à jour les données du document frontal avec le document en arrière plan (backend document, server side) on utilise la méthode reload.
Ce que l'on sait moins (en tout cas au début) c'est que le document en backend est lui aussi en mémoire côté client et que les modifications du document réalisées par un agent ou un autre utilisateur ne sont pas répercutées tant que le document ouvert n'a pas été fermé et ré ouvert.
Prenons un cas concret :
- Deux utilisateurs A et B ouvre le même document en lecture.
- L'utilisateur B édite le document et modifie le champ toto et le fait passer de la valeur "litoto" à "cpasdrole".
- L'utilisateur B enregistre et ferme le document.
- L'utilisateur A entre en modification, fait un reload mais la valeur du champ toto est toujours à "litoto". De plus, dans le post mode change ou dans un bouton d'action, si l'on regarde la valeur du source.document.toto(0) il sera aussi égal à "litoto".
- L'utilisateur A ferme le document et l'ouvre a nouveau et le champ toto a bien pris la modification de l'utilisateur B.
Pour accéder au « vrai » document en backend, la solution est donc d'accéder au document par un autre biais que le notesuidocument. Vous pouvez faire comme ceci par exemple :
Dim vw As NotesView
Set vw = Source.Document.ParentDatabase.GetView("(UNID)")
Set BackEndDoc = vw.GetDocumentByKey(Source.Document.UniversalID)
Ou "(UNID)" est une vue dont la première colonne est égal à @Text(@documentUniqueID).
J'espère avoir été clair car ce n'est pas évident à expliquer tout ça. Concernant la gestion des locks, il y a plusieurs solutions possibles que je n'explorerai pas ici. Je voulais juste mettre le doigt sur ce mal entendu trop répété concernant les BackEnd documents.
1. Benoit
13/04/2007 09:43:48
Merci pour cette info Julien. Si j'ai bien compris, la méthode ci-dessous ne permet pas d'accèder au "vrai" doc backend si il y a deux ouvertures en lecture sur le uidoc :
Set uidoc = workspace.CurrentDocument
Set doc_pas_le_vrai_backend = uidoc.Document
Tandis que cette méthode là, oui :
Set doc_vrai_backend = Source.Document.ParentDatabase.GetDocumentByUNID(Source.Document.UniversalID)
2. julien
13/04/2007 09:51:39
@Benoit : Tu as tout compris ! (même si je n'ai pas testé ta solution qui devrait fonctionner à mon sens)
3. esolarc
13/04/2007 10:12:17
Très belle explication, c'est vrai que c'est pas facile à comprendre pour un débutant, même pas débutant 
Pour ma part je profite de cet état de fait pour quasi toujours modifier mon document ouvert via le NotesDocument (NotesUIDocument.Document) car les fonctions y sont beaucoup plus riches et plus pratique et pour preuve de la véracité de tes dires il suffit de tester et vous verrez que les champs de l'écran utilisateur sont immédiatement modifié (même pas besoin d'un reload).
Bonne continuation.
4. Michael
13/04/2007 14:00:10
C'est bien vrai Esolarc les méthodes frontales sont cruellement pauvre comparé aux méthodes dorsales.
pour ma part je fais la gestion des Lock via un document de lock dédié de ce fait je bypass completement le probleme ce qui est tres pratique aussi pour viré les locks et ne necessite aucune modification de champs dans le document à verouiller.
astucieuse le coup du "Set doc_vrai_backend = Source.Document.ParentDatabase.GetDocumentByUNID(Source.Document.UniversalID)" pas besoin de vue dédié...
5. julien
13/04/2007 14:03:32
@Benoit : J'ai testé ton code et il fonctionne. Il est plus simple que le miens et pas besoin de créer une vue... du tout bon.
@Escolarc : Effectivemment c'est une bonne pratique et c'est plus simple aussi à coder dans ce sens. Il faut aussi penser à la propriété autoreload qui permet d'affecter directement les modif du backend sur le frontend.
6. D.Bugger
16/04/2007 10:01:01
Tu as raison: il faut bien noter que ni un NotesUIDocument ni un NotesDocument est un document dans la base, ils ne sont que des objets en mémoire. Après un Save, le vrai document sera mis à jour. Tout changement se passe alors sur une copie (l'objet) en mémoire.
Le Reload ne sert à rien normalement, sauf dans le cas où tu as uidoc.AutoReload= False, et ça n'est que nécessaire quand il y a beaucoup de champs dans ton masque qui sont modifiés par le back-end document. (Par défaut, AutoReload= True).
Exemple:
- masque timesheet (heures travaillées)
- champs comme h_1_1 .. h_1_7, h_2_1 .. h_2_7, jusqu'a h_15_7
- champs total par jour et total par activité
- touche F9 pour Refresh
Si les champs de total sont calculés avec AutoReload= True, tu verras bien ce qui ce passe pendant un Refresh. La bonne solution:
Set doc= uidoc.Document
uidoc.AutoReload= False
... calculs sur doc
Call uidoc.Reload
uidoc.AutoReload= True




- 









