Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 15h54   #1
Invité de passage
 
Homme
Étudiant
Inscription : mai 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mai 2011
Messages : 1
Points : 0
Points : 0
Par défaut Actualiser le lien ODBC pour importer des tables

Bonjour à tous,

Je travaille actuellement sur un projet pour l'université dans lequel je dois importer des tables (une dizaine) dans une base Access. Toutes les tables proviennent de bases SQL Anywhere ayant la même structure.

Pour ce faire, j'ai créé une source de données ODBC (imposé par l'énoncé) pour pouvoir accéder à mes bases.

J'ai créé une fonction me permettant d'importer uniquement la structure des bases :

Code :
1
2
3
4
5
6
7
8
9
10
11
 Function importerStructureTables()
 
    Dim i As Integer
 
    For i = 0 To UBound(NomsTablesAccess)
        DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=" & DataSourceName & ";UID=" & Login & ";PWD=" & Password & ";" & "DATABASE=" & NomBase, acTable, NomsTables(i), NomsTablesAccess(i), structureonly:=True
 
    Next i
 
 
 End Function
, une autre méthode me permettant d'insérer des données.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Function importerTables()
    Dim i As Integer
 
    'Pour chaque table de la base access
    For i = 0 To UBound(NomsTablesAccess)
        DoCmd.SetWarnings False
        DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=" & DataSourceName & ";UID=" & Login & ";PWD=" & Password & ";" & "DATABASE=" & NomBase, acTable, NomsTablesSB2(i), "DBA_TEMP"
        DoCmd.RunSQL ("INSERT INTO " + NomsTablesAccess(i) + " SELECT * FROM DBA_TEMP")
        DoCmd.RunSQL ("DROP TABLE DBA_TEMP")
    Next i
    DoCmd.SetWarnings True
End Function
et une fonction me permettant de modifier les valeurs des clés correspondantes dans la base de registre

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Function maj()
 
    Dim WshShell As Object
    Dim newKeyDatabase As String
    Dim FSO As Object, folder As Object
 
    Set WshShell = CreateObject("WScript.Shell")
    Set FSO = CreateObject("Scripting.FileSystemObject")
 
 
    'Pour tous les dossier contenus dans le repertoire de l'application
    For Each folder In FSO.GetFolder(repertoireCourant).SubFolders
 
'        'On change la valeur de DatabaseFile et Database dans le registre
        newKeyDatabase = folder.Path & "\blabla.db"
        WshShell.RegWrite keyDatabaseFile, newKeyDatabase, "REG_SZ"
        WshShell.RegWrite keyDatabase, newKeyDatabase, "REG_SZ"
 
        'On importe la structure des tables si ce n'est pas encore fait
        If structureOK = False Then
            importerStructureTables
            structureOK = True
        End If
 
       importerTables
 
        newKeyDatabase = ""
    Next
 
End Function
Mon problème est le suivant :
Lorsque j'utilise DoCmd.TransferDatabase, c'est comme si mon lien ODBC pointait vers la même base de données, même après avoir changé les valeurs dans le registre.

J'ai lu pas mal d'articles sur plusieurs forum et je pense qu'il faut peut être utiliser un objet Recordset et Connection mais je ne sais pas comment m'y prendre.

Je reste ouvert à d'autres solutions.

Merci d'avance pour votre aide.

PS : Je travaille sur Access 2007 et Windows Vista
mickadacu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 19h58   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Les informations de connexions fournies dans la chaîne de connexion ODBC ont priorité sur le contenu de la base de registre.

Dans ton code, la base de données (DATABASE=) est toujours issue de la variable NomBase.
Je ne vois nulle part une affectation qui changerait le contenu de cette variable.
Donc, pour moi, la chaîne de connexion désigne tout le temps la même base de données.

Plutôt que d'écrire directement dans la base de registre (pas très pro ) ,
mets le nom de la base de données en tant que paramètre de ta fonction importerTables.
Code :
1
2
3
Function importerTables(NomBase As String)
...
End Function
Et tu l'appelles depuis ta fonction maj()
Code :
       importerTables folder.Path & "\blabla.db"
A+
LedZeppII est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h44.


 
 
 
 
Partenaires

Hébergement Web