J'aimerais avoir vos lumières (Je refait un peu de programmation après quelques années d’abstinences)
J'aimerais réaliser une moulinette, c.a.d envoyer des données d'un classeur (plusieurs feuilles calc) vers une base de données (Plusieurs tables) !
Mon soucis est que pour une feuille et une table prédéfinis pas de soucis. Mais comme, il y a plusieurs feuilles et tables, je ne veux/peux pas définir tout à la minime
Code : Tout sélectionner
Sub importSpreadsheetToTable
Dim oDriverManager,oDriver As Object
Dim oConn As Object
Dim oCurConn As Object,oStmt As Object ,oResult As Object, oRowSet As Object, oReq As Object
Dim lesTables As Object
' Dim maConnexion As Object
Dim oParams(0) As New com.sun.star.beans.PropertyValue
Dim sURL,sTableName,sQuote,sSQL As String
'Chemin du classeur
sURL="sdbc:calc:" & ConvertToURL(sPathSpreadsheet)
oDriverManager = CreateUnoService("com.sun.star.sdbc.DriverManager")
oDriver=oDriverManager.getDriverByURL(sURL)
If IsNull(oDriver) Then
MsgBox "[Erreur Pilote] Impossible d'ouvrir le fichier"
Exit Sub
End If
'Première ligne entête
oParams(0).Name="HeaderLine"
oParams(0).Value=True
'Connexion DB Classeur
ConnecterSource '
lesTables = maConnexion.Tables 'oDriver.getDataDefinitionByConnection(maConnexion).Tables
oStmt=maConnexion.createStatement()
'Récupère le caractère d'échappement pour les identifiants SQL
sQuote=maConnexion.getMetaData().getIdentifierQuoteString()
'Le nom de la table est le nom de la 1ère feuille
sTableName= sQuote & lesTables.ElementNames(0) & sQuote
'Données de la feuille
sSQL="SELECT * FROM " & sTableName
oResult=oStmt.executeQuery(sSQL)
'Connexion DB Base
oRowSet=CreateUnoService("com.sun.star.sdb.RowSet")
With oRowSet
'.DataSourceName=ConvertToURL(sPathBase)
.DataSourceName=thisComponent.getURL
.CommandType=com.sun.star.sdb.CommandType.TABLE
.Command=sTableNameDB
.execute()
End With
'Suppression données DB
'TODO Remettre clé primaire à zéro ;-)
'Connexion actuelle à la DB
oCurConn = ThisDatabasedocument.CurrentController.ActiveConnection
If oCurConn.tables.hasByName(sTableNameDB) Then
oReq = oCurConn.createStatement()
oReq.executeUpdate("DELETE FROM " & """" & sTableNameDB & """")
End If
'Parcours chaque ligne de la feuille
While oResult.next()
With oRowSet
'Déplacement jusqu'à la nouvelle ligne à insérer
.moveToInsertRow()
'.updateString(index colonne, valeur)
'ATTENTION Si colonne même nom la première qui matche est prise
'cf. http://www.openoffice.org/api/docs/common/ref/com/sun/star/sdbc/XColumnLocate.html
.updateString(.findcolumn("Nom"),oResult.getString(1))
.updateString(.findcolumn("Prenom"),oResult.getString(2))
.updateString(.findcolumn("Tel"),oResult.getString(3))
.updateInt(.findcolumn("CodePostal"),oResult.getString(4))
'TODO Gestion Commande
'.updateString(.findcolumn("Commande"),oResult.getString(4) )
'Insertion de la ligne
.insertRow()
End With
Wend
'Fermeture de la connexion
maConnexion.close()
End Sub 
