Requete SQL- Base de données Access

cs_gabkiel Messages postés 22 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 6 janvier 2010 - 9 nov. 2009 à 17:01
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 3 déc. 2009 à 22:06
Bonjour,
il s'agit d'un base de données Access mettant en relation des recettes de cuisines,leurs ingrédients respectifs ainsi que les ingrédients
contenu dans un stock.

Tables:

RECETTE
id_recette
nom_recette
categorie
type

RECING
#id_recette(clé primaire étrangère)
#id_ingredient(clé primaire étrangère)
quantite_ingredient
mesure_ingredient

INGREDIENT
id_ingredient
nom
quantite
mesure

Pour sélectionner toutes les informations de la table recette->
SELECT * FROM RECETTE WHERE categorie LIKE'%Entrée%';

Maintenant je voudrais filtrer encore plus les réponses en s'intéressant à la quantité des ingrédients contenu dans le frigo(quantite)
et celle contenu dans une recette(quantite_ingredient).Je voudrais complèter la requete précédente avec
"AND quantite>quantite_ingredient".

Le problème est que chaque recette possède plusieurs ingrédients et certains répondent à "quantite>quantite_ingredient"
et d'autres non;
un exemple:

INGREDIENT quantite quantite_ingredient id_recette
oeuf 2 1 1
farine 100 200 1

la quantité d'œuf est validé mais pas celle de farine, la recette 1 va s'afficher car au moins un des ingrédient à les bonnes quantités.
Je voudrais avoir comme réponse à ma requête seulement les recettes ou tous les ingrédients possèdent les bonnes quantités.

Mon projet est développé en vb.net et est relié à une base Access.

J'attends avec impatience des commentaires et surtout si possible une ébauche de solution :)

merci d'avance
gab

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 nov. 2009 à 18:48
Salut
Si j'ai bien compris, tu utilises INGREDIENT pour deux usages :
- la référence du produit pour la recette
- la référence du produit + la quantité pour le frigo
C'est astucieux mais pas facile à comprendre quand on ne le dit pas dans l'énoncé.

Essaye ça :
Select T1.*, T3.*
  From RECETTE T1, RECING T2, INGREDIENT T3
 Where T1.categorie Like '%Entrée%'
   And T2.id_recette = T1.id_recette
   And T2.id_ingredient = T3.id_ingredient
   And T2.quantite < T3.quantite_ingredient


PS : N'abuse pas des "Like", ça ralenti les recherches. Catégorie semble être géré par ton programme, donc peu de chance de trouver des saisies fantaisistes.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 nov. 2009 à 18:50
Il faut lire
And T2.quantite < T3.quantite_ingredient
au lieu de
And T2.quantite < T3.quantite_ingredient
0
cs_gabkiel Messages postés 22 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 6 janvier 2010
9 nov. 2009 à 19:12
Bonjour jack et merci,

mais ma question (qui apparemment à été très mal formulée) était à propos de:

une recette est logiquement composée de plusieurs ingrédients du coup certain répondent au critère 'T2.quantite < T3.quantite_ingredient' ET d'autre NON. Dans access à partir du moment ou un ingrédient est en quantité suffisante il sélectionne la recette. Je voudrais qu'il me sélectionne la recette que si la totalité des ingrédients est en quantité suffisante.

voila :D j'espère m'être mieux fait comprendre


gab
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 nov. 2009 à 19:36
Ah Ok, ton problème est que la requète est affichée pour les composants Ok même s'il en manque un.
Tu ne pourras pas le faire avec une requète puisque tu comptes sur elle pour énumérer les items.

Dans ce cas, il faut le faire en deux étapes :
- Tu fais une requète pour avoir la liste des recettes
Genre
Select *
From RECETTE
Where categorie Like '%Entrée%'


- Tu reprends (*) la liste obtenue puis, pour chacune d'elle, tu recherches les ingrédients qui ne cadrent pas en quantité, tu l'élimines de la première liste
(*) avec une énumération style Do-Loop
Genre :
monRecordSet1.MoveFirst
Do Not monRecordSet1.EOF
  maRecette = monRecordSet1.Fields(&quot;id_recette&quot;).Value
  monRecordSet2.Open _
  &quot;Select T1.*, T2.*
     From RECING T1, INGREDIENT T2
    Where T1.id_recette = &quot; &amp; maRecette &amp; _
      And T1.id_ingredient = T3.id_ingredient
      And T2.quantite < T1.quantite_ingredient&quot;
  ' Epluchage du r&#233;sultat : Si pas de r&#233;cultat, c'est que
  ' tous les composants sont pr&#233;sents, sinon, il en manque un
  ' Effacement
  If monRecordSet2.RecordCount > 0 Then
    monRecordSet1.Delete
  End If
  monRecordSet1.Move.Next
Loop

(Tout ça est approximatif)
Désolé, je n'ai jamais pratiqué les DB sous .Net
La syntaxe ici ressemble plus à du VB6 : A toi de voir quel classe doit remplacer le RecordSet ADO (DataSet je crois mais pas sûr)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)



putain de boite de saisie de texte de meeeeerrrrddddee !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_gabkiel Messages postés 22 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 6 janvier 2010
10 nov. 2009 à 19:39
Bonjour,
Étant donné que je ne peux pas faire ce que je voulais en une seule requête voila mon code initial d'une de mes fonctions.
Cette fonction récupère l'ensemble des recettes répondant à la requête contenu dans la variable "strsql". Dans ce cas strsql="SELECT * FROM RECETTE WHERE categorie LIKE'%Entrée%'; ".
Ensuite j'insère les données dans un tableau de type structuré(tab_recette).


