Aide VBA : Attacher des tables basées sur des données externes (ODBC)
eve75013
Messages postés2Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention12 décembre 2005
-
12 déc. 2005 à 10:29
angenoir3000
Messages postés4Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 7 mars 2006
-
7 mars 2006 à 10:50
Bonjour à tous,
Je voudrais savoir comment on attache des tables sur ACCESS, basé sur des données externes. J'ai tout dabors crée un DNS en utilisant la déclaration d'un API avec la modification de la base de registre.
Ensuite, ce qu'il me ma que c'est de faire ceci en passant uniquement par du code VBA :
angenoir3000
Messages postés4Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 7 mars 2006 7 mars 2006 à 10:50
La fonction suivante t'aideras mais attention elle extrait les données pour l'attachement des tables d'une table zMappage, il faudra donc l'adapter à ton problème: au lieu de boucler sur le recordset, boucle sur une liste des tables à attacher par exmple, si tu veux utiliser ma méthode il te faudra remplir une table zMappage.
Les connexions fonctionnent pour les 4 types de bases de données: MySQL, Oracle, AS400 et Access
Public Function XLDB_CreateODBCLinkedTables() As Boolean
Dim db As Database, rs As Recordset, tbl As TableDef
Dim ws As Workspace
Dim strConnect As String
On Error GoTo Errorhandler
XLDB_CreateODBCLinkedTables = False
'On crée les tables dans un autre Workspace que celui utilisé
' par les utilisateurs afin d'empêcher que ceux appartenant au
' groupe PWRead n'aient tous les droits. On crée ces tables avec
' l'utilisateur "PWUserAdmin", qui n'appartient évidemment
' pas au groupe PWRead.
Set ws = DBEngine.CreateWorkspace("wkPourLiaisonTables", "admin", "")
Set db = ws.OpenDatabase(CurrentDb.Name, False, False)
Set rs = db.OpenRecordset("select * from zMappageTables")
With rs
While Not .EOF
DoEvents
If rs!TypeDB = "MySQL" Then
If G_B_DB_TEST Then
strConnect = "ODBC;DSN=" & rs!dsn & "_test;SERVER=" & G_STR_SERVEUR_MYSQL & ";DATABASE=" & rs!NomDB & "_test;UID=" & G_STR_MYSQL_USER & ";PWD=" & G_STR_MYSQL_PWD & ";OPTION=" & G_STR_OPTION & ";"
Else
strConnect = "ODBC;DSN=" & rs!dsn & ";SERVER=" & G_STR_SERVEUR_MYSQL & ";DATABASE=" & rs!NomDB & ";UID=" & G_STR_MYSQL_USER & ";PWD=" & G_STR_MYSQL_PWD & ";OPTION=" & G_STR_OPTION & ";"
End If
ElseIf rs!TypeDB = "Oracle" Then
strConnect = "ODBC;DSN=" & rs!dsn & ";SERVER=" & G_STR_SERVEUR_ORACLE & ";UID=" & G_STR_ORACLE_USER & ";PWD=" & G_STR_ORACLE_PWD & ";"
ElseIf rs!TypeDB = "AS400" Then
strConnect = "ODBC;DSN=" & rs!dsn & ";UID=" & G_STR_AS400_USER & ";PWD=" & G_STR_AS400_PWD & ";"
ElseIf rs!TypeDB = "Access" Then
If rs!NomTableAccess = "zLog" Then
If G_B_DB_TEST Then
strConnect = "DATABASE=D:\Weidemann\Projets\MySofazImport\Programmes\DBLog.mdb"
Else
strConnect = "DATABASE=//s136a001/mysofazimport/DBLog.mdb"
End If
End If
End If
If (XLDB_DoesTblExist(rs!NomTableAccess) = False) Then
'Si la table n'existe pas on crée la liaison
If rs!NomTableAccess <> "zLog" Then
Set tbl = db.CreateTableDef(rs!NomTableAccess, dbAttachSavePWD)
Else
Set tbl = db.CreateTableDef(rs!NomTableAccess)
End If
tbl.Connect = strConnect
tbl.SourceTableName = rs!NomTableOrigine
db.TableDefs.Append tbl
Else
'Si la table liée existe déjà on réactualise le lien
Set tbl = db.TableDefs(rs!NomTableAccess)
tbl.Connect = strConnect
If rs!NomTableAccess <> "zLog" Then
tbl.Attributes = dbAttachSavePWD
End If
tbl.RefreshLink
End If
Debug.Print tbl.SourceTableName & " : " & tbl.Connect
rs.MoveNext
Wend
End With
'On masque les tables dans cette fonction car pour cela il faut des droits
' d'écriture (quand l'utilisateur appartient à PWRead cela est utile)
Set tbl = Nothing
For Each tbl In db.TableDefs
'On recherche les tables liées par ODBC en procédant à une addition
' binaire (la propriété Attributes est l'addition binaire de plusieurs propriétés)
If (tbl.Attributes And dbAttachedODBC) Then
'tbl.Attributes = dbHiddenObject
End If
Next
Set tbl = Nothing
db.Close
Set db = Nothing
ws.Close
Set ws = Nothing
Application.RefreshDatabaseWindow