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 :

Mise à jour de tables liées - Problème avec RefreshLink [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre régulier Avatar de zoopsys
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 68
    Points : 80
    Points
    80
    Par défaut Mise à jour de tables liées - Problème avec RefreshLink
    Bonjour,

    Je met à jour la liaison de mes tables liées de la façon suivante :

    Function Fct_ModifyLink(strDb As string) As Boolean

    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim strDbFileName As String

    Set oDb = CurrentDb

    strDbFileName = Fct_FileName(strDb)


    'Boucle sur les tables

    For Each oTbl In oDb.TableDefs

    'Détermine toutes les tables qui sont attachées en excluant les tables systèmes
    If oTbl.Attributes = dbAttachedTable And Not oTbl.Attributes = dbSystemObject Then
    If oTbl.Connect Like "*" & strDbFilename Then
    oTbl.Connect = "MS Access";pwd="";DATABASE=" & strDb
    oTbl.RefreshLink
    End if
    End If

    Next

    End Function
    Le problème est que mes tables sont dans des groupes personnalisés et le RefreshLink me supprime mes tables de mes groupes personnalisés.
    En fait, j'ai l'impression que le RefreshLink supprime les tables et les recrée.

    Or, si je passe par l'assistant du gestionnaire des tables liées, mes tables restent bien dans mes groupes personnalisés.

    Y aurait-il une autre méthode VB pour mettre à jour les liaisons des tables ?

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 108
    Points : 5 231
    Points
    5 231
    Par défaut
    Bonjour,

    Avant de rafraichir le lien, il serait intéressant de regarder ce qu'il contient avec une instruction Avec un peu de chance (!) il y aura une indication de groupe

    Sinon il doit être possible d'afficher toutes les propriétés de l'objet otbl pour trouver laquelle contient le groupe avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each prp In otbl.Properties
    msgbox prp.Name & " : " & prp.Value
    Next prp

  3. #3
    Membre régulier Avatar de zoopsys
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Bonjour Nico et merci de t'intéresser à mon problème

    Citation Envoyé par nico84 Voir le message
    Bonjour,

    Avant de rafraichir le lien, il serait intéressant de regarder ce qu'il contient avec une instruction Avec un peu de chance (!) il y aura une indication de groupe
    msgbox otbl.connect m'affiche bien le nouveau chemin (donc celui de la variable strDb).
    mais aucune indication de groupe.

    Sinon il doit être possible d'afficher toutes les propriétés de l'objet otbl pour trouver laquelle contient le groupe avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each prp In otbl.Properties
    msgbox prp.Name & " : " & prp.Value
    Next prp
    Ceci ne permet pas d'afficher le groupe.
    La seule solution que j'ai trouvé pour récupérer le groupe est via la requête suivante :
    SELECT MSysObjects.Name
    FROM MSysObjects INNER JOIN (MSysNavPaneGroups INNER JOIN MSysNavPaneGroupToObjects ON MSysNavPaneGroups.Id = MSysNavPaneGroupToObjects.GroupID) ON MSysObjects.Id = MSysNavPaneGroupToObjects.ObjectID
    WHERE (((MSysNavPaneGroups.Name)="MonGroupe"));
    La solution que tu me proposes c'est en fait de récupérer le groupe avant le refreshlink puis faire mon refreshlink et enfin de réattribuer le groupe à ma table ?

    j'ai trouvé quelqu'un qui a la même problématique que moi :
    http://www.vbaexpress.com/forum/arch...p/t-35842.html

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 108
    Points : 5 231
    Points
    5 231
    Par défaut
    Je n'utilise pas les groupes et je ne sais même pas à quoi ça sert

    Mais l'idée est de trouver où le groupe est stocké pour voir si le fait de rafraîchir le lien efface l'info et s'il y a moyen de la recréer !

    Le msgbox est bien fait avant de lui donner la nouvelle valeur ?

  5. #5
    Membre régulier Avatar de zoopsys
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par nico84 Voir le message
    Je n'utilise pas les groupes et je ne sais même pas à quoi ça sert

    Mais l'idée est de trouver où le groupe est stocké pour voir si le fait de rafraîchir le lien efface l'info et s'il y a moyen de la recréer !

    Le msgbox est bien fait avant de lui donner la nouvelle valeur ?
    Les groupes se trouvent dans la fenêtre de gauche (celle des tables, requêtes...) et te permettent de "ranger" les différents objets.

    Je pense que le refreshlink détruit l'objet puis le recrée et donc attribut un nouvel id dans la table MSysObjects.
    Le lien entre les groupes (MSysNavPaneGroups) et les objets (MSysObjects) est réalisé par la table MSysNavPaneGroupToObjects. Le refreshlink ne met pas à jour cette dernière, l'ancien id est toujours présent.

    De plus, je ne suis pas sûr qu'il soit conseillé de modifier les tables systèmes. Cela peut éventuellement faire crasher Access, non ?

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 108
    Points : 5 231
    Points
    5 231
    Par défaut
    Citation Envoyé par zoopsys Voir le message
    De plus, je ne suis pas sûr qu'il soit conseillé de modifier les tables systèmes. Cela peut éventuellement faire crasher Access, non ?
    J'imagine qu'on modifie ces tables lorsqu'on utilise certaines instructions comme refreshlink, mais de là à faire un update sur la table je suis d'accord que cela mérite réflexion... Pour ma part j'ai toujours réussi à trouver une instruction VBA qui faisait le boulot "proprement"

  7. #7
    Membre régulier Avatar de zoopsys
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Apparemment j'ai trouvé une solution :

    Avant de faire mon RefreshLink, j'exporte la configuration du panneau de navigation dans un fichier xml via la commande
    Application.ExportNavigationPane "C:\Temp\NavPan.xml"
    puis après le RefreshLink j'importe le fichier xml
    Application.ImportNavigationPane "C:\Temp\NavPan.xml"

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

Discussions similaires

  1. Mise à jour liens tables Access attachées avec Delphi
    Par Nicoclem dans le forum Bases de données
    Réponses: 5
    Dernier message: 11/02/2009, 23h07
  2. Mise à jour entre table liée et table access
    Par Sprsrini dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 30/09/2008, 20h47
  3. Réponses: 2
    Dernier message: 24/02/2007, 20h14
  4. Erreur de mise à jour de table liée
    Par tom_ibonia dans le forum Access
    Réponses: 1
    Dernier message: 19/10/2006, 10h52
  5. Mise à jour des tables liées + TIMESTAMP
    Par Homegrown dans le forum Access
    Réponses: 11
    Dernier message: 25/04/2005, 21h52

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