HELP !chemin de ma BDD access amené à changer

HELP !chemin de ma BDD access amené à changer - VB/VBA/VBS - Programmation

Marsh Posté le 20-04-2005 à 22:09:53    

bjr,  
 
g un programme sous VB6 dans lequel des personnes répondent à 1 questionnaire, les réponses sont envoyées et stockées dans Access.  
 
Jusqu'a present mon fichier .mdb était sur le disque c:\ d'un ordi, mais aujourd'hui, je dois installer mon soft sur 4 machines qui doivent envoyer à la fin du test, les données saisies, sur un serveur réseau(de plus ce serveur est amené à changer parfois).  
 
Le chemin actuel pour acceder a la BDD est (dans un module) --->  
 
Set dbABC = Workspaces(0).OpenDatabase("c:\ABC.MDB" ), il me suffisait de compiler et de placer ABC.Mdb sur le C:\  
 
Mais là, si le chemin d'accès doit changer, comment faire? car en plus, je ne peux plus faure d'exe ???  
 
merci a bientot
 

Reply

Marsh Posté le 20-04-2005 à 22:09:53   

Reply

Marsh Posté le 21-04-2005 à 08:37:59    

Salut,
 
Et voilà le retour de l'éternel problème des BDs Access :)
En fait tu n'as pas beaucoup de choix:
1/ Tu écris dans un ini ou dans la base de registre le chemin de la DB
2/ Dans ton programme tu obliges à chaque fois l'utilisateur à aller choisir sa base de données.
 
Dans les deux cas, tu récupères un string qui est le chemin complet de la DB. Et tu peux aussi faire les deux :)
 
Comme ça ton utilisateur peut choisir où il met sa DB et il n'a pas besoin de la rouvrir à chaque fois!
 
J'espère que ça t'a aidé

Reply

Marsh Posté le 28-08-2010 à 22:13:24    

Bonjour,
je déterre ce topic car j'ai sensiblement le même problème.
 
j'ai un fichier serveur.mbd (contenant les tables) qui est dans le répertoire C:\Program Files
un fichier client contenant les requetes et formulaire que je peux copier où je veux.
 
depuis le fichier client, j'ai lié les tables au fichiers serveur puis ai enregistré le fichier client en mde pour le proteger.
 
j'aimerais avoir la possibilité de déplacer le fichier serveur et de modifier le chemin via un formulaire accessible depuis le fichier client. le problème est que je n'ai aucune idée du code à mettre dans ce formulaire
 
pouvez vous m'expliquer comment faire ?
 
merci


Message édité par willou-78 le 28-08-2010 à 22:13:44
Reply

Marsh Posté le 06-09-2010 à 14:45:37    

Hello
 
Regarde un truc comme ceci :

Code :
  1. Set bds = CurrentDb
  2. With bds
  3.     For Each tdf In .TableDefs
  4.         If tdf.SourceTableName <> "" Then
  5.             tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  6.             tdf.RefreshLink
  7.         End If
  8.     Next tdf
  9. End With


Message édité par SuppotDeSaTante le 06-09-2010 à 14:46:07

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-09-2010 à 13:12:18    

Bonjour,
Merci pour l'aide mais où dois-je mettre ce code ?  
 
Merci

Reply

Marsh Posté le 23-09-2010 à 13:14:37    

Bah derriere le bouton de ton formulaire...


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-09-2010 à 13:22:03    

rapide  :)  
 
c'est bien ce que j'ai fais mais j'ai une  
 
"erreur d'execution '3219' :
Opération non valide
 
l'erreur est sur la ligne en rouge, je ne sais pas comment inscrire Nom et Chemin de la base
 
With bds
    For Each tdf In .TableDefs
        If tdf.SourceTableName <> "D:\InfoCenterServeur" Then
            tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
            tdf.RefreshLink
        End If
    Next tdf
End With
 

Reply

Marsh Posté le 23-09-2010 à 13:34:06    

re
 
erreur 3024 :
fichier "D:\InfoCenterServeur" introuvable
 
la ligne en rouge est surmligné en jaune
 
 
 
 
Set bds = CurrentDb
 
With bds
    For Each tdf In .TableDefs
        If tdf.SourceTableName <> "" Then
            tdf.Connect = ";DATABASE=" & "D:\InfoCenterServeur"
            tdf.RefreshLink
        End If
    Next tdf
End With


Message édité par willou-78 le 23-09-2010 à 13:34:23
Reply

Marsh Posté le 23-09-2010 à 13:35:32    

