Classes DXL
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).
-






