IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[Delphi7][SQL] Supprimer les doublons


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 131
    Points
    131
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...;


  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    merci Archibald29 ,je vais l'essayer

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    concernant votre code Archibald29 marche tres bien mais il est tres lent par apport a une base données moyen, en plus mes opérations sont répétitive.
    pour votre deuxieme solution
    > 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...;
    j pas bien compris

    j vais essayer ça ,mais je sais que ce n'est pas la solution optimal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT NUMTR, PART, CLE,MON, MONTANT FROM client 
    Group by  NUMTR, GL, PART, CLE,MON, MONTANT
    le resultat est met dans QR3
    puis j utilisé un batchmove avec source QR3 et destination tabclient(table des clients)
    donc en supprime tous les records de tabclient en les remplaçant avec les records de QR3 qui sont vide des doublons (select distinct!!) !!!!!!!!!

  5. #5
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 131
    Points
    131
    Par défaut [DBF] [Doublons]
    Bonsoir,

    Oui ce code est vraiment lent.

    Une autre solution testée et plus réaliste pour des fichiers plus volumineux :

    Une fois la sélection des doublons effectuée, la sauver vers un fichier temporaire, par exemple un mémo. (fermer la sélection) Puis :
    -> lire le mémo en séquence
    -> pour chaque ligne du mémo, faire un locate, et un delete systematique

    >> dans la version basique, on ne gere pas de quantité, et on effectue l'ensemble sélection des doublons, épuration jusqu'à ce que la sélection renvoie (vide)

    >> une version améliorée peut sauver dans le mémo le code en double, et sur la ligne suivante du mémo la quantité de doublons :
    Dans ce cas on fait :
    -> lire le mémo en séquence 1/ligne du code 2/ligne de la quantité
    -> pour chaque ligne du mémo, faire locate et delete autant que qtité-1


  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Il existe un bon tuto pour les problèmes de doublons :

    http://sql.developpez.com/doublons/
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    j vu le tutoriel proposé par malatar http://sql.developpez.com/doublons/ qui permet de supprimer les doublons

    mais j'arrive pas a executer la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DISTINCT x,y,z INTO tab_tmp from tab
    qui permet de creér un tableu temporaire a partir de tab
    il ya l'erreur 'INTO .........'
    est ce que ce type de requete n'est pas supporté par BDE?
    sachant que j'utilise DELPHI7 DBASE BDE

    peut etre je doit utilisé la methode de Archibald29 malgré que je préfère le SQL ?

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par fthdz
    j vu le tutoriel proposé par malatar http://sql.developpez.com/doublons/ qui permet de supprimer les doublons

    mais j'arrive pas a executer la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DISTINCT x,y,z INTO tab_tmp from tab
    qui permet de creér un tableu temporaire a partir de tab
    il ya l'erreur 'INTO .........'
    est ce que ce type de requete n'est pas supporté par BDE?
    sachant que j'utilise DELPHI7 DBASE BDE

    peut etre je doit utilisé la methode de Archibald29 malgré que je préfère le SQL ?
    Le message d'erreur complet serait bien, pour voir d'où vient ton problème ^^

    N'utilisant pas DBase je ne pourrais pas t'aider sur les faiblesses de ce type de base de données.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    voila l'erreur :
    invalid use of keyword
    Token :INTO
    surement DBASE ne supporte pas ce type de requete !?
    ou il ya une autre anomalie?
    voila le code SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT CODE NOM PRENOM ADRESSE  INTO  T_DOUBLON_TMP  FROM   CLIENT   
    GROUP  BY CODE NOM PRENOM ADRESSE HAVING COUNT(*) > 1

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    il manque les virgules pour la séparation des champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT CODE, NOM, PRENOM, ADRESSE  INTO  T_DOUBLON_TMP  FROM   CLIENT   
    GROUP  BY CODE, NOM, PRENOM, ADRESSE 
    HAVING COUNT(*) > 1
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    il manque les virgules pour la séparation des champs
    il s'agit d'une erreur de saisi seulement
    je pense que le probleme vient de DBASE qui ne supporte ce type de requete

    merci

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par fthdz
    il s'agit d'une erreur de saisi seulement
    je pense que le probleme vient de DBASE qui ne supporte ce type de requete

    merci
    oui il ya des chances que le problème vienne de DBase qui n'est pas un type de base de données très évoluer niveau SQL.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. [PL/SQL] Supprimer les caractères non numériques
    Par Oliveuh dans le forum PL/SQL
    Réponses: 6
    Dernier message: 25/06/2015, 12h13
  2. Comment supprimer les doublons
    Par djelloulc dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/09/2013, 14h30
  3. Comment supprimer les doublons?
    Par Dnx dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/11/2005, 16h35
  4. [ListView]Supprimer les doublons
    Par mohamed dans le forum Composants VCL
    Réponses: 1
    Dernier message: 27/10/2005, 12h14
  5. Réponses: 7
    Dernier message: 25/07/2005, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo