Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/06/2011, 12h18   #1
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Par défaut Règle pour éliminer une partie des doublons

Bonjour le forum,

Je dois régulièrement importer un grand nombre de données d'un AS400 dans une table Access.
Ces données contiennent certains "doublons", que je définis comme toutes lignes ayant en commun les champs suivants: "Client", "Departement", "Article", "Quantite". Ma table contient d'autres champs également dont le Champ "Date".

Je réussis bien à écrire une requête qui me permet d'identifier ces doublons. Mais je ne voudrais pas tous les supprimer de ma table. Je voudrais garder le doublon qui a la date la plus récente pour commencer.

Par exemple, si dans ma requête qui m'identifie les doublons (et qui compte environ 700 enregistrements), si je trouve les deux lignes suivantes:

Client | Departement | Article | Quantite | Date
A | 02 | 12345 |1 | 01/01/2011
A | 02 | 12345 |1 | 31/12/2011

Je voudrais éliminer la première ligne seulement car la date est plus ancienne.

Je ne sais pas du tout vers quelle méthode m'orienter, alors toute suggestion est la bienvenue.
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 17h49   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Au plus simple je créerai un index unique basé sur [Client], [Departement], [Article], [Quantite] dans ma table destination puis je ferais une requête d'ajout triés sur [Client], [Departement], [Article], [Quantite] en ascendant et ta Date en déscendant comme cela le 1er enr, celui qui a la date la plus récente serait ajouté à la table puis tous les autres rejetés par Access.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 20h46   #3
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,
ou sinon créer une requête de suppression :
Code sql :
1
2
3
4
5
6
7
8
DELETE FROM LaTable 
WHERE EXISTS
(SELECT "" FROM LaTable T WHERE
       T.Client=LaTable.Client 
          AND T.Departement=LaTable.Departement
             AND T.Article=LaTable.Article
                AND T.Quantite=LaTable.Quantite
                   AND T.LaDate>LaTable.LaDate);
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 09h01   #4
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour,

Et pardon pour la réponse tardive. J'imaginais qu'il y avait une solution en SQL, mais je ne suis pas assez doué pour la trouver. Je teste ça, et je reviens vers vous.
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 10h23   #5
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour,

Et encore une fois pardon pour la réponse tardive. Super, je ne connaissais pas bien le prédicat Exists, mais la solution marche bien.

Est-ce que je peux ajouter un peu à la complexité? Je me suis aperçu qu'il me restait encore quelques doublons... je vois que je peux les identifier grâce aux champs texte "Niveau 1", "Niveau 2", et "Niveau 3".
J'aimerais bien pouvoir écrire une règle qui dirait: "Pour chaque doublon, si un des deux niveaux 3 est vide, alors je le supprime. Sinon, si un des deux niveaux 2 est vide, alors je le supprime. Sinon, si un des deux niveaux 1 est vide, alors je le supprime."

Est-ce que c'est possible en sql? (si un des admins passent par ici et qu'il veut bien bouger mon sujet dans le forum adéquat...)
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 12h36   #6
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Ben tout simplement comme ça, neiluj26:

Code SQL :
1
2
3
4
5
6
7
8
9
DELETE FROM LaTable 
WHERE EXISTS
(SELECT * FROM LaTable T WHERE
       T.Client=LaTable.Client 
          AND T.Departement=LaTable.Departement
             AND T.Article=LaTable.Article
                AND T.Quantite=LaTable.Quantite
                   AND T.LaDate>LaTable.LaDate
                       AND (T.Niveau1>LaTable.Niveau1 OR T.Niveau2>LaTable.Niveau2 OR T.Niveau3>LaTable.Niveau3));
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 14h12   #7
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Ah non, j'aurais dû mieux vérifier. Ma solution ne fonctionne pas. Évidemment, elle élimine toutes les lignes qui ont "Client", "Departement", "Article", "Quantite" en commun.

Je rouvre donc ce topic. Je prends une solution SQL, mais aussi VBA, bien sûr.
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 18h32   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Ma solution avec les indexs et la requête d'ajout devrait fonctioner sans code.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 14h21   #9
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
Bonjour marot_r,

J'ai privilégié le SQL jusque maintenant parce que je ne suis pas sûr de bien comprendre ta solution (je ne suis encore qu'un débutant).

J'ai bien créé mon index sur la table de destination, mais est-ce que tu pourrais m'expliquer cette partie de ta phrase ?
Citation:
celui qui a la date la plus récente serait ajouté à la table puis tous les autres rejetés par Access
Comment est-ce que je fais pour n'ajouter que le premier enregistrement?
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h24   #10
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Si tu tri tes données ajoutées en ordre décroissant. La plus récente va se retrouver en 1ère. Quand tu vas ajouter ces données à la table, la 1ière ligne va être acceptée puisqu'aucune données n'a cette clef. Toutes les suivantes, qui ont la même clef, vont être rejetées par Access pour violation de clef. Donc, au final, tu vas avoir ajouter 1 seule ligne : celle qui a la date la plus récente.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 18h17   #11
Membre régulier
 
Inscription : octobre 2008
Messages : 224
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 224
Points : 76
Points : 76
J'ai compris. Ta solution fonctionne. Merci. C'était l'obstacle qui me posait le plus de problème jusqu'à maintenant.
neiluj26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h29.


 
 
 
 
Partenaires

Hébergement Web