Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/04/2011, 19h35   #1
Invité de passage
 
Inscription : août 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Par défaut lien entre liste multiple ouverture d'état et requête sous-jacente

Bonjour,

J'ai suivi les tutoriels trouvé sur Internet, mais je pense avoir un problème de construction à la base.
Je m'explique, j'ai les tables suivantes reliées entre elles (Ref/Id):
Menu (IdMenu, NomMenu)
MenuRec (IdMenuRec, RefIdMenu, RefIdRecette, Nb de personne...)
Recettes (IdRecette, Nom, Pour...) Pour indiquant le nombre de personne pour lequel est prévu la recette.
RecIngr (IdRecIngr, RefIdIngredient, RefIdRecette, quantité, unité)
Ingredients (IdIngredient, rayon)

Mon objectif est d'arriver à sélectionner plusieurs menus et de sortir la liste des courses compilée de ces menus.

Autrement dit, j'ai fait une requête (ReqTotalCourses) contenant les champs suivants dont les opérations sont des regroupements:
Code :
IdMenu, Rayon, Nom de l'ingrédient, QTot: Somme(([RecIngr]![quantité]/[Recettes]![Pour])*[MenuRec]![Nb de personne]), Unité
Un Etat "Liste Course" est basé sur cette requête.

J'ai un formulaire avec une liste à choix multiple (LstMenu) où l'utilisateur peut sélectionner plusieurs Menu. Il y a également un bouton (BtnMenu) qui récupère les valeurs de la liste et ouvre l'état "Liste Course".

Ce bouton à le code suivant sur clic:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub BtnMenu_Click()
  Dim varI As Variant
  Dim strFiltre As String
 
  strFiltre = ""
  If Me.LstMenu.ItemsSelected.Count = 0 Then
    MsgBox "Aucun Menu n'a été sélectionné"
  Else
    For Each varI In Me!LstMenu.ItemsSelected
      If strFiltre <> "" Then strFiltre = strFiltre & " OR "
        strFiltre = strFiltre & "[IdMenu]=" & _
          Me!LstMenu.ItemData(varI) & ""
      Next varI
      DoCmd.OpenReport "Liste Courses", acViewReport, , strFiltre
  End If
End Sub
Jusque là tout va bien! L'état indique bien les ingrédients des menus sélectionnés et seulement ceux là. Mais j'ai des doublons. Si dans un Menu j'ai plusieurs recettes qui utilise les mêmes ingrédients il me fait bien la somme mais si dans deux Menu différents j'ai le même ingrédient il me l'indique deux fois.
J'ai pensé que le problème pouvais venir de la requête? Je voudrais pouvoir enlever de la requête IdMenu pour que dans l'état n'apparaissent pas les ingrédients Regroupé par Menu mais seulement par rayon.

Je ne sais comment faire, si une âme charitable pouvais me donner une direction à suivre, ça serait vraiment gentil!

J'ai penser à l'opération "où" pour IdMenu dans la requête, mais je sais pas bien comment ça marche et quoi mettre comme critère?

N'hésitez pas à me demander si il manque des indications. Merci d'avance pour votre aide.
Cordialement.
Mimikit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2011, 21h24   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
Bonjour,

"Où" permet d'utiliser un champ uniquement pour faire un tri ou une condition.

Clique sur Où de idmenu. N'oublie pas de mettre en place le regroupement et de faire une somme sur la quantité d'ingrédient.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 10h22   #3
Invité de passage
 
Inscription : août 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Par défaut Merci mais?

Bonjour,

Merci pour votre réponse rapide. En effet, j'ai bien un regroupement pour mes champs et une somme pour les quantités d'ingrédient. En revanche, je ne comprend pas ce qu'il faut que je mette comme critère pour IdMenu avec le Où.
En fait, c'est le lien entre le code de mon bouton (BtnMenu) de mon formulaire "Choix Menu" et cette fameuse requête que j'ai du mal à saisir...
Est-ce qu'il faut que dans le champ IdMenu je fasse référence aux valeurs stockées dans le code du bouton (BtnMenu)? Et si oui comment?
Je suis débutante dans l'histoire et il est vrai que j'ai adapté le code sans vraiment comprendre tout...
Merci de votre aide.
Cordialement.
Mimikit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 12h18   #4
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
Normalement ça devrait fonctionner avec le code que tu as mis. Il faut que tu rajoute Distinctrow dans la requete, après le SELECT. Ou aller dans les propriétés de la requète et mettre valeur unique à oui.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 18h58   #5
Invité de passage
 
