IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

FAQ Rétablir les liaisons des tables liées après déplacement d'une base fractionnée


Sujet :

VBA Access

  1. #1
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut FAQ Rétablir les liaisons des tables liées après déplacement d'une base fractionnée
    Bonjour à tous,
    En mettant en oeuvre la FAQ Rétablir les liaisons des tables liées après déplacement d'une base fractionnée (http://access.developpez.com/faq/?pa...#RetablLienTbl), j'ai un petit soucis.

    Avec le code suivant, je défini le chemin de ma base (relatif à la base "exploitante"), défini la connexion sans mot de passe, connecte la base puis lance la mise à jour des liens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    strCheminBd = CurrentProject.Path & "\Ressources\base_gningnin.mdb"
    'Définit la chaine de connexion permettant la liaison des tables
    strConnect = "MS Access;;DATABASE=" & strCheminBd
    'Instancie l'objet Database de la base courante
    Set oDb = CurrentDb
    'Instancie l'objet Database de la base protégée
    Set oDbSource = DBEngine.OpenDatabase(strCheminBd, True, False, strConnect)For Each oTblSource In oDbSource.TableDefs
        'ignore les tables system
        If (oTblSource.Attributes And dbSystemObject) = 0 Then
            strTemp = strTemp & oTblSource.Name & "|"
        End If
    Next
    'Ferme la base de données sources (impératif pour la liaison)
    oDbSource.Close: Set oDbSource = Nothing
    'parcours le tableau de noms de tables
    strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|")
    For i = 0 To UBound(strNomsTables)
      'Crée une nouvelle table dans la base de données courante
      Set oTbl = oDb.CreateTableDef(strNomsTables(i))
      'Lie les deux tables
      oTbl.Connect = strConnect
      oTbl.SourceTableName = strNomsTables(i)
      'Ajoute la table à la base de données
      oDb.TableDefs.Append oTbl
    Next i
    A l'exécution de la ligne oDb.TableDefs.Append oTbl, ça bloque dès la liaison de la 1e table avec le message suivant:
    Erreur d'exécution '3012': L'objet 'D_ACT_HUM' existe déjà
    Ce code écrase-t-il les table ou met-il à jour les liens?

    Bon sang, c'est pas possible: je suis tellement blonde que je suis pas fichue d'appliquer une FAQ...

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Non tu n'es pas blonde.
    Il y a une distorsion entre le titre de la faq et ce que fait le code.
    Le code crée les liens vers les tables de la base dorsale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      'Crée une nouvelle table dans la base de données courante
      Set oTbl = oDb.CreateTableDef(strNomsTables(i))
      ...
      'Ajoute la table à la base de données
      oDb.TableDefs.Append oTbl
    A titre d'exemple je te donne le code que j'utilise pour actualiser les tables liées d'une frontale.
    Ce code suppose que toutes les tables liées sont dans une seule et même base dorsale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub RfshLinkedTables(FullDBpathName As String)
    Dim db As DAO.Database, tdef As DAO.TableDef
    Dim strSceDB As String, strConn As String
    Dim ConnParams() As String, varParam As Variant
     
    strSceDB = FullDBpathName
     
    Set db = CurrentDb
    For Each tdef In db.TableDefs
       If (tdef.Attributes And dbAttachedTable) = dbAttachedTable Then
          ' Nouvelle chaîne de connexion
          strConn = ";"
          ' Récuperer mot de passe si existe
          ConnParams() = Split(tdef.Connect, ";")
          For Each varParam In ConnParams
             If varParam Like "PWD=*" Then
                strConn = strConn & varParam & ";"
             End If
          Next
          ' Ajout chemin vers la base dorsale
          strConn = strConn & "DATABASE=" & strSceDB
          ' rafraichir lien
          tdef.Connect = strConn
          tdef.RefreshLink
       End If
    Next
    End Sub
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strCheminBd = CurrentProject.Path & "\Ressources\base_gningnin.mdb"
    RfshLinkedTables strCheminBd
    A+

  3. #3
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 222
    Points
    222
    Par défaut
    Bonjour,
    Dans ton cas si tu veux recréer un lien vers une base externe qui ne pointe plus vers une base valide, il faut penser à retirer la table attachée précédentes dans l'objet tabledefs ==> même si le liens est cassé avec la base origine la table attachée, elle est toujours présentes dans la collection tabledefs de le base ou tu te situes.

    Quand un lien d'une table est perdu, il beaucoup plus facile de corriger la propriétés connect avec un chemin valide, puis d''utiliser la commande refreshlink qui réaccroche correctement la table de la base externe. Cette commande est valide à partir de Access 2000.

    J'espère avoir bien analysé ton problème.

  4. #4
    Membre régulier

    Inscrit en
    Juin 2006
    Messages
    320
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 320
    Points : 97
    Points
    97
    Par défaut
    Jack78960, c'est ça.

    LedZeppII, trop facile. Finghers in ze noze: ça fonctionne au poil.

    Si je peux me permettre: peut-être faudrait-il modifier l'intitulé de la FAQ que j'avait consultée.
    Autre suggestion: mettre le bout de code que tu viens de me proposer, et qui marche du tonnerre, dans la FAQ...

    En tous cas, c'est résolu...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Quand vérifier les liens des tables liées ?
    Par Frantisch dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/04/2014, 11h26
  2. [AC-2007] Rétablir les Liaisons de tablées liées
    Par marycaLou dans le forum VBA Access
    Réponses: 3
    Dernier message: 17/08/2011, 01h40
  3. [AC-2007] Rafraichir les liens des tables liées
    Par zoom61 dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/02/2010, 09h21
  4. Réponses: 8
    Dernier message: 03/02/2009, 09h07
  5. Réponses: 8
    Dernier message: 30/08/2006, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo