Comparaison de tables [Access/SQL] - SQL/NoSQL - Programmation
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)
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: |
Merci de ton aide mais je préférerais eviter d'ajouter des colonnes en effet
Marsh Posté le 27-02-2015 à 21:42:39
HeisenberG75 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.
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 * |
ou bien
SELECT * |
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 |
Marsh Posté le 28-02-2015 à 12:13:01
lasnoufle a écrit :
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
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 :
|
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 )
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
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.
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 |
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
Marsh Posté le 27-02-2015 à 00:03:12
Bonjour
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
thx