Bah NomEtCheminDeTaBase ce n'est qu'une variable pour te montrer comment la definir...
 
Imaginons que tu veuilles te lier a ta base se trouvant sur \\Serveur\D$\serveur.mdb
 
Tu as donc deux possibilités :
 
1/ La passer en dur :

Code :
  1. Set bds = CurrentDb
  2. With bds
  3.     For Each tdf In .TableDefs
  4.         If tdf.SourceTableName <> "" Then
  5.             tdf.Connect = ";DATABASE=\\Serveur\D$\serveur.mdb"
  6.             tdf.RefreshLink
  7.         End If
  8.     Next tdf
  9. End With


 
2/ utiliser une variable en début de code, ou pour affecter par exemple un champ de ton formulaire a cette variable etc.

Code :
  1. NomEtCheminDeTaBase = "\\Serveur\D$\serveur.mdb"
  2. Set bds = CurrentDb
  3. With bds
  4.     For Each tdf In .TableDefs
  5.         If tdf.SourceTableName <> "" Then
  6.             tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  7.             tdf.RefreshLink
  8.         End If
  9.     Next tdf
  10. End With


 
 
Ou avec un chemin plus "simple", si ta base est sur C:\serveur.mdb :

Code :
  1. Set bds = CurrentDb
  2. With bds
  3.     For Each tdf In .TableDefs
  4.         If tdf.SourceTableName <> "" Then
  5.             tdf.Connect = ";DATABASE=C:\serveur.mdb"
  6.             tdf.RefreshLink
  7.         End If
  8.     Next tdf
  9. End With


 
ou avec la variable :

Code :
  1. NomEtCheminDeTaBase = "C:\serveur.mdb"
  2. Set bds = CurrentDb
  3. With bds
  4.     For Each tdf In .TableDefs
  5.         If tdf.SourceTableName <> "" Then
  6.             tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  7.             tdf.RefreshLink
  8.         End If
  9.     Next tdf
  10. End With


 
:jap:


Message édité par SuppotDeSaTante le 23-09-2010 à 13:39:23

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-09-2010 à 14:10:20    

Merci. C'est beaucoup mieux comme ça  :)  
 
je n'ai pas compris quelle était la différence entre (1 et 3) et (2 et 4) ?
 
j'ai donc crée une table contenant un champ "chemin", et l'ai associé avec le formulaire de démarrage et en refusant l'ajout d'enregistrement. J'y ai mis un champ "Chemin" avec comme source, le champ "chemin"
 
 
 
NomEtCheminDeTaBase = Chemin.Value
 
Set bds = CurrentDb
 
With bds
    For Each tdf In .TableDefs
        If tdf.SourceTableName <> "" Then
            tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
            tdf.RefreshLink
        End If
    Next tdf
End With

Reply

Marsh Posté le 23-09-2010 à 14:10:20   

Reply

Marsh Posté le 23-09-2010 à 14:23:50    

Bah ne connaissant pas tes connaissances en informatique, j'ai realisé apres qu'un chemin UNC ne parlait pas a tout le monde...
Et que le \\Serveur\etc pourrait poser souci.
J'ai donc refait un exemple avec un chemin en specifiant une lettre de lecteur
 
:jap:
 
Edit : tu aurais pu te passer de variable :p
tdf.Connect = ";DATABASE=" & Chemin.Value


Message édité par SuppotDeSaTante le 23-09-2010 à 14:24:26

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 23-09-2010 à 15:26:09    

ah oui, tu as raison, elle ne sert à rien
 
Merci de ton aide

Reply

Marsh Posté le 24-09-2010 à 20:12:02    

Re Bonjour,
Je rencontre un problème avec une base contenant plusieurs fichiers serveurs.
 
je m'explique :
 
j'ai un fichier serveur.mde et un client.mde
le serveur.mde contient les table
le fichier client.mde contient formulaires, requetes.....
 
je lie ensuite les tables du fichiers serveur.mde à mon client.mde
 
pour éviter de casser le fichier serveur.mde lorsque je fais évoluer ma base, je créais des module_xx.mde s'ajoutant au serveur.mde
 
je lie de la même manière les tables des module_xx.mde au fichier client.mde
 
comment adapter le code si dessus à plusieurs fichier serveur ?
 
merci

Reply

Marsh Posté le 24-09-2010 à 21:43:16    

Bah tu testes en fonction du nom de la table, ou en fonction de la liaison existante.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 25-09-2010 à 22:46:17    

hello,
j'ai beau chercher, je ne trouve pas :(


