Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 30/05/2011, 18h18   #1
Invité régulier
 
Inscription : novembre 2007
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 35
Points : 7
Points : 7
Par défaut Suppression lignes identiques selon critères

Bonjour,

Dans mon application j'ai une table avec les enregistrements ci-dessous.

L Article Poste DateMax Supprimé
1 Voiture A 01/01/2010
2 Voiture B 01/01/2010
3 Voiture C 15/04/2011
4 Voiture C 15/04/2011 OUI
5 Voiture D 01/01/2010


Je cherche vainement à créer une requête pour exclure les lignes 3 et 4
car elles correspondent aux critères suivants.

Même Article
Même Poste
Même DateMAx
et que l'une d'entre elles est "flagée" comme supprimée.

D'avance merci pour votre aide

StSym
stsym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 20h07   #2
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
Bonsoir,
Ca ressemble à cette file : http://www.developpez.net/forums/d10...aire-doublons/

Tu peux utiliser une syntaxe du type :
Code :
1
2
delete from matable t
where dcount("*","matable","supprimé and article='" & t.article & "' and poste='"  t.poste & "' and datemax=" & t.datemax)>=1
Attention aux ' et "
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 19h32   #3
Invité régulier
 
Inscription : novembre 2007
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 35
Points : 7
Points : 7
Bonsoir

Merci pour ta réponse.
Par contre j'avoue ne pas savoir si tu considères que ma table est nommée
"Matable" ou "t".

J'ai essayé le code suivant en nommant la table "Matable"mais il ne supprime pas les doublons.

Code sql :
1
2
3
DELETE *
FROM Matable
WHERE dcount("*","Matable","supprimé and article='" & Matable.article & "' and poste='" & Matable.poste & "' and datemax=" & Matable.datemax)>=1;

Merci
StSym
stsym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 11h11   #4
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
Comme la requete interroge 2 fois la même table, j'ai mis l'alias t au 1er appel pour que l'interpréteur puisse les distinguer

Ceci dit avec dcount je ne suis pas sûr que ce soit nécessaire... Je suis donc surpris que ça ne marche pas

Essaie pour commencer
Code :
1
2
select * from matable t
where dcount("*","matable","supprimé and article='" & t.article & "' and poste='"  t.poste & "' and datemax=" & t.datemax)>=1
et modifie les conditions du dcount pour voir ce qui se passe...

supprimé est bien un booléen ? par précaution je ne mets jamais d'accents ni d'espace dans mes variables !
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 19h13   #5
Invité régulier
 
Inscription : novembre 2007
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 35
Points : 7
Points : 7
Bonjour Nico84
Merci pour ton message.
J'ai essayé ton code en ajoutant une esperluette devant le dernier "t.poste".

Code :
1
2
3
SELECT *
FROM matable AS t
WHERE dcount("*","matable","supprimé and article='" & t.article & "' and poste='"  &t.poste & "' and datemax=" & t.datemax)>=1;
La réquète fonctionne mais ne retourne pas la ligne 3 et 4 comme doublons selon les critères définis.
J'ai modifié les conditions (en fonction de mes connaissances) mais n'arrive pas au résultat souhaité.
J'ai aussi essayé la condition >=2 car pour moi elle correspond ( peut-être à tort) à des doublons.
Que nenni !La requète est toujours vide.
Tu demandes si "Supprimé" est booléen.
Dans la table "Matable" ce champ est de type "texte".
J'espère avoir bien présenté mon problème car ce qui me gène , c'est que pour toi le résultat est évident.

Encore merci pour ton aide.
StSym
stsym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 19h25   #6
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Ne serait-ce pas un problème avec les champs de type DATE/TIME?
Essayez de convertir vos champs datemax sous la forme (DD/MM/YYYY) avec la fonction DATEPART par exemple.
Quelque chose de ce style
Code :
1
2
3
SELECT *
FROM matable AS t
WHERE dcount("*","matable","supprimé and article='" & t.article & "' and poste='"  &t.poste & "' and'" & DATEPART("DD/MM/YYYY",datemax)"'=" & DATEPART("DD/MM/YYYY",t.datemax))>=1;
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 20h29   #7
Invité régulier
 
Inscription : novembre 2007
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 35
Points : 7
Points : 7
Bonsoir Carden752,
Merci pour votre solution.
J'ai essayé de la "bidouiller" mais elle aussi ne permet d'avoir le résultat souhaité.
Encore merci pour votre aide
stsym est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 21h47   #8
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonsoir,

une autre solution serait d'utiliser la clause exists.
Peut-être quelque chose de ce style pourrait convenir
Code :
1
2
select * from MaTable as t
where exists (select * from MaTable where article=t.article and poste=t.poste and N°<>t.N° and datemax=t.datemax and (supprime='OUI' or t.supprime='OUI'));
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 23h24   #9
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 254
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 1 254
Points : 1 870
Points : 1 870
Exact il manquait un & devant t.poste
Citation:
Dans la table "Matable" ce champ est de type "texte".


Il faut dans ce cas tester :
Code :
supprimé='OUI' and ...
Idem le champ datemax est bien déclaré comme date ??? Si c'est une chaine il faut l'encadrer par des '
Code :
1
2
delete from matable t
where dcount("*","matable","supprimé='OUI' and article='" & t.article & "' and poste='" &  t.poste & "' and datemax='" & t.datemax & "'")>=1
Je maintiens >=1 car dans l'exemple un seul des 2 doublons est déclaré à supprimer
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 05h37   #10
Invité régulier
 
Inscription : novembre 2007
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 35
Points : 7
Points : 7
Bonjour Nico84, Carden752,

Merci pour votre aide, vos formules respectives fonctionnent parfaitement.

A bientôt
StSym
stsym 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 17h28.


 
 
 
 
Partenaires

Hébergement Web