[Résolu][Base] Moulinette export feuilles Calc vers tables

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Factooor
PassiOOnné
PassiOOnné
Messages : 543
Inscription : 14 févr. 2007 11:39
Localisation : Lisieux (14)

[Résolu][Base] Moulinette export feuilles Calc vers tables

Message par Factooor »

Bonjour,

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 
Ci-joint un exemple :
client.zip
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Factooor le 27 janv. 2014 23:37, modifié 2 fois.
7.5.4.2 (AARCH64) LibreOffice
Mac OS X 13.4.1
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Moulinette export feuilles Calc dans des tables

Message par Piaf »

Bonsoir
J'avais commencé à bosser (à adapter :D Voir : L'import de données issues de Calc peut se faire de la même manière.) avant que ton fichier soit en ligne.
Regarde si l'exemple joint peut te servir.
Pour tester, à l'ouverture de la base, tu sélectionnes le fichier Calc joint, l'importation de la première table devrait se faire automatiquement, à la fin de l'import tu peux choisir d'importer ou pas la seconde table.
N.B. : Je ne l'ai testé que sur AOO, sous LibO avec la nouvelle gestion des dates, il faudrait adapter.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Factooor
PassiOOnné
PassiOOnné
Messages : 543
Inscription : 14 févr. 2007 11:39
Localisation : Lisieux (14)

Re: [Base] Moulinette export feuilles Calc dans des tables

Message par Factooor »

Bonjour et merci pour ta réponse,

Je regarde ton doc et je reviens :)
7.5.4.2 (AARCH64) LibreOffice
Mac OS X 13.4.1
Avatar de l’utilisateur
Factooor
PassiOOnné
PassiOOnné
Messages : 543
Inscription : 14 févr. 2007 11:39
Localisation : Lisieux (14)

Re: [Base] Moulinette export feuilles Calc dans des tables

Message par Factooor »

Donc ta macro marche très bien :)

Quelques idées pour apporter quelques améliorations et pour que cela puisse fonctionner avec toutes les bases (Tables) et les fichiers Calc !
Il faudrait dans le formulaire afficher des cases à cocher (ou autre ) avec le nom des feuilles Calc et le nom des tables et un bouton envoyer .
Stef
7.5.4.2 (AARCH64) LibreOffice
Mac OS X 13.4.1