code:
Public Sub connexion(ByVal strsql, ByVal strsqlNb)

Dim ObjetConnection As OleDbConnection 'Déclaration Objet Connexion
Dim ObjetCommand As OleDbCommand 'Déclaration Objet Commande
Dim ObjetDataAdapter As OleDbDataAdapter 'Déclaration Objet DataAdapter
Dim ObjetDataSet1 As New DataSet() 'Déclaration Objet DataSet 'Attention au New
Dim ObjetDataTable1 As DataTable 'Déclaration Objet DataTable
Dim RowNumber As Integer 'Numéro de la ligne en cours
Dim strConn As String 'Paramêtres de connexion à la DB

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source='easyt.mdb';" 'Initialisation de la chaîne de paramètres pour la connexion

ObjetConnection = New OleDbConnection() 'Instanciation d'un Objet Connexion
ObjetConnection.ConnectionString = strConn 'Donner à la propriété ConnectionString les paramètres de connexion
ObjetConnection.Open()
ObjetCommand = New OleDbCommand(strsql) 'Instancier un objet Commande
ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand) 'Instancier un objet Adapter
ObjetCommand.Connection() = ObjetConnection 'initialiser l'objet Command
ObjetDataAdapter.Fill(ObjetDataSet1, "recette") 'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
ObjetDataTable1 = ObjetDataSet1.Tables("recette") 'Mettre dans un Objet DataTable une table du DataSet

nb_entree = ObjetDataTable1.Rows.Count


ReDim tab_recette(nb_entree)

If RowNumber > ObjetDataTable1.Rows.Count - 1 Then
MsgBox("Aucune recette trouvée! Veuillez modifier vos critères.")
'Lors de l'ouverture de la BD, s'il n'y a aucun enregistrement
Exit Sub

End If

While ((RowNumber) <> (nb_entree)) 'ObjetTable.Rows(Numéro de lignes).Item( Nom de colonne) donne le contenu d'un champ dans une ligne donnée'
tab_recette(RowNumber).id = ObjetDataTable1.Rows(RowNumber).Item("id_recette").ToString
tab_recette(RowNumber).nom = ObjetDataTable1.Rows(RowNumber).Item("nom_recette").ToString
tab_recette(RowNumber).categorie = ObjetDataTable1.Rows(RowNumber).Item("categorie").ToString
tab_recette(RowNumber).type = ObjetDataTable1.Rows(RowNumber).Item("type").ToString
tab_recette(RowNumber).temps_preparation = ObjetDataTable1.Rows(RowNumber).Item("temps_preparation").ToString
tab_recette(RowNumber).temps_cuisson = ObjetDataTable1.Rows(RowNumber).Item("temps_cuisson").ToString
tab_recette(RowNumber).preparation = ObjetDataTable1.Rows(RowNumber).Item("preparation").ToString
tab_recette(RowNumber).valide = ObjetDataTable1.Rows(RowNumber).Item("valide").ToString


RowNumber = RowNumber + 1
End While

indice_courant = 0 ' initialisation de la variable servant à afficher les recettes'
If nb_entree = 1 Then
FRM_resultat.CMD_suivant.Enabled = False
End If
FRM_resultat.CMD_precedent.Enabled = False
FRM_resultat.TB_preparation.Text = mef(tab_recette(0))
FRM_resultat.LBL_infos.Text = mef_titre(tab_recette(0))

ObjetConnection.Close()
End Sub

Avec une telle requête (strsql) on ne prend en fait pas en compte les ingrédients du frigo. Je voulais en fait modifier ma requête strsql suivant si l'utilisateur veut rechercher en fonction du frigo ou non.

Je ne vois pas comment adapter mon code pour faire la manipulation proposée dans ton dernier post.

gab
0
cs_MagDix Messages postés 531 Date d'inscription lundi 5 juin 2006 Statut Membre Dernière intervention 6 octobre 2012 1
10 nov. 2009 à 21:58
Salut

Je me suis fait un prog. qui gère les recettes (Ado.net VB.Net 2005 avec access 2000). Le prog n'a pas tout à fait les mêmes vocation mais tu pourrais avoir une idée pour coder en .Net avec l'exemple de jack.

Si tu le veux envois moi ton courriel en privé et je pourrai te l'envoyer au courant de la journée, demain.

A+
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 déc. 2009 à 20:52
Test liste
[*] Coucou
[*] ReCoucou
[list]
10 de der
/list

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 déc. 2009 à 20:55
Test liste
[*] Coucou
[*] ReCoucou
[list]
10 de
der
/list

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 déc. 2009 à 21:56
Test

monRecordSet1.MoveFirst
Do Not monRecordSet1.EOF
  maRecette = monRecordSet1.Fields("id_recette").Value
  monRecordSet2.Open _
  " Select T1.*, T2.*
     From RECING T1, INGREDIENT T2
    Where T1.id_recette = " &maRecette & _
      And T1.id_ingredient = T3.id_ingredient
      And T2.quantite >  T1.quantite_ingredient&quot;
  ' Epluchage du résultat : Si pas de résultat, c'est que
  ' tous les composants sont présents, sinon, il en manque un
  ' Effacement
  If monRecordSet2.RecordCount > 0 Then
    monRecordSet1.Delete
  End If
  monRecordSet1.Move.Next
Loop

0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 déc. 2009 à 22:06
Test list

[list]
[*]item1
[*]item2[*]item3
/list
0
Rejoignez-nous