« Ouvrir une base Lotus Script | Main| Documents lus/non lus (suite) »

Classes DXL

9,9

Export/Import d'elements structurels dans une base Notes
Comment modifier la structure d'un fichier NSF sans passer par la tache DESIGN ou une mise a jour de structure, mais en utilisant plutot un import/export d'elements structurels...

...
le problème à résoudre :
je souhaite envoyer, de manière programmée, un agent dans la boite aux lettres d'un utilisateur particulier sans modifier la structure de la base concernée. L'agent se trouve dans une base centrale sur un serveur Domino.


La solution :
effectuer un export de l'agent en XML (DXL plus exactement : Domino XML) , puis importer cet agent dans la boite aux lettres concernée.


Dans mon exemple, l'agent est exporté sous la forme d'un fichier XML sur le poste de l'utilisateur (c:\ par exemple), puis réimporté dans la boite aux lettres courante à partir, par exemple, d'un bouton envoyé par messagerie.

La base centrale se trouve sur un serveur et se nomme, dans l'exemple, structure.nsf. Elle ne contient qu'un agent que l'on souhaite importer dans la boite aux lettres de l'utilisateur.
Le code d'import et celui d'export sont stockés dans deux modules du bouton.

Voici le code du bouton :

Sub Click(Source As Button)
        Dim uiws as new notesuiworkspace
        Dim s as new notessession
        Dim curDb as notesdatabase
        Set curDb=s.currentdatabase 'la boite aux lettres
               
        Dim session As New NotesSession
        Dim db As NotesDatabase
        Dim test As Integer
        Dim ID As String*32
       
        Call export                 'appel de la fonction, ou du Sub d'export
        Call import(db.FilePath)        'appel de la fonction d'Import
               
        Call uiws.OpenDatabase("",db.FilePath,"($All)")                
End Sub

Les deux modules : le module d'Export DXL

Sub EXPORT
        Dim session As New NotesSession
        Dim db As NotesDatabase
        Set db = session.CurrentDatabase
       
REM création d'un fichier XML nommé d'après le nom de la base courante
          Dim stream As NotesStream
        Set stream = session.CreateStream
        filename$ = "c:\" & Left(db.FileName, Len(db.FileName) - 3) & "xml"
        If Not stream.Open(filename$) Then
                Messagebox "Impossible d'ouvrir le fichier " & filename$,, "Error"
                Exit Sub
        End If
        Call stream.Truncate
       
        'collection des agents de la base centrale
        Dim centrDB as notesdatabase
        Set centrDB=s.getdatabase("nom du serveur", "structure.nsf")
REM Création de la collection des agents de la base centrale (il n'y a qu'un agent dans la base)
REM S'il y avait plusieurs agents, on pourrait tout aussi bien parcourir les objets de la collection pour ne conserver que l'ID d'un agent particulier
REM L'aide de la classe NotesNoteCollection peut vous fournir des exemples sur le sujet
        Dim nc As NotesNoteCollection
        Set nc = centrdb.CreateNoteCollection(False)
        nc.SelectAgents=True
        Call nc.BuildCollection
       
  REM exécution de l'export DXL
        Dim exporter As NotesDXLExporter
        Set exporter = session.CreateDXLExporter
        Call exporter.SetInput(nc)
        Call exporter.SetOutput(stream)
        Call exporter.Process
End Sub


Le module d'Import DXL :

Sub IMPORT
        Dim session As New NotesSession
        Dim db As NotesDatabase
        Set db = session.CurrentDatabase
        filename$ = Left(db.FileName, Len(db.FileName) - 4)
       
  REM Ouverture du fichier XML créé dans le Sub d'export
        Dim stream As NotesStream
        Set stream = session.CreateStream
        If Not stream.Open("c:\" & filename$ & ".xml") Then
                Messagebox "Impossible d'ouvrir le fichier " & filename$,, "Error"
                Exit Sub
        End If
        If stream.Bytes = 0 Then
                Messagebox "Le fichier n'existe pas ou est vide",, filename$
                Exit Sub
        End If
       
  REM Import DXL dans la base
        Dim importer As NotesDXLImporter
        Set importer = session.CreateDXLImporter(stream, db)
        importer.ReplaceDBProperties = False
        importer.ReplicaRequiredForReplaceOrUpdate = False
        importer.ACLImportOption = DXLIMPORTOPTION_IGNORE
        importer.DesignImportOption = DXLIMPORTOPTION_CREATE
        Importer.DocumentImportOption=DXLIMPORTOPTION_IGNORE
        Call importer.Process

REM Signature de l'élément Structurel obligatoire puisque, dans mon exemple, il s'agit d'un agent (nommé "AGENT". Original non !!!)        
        Call db.Sign(DBSIGN_DOC_AGENT,False,"AGENT")
End Sub


Il ne reste plus qu'à supprimer le fichier XML local (KILL, mais je ne l'ai pas fermé dans mon exemple).

Post A Comment

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