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

Access Discussion :

Bug Access ? Requêtes et Tables liées


Sujet :

Access

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2016
    Messages : 136
    Points : 149
    Points
    149
    Par défaut Bug Access ? Requêtes et Tables liées
    Bonjour,

    J'ai constaté un phénomène étrange.

    Dans mon Front-End, certaines requêtes (notamment celles contenant des champs multi-valuées ou se référant à des tables contenant de tels champs) semblent sensibles aux changements de chemins d'accès aux tables liées.

    Si je déplace physiquement mon Back-End et que je reconstruis les liens des tables, l'appel de certaines requêtes à partir de code VBA plante.

    Il suffit alors que j'ouvre la requête en mode "Création" et que je la réenregistre SANS CHANGEMENT pour que tout se remette à fonctionner normalement.

    Est-ce que quelqu'un a déjà constaté ce phénomène ?

    A ce jour, après chaque changement des liens, je lance une macro qui balaye toutes mes requêtes en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For Each qry In DB.QueryDefs
            If Not qry.Name Like "~*" Then
                Debug.Print qry.Name
                DoCmd.OpenQuery qry.Name, acViewDesign
                DoCmd.Close acQuery, qry.Name
            End If
        Next
    ...mais c'est quand même un peu pénible et, si je pouvais avoir le fin mot de l'histoire, j'apprécierai !

    NB : Sur 300 requêtes, ce phénomène en concerne une demi-douzaine, pas plus. Un contexte favorable à un bug Access qui ne sera jamais corrigé ...

    Cordialement,
    Olivier

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour.

    je reconstruis les liens des tables
    Peux-tu poster le code que tu utilises pour "reconstruire" tes liens ?
    Si il consite à supprimer le lien vers la table puis le recréer alors oui, il est possible que cela influence tes requêtes.
    C'est un peu comme de supprimer physiquement la table. Il n'y a d'un seul coup plus de table source.

    Personnellement j'utilise toujours .RefreshLink qui se contente de changer l'adresse associée au lien (donc le lien n'est jamais supprimé) et je n'ai jamais eu de problème.

    A+

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2016
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Hello,

    J'utilise l'interface Access, en mode admin (cf. démarrage avec Shift) pour effacer toutes les tables, puis j'utilise Données Externes / Access pour importer et lier les nouvelles tables, avec leur nouvelle localisation ... donc - effectivement - pendant un court moment, il n'y a plus de tables du tout ... mais je ne tente pas d'éditer les requêtes à ce moment là (d'ailleurs, j'aurai du mal).

    Je vais voir à faire ça en VBA en utilisant ton .RefreshLink et je te dirai.

    Il faudra juste que je fasse attention aux cas où l'évolution de mon appli m'amènera à supprimer ou ajouter des tables. Heureusement, j'ai un seul et unique Back-End, donc je devrais pouvoir m'en sortir.

    Quoi qu'il en soit, merci !
    Olivier

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour.

    Par l'interface tu dois faire :
    1. Cliquer droit sur une table liée.
    2. Ouvrir le gestionnaire de tables liées.
    3. Sélectionner toutes les tables liées.
    4. Cocher en bas "Toujours demamder un nouvel emplacement" (ou un machin du genre). C'est juste sous la liste des tables.
    5. Lancer la reconnection.
    6. Indiquer l'endroit où se trouve ta BD à lier.


    C'est l'équivalent du RefreshLink.

    A+

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2016
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2016
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Pas de veine ! J'ai développé une macro qui permet de changer la connexion Front-End/Back-End via un Refreslink (voir code ci-dessous) mais, malheureusement, ça ne change rien.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Function Fn_SelectBackEnd()
    ' Permet de changer la localisation du Back-End sans détruire-puis-relier les tables (cf. pb des requêtes "sensibles" ?)
    ' .. voir la macro AutoKeys / Ctrl+Shift+B
        ' NB: On ne peut pas faire de Fn_CheckGVs car on est dans une config atypique
        Set gvoDB = Nothing: Set gvoDB = CurrentDb
        Dim target As String: target = Fn_FileSelect("accdb", "", "Sélectionnez le Back-End")
        If target = "" Then Exit Function
        Dim tdf As DAO.TableDef, connect As String, P1 As Long, msgerr As String
        On Error Resume Next                        ' Pour éviter les erreurs liées aux tables inexistantes dans le nouveau Back-End
        For Each tdf In gvoDB.TableDefs
            If ((tdf.Attributes And dbSystemObject) = 0) And ((Left(tdf.Name, 2) = "t_") Or (Left(tdf.Name, 5) = "ttmp_")) Then
                connect = tdf.connect
                P1 = InStr(connect, "DATABASE=")
                If P1 <> 0 Then
                    tdf.connect = Mid(connect, 1, P1 - 1) & "DATABASE=" & target
                    tdf.RefreshLink                 ' Même en cas d'erreur, le tdf.connect est modifié !
                End If
            End If
        Next tdf
        Set gvoDB = Nothing: Set gvoDB = CurrentDb  ' Provoque un refresh des tdf.connect
        For Each tdf In gvoDB.TableDefs
            If ((tdf.Attributes And dbSystemObject) = 0) And ((Left(tdf.Name, 2) = "t_") Or (Left(tdf.Name, 5) = "ttmp_")) Then
                If Not tdf.connect Like "*" & target & "*" Then
                    msgerr = msgerr & " * " & tdf.Name & vbCrLf
                End If
            End If
        Next tdf
        If msgerr <> "" Then
            Fn_FlashMsgBox "Tables absentes du nouveau Back-End - A supprimer ?" & vbCrLf & msgerr & vbCrLf & vbCrLf _
                           & "ATTENTION : Si votre nouveau Back-End contient des tables supplémentaires, elles devront être liées manuellement."
        Else
            Fn_FlashMsgBox target & " : Redirection OK !" & vbCrLf & vbCrLf _
                           & "ATTENTION : Si votre nouveau Back-End contient des tables supplémentaires, elles devront être liées manuellement."
        End If
        Set gvFSO = Null: Set gvFSO = Null
        ' En principe, l'utilisateur corrige manuellement ce qui doit l'être avant de faire un nouveau Ctrl+Shit+U !
    End Function
    J'ai initialement mon Front-End ET mon Back-End en .accdb. Je fais un changement de Back-End (cf. passage de la base de dév à la base de prod), j'enregistre mon Front-End en .accde ... et 10% de mes requêtes ne fonctionnent plus. Je pense que ce sont celles qui utilisent des champs multi-valuées, ou qui font référence à des tables qui en contiennent. Voir le message d'erreur ci-dessous.

    Nom : Capture.JPG
Affichages : 213
Taille : 30,6 Ko

    Ce bug intervient sur une ligne de type QueryDef.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        ...
        Dim oQdf As DAO.QueryDef, orst As DAO.Recordset
        Set oQdf = gvoDB.QueryDefs("rv_AffaireCourrierTo"): oQdf("AffID") = AffID: oQdf("CourrierID") = CourrierID
        ...
    Pour régler ça, je dois lancer - avant de générer l'accde - les deux macros suivantes :
    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
    28
    29
    30
    31
     
    Function Fn_CheckAllQueries()
    ' Ouvre et ferme toutes les requêtes (cf. pbs champs multivalués et tables liées)
    ' .. voir la macro AutoKeys / Ctrl+Shift+C
        Application.Echo False  ' .. et passage en mode "rapide"
        Dim DB As DAO.Database, qry As DAO.QueryDef: Set DB = CodeDb
        For Each qry In DB.QueryDefs
            If Not qry.Name Like "~*" Then
                Debug.Print qry.Name
                DoCmd.OpenQuery qry.Name, acViewDesign: DoCmd.Close acQuery, qry.Name
            End If
        Next
        Set qry = Nothing: Set DB = Nothing
        Application.Echo True
        Debug.Print "CheckAllQueries Done !"
    End Function
     
    Function Fn_CheckAllReports()
    ' Ouvre et ferme tous les états (cf. pbs champs multivalués et tables liées)
    ' .. voir la macro AutoKeys / Ctrl+Shift+C
        Application.Echo False  ' .. et passage en mode "rapide"
        Dim DB As DAO.Database, rep As DAO.Document: Set DB = CurrentDb
        For Each rep In DB.Containers("Reports").Documents
            If Not rep.Name Like "~*" Then
                Debug.Print rep.Name
                DoCmd.OpenReport rep.Name, acViewDesign: DoCmd.Close acReport, rep.Name
            End If
        Next
        Application.Echo True
        Debug.Print "CheckAllEtats Done !"
    End Function
    ... et le "Application.Echo False" n'empêche pas le ruban de clignoter bizarrement.

    Une idée pour régler tout ça ?

    Cordialement,
    Olivier

    PS : Si je devais refaire tout ça, j'éviterais soigneusement de recourir aux champs multi-valués d'Access. J'ai d'ailleurs récupéré des bouts de codes qui permettent d'avoir un équivalent visuel avec des tables de jointures classiques ... mais la fenêtre popup-sélection débloque un peu en mode double-écrans si on n'est pas sur l'écran principal. Ah ! L'informatique ! Quel métier ...

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour.

    Déjà j'enlèverai le , c'est un truc pour manquer une erreur importante.

    Je te suggère de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on error goto Err_Relink
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Err_relink:
       select case err.number
          case 'ici un numéro d'erreur attentdu si le refresh ne marche pas
             resume next
         case else
             call err.raise(err.number, , err.desription) 'Fait afficher l'erreur imprévue
       end select
    Je préfère le Select case au if then else car c'est plus facile d'y ajouter des erreurs supplémentaires.

    Aussi tu peux problement simplifier ta logique, perso j'utilise simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if tdb.connect <> "" then
       'C'est une table liée, traiter en conséquence.
    end if
    Pour le reste non désolé je n'ai jaimais eu de problème après un relink. Peut-être est-ce parce que c'est un accde mais j'ai déjà fait cela avec un mde et tout allait bien.

    A+

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 412
    Points : 19 988
    Points
    19 988
    Billets dans le blog
    66
    Par défaut
    Bonsoir,

    En complément, voici une discussion sur le même sujet :

    https://www.developpez.net/forums/d2...les-attachees/

    Cdlt,

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

Discussions similaires

  1. [AC-2007] Requête sur tables liées : pas de doublons
    Par junty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 30/12/2011, 10h53
  2. Requête sur table liée non nulle
    Par MistyMan dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/02/2009, 12h44
  3. [Access 2003] problème table liée
    Par stargates dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 18h39
  4. [Access] Requête de table croisée ?
    Par Mythrandil dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/06/2007, 15h53
  5. Runtime Access 2002, MDE, tables liées
    Par jfg dans le forum Runtime
    Réponses: 13
    Dernier message: 13/12/2005, 11h12

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