Suite à ce fil lier deux tables de deux bases de données existantes
Il n’est effectivement pas possible de lier (attacher) une table d'une base de données à une autre.
Ce pourrait être une fonctionnalité intéressante.
On peut cependant importer une table d'une base à l'autre, et actualiser les données à l'ouverture de la base.
Dans le cadre « pourquoi faire simple quand on peut faire compliquer »
Le principe : à l'ouverture de la base, vérifier que la table soit déjà importée, si elle ne l'est pas, le faire.
Ensuite, ajouter les données de la table origine à la table importée.
Pour ce faire, j'ai adapté quatre macros.
Les deux bases doivent être enregistrées.
Code : Tout sélectionner
Sub OuvertureBase()
Dim Context as Object, BaseManuel as Object
ThisDatabaseDocument.CurrentController.connect("","")
maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
Context = createUnoService("com.sun.star.sdb.DatabaseContext")
BaseManuel = Context.getByName("AngebotManuels")
oConnection = BaseManuel.getConnection("","")
CreerTable
End SubCode : Tout sélectionner
Sub CreerTable()
Dim lesTables As Object, maRequete As Object
Dim instrSQL As String
lesTables = maConnexion.tables
If lesTables.hasByName(TblCopie) Then
instrSQL = "DELETE FROM " & """" & TblCopie & """"
maRequete = maConnexion.createStatement()
maRequete.executeUpdate(instrSQL)
CopierDonneesManuel
Else
CopierStructureManuel
End If
End SubSi Oui, on supprime les données et on appelle la macro CopierDonneesManuel.
Si Non, on appelle la macro CopierStructureManuel.
Code : Tout sélectionner
Sub CopierStructureManuel()
Dim oTables as object
Dim TblDescriptor as object, ColDescriptor as object, Cols as object, Col as object, cleDescriptor As Object
Dim oTables2 as Object
oTables = oConnection.Tables
TblDescriptor = oTables.createDataDescriptor
TblDescriptor.Name = TblCopie
ColDescriptor = TblDescriptor.columns.createDataDescriptor
cleDescriptor = TblDescriptor.Keys.createDataDescriptor
cleDescriptor.Name = "Principal"
cleDescriptor.Type = com.sun.star.sdbcx.KeyType.PRIMARY
Cols = oTables.getByName(TblSource).Columns
For Each Col In Cols
ColDescriptor.Name = Col.Name
ColDescriptor.Type = Col.Type
ColDescriptor.Precision = Col.Precision
If Col.isAutoIncrement Then
TblDescriptor.columns.appendByDescriptor(ColDescriptor)
cleDescriptor.Columns.appendByDescriptor(ColDescriptor)
Else
TblDescriptor.columns.appendByDescriptor(ColDescriptor)
End If
Next Col
oTables2 = maConnexion.Tables
TblDescriptor.Keys.appendByDescriptor(cleDescriptor)
oTables2.appendByDescriptor(TblDescriptor)
MsgBox("Table " & TblSource & " Copiée sous le nom de " & TblCopie,64,"Import de table")
CopierDonneesManuel
End SubLa macro appelle la macro CopierDonneesManuel
Code : Tout sélectionner
Sub CopierDonneesManuel()
Dim unRowSet As Object, unRowSet2 as Object
Fenetre =ThisComponent.CurrentController.Frame.ContainerWindow
Fenetre.Enable = False
unRowSet = createUnoService("com.sun.star.sdb.RowSet")
unRowSet2 = createUnoService("com.sun.star.sdb.RowSet")
With unRowSet2
.ActiveConnection = maConnexion
.CommandType = com.sun.star.sdb.CommandType.TABLE
.Command = tblCopie
.Execute
End With
On Error GoTo fermerRowSet
With unRowSet
.ActiveConnection = oConnection
.CommandType = com.sun.star.sdb.CommandType.TABLE
.Command = tblSource
.Execute
While .Next
Identifiant = .Columns.getByName("IdManuel").Int
LeNom = .Columns.getByName("NomManuel").String
Annee = .Columns.getByName("AnneeManuel").String
With unRowSet2
.moveToInsertRow
.Columns.getByName("IdManuel").updateInt(Identifiant)
.Columns.getByName("NomManuel").updateString(LeNom)
.Columns.getByName("AnneeManuel").updateString(Annee)
.insertRow
End With
Wend
Fenetre.Enable = True
UnRowSet2.Dispose
oConnection.Dispose
MsgBox("Les données de la table " & TblSource & " ont été copiées dans la table " & TblCopie,64,"Import de table")
Fin:
On Error GoTo 0
.dispose
Exit Sub
fermerRowSet:
MsgBox(Error, 16)
Resume Fin
End With
End SubEnsuite elle boucle sur les enregistrements de la table source et les ajoute à la table destination.
Ferme les RowSet et la connexion à la base distante.
Toutes suggestions ou corrections seront bien sur les bienvenues
A+

