[Delphi7][SQL] Supprimer les doublons
bonjour
j'utilise une requete qui permet de reperer les doublons(tous les champs sont identique y compris l'identifiant PART) d'une table
voici le code:
Code:
1 2 3
|
SELECT NUMTR, PART, CLE,MON, MONTANT, count (*) as Resultat FROM client
Group by NUMTR, GL, PART, CLE,MON, MONTANT |
cette requete trouve tous les enregistrement doublon ,ces doublons sont afficher dans un DBGrid.
mon pb et de supprimer ces doublos de la table client
j essayer ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
QR1.Open;
QR1.First;
While not QR1.Eof do
begin
NbreLigne :=QR1.FieldByName('Resultat').AsInteger;
if NbreLigne>1 then
begin
For i:=1 to NbreLigne-1 do
begin
QR2.Close;
QR2.SQL.Clear;
//QR2.SQL.Add('Delete from client where PART='+QR1.FieldByName('PART').AsInteger;
);
QR2.ExecSQL;
end;
end;
QR1.Next;
end;
QR1.Close; |
mais ca n'a pas marcher puisque le PART n'est pas unique ,en peut avoir plusieurs record avec le meme PART ( j'utilise DBASE (*.dbf)) donc il peut supprimer un record qui n'est pas doublons.
j pensé aussi a BATCHMOVE qui supprime tous les elements qui se trouve dans la source(qr1) dans la table(client) mais ici je touve pas comment preserver un seul enregistrement.
il y'a une solution a ce probleme?
MERCI D'AVANCE
Dbf Doublons aka Les doublons c'est nul
Bonsoir,
Voilà un exemple de code qui n'est sans doute pas optimal mais qui présente le grand avantage de fonctionner :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
While not tbAssoMail.Eof do
Begin
sb.SimpleText:='Tbl Double : Cleaning : '+IntToStr(tbAssomail.RecNo)+'/'+IntToStr(tbAssoMail.RecordCount)+' Found : '+IntToStr(iDouble);
sMail:=tbAssoMail['AssoMail'];
iMail:=tbAssoMail.RecNo;
LocateSuccess :=tbAssoMail.Locate('AssoMail',sMail,[]);
if tbAssoMail.RecNo=iMail then
Begin
tbAssoMail.Next;
End
Else
Begin
sb.simpleText:='Tbl Doublons : '+sMail;
tbAssoMail.Edit;
tbAssoMail.Delete;
iDouble := iDouble+1 ;
End;//While LocateSuccess then
End;//While not qAssoMail.Eof do |
Pour chaque enregistrement on fait un locate dans la table avec sa valeur.
Si le numéro du record n'a pas changé : pas de doublon
Sinon on est sur un doublon -> le détruire
Commentaires :
- il faut packer la table aprés l'opération
- si la table est volumineuse (et/ou) l'opération répétitive, cela peut valoir le coup de n'effectuer l'opération de locate que sur les doublons effectifs
> on peut grouper et compter les codes (Select distinct code, count(des1) from Arti.dbf group by code order by 2 desc),
> préserver le résultat pour les quantités > 1 dans un fichier créé pour l'occasion (ça peut être un mémo),
> lire ce fichier en séquence et supprimer jusqu'à qtité =1...;
8O