PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Requete avec IndexFullText
Requete avec IndexFullText
Iniciado por Jean TURCOTTE, mar., 21 2019 11:36 PM - 8 respostas
Membro registado
1.120 mensagems
Popularité : +8 (8 votes)
Publicado em março, 21 2019 - 11:36 PM
Bonjour,

J'ai une base de données avec laquelle j'ai créé un IndexFullText pour faciliter les recherches. J'ai configuré une requête avec un paramètre pour que je puisse rechercher du texte à l'intérieur du fichier IndexFullText.

Le problème que j'ai, c'est que si dans ma base de IndexFullText, j'ai le Mot "Chevreuil", ma requête ne fonctionne que si je recherche le mot entier alors que j'aimerais rechercher n'importe quel portion du mot.
Voici la requete en SQL
SELECT
CONTACT_PERSONNEL.Prenom AS Prenom,
CONTACT_PERSONNEL.Nom AS Nom,
CONTACT_PERSONNEL.Courriel AS Courriel,
CONTACT_PERSONNEL.Adresse AS Adresse,
CONTACT_PERSONNEL.Ville AS Ville,
CONTACT_PERSONNEL.Arrondissement AS Arrondissement,
MATCH(CONTACT_PERSONNEL.NoEmploye, CONTACT_PERSONNEL.Nom, CONTACT_PERSONNEL.Adresse, CONTACT_PERSONNEL.Ville, CONTACT_PERSONNEL.Arrondissement, CONTACT_PERSONNEL.Telephone1, CONTACT_PERSONNEL.Telephone2, CONTACT_PERSONNEL.PosteOccupe, CONTACT_PERSONNEL.Departement, CONTACT_PERSONNEL.Notes, CONTACT_PERSONNEL.AssurancesSociale) AGAINST({ParamIndex_FullText}) AS PertinenceFullText1
FROM
CONTACT_PERSONNEL
WHERE
PertinenceFullText1 LIKE %{ParamPertinenceFullText1}%
ORDER by
PertinenceFullText1 DESC


Ça ne fonctionne malheureusement pas.

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Membro registado
2.571 mensagems
Popularité : +222 (260 votes)
Publicado em março, 22 2019 - 8:24 AM
Bonjour,

Si tu mets un like à l'intérieur de ta requête full-text, tu vas à l'encontre de la philosophie full-text. Le full-text n'est pas fait pour rechercher une partie d'un mot, mais un mot en fonction d'un lexème.

Si tu veux faire un like, le full-text ne sert à rien. Par contre si tu veux retrouver chevreuil en tapant "chevr", il faut écrire dans le paramètre 'chevr*'

SELECT
CONTACT_PERSONNEL.Prenom AS Prenom,
CONTACT_PERSONNEL.Nom AS Nom,
CONTACT_PERSONNEL.Courriel AS Courriel,
CONTACT_PERSONNEL.Adresse AS Adresse,
CONTACT_PERSONNEL.Ville AS Ville,
CONTACT_PERSONNEL.Arrondissement AS Arrondissement,
MATCH(CONTACT_PERSONNEL.NoEmploye, CONTACT_PERSONNEL.Nom, CONTACT_PERSONNEL.Adresse, CONTACT_PERSONNEL.Ville, CONTACT_PERSONNEL.Arrondissement, CONTACT_PERSONNEL.Telephone1, CONTACT_PERSONNEL.Telephone2, CONTACT_PERSONNEL.PosteOccupe, CONTACT_PERSONNEL.Departement, CONTACT_PERSONNEL.Notes, CONTACT_PERSONNEL.AssurancesSociale) AGAINST('chevr*') AS PertinenceFullText1
FROM
CONTACT_PERSONNEL
WHERE
PertinenceFullText1 > 0
ORDER by
PertinenceFullText1 DESC


--
Cordialement,

Philippe SAINT-BERTIN
Membro registado
1.120 mensagems
Popularité : +8 (8 votes)
Publicado em março, 22 2019 - 1:02 PM
Bonjour Philippe, merci d'avoir répondu.

Ma BD est une liste de contact qui contient une 30e de rubriques. La recherches de ma requêtes doit rechercher à l'intérieur de plusieurs rubriques simultanément justement pour éviter de faire des recherches séparées dans chaque rubrique.

Dans la formule que tu m'as envoyée, tu utilise ('chevr*'). Je l'ai testé avec du txt cohérent et ça n'a sorti aucun résultat.

Je vais alors utiliser comme il se doit mais j'aurais bien aimé pouvoir l'utiliser comme je te l'ai décris.
Merci !:)

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Membro registado
129 mensagems
Popularité : +20 (20 votes)
Publicado em março, 22 2019 - 1:18 PM
Bonjour Jean,

J'utilise cette procédure pour formater mon paramètre avant de l'envoyer dans une requête en Fulltext

// Permet de formater un ou plusieurs mots pour une recherche FULL-TEXT
Procedure gproc_formater_recherche( _recherche est une chaîne )

recherche est une chaîne
mots est un tableau de 0 chaîne

