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 :

Comparaison de champs entre 2 tables ACCESS


Sujet :

Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Comparaison de champs entre 2 tables ACCESS
    Bonjour à tous,

    N'étant pas un spécialiste ACCESS, je voudrais savoir s'il serait possible de comparer 2 tables ACCESS. Je m'esplique : Je récupère une table du jour (Table J) et la compare avec celle de la veille (J-1).
    Pour chaque ligne de la Table J, j'aimerai que le programme (macro ou VBA ou requete) m'extrait dans une nouvelle table toutes les lignes qui ont été modifiées (avec les champs modifiés)

    D'avance merci pour votre aide

    Nasser

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    avez-vous essayé l'assistant de requête de non-correspondance ?

  3. #3
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    slt,

    y a une demande à peu près identique ici :
    http://www.developpez.net/forums/vie...asc&highlight=

    tout en requête je sais pas si c'est possible facilement ça dépend du résultat voulu
    mais peut-être avec une première requête pour isoler les lignes différentes et une petite boucle en DAO pour créer la table des différences si nécessaire...

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Tout en requête, c'est possible mais c'est très lourd, il faut faire une comparaison de tous les champs entre eux et suite à cette comparaison attribuer une valeur 0 ou 1.
    Additionner ces valeurs et si elles sont différentes de 0 copier ces enregistrements dans une table.
    Si il y a peu de champs par enregistrement, c'est pas trop lourd
    Mais si il y en a beaucoup

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Tout d'abord merci pour vos réponses.
    J'apporte quelques réponses à vos questions : Je compare en fait 2 tables contenant à peu près 22500 lignes et chaque ligne contient 38 champs.
    C'est un fichier contenant des données fournisseurs donc la clé primaire sera donc le N° de Fournisseur.

    Merci encore pour votre aide

    Nasser

  6. #6
    Membre averti Avatar de mcdotta
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 292
    Points : 324
    Points
    324
    Par défaut
    Bonjour,

    Je n'apporte rien de nouveau par rapport aux différents posts, j'essaye juste de synthétiser.

    Tu dis : C'est un fichier contenant des données fournisseurs donc la clé primaire sera donc le N° de Fournisseur.

    Ca veut dire que tu as 22500 fournisseurs différents ?

    Si oui, tu peux utiliser des requêtes de non correspondance pour isoler les lignes en plus - en moins entre J-1 et J et les marques par + ou - dans un champ spécialement ajouté (comme te le conseille Caféine)

    Pour les autres, ce sont donc des lignes existantes en J-1 et J.
    Tu dois donc passer par du code VBA pour comparer ligne par ligne (cf Arkham).

    Est-ce que tu sais faire ce genre de code ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci mcdotta et les autres pour vos réponses.

    J'apporte quelques remarques supplémentaires : J'ai bien 22500 lignes fournisseurs mais je ne veux pas savoir quel sont les lignes en plus.
    Je veux réellement compararer chaque champs. Par exemple, si le champs NumCpteBanque a changer entre J+1 et J-1, j'aimerai le savoir.
    Si pour un autre fournisseur, c'est le champs Dénomination qui a changé, j'aimerai le savoir.

    Je ne connais pas bien VBA ACCESS (connais plutot Excel), c'est pour cela que je fais appel aux personnes qui pourrais m'aider dans cette tache bien compliquée pour moi.

    D'avance merci à tous,

    Nasser

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Ok, c'est un grand classique du genre :-).

    Donc tu veux juste comparer les enr qui ont les même code fournisseur dans les 2 tables. Et je suppose que tu va avoir une base par jour de comparaison.

    le plus simple c'est de faire une requète rJJm1 qui fait cela :

    Lien entre ta tableJ et tableJm1 sur le code fournisseur (si il y a des nouveaux ou des suppressions ils seront éliminés du traitement).

    Ensuite tu fait :

    requète rJ qui prend tous les champs de la tableJ et tu la relie à rJJm1 sur le code fournisseur
    requète rJm1 qui prend tous les champs de la tableJm1 et tu la relie à rJJm1 sur le code fournisseur

    Comme cela tu as les enr qui sont communs aux deux tables

    Il te faut aussi une requète rCreerTableResultat de création de table pour le resultat, utilise l'assistant de Access pour faire cela

    ensuite tu tape le petit bout de code suivant dans un module. Attention j'utilise DAO 3.6 vérifie que tu as une ref dessus.

    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
     
    private sub TesterModifJJm1()
     
    dim db as database:set db=currentdb
     
    db.queryDefs("rCreerTableResultat").execute
     
    dim rJ as recorset:set rJ=db.openRecordset("rJ")
    dim rJm1 as recordset:set rJ=db.openRecordset("rJm1")
    dim rResult as recordset:set rResult=db.OpenRecordset("TableResultat")
     
    dim f as field
    do while not rJ.eof
     
       if rJ![NumFournisseur]<>rJm1![NumFournisseur] then
         error(5):'Juste une sécurité durant le débugage, ça ne doit jamais se produire.
       end if
     
     
       for each f in rJ.fields
     
          if f.value<>rJm1.fields(f.name).value then
             debug.print "Champ " & f name & " ds rJ : " & f.value, " ds rJm1 : " ; rJm1.fields(f.name).value
     
             rResult.addnew
             'ici il faut ajouter le code pour écrire les champs de la table résultat mais je n'ai pas bien saisi comment tu la veux.
             rResult.update
     
          end if
     
       next f
     
       rJ.movenext
       rJm1.movenext
    loop
     
    rJm1.close:set rJM1=nothing
    rJ.close:set rJ=nothing
    rResult.close:set rResult=nothing
    db.close:set db=nothing
     
    end sub

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Tout d'abord, merci marot_r pour ton aide : J'ai essayé d'applique ce que tu as écrit mais j'ai qq difficultés :
    1° lorsque je crée la requete de création de table 'rCreerTableResultat', qu'est ce que je dois prendre comme table ou requete ? Dois-je la laissé à blanc et c'est le bout de code qui se chargera de l'alimenter ?
    2° J'ai recopier le code et j'ai activé DAO 3.6, par contre il me met un message d'erreur : "Erreur de compilation - Type défini par l'utilisateur non défini".
    3°) pourrais-tu me mettre un exemple pour l'ajout de champs
    rResult.addnew
    'ici il faut ajouter le code pour écrire les champs de la table résultat mais je n'ai pas bien saisi comment tu la veux.
    rResult.update

    D'avance merci pour votre aide,
    Cordialement,

    Nasser

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Citation Envoyé par Proview
    Bonjour,

    Tout d'abord, merci marot_r pour ton aide : J'ai essayé d'applique ce que tu as écrit mais j'ai qq difficultés :
    1° lorsque je crée la requete de création de table 'rCreerTableResultat', qu'est ce que je dois prendre comme table ou requete ? Dois-je la laissé à blanc et c'est le bout de code qui se chargera de l'alimenter ?
    Cela dépend de ce que tu veux mettre dans ta table résultat. L'idée c'est de créer une table vide, juste des champs pour enregistrer les valeurs.

    2° J'ai recopier le code et j'ai activé DAO 3.6, par contre il me met un message d'erreur : "Erreur de compilation - Type défini par l'utilisateur non défini".
    Décoche ActiveX Data Objects 2.5 library

    3°) pourrais-tu me mettre un exemple pour l'ajout de champs
    rResult.addnew
    'ici il faut ajouter le code pour écrire les champs de la table résultat mais je n'ai pas bien saisi comment tu la veux.
    rResult.update

    D'avance merci pour votre aide,
    Cordialement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    rResult.addnew
    rResult![monChampResult]= ...
    .
    rResult![monAutreChampResult]= ...
    .
    rResult![monDernierChampResult]= ...
    rResult.update
    monChampResult dépend de ce que tu veux stoquer.

    Quand je fais ce genre de truc je garde : la clef (rJ![monChampClef]), le nom du champ (f.name), valeur1 (f.value), valeur 2 (rJm1.fields(f.name).value ).

    A+

  11. #11
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Tout d'abor merci maro_r, ton aide m'a été précieuse et sans ton coup de pouce, je n'y serai pas arrivé.
    Je suis donc arrivé à ce que je voulais. Par contre au lieu de créer une ligne pour chaque champs modifié, je crée par défaut une ligne pour le fournisseur et repère les champs modifiés. Donc voilà ce que cela donne :

    Private Sub TesterModifJJm2()

    Dim db As Database: Set db = CurrentDb

    db.queryDefs("rCreerTableResultat").Execute

    Dim rJ As Recordset: Set rJ = db.OpenRecordset("rJ")
    Dim rJm1 As Recordset: Set rJm1 = db.OpenRecordset("rJm1")
    Dim rResult As Recordset: Set rResult = db.OpenRecordset("TableResultat")


    Dim f As Field
    Do While Not rJ.EOF

    If rJ![NCPT] <> rJm1![NCPT] Then
    Error (5): 'Juste une sécurité durant le débugage, ça ne doit jamais se produire.
    End If

    rResult.AddNew
    rResult![NCPT] = rJ![NCPT]

    For Each f In rJ.Fields

    If f.Value <> rJm1.Fields(f.Name).Value Or IsNull(f.Value) = False And IsNull(rJm1.Fields(f.Name).Value) = True Or IsNull(f.Value) = True And IsNull(rJm1.Fields(f.Name).Value) = False Then
    Debug.Print "Champ " & f; Name & " ds rJ : " & f.Value, " ds rJm1 : "; rJm1.Fields(f.Name).Value

    If f.Name = "LCPT" Then
    rResult![LCPT] = f.Value
    Else
    If f.Name = "LCPC" Then
    rResult![LCPC] = f.Value
    Else
    If f.Name = "RTVA" Then
    rResult![RTVA] = f.Value
    Else
    If f.Name = "CDEV" Then
    rResult![CDEV] = f.Value
    Else
    If f.Name = "DTOU" Then
    rResult![DTOU] = f.Value
    Else
    If f.Name = "DTFE" Then
    rResult![DTFE] = f.Value
    Else
    If f.Name = "CREP" Then
    rResult![CREP] = f.Value
    Else
    If f.Name = "RSOC" Then
    rResult![RSOC] = f.Value
    Else
    If f.Name = "ADE1" Then
    rResult![ADE1] = f.Value
    Else
    If f.Name = "ADE2" Then
    rResult![ADE2] = f.Value
    Else
    If f.Name = "CPOS" Then
    rResult![CPOS] = f.Value
    Else
    If f.Name = "VILL" Then
    rResult![VILL] = f.Value
    Else
    If f.Name = "LPAY" Then
    rResult![LPAY] = f.Value
    Else
    If f.Name = "MREG" Then
    rResult![MREG] = f.Value
    Else
    If f.Name = "EDEP" Then
    rResult![EDEP] = f.Value
    Else
    If f.Name = "ECDT" Then
    rResult![ECDT] = f.Value
    Else
    If f.Name = "NBJO" Then
    rResult![NBJO] = f.Value
    Else
    If f.Name = "ECTE" Then
    rResult![ECTE] = f.Value
    Else
    If f.Name = "TIRG" Then
    rResult![TIRG] = f.Value
    Else
    If f.Name = "ZP06" Then
    rResult![ZP06] = f.Value
    Else
    If f.Name = "PAYS" Then
    rResult![PAYS] = f.Value
    Else
    If f.Name = "LBQE" Then
    rResult![LBQE] = f.Value
    Else
    If f.Name = "ADRB" Then
    rResult![ADRB] = f.Value
    Else
    If f.Name = "CBQE" Then
    rResult![CBQE] = f.Value
    Else
    If f.Name = "CGUI" Then
    rResult![CGUI] = f.Value
    Else
    If f.Name = "COMP" Then
    rResult![COMP] = f.Value
    Else
    If f.Name = "CRIB" Then
    rResult![CRIB] = f.Value
    Else
    If f.Name = "IDCE" Then
    rResult![IDCE] = f.Value
    Else
    If f.Name = "CBAP" Then
    rResult![CBAP] = f.Value
    Else
    If f.Name = "CBLC" Then
    rResult![CBLC] = f.Value
    Else
    If f.Name = "BLCR" Then
    rResult![BLCR] = f.Value
    Else
    If f.Name = "NBQE" Then
    rResult![NBQE] = f.Value
    Else
    If f.Name = "ABQE" Then
    rResult![ABQE] = f.Value
    Else
    If f.Name = "CPBE" Then
    rResult![CPBE] = f.Value
    Else
    If f.Name = "VIBE" Then
    rResult![VIBE] = f.Value
    Else
    If f.Name = "NCPE" Then
    rResult![NCPE] = f.Value
    Else
    If f.Name = "SWIF" Then
    rResult![SWIF] = f.Value

    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If


    End If

    Next f
    rResult.Update
    rJ.MoveNext
    rJm1.MoveNext
    Loop

    rJm1.Close: Set rJm1 = Nothing
    rJ.Close: Set rJ = Nothing
    rResult.Close: Set rResult = Nothing
    db.Close: Set db = Nothing

    End Sub


    Voilà je pense que cela pourrait aider d'autre personne dans mon cas.

    Cependant j'aurai une autre question : Le résultat me donne une table avec un certain nombre de fournisseurs avec tous les champs à blanc.
    J'ai essayé de faire une requête en utilisant la fonction "est null" mais cela reste limité. Y aurait-il un moyen plus fiable d'éliminer toutes les lignes fournisseurs dont tous les champs sont à blanc ?

    Encore merci

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Beau résultat.

    Je me permet de te faire quelques suggestions d'amélioration :

    1) Quand j'ai une série de if imbriqués comme la tienne, moi je préfère utiliser l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select case toto
        case cas1
           'faire quelque chose
     
        case cas2
           'faire quelque chose d'autre
     
        case else
           'Faire tout autre chose ou message d'erreur si ce cas n'est pas possible (ex : Error(5)) pour vérifier que je n'ai pas manquer un cas au dessus
     
    end select
    Je trouve que cela rend le code plus lisible et plus facile à maintenir.

    2) Dans ton cas particulier puisque les noms de champs sont les même des deux côtés, j'aurai remplacer toute ma série de if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If f.Name = "LCPT" Then 
       rResult![LCPT] = f.Value
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rResult.fields(f.name)=f.value.
    comme cela si tu ajoute ou retire un champ ton code marche toujours et cela fait aussi moins de code à taper.

    3) Il est recommandé d'indenter le code à l'intérieur des if..end if, for..next, do..loop, select case..end select, etc.

    A+

  13. #13
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Euh là, tu y va un peu fort sur les if end if. Essaye de procédurer ton code en créant des fonctions réutilisable parce que là, c'est pas forcément trés pratique.

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

Discussions similaires

  1. [AC-2010] Requete de comparaison pour tous les champs entres 2 tables
    Par helico57570 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 03/04/2014, 12h56
  2. Comparaison champs entre deux tables
    Par Echizen1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/11/2007, 08h31
  3. mise à jour automatique de champs entre 2 tables
    Par romdyane dans le forum Access
    Réponses: 5
    Dernier message: 11/10/2005, 18h51
  4. [C#] Remplir une combobox avec le champs d'une table Access
    Par Damsou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/06/2005, 15h31
  5. Ajouter un champs dans une table (Access 2000)
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/10/2004, 13h02

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