Bonjour,
J'ai été confronté au problème suivant, utiliser des données issues d'un fichier au format CSV, ce fichier étant modifié par une application externe entre chaque utilisation.
La première solution consistait à fermer OpenOffice entre chaque traitement pour autoriser la réécriture du fichier CSV, solution contraignante pour l'utilisateur.
La macro ci dessous permet de déclarer une source de données au format CSV dans OOo puis de la supprimer en dynamique. L'attente liée à la fermeture puis à l'ouverture d'OOo est supprimée.
Sub Creation_Base
Dim Chemin as string, NomSource as String, ODB_URL as String
Dim oNewSource as Object, oDbContext as Object
Dim flatProp(7) as new com.sun.star.beans.PropertyValue
Dim props(0) as new com.sun.star.beans.PropertyValue
Dim Context as Object
Dim Reponse as Variant
Chemin = "c:\fpm\trt2\"
NomSource = "TRT2"
oDBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
>
' Création du fichier ODB
ODB_URL = ConvertToURL("c:\fpm\trt2\trt34.odb")
props(0).Name = "Overwrite"
props(0).value = True
oNewSource.databaseDocument.StoreAsURL(ODB_URL, props())
' Définition des paramètres du filtre
flatProp(0).Name = "Extension"
flatProp(0).Value = "dat"
flatProp(1).Name = "CharSet"
flatProp(1).Value = 0
flatProp(2).Name = "FixedLenght"
flatProp(2).Value = True
flatProp(3).Name = "HeaderLine"
flatProp(3).Value = True
flatProp(4).Name = "FieldDelimiter"
flatProp(4).Value = chr(9)
flatProp(5).Name = "StringDelimiter"
flatProp(5).Value = ""
flatProp(6).Name = "Decimaldelimiter"
flatProp(6).Value = ","
flatProp(7).Name = "ThousandDelimiter"
flatProp(7).Value = "."
oNewSource.Info = flatProp()
oNewSource.databaseDocument.store()
oNewSource.databaseDocument.URL(ODB_URL, props())
' Création de la source de données
Reponse = oDbContext.hasByName(NomSource)
If Reponse then
MsgBox "La source de données " & NomSource & " existe déjà, ajout impossible"
Else
oNewSource.URL = "" & Chemin
oNewSource.databaseDocument.store()
oDbContext.RegisterObject(NomSource, oNewSource)
CreationDataSource = oNewSource
End If
' Suppression de la base de données
NomSource = "TRT2"
If oDbContext.hasByName(NomSource) then
oDbContext.revokeObject(NomSource)
' Fermeture du document odb
oNewSource.databaseDocument.close(True)
End If
End Sub
La macro ci dessous qui fonctionne "à vide" et plante systématiquement dés que l'on utilise une requête ou que l'on ouvre un document utilisant la source de données.
Pour remédier au problème il suffit de fermer la requête et/ou le fichier:
Pour un Rowset :
oRowset.close
oRowSet.dispose
Pour une requête SQl :
' Fermeture de la source de données TRT
ConnexionTRT.close
ConnexionTRT.dispose
Et enfin fermeture du document utilisé pour le publipostage.
oDocument.close(True)
MABILLE Bruno
SZSIC METZ
[EMAIL PROTECTED]