OVH Cloud OVH Cloud

Problème de requête

19 réponses
Avatar
Whitetown
Bonjour,
Je souhaite creer une appli permettant de rechercher des recettes selon
différents critères, je souhaite que mon formulaire de recherche soit le plus
modulables possibles, pour cela, l'utilisateur peut choisir les champs dans
lesquels il veut effectuer sa recherche en cochant dans la case
correspondante.

Cette fonctionnalité marche très bien, cependant, je souhaite aller plus
loin, je veux que l'utilisateur puisse rechercher des recettes contenant du
poulet ET du citron par exemple. Pour cela, il tape dans la même zone de
texte "poulet ET citron", cependant, la requête qui est fabriquée par mon
code ne va chercher que les libellés d'ingrédients contenant poulet ET citron
alors que je veux les ingrédients contenant poulet ET les ingredients
contenant Citron....

J'espère que je vous ai suffisament clairement expliqué mon problème.

Je vous joins une partie de mon code au cas où quelqu un pourrait me
débloquer.

en vous remerciant d'avance...


'La requête sera contenue dans la variable "SQL"'
Dim SQL As String


'Requête SQL de base qui selectionne tous les enregistrements de la table
recette'
SQL = "SELECT DISTINCT T_recette.code_prototype as 'Code prototype',
T_recette.libelle_recette as 'Libellé de la recette', T_recette.date_creation
as 'Date', T_recette.note_recette as 'Note',
T_acceptation.libelle_acceptation as
'Accept',T_chef_de_projet.nom_chef_de_projet as 'Chef de projet',
T_gamme.libelle_gamme as 'Gamme' FROM T_acceptation RIGHT JOIN
(T_type_stockage RIGHT JOIN (((T_gamme RIGHT JOIN (T_chef_de_projet RIGHT
JOIN T_recette ON T_chef_de_projet.id_chef_de_projet =
T_recette.id_chef_de_projet) ON T_gamme.id_gamme = T_recette.id_gamme) LEFT
JOIN (T_ingredient RIGHT JOIN T_detail_recette ON
T_ingredient.code_ingredient = T_detail_recette.code_ingredient) ON
T_recette.id_recette = T_detail_recette.id_recette) LEFT JOIN T_stockage ON
T_recette.id_recette = T_stockage.id_recette) ON
T_type_stockage.id_type_stockage = T_stockage.id_type_stockage) ON
T_acceptation.id_acceptation = T_recette.id_acceptation WHERE
T_recette.code_prototype <> '' "


'Si le bouton chk_recette est enfoncé, on cherche tous les enregistrements
qui ont
'un libellé semblable à celui tapé dans la zone de texte libellé'
If Me.Chk_recette = True Then
SQL = SQL & "AND T_recette.libelle_recette like '*" & Me.ZT_libelle & "*'"
End If

'Début du code qui me pose problème...!!!!!!!!!:

'Si le bouton Chk_ingredient est enfoncé, on cherche les recettes pour
lesquelles
'les ingrédients ont un libellé semblable à celui tapé dans la zone de texte
SQL = SQL & "AND ("
Dim chaine As String
Dim longueur As Integer
Dim posET As Integer
Dim posOU As Integer
Dim i As Integer
chaine = Me.ZT_ingredient
longueur = Len(chaine)

For i = 1 To longueur
posET = InStr(i, chaine, " ET ")
posOU = InStr(i, chaine, " OU ")

If posET = i Or posOU = i Then
SQL = SQL & " T_ingredient.libelle_ingredient like '*" & Mid(chaine, 1, i) &
"*'"
If posET = i Then
SQL = SQL & " AND "
Else: SQL = SQL & " OR "
End If
chaine = Mid(chaine, i + 4, longueur - (i + 4))
longueur = Len(chaine)
i = 0
End If

If i = longueur And chaine <> "" Then
SQL = SQL & "T_ingredient.libelle_ingredient like '*" & chaine & "*'"
End If