SI _recherche <> "" ALORS
ChaîneVersTableau( _recherche, mots, " " )
SI TableauOccurrence( mots ) > 1 ALORS
recherche = "+" + TableauVersChaîne( mots, "* +" ) + "*"
SINON
recherche = mots[ 1 ] + "*"
FIN // SI TableauOccurrence( mots ) > 1 ALORS
FIN // SI SAI_recherche <> "" ALORS

RENVOYER ( recherche <> "" ? recherche SINON Null )
Membro registado
1.120 mensagems
Popularité : +8 (8 votes)
Publicado em março, 22 2019 - 3:41 PM
Merci pour le code Julien,

Ça fonctionne très bien. La seule chose qui me reste à corriger, c'est de faire apparaître tous les enregistrements lorsque la case recherche est vide, as-tu une idée?

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram
Membro registado
129 mensagems
Popularité : +20 (20 votes)
Publicado em março, 22 2019 - 4:01 PM
Normalement le fait d'affecter un paramètre Null fait que la condition n'est pas prise en compte.

Par contre dans mes requêtes les MATCH( .. ) AGAINST({_recherche}) > 0 sont dans la clause WHERE, je pense que ça doit jouer
Membro registado
129 mensagems
Popularité : +20 (20 votes)
Publicado em março, 22 2019 - 4:09 PM
Ex.

Une requête SQL :
SELECT
assure.IDAssure AS IDAssure,
assure.Identifiant AS Identifiant,
assure.NomFamille AS NomFamille,
assure.NomUsage AS NomUsage,
assure.Prenoms AS Prenoms,
assure.DateNaissance AS DateNaissance,
assure.Voie AS Voie,
assure.CodePostal AS CodePostal,
assure.Commune AS Commune,
assure.TelephoneFixe AS Telephone,
assure.Email AS Email
FROM
assure
WHERE
assure.Identifiant = {_identifiant}
AND MATCH(assure.NomFamille, assure.NomUsage, assure.Prenoms) AGAINST({_recherche}) > 0
AND assure.CodePostal = {_codePostal}
AND assure.Commune = {_commune}
AND
(
assure.TelephoneFixe = {_telephone}
OR assure.TelephonePortable = {_telephone}
)
AND assure.Email = {_email}


Un appel avec des champs de saisie avec NULL si vide
RQT_recherche_assure._identifiant = SAI_identifiant
recherche = SAI_recherche
RQT_recherche_assure._recherche = COL_Outils.gproc_formater_recherche( recherche )
RQT_recherche_assure._codePostal = SAI_codePostal
RQT_recherche_assure._commune = SAI_commune
RQT_recherche_assure._telephone = SAI_telephone
RQT_recherche_assure._email = SAI_email
HExécuteRequête( RQT_recherche_assure )

Si SAI_recherche est vide mais qu'un autre critère est rempli ça passe.

Par contre si tous mes critères de recherche sont vides je remplace la requête utilisée dans ..FichierParcouru pour pointer directement vers la table.
Membro registado
129 mensagems
Popularité : +20 (20 votes)
Publicado em março, 22 2019 - 4:14 PM
Pour être tout à fait complet, un exemple d'alimentation de table :

Procedure lproc_rechercher()

i est un entier
champ, recherche est une chaîne
avecRecherche est un booléen

i = 1
champ = EnumèreChamp( GR_filtres_assure, i )
TANTQUE champ <> ""
i++
SI SansEspace( { champ, indChamp } ) <> "" ALORS avecRecherche = Vrai
champ = EnumèreChamp( GR_filtres_assure, i )
FIN// TANTQUE champ <> ""

SI avecRecherche ALORS

//Lancement de la recherche
RQT_recherche_assure._identifiant = SAI_identifiant
recherche = SAI_recherche
RQT_recherche_assure._recherche = COL_Outils.gproc_formater_recherche( recherche )
RQT_recherche_assure._codePostal = SAI_codePostal
RQT_recherche_assure._commune = SAI_commune
RQT_recherche_assure._telephone = SAI_telephone
RQT_recherche_assure._email = SAI_email
HExécuteRequête( RQT_recherche_assure )
HLitPremier( RQT_recherche_assure )
SI PAS HEnDehors( RQT_recherche_assure ) ALORS
TABLE_assure..FichierParcouru = RQT_recherche_assure
TableAffiche( TABLE_assure, taInit )
SINON
ToastAffiche( "Aucun résultat trouvé", toastCourt, cvMilieu, chCentre )
FIN // SI PAS HEnDehors( RQT_recherche_assure ) ALORS

SINON

TABLE_assure..FichierParcouru = assure
TableAffiche( TABLE_assure, taInit )

FIN // SI avecRecherche ALORS
Membro registado
1.120 mensagems
Popularité : +8 (8 votes)
Publicado em março, 22 2019 - 5:17 PM
Merci Julien,

Ton code est excellent. Je me doutais bien que c'était possible. Je vais approfondir ton code pour le maîtriser.

Merci encore! :merci:

--
Jean Turcotte
WX 24
Android 8.0 sur Galaxy S8
Laptop Lenovo I7 12GB Ram