Liaison de tables ACCESS en chemin relatif [Résolu]

Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 02:42 - Dernière réponse : Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 16:12
Bonsoir (ou bonjour, c'est selon ^^),

Je vais poster mon pb sur VBFrance parce que, si une solution purement ACCESS n'existe pas, j'aimerai bien en trouver une qui soit au moins en VBA, même si j'ai de gros doute.
J'expose mon pb :

J'ai développé une appli en VB6 qui utilise un certain nombre de base de données ACCESS 2000 en DAO. Tout fonctionne, pas de soucis.
Le problème se situe dans mes bases de données : Une base possède une table liée à une autre base.

Pour faire simple :
Base A : Table 1, Table 2
Base B : Table 3, Table 4 : Liaison sur la Table 2

J'utilise cette liaison dans une requête afin d'afficher un certain nombre de données.
Tout fonctionne parfaitement.

J'arrive donc à mon problème :
Je viens de découvrir qu'en fait, cette liaison est "en dure". Le chemin de la base est rentrée en dure dans la liaison.
Je viens de changer mon appli de répertoire et forcément, ça plante : En effet, le nom de répertoire ayant changé, la liaison n'est plus. Si je corrige avec le gestionnaire d'attache, pas de soucis.

Le pb, c'est que j'ai développé l'appli en VB6 pour justement pouvoir distribuer mes bases sans qu'ACCESS soit nécessairement installé sur le poste.
Je ne peux donc pas me contenter d'une solution consistant à ouvrir les bases avec ACCESS pour modifier la liaison.

J'en viens donc à ma question :
Existe-t-il un moyen de faire mettre le chemin de la liaison en chemin relatif ? (Toutes les bases se trouvant dans le même répertoire).
Si ce n'est pas possible, existe-t-il au moins un code VBA permettant de modifier le chemin de la liaison ? Si ce code existe, je pourrais toujours écrire un petit module qui vérifiera le chemin de la liaison et le modifiera le cas échéant.

Je n'ai qu'ACCESS 2000 à ma disposition.

Molenn

<!-- / message -->
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cavo789
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Dernière intervention
28 juillet 2009
- 22 déc. 2006 à 07:01
3
Merci
Une solution VBA existe : il suffit d'utiliser la propriété ConnectString de la collection table.

Ainsi : CurrentDb.TableDefs("MaTable").ConnectString te retourne entre autre le nom complet de la DB attachée.  

Analyse ce que te retourne cette propriété et va changer dans le path ce qui doit l'être (p.e. à l'ouverture de ta DB).  

Christophe

Merci cavo789 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cavo789
Meilleure réponse
cavo789
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Dernière intervention
28 juillet 2009
- 22 déc. 2006 à 14:50
3
Merci
Pense à faire un CurrentDB.TableDefs.Refresh pour forcer Access à ... rafraîchir ses liens

Christophe

Merci cavo789 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cavo789
Meilleure réponse
Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 16:12
3
Merci
Ca y est, j'ai fini par trouver !!!

En piquant des idées à droite à gauche, j'ai enfin réussi à le faire. Youpiiii. pas besoin de réécrire de code pour une Form entière !! ^^

Déjà, avec ce que j'avais trouvé de microsoft, j'ai pu résoudre un des problèmes :
Je parlais de recordset tout àl'heure, j'ai même pas tilté, mais en fait, le problème était là. Il fallait que je déclare ma variable de type TableDef et non RecordSet ! C'était tellement gros que je ne l'avais pas vu

Le dernier point qui me manquait était donc bien celui qu'indiquait cavo789 Il fallait que je rafraîchisse mes liens, ce n'était pas tout à fait avec Refresh, mais avec MaTable.RefreshLink

Je peux donc modifier mes liaisons dynamiquement et je vais pouvoir me consacrer entièrement à fair eun joli SetUp maintenant.
Bonheur, joie et volupté

Merci encore à vous.

Molenn

Merci Molenn 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Molenn
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 22 déc. 2006 à 07:19
0
Merci
Il est sans doute plus simple de mettre tes fichiers de données dans le même répertoire que celui de ton application ou dans un sous répertoire de celui de ton application.

Il te suffit alors de te référer (dynamiquement) à ce chemin en concaténant le répertoire de ton application avec le nom de ton fichier de données. Et ce sera ainsi toujours vrai, même si tu renommes le répertoire de ton appli ou le déplaces.
Commenter la réponse de jmfmarques
Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 11:04
0
Merci
Je sens qu'il y a de l'idée, merci à vous !!
J'ai tenté CurrentDb.TableDefs("MaTable").ConnectString, c'était presque ça, en ACCESS 2000, ce qui me retourne le chemin de la base à laquelle la table est liée c'est CurrentDb.TableDefs("MaTable").Connect et le nom de la table à laquelle elle est liée c'est CurrentDb.TableDefs("MaTable_ListeObjets").SourceTableName

Plus qu'à recrer adapter ce code à du VB6 (je ne peux pas mettre ce code dans la base de données, elle n'est en fait jamais ouverte en tant que telle).

Sinon, jmfmarques, c'est déjà le cas, toutes mes bases sont dans un sous-répertoire de mon appli. Ce que tu me proposes, c'est exactement ce que je voulais faire sauf que .. il me manquait les 2 lignes de commande (Je ne pense jamais à TableDefs ).

