Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 2011
-
22 déc. 2006 à 02:42
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 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.
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 22 déc. 2006 à 16:12
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é
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 22 déc. 2006 à 07:19
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 22 déc. 2006 à 11:04
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 ^^)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 22 déc. 2006 à 11:29
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
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 22 déc. 2006 à 12:03
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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 22 déc. 2006 à 13:43
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 ...
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 22 déc. 2006 à 15:55
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