Lier les tables d'une Base1 dans une Base3 via une Base2

tedtheOrs Messages postés 37 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 27 janvier 2010 - 30 déc. 2009 à 14:32
c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Derniè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

1 réponse

c148270 Messages postés 303 Date d'inscription mercredi 12 janvier 2005 Statut Membre Dernière intervention 3 octobre 2013 1
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

Bonne journée
0
Rejoignez-nous