OVH Cloud OVH Cloud

SVP : comment comparer le contenu de 2 tables

10 réponses
Avatar
Jmimi
Salut

Je m'explique:

J'ai deux tables avec des structures identiques

Je veux comparer les données

Afin de voir ce qui a évoluer

Merci pour toute aide

10 réponses

Avatar
Raymond
Bonsoir.

pour comparer deux tables identiques en tant que données risque d'être
fastidieux car les données changent en permanence. Il faut que tu fasses une
requête avec tes deux tables en relation avec la même clé et comparer champ
par champ. cette requête peut être créée automatiquement en vba en lisant
toutes les tables et en prenant tous les champs. ça va vite devenir
inexploitable à moins de ne sélectionner que quelques champs.

pour comparer les structures des tables, tu as un exemple en téléchargement
sur http://access.seneque.free.fr/utilitaires_et_gadgets.htm N° 6
--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"Jmimi" a écrit dans le message de
news:
Salut

Je m'explique:

J'ai deux tables avec des structures identiques

Je veux comparer les données

Afin de voir ce qui a évoluer

Merci pour toute aide





Avatar
Anor
Bonjour?

| Non ce sont des tables qui ne bougent qu'une fois par mois
| et justement je voudrais voir quelles lignes ont étés modifiées du
| premier coup d'oeil

Voici une proposition avec une simple requête SQL.
(j'avais de l'imagination ce soir, mais je suis assez fier du résultat ;-))

Préliminaire : soit tu peux ne retenir que quelques champs importants pour effectuer la
comparaison,
au risque de passer à côté de quelques modifs que l'on pourra qualifier de moindre importance,

soit tu veux tout savoir de la moindre modif, donc tu as besoin de 100% des champs, et le code
SQL est alors facilement modifiable.
Dans l'exemple ci-dessous, je ne fais le test que sur 3 champs, mais rien ne nous empêche d'en
ajouter d'autres.

Le résultat ne laissera apparaître que les 2 enregistrements qui diffèrent, précédés d'un
identifiant Table1 ou Table2
selon la table de laquelle il est issu :

SELECT "Table1:" AS [Situé dans ], *
FROM LaTable1
WHERE ([Champ1] & [Champ2] & [Champ3])
Not In (SELECT [Champ1] & [Champ2] & [Champ3]
AS Concatenation FROM LaTable2;)
UNION SELECT "Table2:" AS [Situé dans ], *
FROM LaTable2
WHERE ([Champ1] & [Champ2] & [Champ3])
Not In (SELECT [Champ1] & [Champ2] & [Champ3]
AS Concatenation FROM LaTable1;);

Voilà si Christian ATZEL (ou plutôt ChrisTAN d'après l'alias utilisé ;-)))
veut commencer à bâtir la FAQ de MPFA,
en regardant sur Google, on doit en voir plein des propositions toutes
aussi différentes les unes des autres pour une question finalement toujours identique !!!

Espérant avoir aidé

--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------
Avatar
Raymond
Bonsoir Arnaud.

Requête testée, rien à redire !

sauf peut-être que si tu trouvais un moyen pour que l'enregistrement de la
table2 soit à côté de l'enregistrement de la table1 , c'est-à-dire que si un
petit order by sur la clé primaire des deux tables pouvait se glisser en fin
de requête union, je crois que ce serait parfait maintenant. Qu'en penses-tu
? ça éviterait de trier la colonne manuellement !

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"Anor" a écrit dans le message de
news:3f281055$0$22108$
Bonjour?

| Non ce sont des tables qui ne bougent qu'une fois par mois
| et justement je voudrais voir quelles lignes ont étés modifiées du
| premier coup d'oeil

Voici une proposition avec une simple requête SQL.
(j'avais de l'imagination ce soir, mais je suis assez fier du résultat
;-))


Préliminaire : soit tu peux ne retenir que quelques champs importants pour
effectuer la

comparaison,
au risque de passer à côté de quelques modifs que l'on pourra qualifier de
moindre importance,


soit tu veux tout savoir de la moindre modif, donc tu as besoin de 100%
des champs, et le code

SQL est alors facilement modifiable.
Dans l'exemple ci-dessous, je ne fais le test que sur 3 champs, mais rien
ne nous empêche d'en

ajouter d'autres.

Le résultat ne laissera apparaître que les 2 enregistrements qui
diffèrent, précédés d'un