Plus qu'à chercher ... Je viendrais accepter les réponses si j'arrive à m'en sortir ('y a pas de raison ^^)

Merci

Molenn
Commenter la réponse de Molenn
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 22 déc. 2006 à 11:29
0
Merci
Je ne connais pas VBA, mais tu devrais y trouver l'équivalent de VB6 pour App.Path ou Curdir

Cherche et du trouveras (peut-être en cherchant avec "répertoire en cours" ou "répertoire de l'Application" ou encore avec "Path" et en lisant tout... (c'est le chemin de ton appli et non celui de la base qu'il faut mettre devant, genre App.Path & "" & nom-du_fichier
Commenter la réponse de jmfmarques
Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 12:03
0
Merci
Voilà où j'en suis actuellement, je suis en train d'écrire un petit module pour aller contrôler la liaison au lancement de mon appli :

Private Sub Test()

    Dim CheminLiaison As String
   
    'Ouverture de la base de données
    Set Base = DBEngine.Workspaces(0).OpenDatabase(App.Path & "" & NomBase & ".mdb")
    MsgBox Base .TableDefs("MaTable").Connect
   
    'Contrôle des liaisons
    CheminLiaison = Base .TableDefs("MaTable").Connect
    'Enlever les 10 premiers caractères du chemin (correspondant au début de la connection : ";DATABASE=")
    CheminLiaison = Right(CheminLiaison, (Len(CheminLiaison) - 10))
    'Enlever les 23 derniers caractères (correspondant au nom de la base.mdb dans mon appli plus l'antislash)
    CheminLiaison = Left(CheminLiaison, (Len(CheminLiaison) - 23))
   
    'Mise à jour de la liaison si le chemin est déffiérent du chemin de l'appli
    If CheminLiaison <> App.Path Then
        Base .TableDefs("MaTable").Connect = ";DATABASE=" & App.Path & "" & NomBase & ".mdb"
    End If
   
    MsgBox Base .TableDefs("MaTable").Connect
   
    'Fermeture de la base de données
    Base .Close
    Set Base = Nothing

End sub

Ca a l'air de fonctionner, quand j'utilise des messages box, la correction semble être prise.
Mais en fait, il n'y a pas de mise à jour de faite.
Je suppose qu'il manque un UpDate quelque part.
Je ne sais pas le faire directement dans la base. Je suis alors parti sur un Recordset : je suis tombé sur un lien de MicroSoft qui semblait me donner la réponse http://support.microsoft.com/kb/464174/fr ..., quelque chose comme Set Matable = Db.Tabledefs(Nomtable) . Je n'aurai plus eu qu'à faire un Matable.Edit et un Matable.Update mais impossible de définir le Recordset.

Mais j'y arriverai !

Molenn
Commenter la réponse de Molenn
jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Dernière intervention
22 août 2014
- 22 déc. 2006 à 13:43
0
Merci
Voilà qui me parait  être autre chose et mériterait donc l'ouverture d'un sujet différent (car il ne s'agit plus là de l'établissement du chemin relatif, non ?)...
Enfin... C'est ce que j'en dis, ne travaillant pas moi-même avec VBA ...
Commenter la réponse de jmfmarques
Molenn
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Dernière intervention
23 février 2011
- 22 déc. 2006 à 15:55
0
Merci
Voilà qui me parait  être autre chose et mériterait donc l'ouverture d'un sujet différent (car il ne s'agit plus là de l'établissement du chemin relatif, non ?)...
Enfin... C'est ce que j'en dis, ne travaillant pas moi-même avec VBA ...


Je ne crois pas 615490 jmfmarques : Je me suis sans doute mal exprimé. Mon problème n'a jamais été l'établissement du chemin relatif. Mon problème est depuis le début : Comment puis-je donc le rentrer dans ma foutue base ACCESS.
Si j'ai parlé du VBA, c'est parce que, si le code existait dans ce langage, j'étais certain de pouvoir le reporter ensuite dans VB6. Ce qui est presque le cas ^^

Je re-précise vite fait ce que j'ai fait :
J'ai ouvert une base de données, et fait Menu Fichier\Données Externes\Lier une table... J'ai sélectionné une autre base, une table et hop, ça fonctionne.
Et il est là mon problème, la liaison effectuée par ce biais est enregistrée en dure dans la base. Quand j'affiche le chemin de la liaison avec MaBase.TableDefs("MaTable").Connect, j'en ai la preuve (";DATABASE =J:\Blablabla ...)

J'aurai voulu mettre ce chemin en relatif, ce qui à priori est impossible.

Le bout de code indiqué après, est la solution que j'essaye d'appliquer :
Puisque je peux afficher le chemin, à l'ouverture de l'appli, je vais consulter le chemin de la liaison et je le compare au chemin relatif de mon appli afin de le mettre à jour s'il y a une différence.
Et mon problème est là à présent : A priori, le chemin est bien modifié, mais n'est pas enregistré dans la base de données (j'ai essayé avec Base.TableDefs.Refresh mais ça ne fonctionne pas).

Tout ce que je code est bien en VB6 (ça repose sur des bases ACCESS parce que c'était plus facile pour moi de développer comme ça, mais il n'y a pas une seule ligne de code dans ces bases).
J'espère avoir réussi à éclaircir ma pensée

Molenn
Commenter la réponse de Molenn

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.