Inscription : août 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 9
Points : 1
Points : 1
Bonjour,

En effet mon code marche. J'ai mis Distinctrow dans le select de ma requête mais résultat est le même.
Je n'ai pas du expliquer correctement mon problème. Je vais essayer d'être plus clair.
Pour donner un exemple : dans mon Menu 1 j'ai 3 recettes comprenant toutes les trois de la farine, dans mon Menu 2 j'ai 4 recettes dont 2 contenant de la farine.
Lorsque je sélectionne dans ma liste à choix multiple de mon formulaire le Menu 1 et le Menu 2 et que je clic sur mon Bouton, j'obtiens mon Etat comprenant les ingrédients de mes deux menu (et c'est ce que je veux!) Mais pour revenir à mon exemple j'obtiens 2 lignes correspondant à l'ingrédient farine. Alors que je voudrais obtenir une seule ligne pour farine. Ma requête fait donc bien la somme des quantités de farine dans le Menu 1 (farine de la recette 1, farine de la recette 2 et farine de la recette 3) idem dans le Menu 2, mais ne somme pas les quantités farine du Menu 1 ET farine du Menu 2...
La requête sql sous jacente à mon état est la suivante:

Code :
1
2
3
SELECT DISTINCTROW Ingredients.rayon, Ingredients.[nom de l'ingrédient], Sum(([RecIngr]![quantité]/[Recettes]![Pour])*[MenuRec]![Nb de personne]) AS QTot, RecIngr.unité, Menu.IdMenu
FROM (Recettes INNER JOIN (Menu INNER JOIN MenuRec ON Menu.IdMenu=MenuRec.RefIdMenu) ON Recettes.Idrecette=MenuRec.RefIdRecette) INNER JOIN (Ingredients INNER JOIN RecIngr ON Ingredients.IdIngredients=RecIngr.RefIdIngredient) ON Recettes.Idrecette=RecIngr.RefIdRecette
GROUP BY Ingredients.rayon, Ingredients.[nom de l'ingrédient], RecIngr.unité, Menu.IdMenu;
Lorsque j'enlève dans le group by idMenu, et que je relance mon formulaire, malgrè ma sélection dans la liste à choix multiple quand je clic sur le bouton il demande de saisir manuellement idMenu!
Je ne sais pas d'où celà vient? De ma requête ou de mon code, ou plus simplement de mon état?
D'où mon idée de passer par le fameux critère Où pour le champ IdMenu dans la requête avec un critère faisant référence à la sélection faite dans la liste... mais je ne sais pas si c'est une bonne solution ni comment faire!
Merci encore pour votre aide.
A bientôt.
Mimikit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 09h17   #6
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 085
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 085
Points : 11 623
Points : 11 623
Si tu veux regrouper il ne faut pas indiquer des champs qui ne peuvent pas l'être. Comme IdMenu par exemple.

Tu peux l'utiliser dans un Where mais pas à l'affichage.

Code :
1
2
3
SELECT DISTINCTROW Ingredients.rayon, Ingredients.[nom de l'ingrédient], Sum(([RecIngr]![quantité]/[Recettes]![Pour])*[MenuRec]![Nb de personne]) AS QTot, RecIngr.unité
FROM (Recettes INNER JOIN (Menu INNER JOIN MenuRec ON Menu.IdMenu=MenuRec.RefIdMenu) ON Recettes.Idrecette=MenuRec.RefIdRecette) INNER JOIN (Ingredients INNER JOIN RecIngr ON Ingredients.IdIngredients=RecIngr.RefIdIngredient) ON Recettes.Idrecette=RecIngr.RefIdRecette GROUP BY Ingredients.rayon, Ingredients.[nom de l'ingrédient], RecIngr.unité
 WHERE Menu.IdMenu...;
Tu peux utiliser l'opérateur IN pour isoler tes menus.

Code :
.... WHERE Menu.IdMenu IN ('1','2','10')
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h15.


 
 
 
 
Partenaires

Hébergement Web