Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1315 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Access] Tables liées

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Access] Tables liées

n°1098231
gfa
Posté le 26-05-2005 à 15:25:14  profilanswer
 

Salut tout le monde,
 
J'essaie de mettre à jour, via du code VBA, une table liées qui se trouve dans mon application.
 
Pour ça j'utilise le code suivant :

Code :
  1. Application.CurrentDb.TableDefs("NomTable" ).Connect = ";DATABASE=" & strDBPath & "\MaBase.mdb"
  2.   Application.CurrentDb.TableDefs("NomTable" ).RefreshLink


 
Dans ce code, strDBPath contient le chemin complet vers la DB. Le problème ne vient pas de là et mon chemin est correct... J'ai testé.
 
Malheureusement pour moi, au moment où je fais le .RefreshLink, il me sort l'erreur comme quoi le chemin à la DB n'est pas valide. Forcément puisqu'il a gardé l'ancien chemin plutôt que de le remplacer par celui que je lui donne à la ligne d'en-dessus.
 
Est-ce que qqn a une idée?
 
Merci d'avance!

mood
Publicité
Posté le 26-05-2005 à 15:25:14  profilanswer
 

n°1098301
AlainTech
Pas trouvé? Cherche encore!
Posté le 26-05-2005 à 16:15:07  profilanswer
 

Je t'envoie le code que j'ai pondu il y a quelques années.
Je n'ai rien vérifié et il a été écrit pour Access 97.

  Dim sCurPath As String, IsaPath As String, HeadPath As String
  Dim Response As Integer, I As Integer
  Dim Msg As String
   
  CR$ = Chr$(13)
  sCurPath = Left$(CurrentDb.Name, InStr(1, CurrentDb.Name, _
                   Dir$(CurrentDb.Name), 1) - 1)
  If (Dir$(sCurPath & "Tabisa.mdb" ) = "" ) Then
    Msg = "Le fichier TABISA.MDB doit se trouver" & CR$
    Msg = Msg & "dans le même répertoire que ISABEL.MDB"
    Response = MsgBox(Msg, 48)
    DoCmd.Close
  ElseIf (Dir$(sCurPath & "Tabhead.mdb" ) = "" ) Then
    Msg = "Le fichier TABHEAD.MDB doit se trouver" & CR$
    Msg = Msg & "dans le même répertoire que ISABEL.MDB"
    Response = MsgBox(Msg, 48)
    DoCmd.Close
  Else
    IsaPath = sCurPath & "Tabisa.mdb"
    HeadPath = sCurPath & "Tabhead.mdb"
  End If
  ' Set WS = DBEngine(0)
  ' Set DB = WS.Databases(0)
  Set DB = CurrentDb
  For I = 0 To DB.TableDefs.Count - 1
    Set Defs = DB.TableDefs(I)
    If Defs.Connect Like "*TABHEAD.MDB*" Then
      Defs.Connect = ";DATABASE=" & HeadPath
      Defs.RefreshLink
    ElseIf Defs.Connect Like "*TABISA.MDB*" Then
      Defs.Connect = ";DATABASE=" & IsaPath
      Defs.RefreshLink
    End If
  Next I


Essaye de voir si tu peux en tirer quelque chose.
 
Edit --> En relisant, je me rends compte que j'ai appris à travailler plus efficacement aujourd'hui... Mais je ne développe plus sur Access.


Message édité par AlainTech le 26-05-2005 à 16:19:42

---------------
Si on vous donne une info qui marche, DITES-LE!!!! ------ Si vous trouvez seul, AUSSI, votre solution peut servir à d'autres! ------ Je dois la majorité de mes connaissances à mes erreurs!
n°1098324
gfa
Posté le 26-05-2005 à 16:33:00  profilanswer
 

AlainTech a écrit :

Je t'envoie le code que j'ai pondu il y a quelques années.
Je n'ai rien vérifié et il a été écrit pour Access 97.

  Dim sCurPath As String, IsaPath As String, HeadPath As String
  Dim Response As Integer, I As Integer
  Dim Msg As String
   
  CR$ = Chr$(13)
  sCurPath = Left$(CurrentDb.Name, InStr(1, CurrentDb.Name, _
                   Dir$(CurrentDb.Name), 1) - 1)
  If (Dir$(sCurPath & "Tabisa.mdb" ) = "" ) Then
    Msg = "Le fichier TABISA.MDB doit se trouver" & CR$
    Msg = Msg & "dans le même répertoire que ISABEL.MDB"
    Response = MsgBox(Msg, 48)
    DoCmd.Close
  ElseIf (Dir$(sCurPath & "Tabhead.mdb" ) = "" ) Then
    Msg = "Le fichier TABHEAD.MDB doit se trouver" & CR$
    Msg = Msg & "dans le même répertoire que ISABEL.MDB"
    Response = MsgBox(Msg, 48)
    DoCmd.Close
  Else
    IsaPath = sCurPath & "Tabisa.mdb"
    HeadPath = sCurPath & "Tabhead.mdb"
  End If
  ' Set WS = DBEngine(0)
  ' Set DB = WS.Databases(0)
  Set DB = CurrentDb
  For I = 0 To DB.TableDefs.Count - 1
    Set Defs = DB.TableDefs(I)
    If Defs.Connect Like "*TABHEAD.MDB*" Then
      Defs.Connect = ";DATABASE=" & HeadPath
      Defs.RefreshLink
    ElseIf Defs.Connect Like "*TABISA.MDB*" Then
      Defs.Connect = ";DATABASE=" & IsaPath
      Defs.RefreshLink
    End If
  Next I


Essaye de voir si tu peux en tirer quelque chose.
 
Edit --> En relisant, je me rends compte que j'ai appris à travailler plus efficacement aujourd'hui... Mais je ne développe plus sur Access.


Salut,
 
Merci pour l'aide mais ça ne change strictement rien... Ton code est exactement le même que le mien, mise à part les attributions de variables...
 
Si jamais je suis en Access 2002... Et si qqn a une autre idée, je prends volontiers!

n°1098358
AlainTech
Pas trouvé? Cherche encore!
Posté le 26-05-2005 à 16:55:22  profilanswer
 

La seule idée qui me vient c'est de mettre:

Msgbox(strDBPath & "\MaBase.mdb" )


Juste avant ton Connect.
 
Pour tout dire, je me demande s'il n'y aurait pas un \ de trop à la fin de strDBPath.
Non pas que je mette en doute tes vérifications mais, parfois, avec la fatigue, les choses les plus évidentes ne nous sautent pas aux yeux.
 
En fait, il est logique qu'il ait toujours l'ancien chemin tant que tu n'as pas fait le RefreshLink


---------------
Si on vous donne une info qui marche, DITES-LE!!!! ------ Si vous trouvez seul, AUSSI, votre solution peut servir à d'autres! ------ Je dois la majorité de mes connaissances à mes erreurs!
n°1098381
gfa
Posté le 26-05-2005 à 17:05:42  profilanswer
 

AlainTech a écrit :

La seule idée qui me vient c'est de mettre:

Msgbox(strDBPath & "\MaBase.mdb" )


Juste avant ton Connect.
 
Pour tout dire, je me demande s'il n'y aurait pas un \ de trop à la fin de strDBPath.
Non pas que je mette en doute tes vérifications mais, parfois, avec la fatigue, les choses les plus évidentes ne nous sautent pas aux yeux.
 
En fait, il est logique qu'il ait toujours l'ancien chemin tant que tu n'as pas fait le RefreshLink


Merci du conseil...
 