identifiant Table1 ou Table2
selon la table de laquelle il est issu :

SELECT "Table1:" AS [Situé dans ], *
FROM LaTable1
WHERE ([Champ1] & [Champ2] & [Champ3])
Not In (SELECT [Champ1] & [Champ2] & [Champ3]
AS Concatenation FROM LaTable2;)
UNION SELECT "Table2:" AS [Situé dans ], *
FROM LaTable2
WHERE ([Champ1] & [Champ2] & [Champ3])
Not In (SELECT [Champ1] & [Champ2] & [Champ3]
AS Concatenation FROM LaTable1;);

Voilà si Christian ATZEL (ou plutôt ChrisTAN d'après l'alias utilisé
;-)))

veut commencer à bâtir la FAQ de MPFA,
en regardant sur Google, on doit en voir plein des propositions toutes
aussi différentes les unes des autres pour une question finalement
toujours identique !!!


Espérant avoir aidé

--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------




Avatar
Anor
Bonjour Raymond

Merci pour ton avis : j'ai trouvé ça tellement simple que je me demandais pourquoi on n'y avait
pas pensé plus tôt !!

Pour la position, je m'en suis rendu compte juste après avoir posté.

Je me suis rendu compte aussi que dans le cas où une modif d'un enregistrement,
ce dernier devient justement identique à un autre de l'autre table, on ne le voit plus
apparaître,
d'où l'intérêt de mettre un maximum de champs dans la concaténation.

Ah oui : on peut afficher un champ Memo, et quelques autres OLE, mais pas de concaténation
dessus !!

Bon pour le tri, si Champ0 est la clé primaire de la table, on rajoute un OrderBy à la fin :

SELECT "Table1" AS [Situé dans ], *
FROM Table1
WHERE ([Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] & [Champ6] & [Champ7] &
[Champ8] & [Champ9])
Not In
(SELECT [Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] & [Champ6] & [Champ7] &
[Champ8] & [Champ9] AS Concatenation FROM Table2;)
UNION
SELECT "Table2" AS [Situé dans ], *
FROM Table2
WHERE ([Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] & [Champ6] & [Champ7] &
[Champ8] & [Champ9])
Not In
(SELECT [Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] & [Champ6] & [Champ7] &
[Champ8] & [Champ9] AS Concatenation FROM Table1;)
ORDER BY ([Champ0]);

Voilà,
Si ça plaît à Raymond, alors je rajoute ça sur mon site ;-))

--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------

| Bonsoir Arnaud.
|
| Requête testée, rien à redire !
|
| sauf peut-être que si tu trouvais un moyen pour que l'enregistrement
| de la table2 soit à côté de l'enregistrement de la table1 ,
| c'est-à-dire que si un petit order by sur la clé primaire des deux
| tables pouvait se glisser en fin de requête union, je crois que ce
| serait parfait maintenant. Qu'en penses-tu ? ça éviterait de trier la
| colonne manuellement !
|
| "Anor" a écrit dans le message de
| news:3f281055$0$22108$
|| Bonjour?
||
||| Non ce sont des tables qui ne bougent qu'une fois par mois
||| et justement je voudrais voir quelles lignes ont étés modifiées du
||| premier coup d'oeil
||
|| Voici une proposition avec une simple requête SQL.
|| (j'avais de l'imagination ce soir, mais je suis assez fier du
|| résultat ;-))
||
|| Préliminaire : soit tu peux ne retenir que quelques champs
|| importants pour effectuer la comparaison,
|| au risque de passer à côté de quelques modifs que l'on pourra
|| qualifier de moindre importance,
||
|| soit tu veux tout savoir de la moindre modif, donc tu as besoin de
|| 100% des champs, et le code SQL est alors facilement modifiable.
|| Dans l'exemple ci-dessous, je ne fais le test que sur 3 champs, mais
|| rien ne nous empêche d'en ajouter d'autres.
||
|| Le résultat ne laissera apparaître que les 2 enregistrements qui
|| diffèrent, précédés d'un identifiant Table1 ou Table2
|| selon la table de laquelle il est issu :
||
|| SELECT "Table1:" AS [Situé dans ], *
Avatar
Raymond
ça me plait et je crois que ça va plaire à jmimi.
il y a peu de chances de retrouver 2 enregistrements identiques à cause des
modifs , surtout sur une exécution mensuelle.

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"Anor" a écrit dans le message de
news:3f281d92$0$22112$
Bonjour Raymond

Merci pour ton avis : j'ai trouvé ça tellement simple que je me demandais
pourquoi on n'y avait

pas pensé plus tôt !!

Pour la position, je m'en suis rendu compte juste après avoir posté.

Je me suis rendu compte aussi que dans le cas où une modif d'un
enregistrement,

ce dernier devient justement identique à un autre de l'autre table, on ne
le voit plus

apparaître,
d'où l'intérêt de mettre un maximum de champs dans la concaténation.

Ah oui : on peut afficher un champ Memo, et quelques autres OLE, mais pas
de concaténation

dessus !!

Bon pour le tri, si Champ0 est la clé primaire de la table, on rajoute un
OrderBy à la fin :


SELECT "Table1" AS [Situé dans ], *
FROM Table1
WHERE ([Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] &
[Champ6] & [Champ7] &

[Champ8] & [Champ9])
Not In
(SELECT [Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] &
[Champ6] & [Champ7] &

[Champ8] & [Champ9] AS Concatenation FROM Table2;)
UNION
SELECT "Table2" AS [Situé dans ], *
FROM Table2
WHERE ([Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] &
[Champ6] & [Champ7] &

[Champ8] & [Champ9])
Not In
(SELECT [Champ0] & [Champ1] & [Champ2] & [Champ3] & [Champ4] & [Champ5] &
[Champ6] & [Champ7] &

[Champ8] & [Champ9] AS Concatenation FROM Table1;)
ORDER BY ([Champ0]);

Voilà,
Si ça plaît à Raymond, alors je rajoute ça sur mon site ;-))

--
à+


Avatar
Anor
Resoir

| ça me plait et je crois que ça va plaire à jmimi.
| il y a peu de chances de retrouver 2 enregistrements identiques à
| cause des modifs , surtout sur une exécution mensuelle.
|

Je crois que Françoise serait fière de moi si elle voyait ça ;-)

J'ai immortalisé ce coup de génie (il faut bien se lancer des fleurs ;-))
ici :
http://perso.wanadoo.fr/anor.fr.st/queries.htm#TblCompare

Il ne reste plus qu'à trouver un moyen pour dire quel champ est différent
mais là je laisse la main !!
--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------
Avatar
Jmimi
Cool

vais essayer ca demain

merçi pour votre aide

je vous tiendrais au courant

Jmimi

"Anor" a écrit dans le message de news:
3f2824b9$0$22139$
Resoir

| ça me plait et je crois que ça va plaire à jmimi.
| il y a peu de chances de retrouver 2 enregistrements identiques à
| cause des modifs , surtout sur une exécution mensuelle.
|

Je crois que Françoise serait fière de moi si elle voyait ça ;-)

J'ai immortalisé ce coup de génie (il faut bien se lancer des fleurs ;-))
ici :
http://perso.wanadoo.fr/anor.fr.st/queries.htm#TblCompare

Il ne reste plus qu'à trouver un moyen pour dire quel champ est différent
mais là je laisse la main !!
--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------





Avatar
Raymond
Je crois que Françoise serait fière de moi si elle voyait ça ;-)


Elle le sera demain, tu verras.

J'ai immortalisé ce coup de génie (il faut bien se lancer des fleurs ;-))
C'est beau le temps réel.


Il ne reste plus qu'à trouver un moyen pour dire quel champ est différent
mais là je laisse la main !!


Il faut attendre la prochaine demande.

Ce qu'il faudra faire en revanche, c'est générer entièrement la requête en
vba et l'exécuter immédiatement, en sélectionnant certains champs sur un
formulaire.
--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"Anor" a écrit dans le message de
news:3f2824b9$0$22139$

Avatar
Anor
Bonjour Raymond


| Ce qu'il faudra faire en revanche, c'est générer entièrement la
| requête en vba et l'exécuter immédiatement, en sélectionnant certains
| champs sur un formulaire.

Pourquoi pas, mais tu sais,
Moi je suis le motoriste, et mon moteur semble opérationnel.

Maintenant, si des fabricant de chassis veulent l'adapter
sur leur monture, ils peuvent ...

;-)
--
à+
Arnaud
----------------------------------------------
Conseils d'utilisation, sites recommandés :
http://users.skynet.be/mpfa/
Access Memorandum - Les tablettes d'Anor
www.anor.fr.st
----------------------------------------------
Avatar
Jmimi
Ca marche nikel

c'est exactement ce que je voulais

merçi encore

Jmimi