Title: Déclaration/Suppression d'une SDD au format CSV en dynamique

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]

Répondre à