Lier les tables d'une Base1 dans une Base3 via une Base2
tedtheOrs
Messages postés37Date d'inscriptionsamedi 12 avril 2008StatutMembreDernière intervention27 janvier 2010
-
30 déc. 2009 à 14:32
c148270
Messages postés303Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention 3 octobre 2013
-
30 déc. 2009 à 21:21
Bonjour,
Est il possible de lier les tables d'une base dans une autre via un module dans une troisième.
J'ai une Base1 qui contient 3 tables. Je voudrais lier ces tables dans une Base3 via un module lancé depuis une Base2 (oui c'est un peu sioux mais bon..)
J'ai essayé de m'inspirer du code présent dans la FAQ mais j'ai une anomalie au niveau de la ligne en gras: "Mise à jour Impossible. La base de données ou l'objet est en lecture seule".
La base est fermée et n'est pas (a priori) en lecture seule.
D'avance merci.
Dim strCheminBd As String
Dim strCheminBd2 As String
Dim strConnect As String
Dim strConnect2 As String
Dim strNomsTables() As String
Dim strTemp As String
Dim i As Integer
Dim oDb As DAO.Database
Dim oDbSource As DAO.Database
Dim oTbl As DAO.TableDef
Dim oTblSource As DAO.TableDef
'Définit mot passe, nom table, chemin base de données
strMotPasse = ""
strCheminBd = "G:\TEST1.mdb"
'Définit la chaine de connexion permettant la liaison des tables
strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=G:\TEST1.mdb"
strConnect2 = "MS Access;pwd=" & strMotPasse & ";DATABASE=G:\TEST3.mdb"
'Instancie l'objet Database de la base courante
Set oDb = DBEngine.OpenDatabase(strCheminBd2, True, True, strConnect2)
'Instancie l'objet Database de la base protégée
Set oDbSource = DBEngine.OpenDatabase(strCheminBd, True, True, strConnect)
'Parcours l'ensemble des tables de la base de données protégée
'et stocke leur nom
For Each oTblSource In oDbSource.TableDefs
'ignore les tables system
If (oTblSource.Attributes And dbSystemObject) = 0 Then
strTemp = strTemp & oTblSource.Name & "|"
End If
Next
'Ferme la base de données sources (impératif pour la liaison)
oDbSource.Close: Set oDbSource = Nothing
'parcours le tableau de noms de tables
strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|")
For i = 0 To UBound(strNomsTables)
'Crée une nouvelle table dans la base de données courante
Set oTbl = oDb.CreateTableDef(strNomsTables(i))
'Lie les deux tables
oTbl.Connect = strConnect
oTbl.SourceTableName = strNomsTables(i)
'Ajoute la table à la base de données
oDb.TableDefs.Append oTbl
Next i
'Rafraichit la liste des tables
oDb.TableDefs.Refresh
End Sub
A voir également:
Lier les tables d'une Base1 dans une Base3 via une Base2
c148270
Messages postés303Date d'inscriptionmercredi 12 janvier 2005StatutMembreDernière intervention 3 octobre 20131 30 déc. 2009 à 21:21
Bonjour
J'ai presque compris
Pourquoi ne pa sutiliser le principe suivant :
Dans la base 2 créer une table mentionnant les tables à lier entre base1 vers base2
dans la base 3 lier cette table de la base 2
Dans la base3 executer un module de liaison base1 / base 2 à partir de cette table.
Ainsi toute modification de la table base2 sera répercutée lors de la liaison base1 / base2.
Il n'y a plus qu'à déclarer une liaison permanente base3 / base 2 pour une mise à jour de la table des tables à lier entre base1 et 3 et un seul module en base 3
Voici un exemple d'établissement de liaison :
Function LIAISONSSACARBEE()
Dim madata As Database
Dim mytable As DAO.Recordset
Dim ConnectStr As String
Dim TableStr As String
Dim SourceTablestr As String
Dim MaTableDef As TableDef
' connexion à SCARABEE
Statut = SysCmd(acSysCmdSetStatus, "Connexion à SCARABEE")
On Error GoTo errconnexion
Set madata = CurrentDb()
Set mytable = madata.OpenRecordset("tABLES")==============> tables en liaison base 2
mytable.MoveFirst
If mytable.NoMatch = False Then
Do Until mytable.EOF
SourceTablestr = mytable![Nom v2]
TableStr = SourceTablestr
ConnectStr = "ODBC;DRIVER={SQL Server};SERVER=mercure;APP=Microsoft® Access;UID=scl3user_p;PWD=scl3user_p;DATABASE=scscl3dp"
Set MaTableDef = madata.TableDefs(TableStr)
MaTableDef.Connect = ConnectStr
MaTableDef.RefreshLink
mytable.MoveNext
Loop
End If
mytable.Close
Statut = SysCmd(acSysCmdClearStatus)
Set madata = Nothing
Set mytable = Nothing
Set MaTableDef = Nothing
Exit Function
errconnexion:
MsgBox Err.Description
End Function
Attention : il se peut que j'ai mélangé les base1, 2, 3