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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 678
    Billets dans le blog
    65
    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' ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 115
    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 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 678
    Billets dans le blog
    65
    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 )

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 678
    Billets dans le blog
    65
    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

  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
    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 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 678
    Billets dans le blog
    65
    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

+ 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