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 :

Comparer tous les champs de 2 tables et enregistrer les écarts [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Assistante Service Approvisionnement
    Inscrit en
    Décembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistante Service Approvisionnement
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 44
    Points : 20
    Points
    20
    Par défaut Comparer tous les champs de 2 tables et enregistrer les écarts
    Bonjour à tous,
    Autodidacte en vba, je sèche sur un travail et apprécierais beaucoup votre aide.
    On me demande:
    dans une grosse base access, mise à jour quotidiennement, de comparer tous les champs d'une table (25 champs, 47000 enregistrements environ) entre la veille et aujourd'hui, sans prendre en compte les nouveaux enregistrements et ceux qui ont pu être supprimés.
    De reporter dans une table de suivi(traçabilité), tous les champs qui ne sont pas identiques en y ajoutant un champ "DateModif" = date du jour -1 (en jours ouvrés), Le champs Commentaire sera renseigné à l'analyse de la table de suivi.
    L'idéal est d'obtenir une table du Style
    Référence DateModif ChampModif ié ValYesterday ValToday Commentaire
    T06773 15/11/2015 Description Chocolat Caramel
    T06775 01/12/2015 Fabricant CC CCCCCCC
    T06776 09/12/2015 Nomenclature 090-011930 B090-011930 Nouvelle norme
    T06777 10/12/2015 Fabricant AAAAA BBBBBBBBBB

    Vous remerciant par avance de toute l'aide que vous pourrez m'apporter

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Bonjour,
    Citation Envoyé par Fleur59 Voir le message
    comparer tous les champs d'une table (25 champs, 47000 enregistrements environ) entre la veille et aujourd'hui, sans prendre en compte les nouveaux enregistrements et ceux qui ont pu être supprimés.
    Pour avoir cette info, le mieux est d'utiliser un champ date_modif au niveau de la table et de créer un journal des modifs à l'écriture des infos
    Comme il semble que cela n'a pas été prévu, j'imagine qu'il y a au moins une clé principale sur la table
    Si oui, il faut disposer de l'ancienne table et de la nouvelle dans la même base pour faire une jointure sinon ça complique
    Il est alors inutile de créer une table des différences puisque les infos sont déjà toutes dans la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... from t1 inner join t2 on t1.cle=t2.cle where t1.qte<>t2.qte or t1.desc<>t2.desc or ...

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    Si tu as :
    - Les anciennes données dans la table : T_Donnees_Anciens
    - La nouvelle table : T_Donnees_Nx
    - Le champ reference comme identifiant de tes données

    Le code suivant devrait te permettre de faire ce que tu veux :
    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
    Dim rstT_Ancien As DAO.Recordset
    Dim rstT_Nx As DAO.Recordset
    Dim fld As DAO.Field
    Dim strcrit As String, nomchamp As Variant
    Dim i As Integer
    Dim strsql As String
    i = 1
    Set rstT_Ancien = CurrentDb.OpenRecordset("T_Donnees_Anciens", dbOpenSnapshot)
    Set rstT_Nx = CurrentDb.OpenRecordset("T_Donnees_Nx", dbOpenSnapshot)
    For Each fld In rstT_Ancien.Fields 'Parcourir les champs de la table des anciennes données
        If fld.Name <> "reference" Then 'exclure le champ reference
            rstT_Ancien.MoveFirst
            While Not rstT_Ancien.EOF 'Parcourir les données du champ
                'Debug.Print fld.Value
                With rstT_Nx 'Retrouver la valeur
                    If IsNumeric(fld.Value) Then 'Critère Différent selon valeurs du champ
                        strcrit = "[reference]=" & rstT_Ancien![Reference] & " AND [" & fld.Name & "]<>" & fld.Value
                    Else
                        strcrit = "[reference]=" & rstT_Ancien![Reference] & " AND [" & fld.Name & "]<>""" & fld.Value & """"
                    End If
     
                    .FindFirst strcrit 'Chercher la ligne dans l'ancienne base
                    If Not .NoMatch Then ' Si trouvé insérer dans la table de suivi
                        'Debug.Print i, rstT_Nx![Reference], rstT_Nx(fld.Name), fld.Value
                        'i = i + 1
                        strsql = "INSERT INTO T_Suivi ( Reference, DateModif, ChampModifie, ValYesterday, ValToday )" _
                            & " VALUES (" & rstT_Nx![Reference] & ",#" & Format(DateAdd("d", -1, Date), "yyyy/mm/dd") & "#,""" & fld.Name & """,""" & fld.Value & """,""" & rstT_Nx(fld.Name) & """)"
                        CurrentDb.Execute strsql, dbFailOnError
     
                    End If
                End With
                rstT_Ancien.MoveNext
            Wend
        End If
    Next fld
    Me.Sf_Suivi.Form.Requery
    rstT_Nx.Close: Set rstT_Nx = Nothing
    rstT_Ancien.Close: Set rstT_Ancien = Nothing
    La base exemple est jointe :M_Rech_Valeurs_Changees_table.zip

    Cordialement.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Assistante Service Approvisionnement
    Inscrit en
    Décembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistante Service Approvisionnement
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 44
    Points : 20
    Points
    20
    Par défaut
    Bonjour Madefemere,
    MERCI pour cette première très grande avancée.
    A l'application sur ma base, je debug sur
    " .FindFirst strcrit 'Chercher la ligne dans l'ancienne base"
    avec le message
    "Le moteur de la base de données Microsoft Office Access ne reconnaît pas "T02069" en tant que nom de champ ou expression correcte"

    T02069 est ma première référence dans les tables. (j'ai dû oublier de dire que ma référence est alphanumérique)
    J'avais un masque de saisie dans ma table initiale que j'ai supprimé dans les tables anciens et nx
    J'ai aussi mis la clef primaire sur la table ancien comme dans ton exemple.

    Qu'est ce qui peut me bloquer maintenant?
    Merci de votre aide

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir Fleur,

    Si tes "reference" sont alphanumérique, il faut les mettre entre "quotes" quand tu y fais référence.
    De la sorte :
    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
    Dim rstT_Ancien As DAO.Recordset
    Dim rstT_Nx As DAO.Recordset
    Dim fld As DAO.Field
    Dim strcrit As String, nomchamp As Variant
    Dim i As Integer
    Dim strsql As String
    i = 1
    Set rstT_Ancien = CurrentDb.OpenRecordset("T_Donnees_Anciens", dbOpenSnapshot)
    Set rstT_Nx = CurrentDb.OpenRecordset("T_Donnees_Nx", dbOpenSnapshot)
    For Each fld In rstT_Ancien.Fields 'Parcourir les champs de la table des anciennes données
        If fld.Name <> "reference" Then 'exclure le champ reference
            rstT_Ancien.MoveFirst
            While Not rstT_Ancien.EOF 'Parcourir les données du champ
                'Debug.Print fld.Value
                With rstT_Nx 'Retrouver la valeur
                    If IsNumeric(fld.Value) Then 'Critère Différent selon valeurs du champ
                        strcrit = "[reference]=""" & rstT_Ancien![Reference] & """ AND [" & fld.Name & "]<>" & fld.Value
                    Else
                        strcrit = "[reference]=""" & rstT_Ancien![Reference] & """ AND [" & fld.Name & "]<>""" & fld.Value & """"
                    End If
     
                    .FindFirst strcrit 'Chercher la ligne dans l'ancienne base
                    If Not .NoMatch Then ' Si trouvé insérer dans la table de suivi
                        'Debug.Print i, rstT_Nx![Reference], rstT_Nx(fld.Name), fld.Value
                        'i = i + 1
                        strsql = "INSERT INTO T_Suivi ( Reference, DateModif, ChampModifie, ValYesterday, ValToday )" _
                            & " VALUES (""" & rstT_Nx![Reference] & """,#" & Format(DateAdd("d", -1, Date), "yyyy/mm/dd") & "#,""" & fld.Name & """,""" & fld.Value & """,""" & rstT_Nx(fld.Name) & """)"
                        CurrentDb.Execute strsql, dbFailOnError
     
                    End If
                End With
                rstT_Ancien.MoveNext
            Wend
        End If
    Next fld
    Me.Sf_Suivi.Form.Requery
    rstT_Nx.Close: Set rstT_Nx = Nothing
    rstT_Ancien.Close: Set rstT_Ancien = Nothing
    Cordialement,

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 926
    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 926
    Points : 4 843
    Points
    4 843
    Par défaut
    Bonsoir, Fleur59
    As-tu correctement adapté le code de madefemere à ton cas ?
    Notamment dans plusieurs endroits il faut traduire que ta clé référence est alpha.
    Le plus simple et rapide serait de poster ton code pour le vérifier.

    Cordialement,

  7. #7
    Membre à l'essai
    Femme Profil pro
    Assistante Service Approvisionnement
    Inscrit en
    Décembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistante Service Approvisionnement
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 44
    Points : 20
    Points
    20
    Par défaut
    Bonsoir à tous
    Merci Micniv de m'avoir rappelé de bien regarder partout, il y avait effectivement des résidus non modifiés.
    Je pense pouvoir adapter complètement ce module à ma base assez rapidement la semaine prochaine.
    Je vous tiens au courant rapidement.
    GRAND MERCI de l'intérêt que vous m'avez apporté

  8. #8
    Membre à l'essai
    Femme Profil pro
    Assistante Service Approvisionnement
    Inscrit en
    Décembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistante Service Approvisionnement
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 44
    Points : 20
    Points
    20
    Par défaut
    Bonjour à tous
    Voilà, les modifications sont implémentées et cela à bien fonctionné pour 12000 lignes environ (sur 530000)
    Il me reste un souci découvert en effectuant un pas à pas
    Certains de mes champs texte (4 champs) contiennent des quotes dans les valeurs (permet de raccourcir le mot inch=")
    Donc cela perturbe le code, auriez-vous une idée pour debugger ce problème sans modifier les données de la table initiale?

    A la rigueur, je pourrais supprimer ces quotes avant de lancer l'application dans la création de mes tables à comparer.

    Voici le sql de la table ST2-ancien (la deuxième est identique pour ST1-nouveau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT STOCK_TRACKING.Part_Number, STOCK_TRACKING.Part_Type, STOCK_TRACKING.Description_FR, STOCK_TRACKING.Description_UK, STOCK_TRACKING.Spec, STOCK_TRACKING.Supplier_Code, STOCK_TRACKING.Plant_Code, STOCK_TRACKING.UOM, STOCK_TRACKING.Standard_Price, STOCK_TRACKING.Currency, STOCK_TRACKING.Lead_Time, STOCK_TRACKING.Shelf_Control_Number, STOCK_TRACKING.Storage_Location, STOCK_TRACKING.Users, STOCK_TRACKING.Order_Stop_Reason, STOCK_TRACKING.Order_Stop_Comment, STOCK_TRACKING.Manufact INTO ST1
    FROM STOCK_TRACKING
    WHERE (((STOCK_TRACKING.Master)=True))
    GROUP BY STOCK_TRACKING.Part_Number, STOCK_TRACKING.Part_Type, STOCK_TRACKING.Description_FR, STOCK_TRACKING.Description_UK, STOCK_TRACKING.Spec, STOCK_TRACKING.Supplier_Code, STOCK_TRACKING.Plant_Code, STOCK_TRACKING.UOM, STOCK_TRACKING.Standard_Price, STOCK_TRACKING.Currency, STOCK_TRACKING.Lead_Time, STOCK_TRACKING.Shelf_Control_Number, STOCK_TRACKING.Storage_Location, STOCK_TRACKING.Users, STOCK_TRACKING.Order_Stop_Reason, STOCK_TRACKING.Order_Stop_Comment, STOCK_TRACKING.Manufact
    ORDER BY STOCK_TRACKING.Part_Number, STOCK_TRACKING.Shelf_Control_Number;
    Je vous remercie de l'aide que vous pourrez m'apporter

    Fleur59

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    J'ai essayé de prendre la précaution dans le code générique pour éviter l'erreur, mais a priori ce n'était pas suffisant.

    Il faudrait doubler les guillemets dans les paramètres comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... & """" & replace(MaChaîneParametre, """", """""") & """" & ...
    Astuce donnée par marot_r dans la discussion ci-jointe : http://www.developpez.net/forums/d15...-requetes-sql/

    Il y a aussi la fonction générique proposée dans la contribution.

    Cordialement,

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2015, 10h52
  2. Comment convertir les champs d'une table en enregistrements
    Par belaggoun2000 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/01/2015, 11h49
  3. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31
  4. Retrouver tous les champs d'une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2004, 20h40
  5. Afficher tous les champs d'une table avec dbexpress et MySQL
    Par LHT dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2004, 17h11

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