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 :

Utilisation de Soundex pour une query


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut Utilisation de Soundex pour une query
    Bonjour
    Peut être peu d'entre nous savent qu'il y a une fonction Soundex (version anglaise) dans Strutils . Je voudrais utiliser celle-ci dans une recherche partielle de nom .
    exemple
    dans un fichier 'CLIENTS' contenant 3 champs
    • CODE
    • NOM
    • SOUNDEXNOM

    je voudrais faire une recherche dans la table (via SQL) selon un texte saisi
    une recherche sur le nom ne pose pas de soucis
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT CODE,NOM FROM CLIENT WHERE NOM LIKE %'+Edit1.text
    (le Like est voulu si edit1.text='' alors j'ai ainsi tous les clients et bien sur j'utilise une requête paramétrée )
    par contre je ne sais pas comment interroger sur SOUNDEXNOM
    Si CODE='GIRARD' SOUNDEX aura la valeur 'G6630000' résultat de soundex('GIRARD',8)
    en tapant 'GI' dans mon edit Soundex('GI',8)='G0000000' ce n'est donc pas par égalité que je vais faire ma requête .

    Quelqu'un du forum connait-il 'l'Astuce' ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En MySQL, SQL-Server, Oracle ... SoundEx existe nativement dans leurs variantes de SQL, PL/SQL, T-SQL...

    Après bidouiller, un Soundex à la main dans le SQL, je ne sais pas, à coup de SUBSTR ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    En MySQL, SQL-Server, Oracle ... SoundEx existe nativement dans leurs variantes de SQL, PL/SQL, T-SQL...
    Sauf Firebird
    Bon , j'ai bien lu l'excellent article de SQLPro sur le sujet L'art des soundex mais :
    a- je ne voulais pas créer d'UDF
    b- comme c'est pour une recherche anglophone je me suis dit qu'il y avait peut être moyen de travailler directement

    il n'y semble pas y avoir de 'DIFFERENCE' proposé par certains des SGBD sus-cités
    Après bidouiller, un Soundex à la main dans le SQL, je ne sais pas, à coup de SUBSTR ?
    peut être pas tout a fait , mais c'est actuellement ma première direction de recherche :
    1-Récupérer la première lettre
    2-prendre la valeur numérique restante,re-formatter pour ôter les zéros non significatifs et un like ?

    autre piste , implémenter (si elle n'existe pas) une fonction différence mais cela demanderais de changer la valeur du champ

    enfin bien lire et appliquer ce que propose SQLPro , mais là , je suis pas trop chaud (ce serait pour mon usage je dis pas , mais pour un 'donation ware' je voudrais pas trop compliqué la sauce : UDF )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    En suivant ma première piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if Length(Edit1.Text)>0 then
      begin
        S:=soundex(Edit1.Text,8);
        for n:=length(S) downto 1 do
          if S[n]='0' then S[n]:=' '
          else break;
        Query1.Active:=False;
        Query1.ParamByName('SE').asString:=Trim(S);
        Query1.Active:=True;
      end;
    Avec
    Code SQL Query1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CODE,NOM FROM CLIENTS WHERE SOUNDEX STARTING WITH :SE
    Semble fonctionner
    bien sur comme soundex fourni une chaine commençant par la première lettre de la chaine , ce ne sera pas phonétiquement parfait !
    par exemple GIRARD et JIRARD
    cependant si ma recherche est GIRA
    j'aurais bien les :
    GARAGE
    GARDIN
    GERARD
    GIRARD
    etc... c'est déjà pas mal
    maintenant si quelqu'un connait un phoneex (en référence a l'article de SQL pro) anglais free , je pourrais bien être preneur
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Serge,

    As-tu lu cet article :

    soundex1


  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Oui, merci Buzz , j'avais bien lu cet article entre autres
    ...une fonction différence... il ne semble pas y avoir de 'DIFFERENCE' proposé par certains des SGBD
    (sous entendu en Delphi)

    Cette fonction est implémentée dans certaines SGBD , mais ce qu'il me faudrait ce serait l'algorithme (je continue mes recherches) , et comme je ne veux pas faire une UDF (pour l'instant) je continue sur ma première piste

    Déjà , si je comprend bien l'algorithme de Soundex mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        S:=soundex(Edit1.Text,8);
        for n:=length(S) downto 1 do
          if S[n]='0' then S[n]:=' '
          else break;
    doit pouvoir "s'améliorer"
    en utilisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S:=soundex(Edit1.Text,8);
    S:=StringReplaceStr(S,'0','',[rfReplaceAll]);

    Pour ce qui est de l'histoire des sons identiques , j'ai commencé à m’intéresser a la phonétique (pêchée dans un vieux dico papier, mais je vais pas pousser le bouchon trop loin) j'en ai déduit que certains sons devaient se traiter en amont : par exemple X devient KS , j'ai même trouvé quelques tentatives dans ce sens (non garanties) ici mais ... je ne suis pas sur que ce ne soit déjà fait dans la fonction de Delphi (à vérifier )

    [edit] la fonction delphi (du moins D7) ne tient pas compte de la phonétique
    ou du moins pas entièrement :
    - PH ne deviendra jamais F
    - X n'est pas transformé en KS
    - par contre CHR donne déjà CR (la lettre H ayant une valeur <=0 dans l'algorithme utilisé)
    ne reste plus qu'a trouvé ce 'english phonems'

    merci
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Cette fonction est implémentée dans certaines SGBD , mais ce qu'il me faudrait ce serait l'algorithme (je continue mes recherches)
    DIFFERENCE semble utiliser l'algorithme de Jaro Winkler pour ceux qui sont curieux wiki on peut en trouver une transposition Delphi sur certains forums (concurrents donc non cités ) bon
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Récemment j'ai eu à utiliser un algorithme semblable (Ratcliff/Obershelp), trouvé ici: http://lazarus.freepascal.org/index.php?topic=11387.0
    Un petit article intéressant qui parle de Soundex, Jaro Winkler, Ratcliff et autres:
    http://alexandrerodichevski.chiappan...?n=222&lang=en

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    big @goustifruit je n'arrivai pas atteindre ce lien , j'avais uniquement le nom de l'auteur
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Dire que j'ai failli ne pas poster, par peur du hors sujet !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSTL] [débutant] Utilisation de jstl pour une internationnalisation
    Par mimil77210 dans le forum Taglibs
    Réponses: 7
    Dernier message: 16/02/2007, 15h57
  2. Réponses: 1
    Dernier message: 27/09/2006, 16h21
  3. Utiliser un ascenseur pour une application MDI
    Par kurkaine dans le forum C++Builder
    Réponses: 6
    Dernier message: 27/09/2006, 13h54
  4. Réponses: 4
    Dernier message: 09/02/2006, 17h44
  5. [MASM] Utiliser un .IF pour une comparaison de nombre signés
    Par Crisanar dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 24/11/2004, 16h32

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