[Access] Tables liées

Tables liées [Access] - VB/VBA/VBS - Programmation

Marsh Posté le 26-05-2005 à 15:25:14    

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!

Reply

Marsh Posté le 26-05-2005 à 15:25:14   

Reply

Marsh Posté le 26-05-2005 à 16:15:07    

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!
Reply

Marsh Posté le 26-05-2005 à 16:33:00    

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!

Reply

Marsh Posté le 26-05-2005 à 16:55:22    

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!
Reply

Marsh Posté le 26-05-2005 à 17:05:42    

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:

Reply

Marsh Posté le 31-05-2005 à 09:41:04    

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 +

Reply

Marsh Posté le 31-05-2005 à 20:59:24    

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!
Reply

Marsh Posté le 17-08-2006 à 15:45:41    

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)

Reply

Marsh Posté le 21-12-2006 à 15:21:08    

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.

Reply

Marsh Posté le 21-12-2006 à 16:19:28    

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...)

Reply

Sujets relatifs:

Leave a Replay

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