« Classes DXL | Main| Audit mail Domino »

Documents lus/non lus (suite)

0

Probleme de documents lus/non lus (suite)
Pour faire suite aux questions ou demandes de quelques visiteurs de ce blog, voici du code permettant de traiter le probleme de perte de synchronisation des marqueurs de non lus dans une boite aux lettres.

...
Le problème existe toujours sous Domino/Notes7 bien qu'un esemble de ses causes aient été corrigées. La perte de synchronisation des non lus peut trouver sa cause dans les suppressions de documents : un utilisateur archive un document non lu depuis son courrier en arrivée vers sa boite d'archives. A la place du document archivé,  on trouve, dans le fichier courrier, un talon de suppression. Si le compteur de non lus ne s'est pas décrémenté, il y a fort à parier qu'un des documents non lus soit le talon de suppression (qui n'est pas visible en mode utilisation). Pour remédier au problème, vous pouvez forcer la suppression des talons de suppression en modifiant leur intervalle de purge depuis les paramètres de réplication.

Le code de l'exemple ci-dessous se trouve dans la boite aux lettres de l'utilisateur. Il est exécuté depuis un agent dont les paramètres sont décrits dans l'article Quid de la synchronisation des marqueurs de non lus du mois de juin dernier.

L'agent doit impérativement se trouver dans la boite aux lettres concernée afin que la cible d'exécution 'document non lus de la vue' puisse fonctionner.
L'agent peut très bien être stocké de manière centrale puis exporté dans la boite aux lettres d'un utilisateur particulier. Référez vous à l'article  http://10.0.0.139/web/domsphere.nsf/d6plinks/PMOY-6URFJR">Export/Import d'éléments structurels dans une base notesdu 18/10/2006 pour plus d'informations sur cette méthode.
Il doit également être lancé depuis la vue Tous documents, la meilleure méthode est peut être d'ouvrir préalablement cette vue depuis un bouton  en langage de formules par exemple.

Code du bouton :

@Command(ileOpenDatabase "":MailFile; "($All)"; ""; ""; "1" );
@command (oolsRunMacro"UnreadDocs");


Code de l'agent UnreadDocs :

Sub Initialize
        Dim uiws As New notesuiworkspace
        Dim session As New NotesSession                
        Dim curdb As notesdatabase                        
        Dim collection As NotesDocumentCollection
        Dim doc As NotesDocument    
        Dim agent As notesagent

        Set agent=session.CurrentAgent
        Set curdb=agent.parent
        Set collection = curdb.UnprocessedDocuments
        Set doc = collection.GetFirstDocument()        
       
        While Not(doc Is Nothing)
                Call doc.PutInFolder("UnreadDocs",True )
                Set doc = collection.GetNextDocument(doc)
        Wend        

La suite du code du bouton, dans l'exemple ci-dessous, permet de marquer tous les documents de la base en lus, puis ceux du dossier UnreadDocs en non lus, puis, enfin, de supprimer tous les documents du dossier non lus.

@Command( oolsMarkAllRead );
@Command(iewRefreshFields;
@Command(ileOpenDatabase "":MailFile; "UnreadDocs"; ""; ""; "1" );
@Command(ditSelectAll;
@Command( oolsMarkSelectedUnread );
@Command(iewRefreshFields;
@Command(ileCloseWindow

Puis on pourrait appeler un autre agent pour retirer les documents du dossier UnreadDocs puis éventuellement supprimer ce dossier  :

        Dim s As New notessession
        Dim s as new notessession
        Dim maildb As notesdatabase
        Set maildb=s.currentdatabase
        Dim v As NotesView
        Set v=maildb.GetView("UnreadDocs")
        Dim maildoc As notesdocument, nextdoc As notesdocument
        Set maildoc=v.GetFirstDocument
        While Not maildoc Is Nothing
                Set nextdoc=v.GetNextDocument(maildoc)
                Call maildoc.RemoveFromFolder("UnreadDocs")                
                Set maildoc=nextdoc
        Wend        
        Call v.Remove

Si l'on dispose de la collection de tous les documents non lus (cf exemple de l'agent UnreadDocs plus haut), la méthode NotesDocumentCollection permet de retirer tous les documents du dosier de manière plus optimisée sur une seule instruction :

        Call collection.RemoveAllFromFolder( "UnreadDocs" )

Ce serait plus rapide...

Il existe également un exemple de classe LotusScript de gestion des non lus dans la SandBox http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/50c04aabe223bdcb8525688d007060c7?OpenDocument" target=_Blank>à cet emplacement . Mais le code marche de manière aléatoire en V6-V7 :  l'interface utilisateur a des difficultés à prendre en compte la table des non lus lorsqu'elle est modifiée de cette façon. A creuser...

Post A Comment

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)