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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 46
    Points : 5
    Points
    5

    Par défaut Comparer 2 tables a 200 champs sous access

    Bonjour a tous,

    J'aimerais savoir comment comparer les champs de ma table A avec ceux de la table B ? Comparaison 1 a 1 sauf sur l'id des mes 2 tables, table de meme structure avec 200 champs dans chaque table

    J'ai construit une requête sql dynamique or mon problème c'est qu-il y a plus de champs que prévu du coup cela me génère une erreur la 3190


    Comment puis-je faire pour comparer mes données sans cette erreur ?

    Je souhaites savoir si un écart est constaté entre le champs A et le champs B ?

    Cordialement les developpiens

  2. #2
    Membre éprouvé
    Inscrit en
    août 2008
    Messages
    655
    Détails du profil
    Informations forums :
    Inscription : août 2008
    Messages : 655
    Points : 953
    Points
    953

    Par défaut

    Bonjour,

    Solution 1)
    dans ton code existant rajoute un DoEvents, ça m'est arrivé de résoudre des problèmes un peu similaires comme ça

    Solution 2)
    si tu maîtrise VBA, tu peux essayer de faire tout en code avec recordset DAO

    tu crées une table de metadata comprenant le nom des champs de ta table à contrôler
    tu crées une table de résultat: ID, Champ, ValeurSource, ValeurCible

    tu travailles avec 4 recordset: rstSource, rstCible, rstChamp, rstResultat et l'algo aura cette tête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while not rstSource.eof
            rstCible.findfirst "ID=" & rstSource("ID")
            rstChamp.movefirst
            while not rstChamp.eof
               if rstSource(rstChamp("Champ")) <>rstCible(rstChamp("Champ")) then rstResultat.add..... 
               rstChamp.movenext
            Wend       
            rstSource.movenext
    Wend

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 472
    Points : 19 019
    Points
    19 019

    Par défaut

    Bonjour.

    Pour comparer 200 champs 1 à 1, je recommande le code suivant (basé sur l'exemple de accessisgood).

    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
    dim f as dao.fields:for each field in rstSource.fields
     
       select case f.name
          case "ID"
             'Ne pas comparer
     
          case else
     
             if rstCible.fields(f.name) <> f then
                'Enregistre le résultat
             end if
     
        end select
     
    next f
    Cela évite d'avoir à définir une table avec les 200 noms de champ.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 46
    Points : 5
    Points
    5

    Par défaut

    Bonjour Marot et accessisgood,

    Veuillez excuser ma réponse tardive j'étais en formation ces 2 dernières semaines donc sur d'autres projets

    Si je comprend bien marot, je fais ma table réference et ma table résultat :
    Je place les résultat dans une table erreur

    Ma table ref a 180 colonne idem pour resultat et je cherche a lister les differences via une requete sql construire au fur et a mesure : petit soucis je me heurte à la limite Excel de pas plus de 250 colonne dans une table car beaucoup d'enregistrements

    Si je comprend bien votre solution vous comparer les champs table a table sans sql or c'est les valeurs que je souhaites comparer

    Merci de votre aide

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 472
    Points : 19 019
    Points
    19 019

    Par défaut

    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rstCible.fields(f.name) <> f
    est la version condensée de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rstCible.fields(f.name).value <> f.value
    .value est la propriété par défaut et n'a pas besoin d'être indiquée explicitement.

    La limite de 255 est dans Access (pas plus de 255 champs dans une table ou une requête) et les versions de Excel avant 2007.
    Depuis 2007, en format xlsx, Excel accepte 16 384 colonnes et 1 048 576 lignes.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 46
    Points : 5
    Points
    5

    Par défaut

    D'accord MArot

    Je travaille sous acces pas Excel et par requete sql apres je connais la propriété value (j'avais compris votre code )

    Par contre est-il possible sans sql de verifier et comparer 2 table access : chaque champs d'une ligne (table reference) a chaque champs d'une ligne (table resultat) via un id commun pour chaque ligne ?
    Et stocker le resultat de la comparaison si erreur dans une tableerreur ?

    Cordialement

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 472
    Points : 19 019
    Points
    19 019

    Par défaut

    Bonjour.

    Ici un exemple à adpter à ta réalité. Là j'ai supposé que tu avais un champ Clef numérique qui était commun à tes 2 tables.

    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
    private sub ComparerT1_T1()
     
    dim db as dao.database: set db=currentdb
    dim r1 as dao.recordset: set r1=db.openrecordset("TaTable1", dbOpenDynsaset)
    dim r2 as dao.recordset: set r2=db.openrecordset("TaTable2", dbOpenDynsaset)
     
    call db.execute("delete * from [TaTableErreur]", dbFailOnError) 'Vide la table de résultat
    dim r as dao.recordset: set r=db.openrecordset("TaTableErreur", dbOpenDynsaset)
     
    dim f as dao.fields:
     
    do while not r1.eof()
     
       call r2.findfirst("[Clef]=" & r1![Clef]) 'Trouve l'enr correspondant à R1 dans R2
     
       for each field in r1.fields
     
          select case f.name
             case "ID"
             'Ne pas comparer
     
             case else
     
                if r2.fields(f.name) <> f then
                   'Energistre le résultat
                   r.addnew
                   r![Clef]=r1![Clef]
                   r![NomChamp]=f.name
                   r![ValeurR1]=f.value
                   r![ValeurR2]=r2.fields(f.name).value
                   r.update
                end if
     
           end select
     
       next f
     
       call r1.movenext
    loop
     
    r1.close:set r1=nothing
    r2.close:set r2=nothing
    r.close:set r=nothing
    db.close:set db=nothing
     
    end sub
    Si tu as seulement des "lignes" en parallèle alors il faut faire un parcours du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do while not r1.eof()
       if r2.eof() then
         exit do
       end if
     
       'ici le code de comparaison
     
       r1.movenext
       r2.movenext
    loop
    Et il faut gérer les cas où tu as plus d'enregistrements dans R1 que dans R2 et vice-versa.
    Logiquement les enregsitrements sur numéraires devraient être tous dans les erreurs.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 46
    Points : 5
    Points
    5

    Par défaut

    Merci de votre aide MAROT

    Cela est-il genant si l'id n'est pas un auto increment ?

    J'ai un id commun au 2 tables pour chaque ligne et apres je veux contoler la valeur des 179 colonnes restantes entre la table ref et la table resultat si difference alors sortir l'ecart et insérer dans la table erreur

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 472
    Points : 19 019
    Points
    19 019

    Par défaut

    Non ce n'est pas important du moment que c'est un nombre.

    Ici un exemple qui enregistre la diffrence :

    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
    private sub ComparerT1_T1()
     
    dim db as dao.database: set db=currentdb
    dim r1 as dao.recordset: set r1=db.openrecordset("TaTable1", dbOpenDynsaset)
    dim r2 as dao.recordset: set r2=db.openrecordset("TaTable2", dbOpenDynsaset)
     
    call db.execute("delete * from [TaTableErreur]", dbFailOnError) 'Vide la table de résultat
    dim r as dao.recordset: set r=db.openrecordset("TaTableErreur", dbOpenDynsaset)
     
    dim f as dao.fields:
     
    do while not r1.eof()
     
       call r2.findfirst("[ID]=" & r1![ID]) 'Trouve l'enr correspondant à R1 dans R2
     
       for each field in r1.fields
     
          select case f.name
             case "ID"
             'Ne pas comparer
     
             case else
     
                if r2.fields(f.name) <> f then
                   'Energistre le résultat
                   r.addnew
                   r![ID]=r1![ID]
                   r![NomChamp]=f.name
                   r![IndexChamp]=f.ordinalpositon
                   r![ValeurR1]=f.value
                   r![ValeurR2]=r2.fields(f.name).value
                   r[Delta]=r![ValeurR1]-r![ValeuR2]
                   r.update
                end if
     
           end select
     
       next f
     
       call r1.movenext
    loop
     
    r1.close:set r1=nothing
    r2.close:set r2=nothing
    r.close:set r=nothing
    db.close:set db=nothing
     
    end sub
    Ta table de résultat pourait être :

    • ID
    • IndexChamp (entier long, conserve l'ordre des colonnes)
    • NomChamp (texte : le nom du champ comparé)
    • ValeurR1 (La valeur dans la 1ère table)
    • ValeurR2 (La valeur dans la 2ième table)
    • Delta (la différence entre R1 er R2)


    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 46
    Points : 5
    Points
    5

    Par défaut

    Merci pour votre aide


    "[ID]=" ---> affectation pour le case

    r1![nom de mon champs id] ---> c'est a cet endroit dans le code que je remplace id par le nom du champs qui sera l'id pour moi


    Ai-je bien compris ton code ?

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    octobre 2005
    Messages
    12 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : octobre 2005
    Messages : 12 472
    Points : 19 019
    Points
    19 019

    Par défaut

    Oui, j'ai mis les noms qui me paraissaient les meilleurs mais tu dois l'adapter à ta réalité.

    L'important c'est l'idée génrale.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [ASE 21.5.4] mappage des tables sybase 12.5 sous access 2003 via odbc
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 5
    Dernier message: 27/02/2008, 16h50
  2. [Table]Ajout de champ dans ACCESS
    Par Eric Harvey dans le forum Modélisation
    Réponses: 7
    Dernier message: 15/04/2007, 18h17
  3. Réponses: 1
    Dernier message: 15/06/2006, 17h39
  4. changer les noms de champs sous access
    Par Flo42 dans le forum Access
    Réponses: 4
    Dernier message: 11/04/2006, 12h29
  5. tester si une table existe ou non sous access
    Par Lady_jade dans le forum Access
    Réponses: 4
    Dernier message: 17/02/2006, 20h44

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