|
Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Bonjour, J'ai créé une fenetre de recherche avec différents champs. Par exemple, un champ se nomme "difficultés". La, je peux rentrer un mot, mon programme me trouve tout les enregistrements qui ont dans "difficultés" ce mot. L'ennui, c'est que si je veux chercher avec plusieurs mots comme : Allergie,asthme Il va me trouver tout ceux que j'ai rentré dans "difficultés" avec "Allergie,Asthme" écrit, avec la virgule, sans espace. si je met un point virgule ou que j'écris autre chose entre ex : allergie,machin,asthme Il ne me le trouvera pas non-plus ! Voila le code utilisé ( qui marche, mais que si on écrit exactement pareil ) :
PROCEDURE def_param( NomEta est une chaîne)
sRubCléParcours est une chaîne
// on efface la table
TableSupprimeTout(Table_recherche)
// On active le filtre
// Si les 2 cases sont décochées :
SI ValAvoirt="0" OU ValArchivert="0" ALORS
sRubCléParcours = HFiltre(NomEta, "Nom~]'"+valNom+"'"...
+" ET Rs~]'"+ValDate+"'"...
+" ET a_voir~]'"+ValAvoir+"'"...
+" ET Classes~]'"+ValClasse+"'"...
+" ET Difficultes~]'"+ValDifficultes+"'"...
+" ET Pai~]'"+ValPai+"'"...
+" ET Suites~]'"+ValSuites+"'"...
+" ET Suivi~]'"+ValSuivi+"'"...
+" ET Notes~]'"+ValNotes+"'"...
+" ET Archiver~]'"+ValArchiver+"'")
FIN
// Si la case "tous avoir" est cochée :
SI ValAvoirt="1" ALORS
sRubCléParcours = HFiltre(NomEta, "Nom~]'"+valNom+"'"...
+" ET Rs~]'"+ValDate+"'"...
+" ET Classes~]'"+ValClasse+"'"...
+" ET Difficultes~]'"+ValDifficultes+"'"...
+" ET Pai~]'"+ValPai+"'"...
+" ET Suites~]'"+ValSuites+"'"...
+" ET Suivi~]'"+ValSuivi+"'"...
+" ET Notes~]'"+ValNotes+"'"...
+" ET Archiver~]'"+ValArchiver+"'")
FIN
// Si la case "tous archiver" est cochée :
SI ValArchivert="1" ALORS
sRubCléParcours = HFiltre(NomEta, "Nom~]'"+valNom+"'"...
+" ET Rs~]'"+ValDate+"'"...
+" ET a_voir~]'"+ValAvoir+"'"...
+" ET Classes~]'"+ValClasse+"'"...
+" ET Difficultes~]'"+ValDifficultes+"'"...
+" ET Pai~]'"+ValPai+"'"...
+" ET Suites~]'"+ValSuites+"'"...
+" ET Suivi~]'"+ValSuivi+"'"...
+" ET Notes~]'"+ValNotes+"'")
FIN
// Si les 2 cases sont cochées :
SI ValAvoirt="1" ET ValArchivert="1" ALORS
sRubCléParcours = HFiltre(NomEta, "Nom~]'"+valNom+"'"...
+" ET Rs~]'"+ValDate+"'"...
+" ET Classes~]'"+ValClasse+"'"...
+" ET Difficultes~]'"+ValDifficultes+"'"...
+" ET Pai~]'"+ValPai+"'"...
+" ET Suites~]'"+ValSuites+"'"...
+" ET Suivi~]'"+ValSuivi+"'"...
+" ET Notes~]'"+ValNotes+"'")
FIN
// Parcours des enregistrements filtrés
HLitPremier(NomEta,sRubCléParcours)
TANTQUE PAS HEnDehors()
//remplir la table
TableAjouteLigne(Table_recherche,{NomEta + ".Nom",indRubrique},...
{NomEta + ".Date_int",indRubrique},...
{NomEta + ".Rs",indRubrique},...
{NomEta + ".A_voir",indRubrique},...
{NomEta + ".classes",indRubrique},...
{NomEta + ".Difficultes",indRubrique},...
{NomEta + ".Pai",indRubrique},...
{NomEta + ".Suivi",indRubrique},...
{NomEta + ".Suites",indRubrique},...
{NomEta + ".Notes",indRubrique},...
{NomEta + ".Archiver",indRubrique})
HLitSuivant(NomEta, sRubCléParcours,ccSansCasse)
FIN
// On désactive le filtre
HDésactiveFiltre(NomEta)
Merci de m'aider, @+
Contribution le : 30/10/2007 12:30
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour, Idée
SELECT *
FROM MaTable
WHERE [Difficultés] Like '%Allergie%'
OR [Difficultés] Like '%Asthme%'
OR [Difficultés] Like '%Machin%'
FROM Table
Contribution le : 30/10/2007 13:55
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Je n'avais pas penser au SQL, car, je n'aime pas trop ce langage et, je ne sais pas trop l'utiliser avec windev ... Je suppose que je peux remplacer '%Asthme%' et '%Machin%' par un champ.
Enfin, je vais chercher de ce coté la, je te donnerai des nouvelles ! ( sans doute ce soir )
Contribution le : 30/10/2007 14:35
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Pourrais tu m'aider sur ces codes SQL ? merci
Contribution le : 30/10/2007 16:58
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
oui bien sur, désolé du temps de réponse
Contribution le : 30/10/2007 17:49
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
je n'ai pas bien compris ...
Contribution le : 30/10/2007 20:31
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
tblVar est un tableau dynamique de 0 Chaines
Ind est un entier
sCondition est une chaine
Rs est une source de donnees
Sql est une chaine
//On remplie un tableau avec les valeurs voulues
TableauAjoute(tblVar, "Allergie")
TableauAjoute(tblVar, "Asthme")
TableauAjoute(tblVar, "Machine")
//On construit la condition
Pour Ind = 1 a Dimension( tblVar)
Si sCondition <> "" alors
sCondition += RC + " OR "
Fin
sCondition += "[Difficultés] LIKE '%" + tblVar[Ind] + "%' "
Fin
//On construit la requête
Sql =
[
SELECT *
FROM MaTable
WHERE [Difficultés] Like @Condition
FROM Table
]
//On execute la requete
Sql = Remplace( Sql, "@sCondition", sCondition )
Si pas HExecuteRequeteSql( Rs, HRequeteDefaut, Sql ) Alors
Erreur( HErreurInfo())
Retour
Fin
POUR TOUS RS
//Traitement des données ici
FIN
Contribution le : 31/10/2007 01:56
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
et, pour plusieurs conditions, je suppose que c'est le meme principe ?
Contribution le : 31/10/2007 12:18
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour, Oui bien sur on peut ajouter des conditions du type champx=<Valeur> champx>=<Valeur> depuis la version 11 de WinDev on peu même rajouté dans les requêtes des fonctions du langage
SELECT
CLIENT.NumClient AS NumClient,
CLIENT.Civilité AS Civilité,
CLIENT.NomClient AS NomClient,
CLIENT.DateNaissance AS DateNaissance
FROM
Client
WHERE
Client.Civilité = 'Mr'
AND
WL.Age(CLIENT.DateNaissance) <= 30
Dans cette exemple on extrait les clients masculins Client.Civilité = 'Mr' et tous ceux qui ne n'ont pas plus de 30 ans grâce à la fonction du WLangage Age() Cette fonction dans la requête est préfixée de 'WL.' pour que l'interpréteur comprenne qu'il s'agisse d'une fonction du WLangage.
Contribution le : 31/10/2007 13:23
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Bonjour, dans l'exemple, il y a seulement la rubrique "Difficultes" mais, dans ma fenetre de recherche il y en a plusieurs : Nom, difficultés, etc ... Donc, il faudrait chercher tout ceux qui ont Le nom donné ( ValNom ) les difficultés données ( ValDifficultes ), etc ... Je ne vois pas ou introduire les autres champs !
EDIT : En regardant bien ce code, il y a un problème : Il n'y a pas de "valeurs fixe" comme "asthme, allergie, machin". Ces valeurs sont l'utilisateur qui les rentre et, peuvent varié ! C'est en fonction du champ de rehcerche "ValDifficultes" et des autres "ValNom", ValEtc ...
Contribution le : 31/10/2007 14:34
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour, Le principe reste le même, si il s'agit d'un champ qui ne contient qu'une seule pas de problème pour les liste vous pouvez faire une boucle comme dans l'exemple fourni.
tblVar est un tableau dynamique de 0 Chaines
Ind est un entier
sCondition est une chaine
Rs est une source de donnees
Sql est une chaine
//On remplie un tableau avec les valeurs voulues
TableauAjoute(tblVar, "Allergie")
TableauAjoute(tblVar, "Asthme")
TableauAjoute(tblVar, "Machine")
//On construit la condition
Pour Ind = 1 a Dimension( tblVar)
sCondition += RC + "[Difficultés] LIKE '%" + tblVar[Ind] + "%' "
Fin
Si SansEspace(ValNom) <> "" Alors
sCondition += " AND [ChampNom]='" + ValNom + "' "
Fin
Si SansEspace(ValEtc) <> "" Alors
sCondition += " AND [ChampEtc]='" + ValEtc + "' "
Fin
//On construit la requête
Sql =
[
SELECT *
FROM MaTable
WHERE @Condition
]
//On execute la requete
Sql = Remplace( Sql, "@sCondition", sCondition )
Si pas HExecuteRequeteSql( Rs, HRequeteDefaut, Sql ) Alors
Erreur( HErreurInfo())
Retour
Fin
POUR TOUS RS
//Traitement des données ici
FIN
Contribution le : 31/10/2007 15:38
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
un champ texte ou on peut y écrire PAR EXEMPLE Asthme allergie machin truc et il va me trouver tous les enregistrements qui ont dans ce champ texte marqué Asthme, allergie, machin, truc ou allergie, machin;truc,asthme ou etc ...
?? l'utilisateur rentre le nom dans la case nom mon programme va filtrer tout les enregistrements avec ce nom. si l'utilisateur rentre le NOM + le champ texte "difficultes" alors, mon programme va filtrer tous les enregistrements qui ont pour nom "ValNom" et, comme difficultés "ValDifficultés"
Mais, mon problème avec HFiltre est le suivant : Si dans "difficultés" ( quand j'ajoute un enregistrement ) je rentre : Asthme,allergie et que dans la recherche je rentre : Asthme;allergie ( point virgule )
Ca ne marche pas car ce n'est pas écrit EXACTEMENT pareil. Les mots "asthme" et "allergie" sont juste un exemple. Ils ne sont pas a utiliser dans le code !
Est-ce que tu m'as compris ?
Contribution le : 31/10/2007 17:14
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 05/06/2003 14:23
De Québec
Post(s): 511
|
Salut,
Déja je pense qu'il est important de fixer un mode de saisie pour l'utilisateur exemple : Asthme,allergie,machin.
C'est à dire obliger l'utilisateur de mettre une virgule entre chaque item recherché.
Si tu laisses l'utilisateur saisir n'importe quoi genre Asthme allergie machin ou Asthme,allergie,machin ou Asthme;allergie;machin dans ce cas la tu y arriveras jamais.
Dans l'exemple du code ecrit par drcharly93 ca fait du contient. Donc ca va t'afficher tout les enregistrements qui contiennent un des mots.
a+++
Contribution le : 31/10/2007 17:25
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Donc, c'est possible avec du "contient" ? Ou, sinon, comment "obliger" l'utilisateur a mettre une virgule, et a écrire les mots toujours pareils !
Contribution le : 31/10/2007 18:00
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
Euh, en regardant le tableau de l'aide, il y a EGALITE TRES SOUPLE, ce qui correspond presque a ce que je veux : Égalité très souple : ne différencie pas les caractères majuscules des caractères minuscules, ne tient pas compte des espaces situés avant et après la chaîne à tester, ne tient pas compte des caractères accentués minuscules, ne tient pas compte des espaces et des ponctuations à l'intérieur des chaînes.
ESPACES ET PONCTUATION. Mais, c'est en EGALITE, y a t'il un moyen d'avoir un "CONTIENT TRES SOUPLE" ? égalité très souple = ~~ contient = ]
Il faudrait avoir les 2 et, je pense ça fonctionnera ...
Contribution le : 31/10/2007 19:48
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 05/06/2003 14:23
De Québec
Post(s): 511
|
Salut,
Apres quelque recherche je n'ai pas vu de contient tres souple en sql.
Tant qu'a l'egalite tres souple disponible sous windev, d'apres ce que j'ai vu dans l'aide en ligne, fonctionnerait seulement dans un test du genre si variable ~~ 'texte texte texte' mais rien au niveau du hfiltre.
J'ai essaye moi meme avec un fichier avec une description de faire un hfiltre avec une egalite tres souple aucun resultat par contre avec le test ca fonctionne...
Euh correction meme avec le test si variable ~~ 'texte texte texte' ne fonctionne pas toujours ...
a+++
Contribution le : 31/10/2007 20:57
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
il n'y a donc aucun moyen de faire ce que je cherche a faire ?
Contribution le : 31/10/2007 21:10
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 05/06/2003 14:23
De Québec
Post(s): 511
|
Salut,
Avant de donner une reponse, je vais continuer les recherches et voir comment rendre possible ce que tu cherches a faire.
a+++
Contribution le : 31/10/2007 21:15
|
|
|
Re: Recherche ( très souple ) |
|
Utilisateur WDF
Inscrit: 28/05/2007 18:18
Post(s): 90
|
je vais 2 jours a la montagne ( un trou perdu sans internet ) j'ai 2 bouqins asser gros sur windev et l'aide windev ( su rl'ordi portable ) donc, je chercherai aussi ! si tu trouve quelque chose, met une réponse sur le fourm ! et, merci de votre aide a tous les deux !!!!!
Contribution le : 31/10/2007 22:03
|
|
|
Re: Recherche ( très souple ) |
|
Animateur WDF
Inscrit: 02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
|
Bonjour, Citation : ne différencie pas les caractères majuscules des caractères minuscules, ne tient pas compte des espaces situés avant et après la chaîne à tester, ne tient pas compte des caractères accentués minuscules, ne tient pas compte des espaces et des ponctuations à l'intérieur des chaines.
C'est le fonctionnement par défaut de WinDev. Pour vous en assurer aller dans l'éditeur d'analyse, clic droit sur le fichier en question, puis sélectionner l'option 'Description des rubriques' vérifier enfin le bloc 'Paramètres de l'index et de la recherche pour les clés texte'(vous comprendrez qu'il vous faudra même pour une question de rapidité de la recherche définir cette rubrique comme 'clé avec doublon') Vous trouverez les options référents à votre demande. Vous Pouvez même utilisez la phonétique 1) Récupération des mots a) Procédure pour spiltter une chaine
PROCEDURE Split( ChaineSource est une chaine, CaractereSeparateur est une chaine, bSupprimeEspace est un booléen = Faux )
tbl est un tableau dynamique de 0 chaines
sListe est une chaine = ChaineSource
sUnMot est une chaine
POUR TOUTE CHAINE sUnMot DE SListe SEPAREE PAR CaractereSeparateur
Si bSupprimeEspace = Vrai Alors
sUnMot = SansEspace( sUnMot )
Fin
TableauAjoute( tbl, sUnMot )
FIN
RENVOYER tbl
b) Méthode pour prendre différent séparateur
//On remplace le points virgules par des virgules
ValDifficultes = Remplace( ValDifficultes, ";", "," )
//On remplace les deux points par des virgules
ValDifficultes = Remplace( ValDifficultes, ":", "," )
//On remplace les espaces par des virgules
ValDifficultes = Remplace( ValDifficultes, " ", "," )
//On peut continuer comme çà
c) On alimente le tableau par un splittage de la chaine transformée
tblVar = Split( ValDifficultes, ",", Vrai )
Maintenant le tableau tblVar de mon précédent exemple est alimenté. 2) Utilisation de la phonétiquePour que cela fonctionne il faut modifier la requête de départ exemple: Citation : SELECT CLIENT.NumClient AS NumClient, CLIENT.Civilité AS Civilité, CLIENT.NomClient AS NomClient, CLIENT.DateNaissance AS DateNaissance FROM Client
par
sClientRecherche est une chaine = "dupon"
Sql est une chaine
Rs est une source de donnees
Sql =
[
SELECT
CLIENT.NumClient AS NumClient,
CLIENT.Civilité AS Civilité,
WL.Phonétique(CLIENT.NomClient) As RubTest
CLIENT.NomClient AS NomClient,
CLIENT.DateNaissance AS DateNaissance
FROM
Client
WHERE
RubTest LIKE
]
Sql += "'%" + WL.Phonetique(sClientRecherche) + "%'"
Modification de mon précédent l'exemple Citation : //On construit la condition Pour Ind = 1 a Dimension( tblVar) sCondition += RC + "[Difficultés] LIKE '%" + tblVar[Ind] + "%' " Fin
//On construit la condition
Pour Ind = 1 a Dimension( tblVar)
sCondition += RC + "RubTest") LIKE '%" + WL.Phonétique(tblVar[Ind]) + "%' "
Fin
Ce code reste toutefois téhorique et n'a pas été testé
Contribution le : 02/11/2007 10:44
|
|
Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.
|
Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
|