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 :

BDD Hyper lente et liaison des tables trop longue


Sujet :

VBA Access

  1. #21
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Salut loufab ,
    Excuse moi mais je suis perdu dans ta dernière réponses .

    Tu me dis que je n'ai pas a faire la ligne 2 de ce code en prod ? le refresh link n'est pas nécessaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Connect = ";DATABASE=" & strChmFichier
    .RefreshLink
    C'est ça ou j'ai mal compris ?

    J'ai aussi voulu tester en supprimant toutes mes tables liées et faire de nouveau Données externes > Nouvelle source de donnée access et sélectionner mon BE puis toutes les tables .
    Le lien se fait plus rapidement , juste qq secondes au lieu de 90 secondes via mon code .
    C'est bizarre non ?

  2. #22
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Salut Loufab,
    Tu me dis de ne pas faire le refresh c'est bien ça ? et de vérifier les temps comme ds le code ci-dessous ?

    Il faut pourtant que je parcoure toutes le tables pour faire un refresh non ? c'est le but du truc ?


    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
     
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set a = fs.CreateTextFile("C:\tmp\bilan.txt", True)
     
     
        'Boucle parcours de la table tant que l'on arrive pas sur le dernier.
        While Not rst.EOF
     
            'Définition de l'objet TableDefs avec table stockées dans TablesAttachees
            With dbBase.TableDefs(rst!TablesAttachees.Value)
     
                'Redéfini la propriété connect de la table avec la nouvelle base
                debut_table = Time()
                .Connect = ";DATABASE=" & strChmFichier
                'Remet à jour la liaison de la table
                secondes = DateDiff("s", debut_table, Time())
                temps_connect = (secondes \ 60) & ":" & (secondes - (secondes \ 60) * 60)
                .RefreshLink
                secondes = DateDiff("s", debut_table, Time())
                temps_total = (secondes \ 60) & ":" & (secondes - (secondes \ 60) * 60)
     
                a.WriteLine (rst!TablesAttachees.Value & vbTab & temps_connect & vbTab & temps_total)
     
            End With
            'Efface l'enregistrement de la Table
     
            rst.Delete
            'Enregistrement suivant
            rst.MoveNext
         '    Fichier.Close
        Wend
        a.Close
    Je penne que je n'ai pas compris ton dernier post
    Le code doit bien parcourir toutes les tables et les relier, ou alors je n'ai pas bien pigé comment fonctionne ce code.
    Il faut que je mette quoi ds mon code au bout du compte ?
    SOS ,

    Note: j'ai voulu essayer de supprimer toutes les tables liées et de les re lier en faisant Nouvelle source de données externe > fichier access et sélectionner toutes les tables , c'est bcp plus rapide , seulement qq secondes en comparaison à 90 secondes via mon code , c'est bizarre non ?

    François

  3. #23
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Loufab,
    Je n'ai pas du bien piger ton dernier post, désolé, cf mes 2 messages ci-dessus


    J'ai un utilisateur qui tente de remettre à jour ses liens via mon code car il n'a pas le bon disque de monté et ça le fait rien, (j'ai mis une progresse bar qui reste à 0%) alors que chez moi ça avance mais lentement, c'est désespérant ces problèmes.

    Et question subsidiaire: si mon BE est sur un truc du genre :
    Z:\BE\be.accbd
    et que je lie mon front sur ce BE avant de déployer sur tous les postes utilisateurs, il faut donc obligatoirement que tout le monde ait son disque Z monté sur le truc qui va bien !
    Vu que quand on met des chemins UNC \\ serveur_name\BE\be.accbd c'est pas cool pour access

    (il fauta espérer que les utilisateurs n’aient pas déjà pris la lettre Z pour autre chose. , c'est contraignant non ?

    Les UNC ça ralenti le mécanisme de liaison, mais une foi le lien fait, ca fonctionnerait quand mêm avec un UNC ?


    Merci de ton aide ,

  4. #24
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Oui Z doit être le même sur toute les machines si tu le met en dur dans le connect.
    Oui c'est contraignant.
    UNC est lent à l'attache comme en fonctionnement.

    Le refresh c'est quand tu modifie le connect à chaud, là c'est au démarrage donc inutile. Un Tabledefs.refresh global est suffisant.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #25
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Salut Loufab,
    questions Q1, Q2 et Q3 Q4 pour finir sur le sujet :

    Q1 :Je ne pige pas ou mettre le
    dans mon code ci-dessous où je passe en param à ma fonction le chemin de mon nouveau fichier BE.
    Q2:Je n'ai pas besoin de parcourir toutes les tables liées une par une en fait ?


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    Function LierTables(ByVal strChmFichier As String) As Boolean
    '---------------------------------------------------------------------------------------
    ' Procédure      : Function ==> LierTables
    ' Auteur         : Dolphy           http://dolphy35.developpez.com/
    ' Commentaires   : Permet de remettre les liaisons en fonction du chemin sélectionné
    ' Lien vers Faq  : néant
    '---------------------------------------------------------------------------------------
    '
        'Déclaration des variables
        Dim dbBase As DAO.Database
        Dim tbdTables As DAO.TableDef
        Dim rst As DAO.Recordset
        Dim chemin_complet_fichier As String
     
        'Initialise le retour de la Fonction
        LierTables = False
     
        'Instancie la base courrante
        Set dbBase = CurrentDb
        'charge la table dans le Recordset rst
        Set rst = dbBase.OpenRecordset("tblTablesAttachees", dbOpenDynaset)
     
        'Inhibe les messages d'alertes
        DoCmd.SetWarnings False
     
        'Vide la Tables contenant la liste des tables attachées
        DoCmd.RunSQL "DELETE * FROM tblTablesAttachees"
     
        'Boucle Parcourant toutes les tables de la Bdd en cours
        For Each tbdTables In dbBase.TableDefs
     
     
     
            'Teste l'attribut de la table pour savoir si c'est une table liée
            If tbdTables.Attributes And dbAttachedTable Then
                rst.AddNew                              'Ajoute un enregistrements
                rst!TablesAttachees = tbdTables.Name    'Ajoute la table dans le Champs
                rst.update                              'Mise à jour
            End If
     
        Next tbdTables
     
        debut = Time()
        'Mise à jour du Recordset après ajout des tables
        rst.Requery
     
        'Test la position du pointeur si il ne se situe pas en début de table
        If Not rst.BOF Then
            rst.MoveFirst   'déplacement du pointeur sur le premier enregistrement
        End If
     
        chemin_complet_fichier = "C:\tmp\bilan.txt"
         Set fs = CreateObject("Scripting.FileSystemObject")
        If FichierExiste(chemin_complet_fichier) = True Then
            Set a = fs.OpenTextFile(chemin_complet_fichier, 8)
        Else
            Set a = fs.CreateTextFile(chemin_complet_fichier, True)
        End If
         a.WriteLine ("--------------------------")
     
     
     
        'Boucle parcours de la table tant que l'on arrive pas sur le dernier.
        While Not rst.EOF
     
            'Définition de l'objet TableDefs avec table stockées dans TablesAttachees
            With dbBase.TableDefs(rst!TablesAttachees.Value)
     
                'Redéfini la propriété connect de la table avec la nouvelle base
                debut_table = Time()
                .Connect = ";DATABASE=" & strChmFichier
                'Remet à jour la liaison de la table
                secondes = DateDiff("s", debut_table, Time())
                temps_connect = (secondes \ 60) & ":" & (secondes - (secondes \ 60) * 60)
                '.RefreshLink
                secondes = DateDiff("s", debut_table, Time())
                temps_total = (secondes \ 60) & ":" & (secondes - (secondes \ 60) * 60)
     
                a.WriteLine (rst!TablesAttachees.Value & vbTab & temps_connect & vbTab & temps_total)
     
     
            End With
            'Efface l'enregistrement de la Table
     
            rst.Delete
            'Enregistrement suivant
            rst.MoveNext
         '    Fichier.Close
        Wend
        a.Close
        'Liberation des variables
        dbBase.Close
        Set dbBase = Nothing
        Set rst = Nothing
     
        'Re-active les messages d'alertes
        DoCmd.SetWarnings True
          secondes = DateDiff("s", debut, Time())
          temps_mis = (secondes \ 60) & ":" & (secondes - (secondes \ 60) * 60)
     
        'Affiche Message
        MsgBox ("mise à jour terminée, il à fallu :" & secondes & " secondes")
     
        'Renvoi la fonction à true
        LierTables = True
     
    End Function
    Vu que je fais au démarrage :
    - si on n'a pas trouvé le fichier BE attendu
    - ouverture d'une File dialog pour sélectionner le fichier BE
    - pui appel de la fonction LierTables,
    Q3 :Une fois le code exécuté, il faut alors fermer access et réouvrir Access pour que ce soit pris en compte ?

    Q4:Du coup en général pour une BDD scindée c'est la procédure usuelle avec Access de mettre le BE sur u montage disque ou tout le monde à le même montage ?

    Millions de mercis.

  6. #26
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Vu que c'est une commande globale il faut le faire à la fin.

    Q2 Non

    Q3 Oui
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #27
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Hi again loufab,

    Je n'ai pas besoin de parcourir toutes les tables liées une par une en fait ?
    Je n'arrive pas a piger ce que devient mon code en fait !
    Info : j'ai une table dans le BE ( qui contient la version du BE)
    Le refresh va bien refresher que ce qui est lié ?

    En fait juste 2 lignes de code suffisent ?
    Il suffit de faire le refresh global après le connect ? donc ca devient ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .Connect = ";DATABASE=" & strChmFichier
    dbBase.TableDefs.Refresh
    PB1Mais cela ne fonctionne pas, si je vais dans le gestionnaire de tables liées c'est toujours l'ancienne BE qui est liée.


    Sur le fichier joint :
    - ça donnerait quoi ton idée de code ?
    - ça met 5 secondes pour les 2 tables si je les mets sur le réseau ( auquel j'accède via un VPN). et c’est immédiat si le BE st sur mon PC.

    PB2Sinon je n'ai pas mis le nom du lecteur en Dur , mais en fait la version du Front que je mettrai à dispo sur le réseau pour que chacun la recopie sur son propre PC sera liée a une BE sur Z - car c'est le montage que j'ai ( mais je n'ai pas mi Z en dur dans le code, c’est juste que je l'ai liées à une BE sur Z).
    Je n’ai pas bien pigé ta remarque sur ce sujet .
    Quelle serait la solution sinon ?
    @++
    Fichiers attachés Fichiers attachés

  8. #28
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bonjour,
    voici un attachement qui fonctionne.
    Simplifie toi la vie : il suffit de saisir une bonne fois les noms des tables de la BE dans tblTablesAttachees .
    Aussi , tu dois rendre obligatoire la déclaration des variables par la mentiondans l'entete de chaque module, ca t'aidera à mieux nommer tes parametres

    A+test lien.zip
    "Always look at the bright side of life." Monty Python.

  9. #29
    Membre habitué Avatar de bartimeus35
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2009
    Messages : 504
    Points : 191
    Points
    191
    Par défaut
    Salut micniv,
    Merci de ta contribution :
    Liaison
    Je viens de voir ton fichier Database512.accdb.
    Ok tu as mis en dur les tables tblAttcahees , mais ce n'est pas ce morceau qui pose problème
    J'avais récupéré ce vbout de code sut developpez.net d'ailleurs.
    C'est la ligne qui met 3/4 secondes par table quand le BE est sur le réseau et que j'y accède via un VPN.


    Ok pour le Option Eplicit,

    @++

    François

Discussions similaires

  1. [MySQL] Afficher le contenu d'une BDD et retirer l'une des tables
    Par piranha2209 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/12/2007, 17h22
  2. [VBA]Liaison des tables
    Par TLImpala dans le forum VBA Access
    Réponses: 7
    Dernier message: 17/04/2007, 10h48
  3. Securité - Bloquer liaison des tables -
    Par Sam 069 dans le forum Sécurité
    Réponses: 2
    Dernier message: 09/01/2007, 10h18
  4. Réponses: 2
    Dernier message: 06/10/2006, 10h16
  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