(1) 2 3 »


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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
Créer un fichier PDF de la contribution Imprimer


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étique
Pour 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
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 3 »




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


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.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2