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 :

[SQL] vs [VBA] comparaison de tables et mise à jour


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Par défaut [SQL] vs [VBA] comparaison de tables et mise à jour
    bonjour,

    J'ai deux tables T1(A, B) et T2(C). Je souhaite comparer A et C et mettre C dans B lorsque A et C sont differents...
    Là j'utilise des recordset qui ouvrent les tables T1 et T2 et je fais des rs.edit/rs.update pour les update de C, mais ça prend un temps fou (mes tables sont lourdes 100 000 pour T1 et 250 000 lignes pour T2). Est-ce une fatalité ou y a-t-il une méthode plus rapide que le parcours des tables en vba?
    Il me semble que lancer du sql via le vba et encore plus long...

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut Re: [SQL] vs [VBA] comparaison de tables et mise à jour
    Citation Envoyé par borisa
    bonjour borisa,

    J'ai deux tables T1(A, B) et T2(C). Je souhaite comparer A et C et mettre C dans B lorsque A et C sont differents...
    Là j'utilise des recordset qui ouvrent les tables T1 et T2 et je fais des rs.edit/rs.update pour les update de C, mais ça prend un temps fou (mes tables sont lourdes 100 000 pour T1 et 250 000 lignes pour T2). Est-ce une fatalité ou y a-t-il une méthode plus rapide que le parcours des tables en vba?
    Il me semble que lancer du sql via le vba et encore plus long...
    Explique nous concrêtement comment tu rapproches les informations A et B. Soit précis, merci.

    Sans savoir de quoi il retourne, je vois déjà 2 optimisations possibles, l'une pour VBA/DAO, l'autre pour le SQL.

    [VBA / DAO]
    Utiliser un index sur la table T2 pour des accès quasi instantanés.

    Question: faut-il vraiment parcourir les 100 000 lignes de T1 ? Peut être seulement un sous-ensemble de T1 est-il impliqué ? D'où un gain possible.


    [SQL]
    Faire une requête UPDATE basée sur la jointure des enregistrements de T1 et T2, via le probable sous-ensemble de valeurs qui est commun à A et B (nécessaire pour le rapprochement des lignes).

    A bientôt

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 136
    Par défaut
    hello,


    je souscris entièrement à la remarque de =jbo= sur les index

    les champs à mettre à jour sont-ils indexés dans la table ?

  4. #4
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Par défaut
    bonjour et merci pour vos reponses...avec mes excuses pour l'imprecision.
    1. les champs sur lesquels on fait les comparaisons ne sont pas indexés.
    2. je filtre effectivement les enregistrements de la table la plus lourde (T2) mais je ne sais pas à priori quel proportion representent les enregistrements filtrés.
    3. voici le code que j'utilise:

    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
    Set rs1 = db.OpenRecordset("table1", dbOpenTable)
     
    Set rs2 = db.OpenRecordset("select * from table2 where filtre = vrai")
     
    'positionnement au debut de rs-he
    While (Not rs1.EOF)
     
        trouv_pas = True
           While (Not rs2.EOF And trouv_pas)
                   'si les champs "cle" sont égaux et t1.A = t1.C:
                    If (rs1.Fields("cle").Value = rs2.Fields("cle").Value) And (rs1.Fields("A").Value = rs2.Fields("C").Value) Then
                        'on modifie
                        trouv_pas = False
     
                        rs1.Edit
                        rs1.Fields("B") = rs2.Fields("C")
                        rs1.Update
     
                    End If
                rs2.MoveNext
            Wend
        rs2.MoveFirst
        rs1.MoveNext
    Wend
    je compare donc simplement A et C.

    4. Je voulais aussi "pretrier" les tables T1 selon A et T2 selon C pour ne pas avoir à faire de rs2.movefirst, mais je ne sais pas comment faire....
    merci de votre aide!
    b.[/code][/quote]

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Par défaut
    ok, j'ai la solution grace à votre insistance sur les index: je crée un index sur la table T1 (sur le champ que j'appelai "cle", mais n'etait pas indexé) et le traitement qui durait 45mn prend 1mn30...
    Voila, c'etait idiot, mais maintenant je n'oublierai pas de bosser avec des index!
    merci beaucoup,
    b.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2013, 14h29
  2. Sql-server 2000 Comparaison de tables et déclenchement de lot
    Par miniquick dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/10/2007, 14h50
  3. Vue multi table et mise à jour
    Par neptune dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2007, 16h41
  4. Duplication de table et mise à jour
    Par cyraile dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/01/2006, 09h53
  5. [MPD] Créé des tables de mise à jour
    Par Oberown dans le forum Schéma
    Réponses: 9
    Dernier message: 16/01/2005, 13h08

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