Message édité par willou-78 le 25-09-2010 à 22:46:35
Reply

Marsh Posté le 27-09-2010 à 13:35:55    

N'arrivant pas à comprendre ce qu'il se passe j'ai recrée un fichier client et 2 fichiers serveur. L'erreur est la même....
 
avez-vous une idées svp ?

Reply

Marsh Posté le 27-09-2010 à 15:07:02    

Quelle erreur ? Ou ca ? A quel moment dans le code ?
Faut expliquer hein, moi j'ai pas ta base sous les yeux...
 
De plus tu as toutes les infos... Faut tester pour voir ce que renvoient certaines propriétés ou variable.
Par exemple si tu avais placé un "MsgBox tdf.Connect" tu te serais rendu compte que le prog te renvoyais a quelle base est attachée la table. Donc tu peux tester des choses sur tdf.Connect

Code :
  1. If tdf.connect = ";DATABASE=C:\base1.mdb then


 
Ou si tu avais placé un "Msgbox tdf.Name" tu te serais rendu compte que le prog te renvoyais le nom de la table qu'il traite. Tu aurais pu tester des choses sur le nom de la table avec tdf.name

Code :
  1. If tdf.name= "Table1" then


 
C'est quand meme pas bien dur a tester :

Code :
  1. NomEtCheminDeTaBase = Chemin.Value
  2. Set bds = CurrentDb
  3. With bds
  4.     For Each tdf In .TableDefs
  5.         msgbox tdf.name
  6.         msgbox tdf.connect
  7.     Next tdf
  8. End With


 
 
 
 
Il y un paquet de solutions pourtant.
deux idées et un exemple comme ca :
 

  • Soit tu listes toutes tes tables et en fonction tu lies a telle source.

Imaginons que tu ai 4 tables, Table1, Table2, Table3 et Table4. Table1 et Table2 sont liées a la base1, Table3 et Table4 sont liées a la base2

Code :
  1. NomEtCheminDeTaBase = Chemin.Value
  2. NomEtCheminDeTaBase2 = Chemin2.Value
  3. Set bds = CurrentDb
  4. With bds
  5. For each tdf In .TableDefs
  6.         select case tdf.Name
  7.             Case "Table1"
  8.                 tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  9.                 tdf.RefreshLink
  10.              case "Table2"
  11.                 tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  12.                 tdf.RefreshLink
  13.              case "Table3"
  14.                 tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase2
  15.                 tdf.RefreshLink
  16.              case "Table4"
  17.                 tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase2
  18.                 tdf.RefreshLink
  19.         End select
  20.     Next tdf
  21. End With


 
 

  • Soit les tables sont deja liées a deux sources differentes et tu testes en fonction du lien existant (avec tdf.connect)
Code :
  1. NomEtCheminDeTaBase = Chemin.Value
  2. NomEtCheminDeTaBase2 = Chemin2.Value
  3. Set bds = CurrentDb
  4. With bds
  5.     For Each tdf In .TableDefs
  6.         if tdf.connect = ";DATABASE=C:\Toto\base1.mdb" then
  7.             tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase
  8.             tdf.RefreshLink
  9.         elseif tdf.connect = ";DATABASE=C:\Tata\base2.mdb" then
  10.             tdf.Connect = ";DATABASE=" & NomEtCheminDeTaBase2
  11.             tdf.RefreshLink
  12.         end if
  13.     Next tdf
  14. End With


 
Petit NB : Une base de programme lié a 2 bases de données access, ca ralenti enormement les process


Message édité par SuppotDeSaTante le 27-09-2010 à 15:29:36

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 27-09-2010 à 15:43:07    

je suis une brelle en programmation, je suis moins pire en réseau....
 
je viens de me rendre compte qu'il me manquait "elseif" dans mon code, car j'ai bien essayé les codes que tu m'annonces mais sans cette "condition", ça ne pouvait pas fonctionner.
 
Quand à la "case", je ne sais pas m'en servir
 
Je regarde ça ce soir, en rentrant chez moi, je suis certain que ça va mieux fonctionner ;)
 
@+

Reply

Marsh Posté le 29-09-2010 à 11:42:34    

hello,
bon finallement, j'ai voulu tester la fonction "Case" : ça marche super.
 
concernant le ralentissement, ça ne devrait pas être trop un souci car la casi totalité des utilisateurs de mes bases, les installent en local, sur leur machine perso, à titre perso et non pro, je me fais pas trop de souci.
 
Merci pour tes explications ;)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed