Ma configuration : base de données MySQL avec LO Base comme interface utilisateur.
Dans un fil précédent ici, avec votre aide, j'avais pu mettre au point une procédure permettant d'exporter automatiquement une requête dans un fichier Calc créé à cet effet. Cela marche bien.
Mais (et oui, il y a un 'mais'), je me suis rendu compte qu'un des champ, une date, est considéré comme une chaîne dans le fichier Calc créé ce que je ne trouve pas satisfaisant. Quitte à faire une procédure, j'aimerais qu'à la sortie, tout soit correct.
Je reproduis le corps du code :
Code : Tout sélectionner
laBase = thisDatabaseDocument
' le nom de la base
aNomBase = split(labase.title,".")
x = uBound(aNomBase)-1
redim preserve aNomBase( x )
NomBase = join( aNomBase, "." )
' le répertoire de sauvegarde
aURL = split( laBase.url, "/" )
x = uBound(aURL)-1
redim preserve aURL( x )
URL = join( aURL, "/" )
' ouvre un nouveau classeur en mode caché
oURL = "private:factory/scalc"
oDoc = starDesktop.loadComponentFromURL(oURL, "_blank", 0, Args())
oFeuille = oDoc.Sheets(0) ' la première feuille
' récupère les données (rowset)
Ntable = "maRequête" ' nom de la requête
genereRowSet = createUnoService("com.sun.star.sdb.RowSet")
with genereRowSet
.commandType = 1
.command = Ntable
.datasourcename = laBase.url
.filter = ""
.applyFilter = false
end with
q = genereRowset
q.execute
' s'assurer que tous les enregistrements sont bien chargés
if not q.IsRowCountFinal then
q.afterLast
q.beforeFirst
end if
' récupère les en-têtes de colonne
qCol = q.columns.elementNames
' dimensionne et récupère un dataArray du classeur
cels = oFeuille.getcellRangebyPosition(0,0,uBound(qCol),q.rowCount)
da = cels.getDataArray()
' injecte les en-têtes
for i = 0 to uBound(qCol)
da(0)(i) = qCol(i)
next i
' injecte les données
for i = 1 to q.rowCount
q.next
ligne = da(i)
for j = 0 to uBound(qCol)
ligne(j) = q.getString(j+1)
next j
next i
' insère le dataArray modifié + adapte largeurs de colonnes
cels.setDataArray(da)
for i = 0 to uBound(qCol)
oFeuille.columns.getByIndex(i).optimalWidth = true
next i
' sauvegarde et ferme
Ntable = REPLACE(Ntable, "nomBDDMySQL.","")
oDoc.storeToUrl(URL & "/" & Ntable & ".ods", array() )
oDoc.close(true)
- Les données de la requête sont récupérées dans un objet Rowset
- Une première boucle avec un compteur 'i' passe en revue les lignes d’enregistrements
- A l'intérieur de la première boucle, une 2e boucle avec un compteur 'j' passe en revue les colonnes, donc finalement, chaque cellule de la ligne
- Et ceci sera enregistré dans le fichier Calc
J'ai aussi introduit 2 lignes de code, avant l'écriture de ces dates, pour transformer le format des cellules qui vont recevoir les dates au format #01/02/2024#, et cela marche ; en cours d'exécution, le format des cellules devient bien le bon :
Code : Tout sélectionner
'formater cellules de date
cel = oFeuille.getcellRangebyPosition(23,1,23,q.rowCount)
cel.Numberformat = 36
Puis-je faire autrement ? Où je fais une erreur ?
Merci