Next i

'SQL = SQL & ")"

End If

9 réponses

1 2
Avatar
Eric
Bonjour,

J'ai pas lu tout le sql mais je suppose que tu as une association entre
la table Recette et la table Ingredient qui porte sur une relation N-N.

Soit la table Recette definie comme suit :
NumR - clé primaire
NomR - Nom Recette
...

Soit la table Ingredient:
NumI - clé primaire
NomI - Nom Ingredient
...

et la table RecetteIngredient(née de l'association Plusieurs-Plusieurs)
NumR
NumI
Qte - Quantité

le sql suivant te donnera les recettes à base, à la fois, de poulet et
de curry:

SELECT Recette.NomR, Recette.NumR
FROM (Recette INNER JOIN RecetteIngredient ON Recette.NumR =
RecetteIngredient.NumR)
INNER JOIN Ingredient ON RecetteIngredient.NumI = Ingredient.NumI
WHERE Ingredient.NomI Like "*poulet*" AND
RecetteIngredient.NumR In (SELECT RecetteIngredient.NumR
FROM RecetteIngredient
INNER JOIN Ingredient
ON RecetteIngredient.NumI = Ingredient.NumI
WHERE Ingredient.NomI Like "*curry*");

A toi d'adapter pour les jointures externes .

Ok?

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

hélàs ta solution ne fonctionne pas, il faudrait que dans le libellé d'un
ingrédient il y ait a la fois poulet et curry...

au cas où je peux vous envoyer la requête fabriquée pour quelques recherches

- Si on ne tape rien dans le champ libellé ingrédient :

SELECT DISTINCT T_recette.code_prototype as 'Code prototype',
T_recette.libelle_recette as 'Libellé de la recette', T_recette.date_creation
as 'Date', T_recette.note_recette as 'Note',
T_acceptation.libelle_acceptation as
'Accept',T_chef_de_projet.nom_chef_de_projet as 'Chef de projet',
T_gamme.libelle_gamme as 'Gamme' FROM T_acceptation RIGHT JOIN
(T_type_stockage RIGHT JOIN (((T_gamme RIGHT JOIN (T_chef_de_projet RIGHT
JOIN T_recette ON T_chef_de_projet.id_chef_de_projet =
T_recette.id_chef_de_projet) ON T_gamme.id_gamme = T_recette.id_gamme) LEFT
JOIN (T_ingredient RIGHT JOIN T_detail_recette ON
T_ingredient.code_ingredient = T_detail_recette.code_ingredient) ON
T_recette.id_recette = T_detail_recette.id_recette) LEFT JOIN T_stockage ON
T_recette.id_recette = T_stockage.id_recette) ON
T_type_stockage.id_type_stockage = T_stockage.id_type_stockage) ON
T_acceptation.id_acceptation = T_recette.id_acceptation WHERE
T_recette.code_prototype <> '' ;

--------------------------------------------------------------------------------------------------------

- Si on tape poulet dans le champ libelle ingredient :

SELECT DISTINCT T_recette.code_prototype as 'Code prototype',
T_recette.libelle_recette as 'Libellé de la recette', T_recette.date_creation
as 'Date', T_recette.note_recette as 'Note',
T_acceptation.libelle_acceptation as
'Accept',T_chef_de_projet.nom_chef_de_projet as 'Chef de projet',
T_gamme.libelle_gamme as 'Gamme' FROM T_acceptation RIGHT JOIN
(T_type_stockage RIGHT JOIN (((T_gamme RIGHT JOIN (T_chef_de_projet RIGHT
JOIN T_recette ON T_chef_de_projet.id_chef_de_projet =
T_recette.id_chef_de_projet) ON T_gamme.id_gamme = T_recette.id_gamme) LEFT
JOIN (T_ingredient RIGHT JOIN T_detail_recette ON
T_ingredient.code_ingredient = T_detail_recette.code_ingredient) ON
T_recette.id_recette = T_detail_recette.id_recette) LEFT JOIN T_stockage ON
T_recette.id_recette = T_stockage.id_recette) ON
T_type_stockage.id_type_stockage = T_stockage.id_type_stockage) ON
T_acceptation.id_acceptation = T_recette.id_acceptation WHERE
T_recette.code_prototype <> '' AND T_ingredient.libelle_ingredient like
'*poulet*';

- Si on tape poulet et curry

SELECT DISTINCT T_recette.code_prototype as 'Code prototype',
T_recette.libelle_recette as 'Libellé de la recette', T_recette.date_creation
as 'Date', T_recette.note_recette as 'Note',
T_acceptation.libelle_acceptation as
'Accept',T_chef_de_projet.nom_chef_de_projet as 'Chef de projet',
T_gamme.libelle_gamme as 'Gamme' FROM T_acceptation RIGHT JOIN
(T_type_stockage RIGHT JOIN (((T_gamme RIGHT JOIN (T_chef_de_projet RIGHT
JOIN T_recette ON T_chef_de_projet.id_chef_de_projet =
T_recette.id_chef_de_projet) ON T_gamme.id_gamme = T_recette.id_gamme) LEFT
JOIN (T_ingredient RIGHT JOIN T_detail_recette ON
T_ingredient.code_ingredient = T_detail_recette.code_ingredient) ON
T_recette.id_recette = T_detail_recette.id_recette) LEFT JOIN T_stockage ON
T_recette.id_recette = T_stockage.id_recette) ON
T_type_stockage.id_type_stockage = T_stockage.id_type_stockage) ON
T_acceptation.id_acceptation = T_recette.id_acceptation WHERE
T_recette.code_prototype <> '' AND T_ingredient.libelle_ingredient like
'*poulet *' AND T_ingredient.libelle_ingredient like '*curry*';


je rapelle pour finir que la table recette contient que le nom de la
recette, du chef de projet, la date de creation... la table detail recette
contient pour chaque ligne le libellé des ingrédients présents dans la recette

ex :

T_ recette

id_recette libelle_recette chef_de_projet
1;Poulet à l'orientale;Didier Gustin

T_detail_recette
id_ligne_recette id_recette libelle_ingredient
1;1;poulet cuisse 125g
2;1;curry vapeur
3;1;riz basmati
....


Cordialement!



Avatar
Whitetown
J'ai testé ta proposition..la requête ne me donne aucun resultat...

Merci quand même à tous pour votre aide mais là je bloque!!!!....
Avatar
Eric
re,

On va pas te laisser tomber ... ;-)
Si on est bien dans la configuration que je t'indiquais, alors un
exemple ici :

http://cjoint.com/?hboumes8Sh
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

J'ai testé ta proposition..la requête ne me donne aucun resultat...

Merci quand même à tous pour votre aide mais là je bloque!!!!....




Avatar
Whitetown
Salut Eric!
Ta requête va chercher les recettes 1 et 5 alors que seule la 5 contient à
la fois les deux ingrédients.

Le modèle de ma base correspondait à ce que tu as fait...mais j'ai du la
simplifier, en effet, je dois importer 7000 recettes venant de fiches Excel,
tous les champs ne sont pas forcement renseignés et ils ne sont pas toujours
renseignés de la même facon.

J ai donc une table recette (id_recette, libelle_recette,...)
et une table detail_recette (id_ligne_recette, id_recette, code_ingredient,
libelle_ingredient)

Si cela peut un peu plus t eclairer!

Whitetown
Avatar
Eric
re,

La recette 1 est composée de : Curry et Aile poulet (2 ingrédients)
La recette 5 : Curry, riz et cuisse poulet (3 ingrédients)
Les recettes 3 et 4: Safran & aile poulet (2 ingrédients)
La recette 2 n'a pas ces 2 ingrédients

donc c'est normal que la requête retourne les recettes 1 et 5.

Donc apparemment, tu cherches les recettes, en poursuivant ton exemple,
ne contenant, exclusivement, que du poulet et du curry et rien d'autre.
C'est bien ca ?

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Salut Eric!
Ta requête va chercher les recettes 1 et 5 alors que seule la 5 contient à
la fois les deux ingrédients.

Le modèle de ma base correspondait à ce que tu as fait...mais j'ai du la
simplifier, en effet, je dois importer 7000 recettes venant de fiches Excel,
tous les champs ne sont pas forcement renseignés et ils ne sont pas toujours
renseignés de la même facon.

J ai donc une table recette (id_recette, libelle_recette,...)
et une table detail_recette (id_ligne_recette, id_recette, code_ingredient,
libelle_ingredient)

Si cela peut un peu plus t eclairer!

Whitetown



Avatar
Whitetown
autant pour moi!!

j'avais pas fait gaffe!!!!!

cependant, cela n'a pas l'air de fonctionner avec mon modèle à deux
tables...je suis peut être mauvais en syntaxe sql...

et pour ta derniere question : oui c'est bien ca!!!!!!

whitetown



re,

La recette 1 est composée de : Curry et Aile poulet (2 ingrédients)
La recette 5 : Curry, riz et cuisse poulet (3 ingrédients)
Les recettes 3 et 4: Safran & aile poulet (2 ingrédients)
La recette 2 n'a pas ces 2 ingrédients

donc c'est normal que la requête retourne les recettes 1 et 5.

Donc apparemment, tu cherches les recettes, en poursuivant ton exemple,
ne contenant, exclusivement, que du poulet et du curry et rien d'autre.
C'est bien ca ?

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Salut Eric!
Ta requête va chercher les recettes 1 et 5 alors que seule la 5 contient à
la fois les deux ingrédients.

Le modèle de ma base correspondait à ce que tu as fait...mais j'ai du la
simplifier, en effet, je dois importer 7000 recettes venant de fiches Excel,
tous les champs ne sont pas forcement renseignés et ils ne sont pas toujours
renseignés de la même facon.

J ai donc une table recette (id_recette, libelle_recette,...)
et une table detail_recette (id_ligne_recette, id_recette, code_ingredient,
libelle_ingredient)

Si cela peut un peu plus t eclairer!

Whitetown






Avatar
Eric
autant pour moi!!

j'avais pas fait gaffe!!!!!

cependant, cela n'a pas l'air de fonctionner avec mon modèle à deux
tables...je suis peut être mauvais en syntaxe sql...

et pour ta derniere question : oui c'est bien ca!!!!!!

whitetown




re,
Désolé, je m'etais absenté. Donc vite fait :

Pour avoir uniquement les recettes composées de poulet et curry,
donc d'aucun autre ingrédient, il faut rajouter à la requête que
je t'ai donnée, à la fin après avoir enlevé le ;

AND RecetteIngredient.NumR NOT IN (SELECT numR
FROM RecetteIngredient
GROUP BY NumR HAVING count(*)>2)

Dès que j'ai un moment, ce we, je regarderai pour te donner
le sql basé sur les 2 tables que tu as décrites dans ton post.




J ai donc une table recette (id_recette, libelle_recette,...)
et une table detail_recette (id_ligne_recette, id_recette, code_ingredient,
libelle_ingredient)

Si cela peut un peu plus t eclairer!

Whitetown




--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Eric
re,

Avec tes tables ici :
http://cjoint.com/?hbt1LE0zve

Ouvres la fenêtre SQL de la requête RQWHITETOWN pour voir le code
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Whitetown
C'est parfait!! merci beaucoup pour ton aide et ton abnégation Eric!!!!

Bonne journée et bonne semaine...


re,

Avec tes tables ici :
http://cjoint.com/?hbt1LE0zve

Ouvres la fenêtre SQL de la requête RQWHITETOWN pour voir le code
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



1 2