J'ai quand même vérifié dans le doute... Et mon chemin vers la base est bien correct. Je n'ai pas de \ de trop et la base existe bien (j'ai vérifié 10x je pense) :)
En fait, c'est au moment où je fais le .RefreshLink que j'ai droit à la belle erreur no 3024 (fichier introuvable). Le problème étant que la propriété .connect de ma tabledefs reste à l'ancienne valeur :(
 
Ca commence à me taper sur le système cette histoire  :pt1cable:

n°1102479
gfa
Posté le 31-05-2005 à 09:41:04  profilanswer
 

gfa a écrit :

Merci du conseil...
 
J'ai quand même vérifié dans le doute... Et mon chemin vers la base est bien correct. Je n'ai pas de \ de trop et la base existe bien (j'ai vérifié 10x je pense) :)
En fait, c'est au moment où je fais le .RefreshLink que j'ai droit à la belle erreur no 3024 (fichier introuvable). Le problème étant que la propriété .connect de ma tabledefs reste à l'ancienne valeur :(
 
Ca commence à me taper sur le système cette histoire  :pt1cable:


Ouf,
 
Finalement j'ai trouvé la solution !!! En fait, la propriété .Connect est en read-only dans Acces... Donc aucune chance que cela fonctionne!
 
Du coup, ce que j'ai fait, c'est détruire ma table liée (si sa liaison n'est pas correcte) et refaire la liaison.
 
Au cas où cela arriverait à quelqu'un d'autre, je vous publie mon code ci-dessous:

Code :
  1. If CurrentDb.TableDefs("Table" ).Connect <> ";DATABASE=" & strDBPath Then
  2.     DoCmd.DeleteObject acTable, "Table"
  3.     DoCmd.TransferDatabase acLink, "Microsoft Access", strDBPath, acTable, "Table", "Table"
  4.   End If


 
Voilà... A +

n°1103416
AlainTech
Pas trouvé? Cherche encore!
Posté le 31-05-2005 à 20:59:24  profilanswer
 

C'est curieux, mon code fonctionnait sous Access 97.
Peut-être que ça a changé dans les versions suivantes.


---------------
Si on vous donne une info qui marche, DITES-LE!!!! ------ Si vous trouvez seul, AUSSI, votre solution peut servir à d'autres! ------ Je dois la majorité de mes connaissances à mes erreurs!
n°1426724
4get9
C'est clair !
Posté le 17-08-2006 à 15:45:41  profilanswer
 

ton code marche très bien sous Access 2002 chez moi (j'utilisais le même code sous 97 également)
 
j'ai eu des soucis avec DAO Jet au début (j'ai du simplement le cocher dans Outils/Référence car il n'était pas coché, je n'arrivais pas à faire d'OpenRecordset non plus)

n°1494846
4get9
C'est clair !
Posté le 21-12-2006 à 15:21:08  profilanswer
 

Trop fort je me retrouve avec le même souci et faisant un recherche sur Google je retombe sur la solution que j'avais moi même posté !!!
Alzeimer me guète !!! :/
Par contre ça fonctionne pas, je vais sûrement passer également par une suppression de la table attachée.

n°1494897
4get9
C'est clair !
Posté le 21-12-2006 à 16:19:28  profilanswer
 

solution  :

Code :
  1. Public Sub Lier_Table(NomDeLaTable, CheminBase)
  2. Dim TblDef As DAO.TableDef
  3. Dim myDB As DAO.Database
  4. Set myDB = CurrentDb
  5. Set TblDef = myDB.TableDefs(NomDeLaTable)
  6. TblDef.Connect = ";DATABASE=" & CheminBase
  7. TblDef.RefreshLink
  8. myDB.TableDefs.Refresh
  9. End Sub


 
ça fonctionne pour moi, par contre la table doit porter le même nom dans la base source  
il me refuse le SourceTableName (sinon il me semble qu'on peux l'indiquer dans le .Connect)  
Pareil il me refuse le Append, mais cela fonctionne sans  :pt1cable:  (j'ai utilisé le code du site de Microsoft pourtant...)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Access] Tables liées

 

Sujets relatifs
problème VBA Access : "Procédure trop grande"[Access] sur reseau= tres lent
Fusionner trois tables (résolu)[Vb/Access]Suppression par des critères
Exportation / Tables temporaires dans Sql Server 2000Problème connexion Access->MySQL
script php de recherche (multicriteres) , et d'update de tables mysql[Access] vider liste deroulante
[Access] Partage d'une base sur reseau avec tables liéesTables liées sous access
Plus de sujets relatifs à : [Access] Tables liées


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR