[Access/SQL] Comparaison de tables

Comparaison de tables [Access/SQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-02-2015 à 00:03:12    

Bonjour  :hello:
 
J'ai une procédure à mettre en place et je sèche un peu
en fait j'ai un tableau excel (12000 lignes et 20 colonnes) mis à jour quotidiennement
 
j'aimerais comparer les tableaux chaque jours (J-1 avec J)
ils ont donc les mêmes colonnes avec la colonne 1 qui est le numéro (ID) de contrats
 
l'objectif :
obtenir 3 nouveaux tableaux :
1) la liste des nouveaux contrats (ceux qui sont en J mais qui n'étaient pas en J-1) avec leurs paramètres respectifs (les valeurs de toutes les colonnes)
2) la liste des contrats supprimés (ceux qui étaient en J-1 mais qui ne sont plus en J) avec leurs paramètres respectifs (les valeurs de toutes les colonnes)
3) la liste des modifications sur les contrats (contrats présents en J-1 et J mais où une valeur dans au moins une colonne a été modifiée entre les 2 dates)
=> pour ce dernier tableau il y aurait pour chaque contrat modifié entre les 2 dates, une ligne par paramètres qui a changé
ex : si le contrat XXX a eu la colonne 2 qui est passé de A à B et la colonne 7 qui est passé de C à D et le contrat YYY a eu colonne 6 passé de E à F ça m'afficherait quelque chose comme :
 
ID          intitulé de la colonne             J-1                  J
XXX                     2                                 A                   B
XXX                     7                                 C                   D
YYY                      6                                 E                   F
 
en VBA à mon avis c'est trop long car faudrait qu'il cherche 12000 lignes dans 12000 lignes et regarde les 20 colonne s'il trouve..
du coup je penche plus pour access mais je sais vraiment pas comment faire
 
j'ai vu qu'on pouvait utiliser un assistant de requete de non correspondance (ca serait pour les 2 premiers tableaux ??)
j'ai vu qu'il faudrait faire un lien à gauche sur la jointure numéro (ID) du contrat pour avoir le premier tableau
et un lien à droite sur la jointure pour avoir le second tableau
mais je trouve pas comment faire pour qu'il m'affiche tous les paramètres quand il trouve pas de correspondance sur les ID de la première colonne :/  
 
pour le troisième tableau je sais vraiment pas par contre, j'aimerais éviter de passer par du VB accès que je ne vraiment maitrise pas bien
 
donc voilà si quelqu'un avait une idée pour ces 3 requêtes je lui en serait éternellement reconnaissant  [:jean-michel platini:3]  
 
thx

Reply

Marsh Posté le 27-02-2015 à 00:03:12   

Reply

Marsh Posté le 27-02-2015 à 07:47:08    

Si tu as la possibilité de changer la mise a jour du tableau:
1) Ajouter une colonne "DateCreation"
2) Utiliser une suppression logique, donc une colonne avec DateSuppression qui n'est remplie qu'en cas de suppression, et nettoyer de temps en temps.
3) Ajouter un colonne "DerniereModification" (tu dois quand même comparer les 20 colonnes mais au moins tu ne le fais que sur les modifs)
 

Reply

Marsh Posté le 27-02-2015 à 09:35:21    

Oliiii a écrit :

Si tu as la possibilité de changer la mise a jour du tableau:
1) Ajouter une colonne "DateCreation"
2) Utiliser une suppression logique, donc une colonne avec DateSuppression qui n'est remplie qu'en cas de suppression, et nettoyer de temps en temps.
3) Ajouter un colonne "DerniereModification" (tu dois quand même comparer les 20 colonnes mais au moins tu ne le fais que sur les modifs)
 


 
Merci de ton aide mais je préférerais eviter d'ajouter des colonnes en effet
:jap:

Reply

Marsh Posté le 27-02-2015 à 21:42:39    

HeisenberG75 a écrit :


en VBA à mon avis c'est trop long car faudrait qu'il cherche 12000 lignes dans 12000 lignes et regarde les 20 colonne s'il trouve..


Tu peux pas tout simplement classer les deux tableaux par numero de contrat? Ca rend la comparaison bien plus simple (un seul parcours des deux tableaux en parallele):  
- un index pour J qui demarre a 1
- un pour J-1 qui demarre a 1
- tu compares les deux numeros de contrats entre J et J-1:
  - si c'est le meme contrat, tu compares les 20 autres champs et tu remplis ton troisieme tableau en consequence, puis tu incrementes tes deux indexs
  - si le num de contrat en J est plus petit que celui en J-1, c'est un nouveau contrat: tu remplis ton premier tableau et incremente l'index de J
  - si le num de contrat en J-1 est plus petit que celui en J, c'est un contrat supprime: tu remplis ton premier tableau et incremente l'index de J-1
- tu repetes ca jusqu'a arriver a la fin d'un des deux tableaux, puis tu "finis" en consequence:
  - si tu arrives a la fin de J, alors tout ce qui "reste" en J-1 c'est des contrats supprimes
  - si tu arrives a la fin de J-1, alors tout ce qui "reste" en J c'est des nouveaux contrats
 
Fait comme ca ca m'a vraiment pas l'air insurmontable.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 27-02-2015 à 21:54:04    

Sinon pour les requetes en elle-meme.
 
Pour les nouveaux contrats (oui je sais, select * c'est le mal, etc.):

SELECT *
FROM tableJ
WHERE id NOT IN (SELECT id FROM tableJMoins1);


ou bien

SELECT *
FROM tableJ tj
LEFT OUTER JOIN tableJMoins1 tjm1 ON tj.id = tjm1.id
WHERE tjm1.id IS NULL;


 
Pour les contrats supprimes: meme requete en inversant les tables
 
Pour les differences: je suis pas sur que ca soit facilement faisable sans faire une requete par champ a verifier. Genre ca, une fois par champ:

SELECT tj.ID, tjm1.champ_verifie, tj.champ_verifie
FROM tableJ tj
JOIN tableJMoins1 tjm1 ON tj.id = tjm1.id
WHERE tjm1.champ_verifie <> tj.champ_verifie;


Message édité par lasnoufle le 27-02-2015 à 21:54:48

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 28-02-2015 à 12:13:01    

lasnoufle a écrit :


Tu peux pas tout simplement classer les deux tableaux par numero de contrat? Ca rend la comparaison bien plus simple (un seul parcours des deux tableaux en parallele):
- un index pour J qui demarre a 1
- un pour J-1 qui demarre a 1
- tu compares les deux numeros de contrats entre J et J-1:
  - si c'est le meme contrat, tu compares les 20 autres champs et tu remplis ton troisieme tableau en consequence, puis tu incrementes tes deux indexs
  - si le num de contrat en J est plus petit que celui en J-1, c'est un nouveau contrat: tu remplis ton premier tableau et incremente l'index de J
  - si le num de contrat en J-1 est plus petit que celui en J, c'est un contrat supprime: tu remplis ton premier tableau et incremente l'index de J-1
- tu repetes ca jusqu'a arriver a la fin d'un des deux tableaux, puis tu "finis" en consequence:
  - si tu arrives a la fin de J, alors tout ce qui "reste" en J-1 c'est des contrats supprimes
  - si tu arrives a la fin de J-1, alors tout ce qui "reste" en J c'est des nouveaux contrats

 

Fait comme ca ca m'a vraiment pas l'air insurmontable.


merci pour ta réponse
j'ai déja écrit un programme VBA comme ca mais c'est super long et mon excel plante à chaque fois  [:silvershaded]
les contrats ont des numéros genre PIMCO-02 ou 12051 (mélange de lettres et chiffres ou que chiffres)

 

en gros ce serait un truc comme ca :

 
Code :
  1. for i=2 to tableJ.range("A50000" ).end(xlup).row
  2.       for j=2 to tableJ-1.range("A50000" ).end(xlup).row
  3.           if tableJ.range("A" & i) = tableJ-1.range("A" & j) then
  4.                for colonne = 2 to tableJ.range("A1" ).end(xltoright).column
  5.                   if tableJ.cells(i,colonne) <> tableJ-1.cells(j,colonne) then
  6.                        je mets la diff dans le tableau 3
 

sauf que c'est super long
i (table J) passerait en revu 12000 noms de contrats
puis testerait les contrats table J-1 jusqu'à qu'il trouve (je mets un exit for quand meme :o)
une fois qu'il a trouvé il doit checker les 20 colonnes avec la troisième boucle et ensuite remplir un tableau de différence

 

je pense que c'est beaucoup trop long :/

 

merci pour les requetes, j'avais réussi pour les 2 premieres tables avec l'assistant de requete de non correspondance
mais c'est sur la table des différences que je sèche complétement
ou alors faudrait que je fasse une requete par colonne et que je trouve un moyen de tout rassembler dans une table après mais je suis naze en access :D


Message édité par HeisenberG75 le 28-02-2015 à 12:26:41
Reply

Marsh Posté le 02-03-2015 à 08:49:51    

Encore quelques jours d'essai et tu changeras d'avis sur l'ajout de colonnes :)
 
Ajouter des colonnes = 5 mins de boulot.
Le faire autrement = des heures de boulot pour un truc qui ne sait pas monter en charge pour au final changer les colonnes.

Reply

Marsh Posté le 06-03-2015 à 00:16:34    

Oliiii a écrit :

Encore quelques jours d'essai et tu changeras d'avis sur l'ajout de colonnes :)
 
Ajouter des colonnes = 5 mins de boulot.
Le faire autrement = des heures de boulot pour un truc qui ne sait pas monter en charge pour au final changer les colonnes.


 
Je vois pas en quoi rajouter une colonne va me permettre d'etre si rapide
Mes contrats sont pas toujours dans le meme ordre je suis oblige de les balayer et un vlookup ne me renseignera pas sur les colonnes qui ont change
 
Puis ce fichier est utilise par pas mal de monde je peux pas le modifier a ma guise
J'ai reussi avec access en galerant pas mal

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed