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 20/12/2010, 13h21   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
Par défaut filtre pour zone de liste

Bonjour,

Dans une base de gestion d'items, je souhaite afficher l'ensemble des items à commander dans une zone de liste. Le formulaire permet ensuite de commander l'item sélectionné.

J'ai ajouté deux zones de liste déroulante permettant de filtrer les items affichés par leur "statut" ou le "module" auquel ils appartiennent, à l'aide d'une requête SQL + Requery de la zone de liste.

Cette technique empêche d'afficher tous les items, ou les items de tous les modules pour un statut donné ou les items de tous statuts dans un module donné. Aussi, j'aimerais pouvoir rajouter un choix "ALL" en haut de mes listes déroulantes.

J'ai trouvé ce bout de code dans votre forum mais ne voit pas comment l'appliquer à mon besoin.
http://access.developpez.com/faq/?pa...l#AjoutTousLst

Sauriez-vous détailler un peu plus afin de m'aider à le mettre en place ? En particulier, comment faire en sorte que ma requête affiche tous les enregistrements lorsqu'elle "lit" la valeur "ALL" ?

Merci par avance pour votre aide !
Joyeuses fêtes,
Thomas
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 23h46   #2
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour Thomas75005,

Pour l'implémentation de la requête, il faut que tu implémente la requête UNION dans le controlSource de ta listbox (n'oublie pas de préciser l'ordre de tri de manière à afficher le (Tous) en début ou en fin de liste

Ensuite, il te faut sélectionner la colonne liée, afin de retourner la valeur que tu souhaite.

Enfin, il te faudra construire le résultata de ta requête dynamiquement, de manière à ne pas insérer de clause WHERE dans celle-ci si la valeur retournée pas ta colonne liée se réféère au (Tous)
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 12h29   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
Bonjour,

Merci pour tes conseils !
Pas de soucis pour ajouter le champs "TOUS" dans ma liste déroulante.
Par contre, je ne sais pas (encore) faire de requêtes dynamiques. J'imagine qu'il faut rentrer dans le SQL de la requête pour supprimer la condition WHERE si
Code :
Formulaires.MonFormulaire.choix_module = "Tous"
et sinon conserver
Code :
WHERE MaTable.Module = Formulaires.MonFormulaire.choix_module
Comment le formuler dans le SQL ? A quel endroit ?

Extrait du SQL :
Code :
1
2
3
SELECT Kit_lists.statut_item AS Statut
FROM Kit_lists
WHERE Kit_lists.module_item=[Formulaires]![HA_visu_cotations]![choix_module]
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 14h11   #4
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour Thomas75005

Il faut que tu gère le SQL directement dans le VBA.

Le mieux est que tu codes quelque chose dans le genre :

Code :
1
2
3
4
5
6
7
8
9
Dim MonSQL as string
 
MonSQL = "SELECT Kit_lists.statut_item AS Statut " & _
               " FROM Kit_lists"
if [Formulaires]![HA_visu_cotations]![choix_module] <> "Tous" then
     MonSQL = MonSQL  & [Formulaires]![HA_visu_cotations]![choix_module] 
end if
 
<mon formulaire>.RecordSource = MonSQL
sI le controlsource avait déjà été défini et le formulaire déjà activé, n'oublie pas de faire un .requery
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 15h14   #5
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
Merci beaucoup, je vais essayer ça !
Et donc si je veux insérer cette instruction comme contenu de ma zone de liste déroulante je conclus avec
Code :
mazonedelistederoulante.RowSource = MonSQL
au lieu de
Code :
monformulaire.RecordSource=MonSQL
N'est-ce pas ?
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 15h18   #6
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
tout à fait.

N'hésite pas à consulter l'aide en ligne de Acces à ce sujet, qui est très bien faite.
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 17h09   #7
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
J'ai essayé avec une requête simple : ça marche nickel !
J'ai opté pour cette syntaxe :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Dim MonSQL As String
 
If Me.choix_module <> "Tous" Then
MonSQL = "SELECT Kit_lists.code_pn_ENG FROM Kit_lists WHERE (((Kit_lists.module_item)=[Formulaires]![HA_visu_cotations]![choix_module]))"
 
Else
MonSQL = "SELECT Kit_lists.code_pn_ENG FROM Kit_lists"
 
End If
 
Me.Texte119.RowSource = MonSQL
Me.Texte119.Requery
Par contre, j'ai un problème de syntaxe en adaptant ma requête SQL complète (voir ci-dessous).

Je sais déjà que je dois changer "HAVING" en "WHERE", quant est-il des autres éléments ? La requête est-elle trop longue pour l'insérer dans VBA ? Comment l'y rendre lisible ? Est-ce que je peux l'écrire comme ceci :

MonSQL="SELECT...." &
"FROM ...." &
"HAVING ..." &
"GROUP BY ..."

Merci encore !



Code :
1
2
3
4
SELECT Kit_lists.code_pn_ENG, Kit_lists.criticite_ENG AS Criticité, Referentiel_PN.Part_Number AS [P/N], Referentiel_PN.designation_pn AS Désignation, Kit_lists.statut_item AS Statut, Sum(Kit_lists.quantite_par_avion_ENG) AS [Qté totale ENG], Kit_lists.unite_ENG AS Unité, Avg(Kit_lists_AP.PU_retenu_ap_eurp) AS [PU AP moy ()], Sum(Kit_lists_AP.PT_retenu_ap_euro) AS SommeDePT_retenu_ap_euro, Avg(Kit_lists_AP.delai_retenu_ap) AS MoyenneDedelai_retenu_ap, Referentiel_PN.Vendeur, Referentiel_PN.Nature, Referentiel_PN.num_plan_FAB, Kit_lists.ref_cotation_HA, Cotations_HA.fournisseur_HA, Cotations_HA.prix_unitaire_HA, Cotations_HA.quantite_HA, Cotations_HA.unite_HA, Cotations_HA.prix_total_HA, Cotations_HA.devise_HA, Cotations_HA.prix_total_HA_euro, Cotations_HA.delai_HA, Cotations_HA.origine, Cotations_HA.document, Cotations_HA.date_validite, Cotations_HA.acheteur 
FROM ((Kit_lists LEFT JOIN Kit_lists_AP ON Kit_lists.ref_item_AP = Kit_lists_AP.ref_item) LEFT JOIN Referentiel_PN ON Kit_lists.code_pn_ENG = Referentiel_PN.Reference) LEFT JOIN Cotations_HA ON Kit_lists.ref_cotation_HA = Cotations_HA.ref_cotation GROUP BY Kit_lists.code_pn_ENG, Kit_lists.criticite_ENG, Referentiel_PN.Part_Number, Referentiel_PN.designation_pn, Kit_lists.statut_item, Kit_lists.unite_ENG, Referentiel_PN.Vendeur, Referentiel_PN.Nature, Referentiel_PN.num_plan_FAB, Kit_lists.ref_cotation_HA, Cotations_HA.fournisseur_HA, Cotations_HA.prix_unitaire_HA, Cotations_HA.quantite_HA, Cotations_HA.unite_HA, Cotations_HA.prix_total_HA, Cotations_HA.devise_HA, Cotations_HA.prix_total_HA_euro, Cotations_HA.delai_HA, Cotations_HA.origine, Cotations_HA.document, Cotations_HA.date_validite, Cotations_HA.acheteur, Kit_lists.ref_projet 
HAVING (((Kit_lists.code_pn_ENG) Is Not Null) AND ((Kit_lists.module_item)=[Formulaires]![HA_visu_cotations]![choix_module]) AND ((Kit_lists.ref_projet)=[Formulaires]![HA_visu_cotations]![Ref_projet])) 
ORDER BY Kit_lists.criticite_ENG DESC;
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 17h38   #8
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
ta requête m'a l'air correcte (à a part le HAVING effectivement car il ne porte pas sur les agrégats)

Il faudrait que tu mettes simplement les critères sur tes formulaires en dehors de la chaîne et de les remplacer par les valeurs issues du formulaire

comme suit (attention, je n'ai pas mis les double-quote partout, tu sauras compléter):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Select
  [Kit_lists].[code_pn_ENG],
  [Kit_lists].[criticite_ENG] As Criticité,
  [Referentiel_PN].[Part_Number] As [P/N],
  [Referentiel_PN].[designation_pn] As Désignation,
  [Kit_lists].[statut_item] As Statut,
  Sum([Kit_lists].[quantite_par_avion_ENG]) As [Qté totale ENG],
  [Kit_lists].[unite_ENG] As Unité,
  Avg([Kit_lists_AP].[PU_retenu_ap_eurp]) As [PU AP moy (€)],
  Sum([Kit_lists_AP].[PT_retenu_ap_euro]) As [SommeDePT_retenu_ap_euro],
  Avg([Kit_lists_AP].[delai_retenu_ap]) As [MoyenneDedelai_retenu_ap],
  [Referentiel_PN].Vendeur,
  [Referentiel_PN].Nature,
  [Referentiel_PN].[num_plan_FAB],
  [Kit_lists].[ref_cotation_HA],
  [Cotations_HA].[fournisseur_HA],
  [Cotations_HA].[prix_unitaire_HA],
  [Cotations_HA].[quantite_HA],
  [Cotations_HA].[unite_HA],
  [Cotations_HA].[prix_total_HA],
  [Cotations_HA].[devise_HA],
  [Cotations_HA].[prix_total_HA_euro],
  [Cotations_HA].[delai_HA],
  [Cotations_HA].origine,
  [Cotations_HA].document,
  [Cotations_HA].[date_validite],
  [Cotations_HA].acheteur
From
  (([Kit_lists] Left Join
      [Kit_lists_AP] On [Kit_lists].[ref_item_AP] = [Kit_lists_AP].[ref_item]) Left Join
    [Referentiel_PN] On [Kit_lists].[code_pn_ENG] = [Referentiel_PN].Reference) Left Join
  [Cotations_HA] On [Kit_lists].[ref_cotation_HA] = [Cotations_HA].[ref_cotation]
Where
  ([Kit_lists].[code_pn_ENG]) Is Not Null And
  ([Kit_lists].[statut_item]) =  "& Formulaires.[HA_visu_cotations].[choix_module] & " And
  ([Kit_lists].[ref_projet]) = " &  Formulaires.[HA_visu_cotations].[Ref_projet] & "
Group By
  [Kit_lists].[code_pn_ENG], [Kit_lists].[criticite_ENG], [Referentiel_PN].[Part_Number], [Referentiel_PN].[designation_pn], [Kit_lists].[statut_item], [Kit_lists].[unite_ENG], [Referentiel_PN].Vendeur, [Referentiel_PN].Nature, [Referentiel_PN].[num_plan_FAB], [Kit_lists].[ref_cotation_HA], [Cotations_HA].[fournisseur_HA], [Cotations_HA].[prix_unitaire_HA], [Cotations_HA].[quantite_HA], [Cotations_HA].[unite_HA], [Cotations_HA].[prix_total_HA], [Cotations_HA].[devise_HA], [Cotations_HA].[prix_total_HA_euro], [Cotations_HA].[delai_HA], [Cotations_HA].origine, [Cotations_HA].document, [Cotations_HA].[date_validite], [Cotations_HA].acheteur, [Kit_lists].[ref_projet]
Order By
  [Kit_lists].[criticite_ENG] Desc
Ca devrait marcher.

Tu ne devrais pas havoir de limite pour ta requête (le type String est limité à 63Ko, ce qui laisse un peu de marge).

Par compte, pour que la concétation marche avec le changement de ligne, la syntaxe en fin de ligne doit ête obligatoirement & _

Pour tester, mets un point d'arrêt sur ta variable MonSQL juste avant de l'affecter en rowsource. Un p'tit coup de débugger (Ctrl + G), un p'tit debug.print de la variable et un copier-coller dans l'éditeur de requête, exécuter, et hop ! Rien de tel pour voir si ça marche

Bon courage
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 10h25   #9
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
Merci encore, je pars en congés, je te donne donc un retour sur tout ça à la rentrée ! Bonnes fêtes !
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 11h37   #10
Invité de passage
 
Inscription : novembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 13
Points : 3
Points : 3
Bonjour et bonne année !
J'ai donc inséré ce code avec les double quote et tout et tout... et malheureusement j'ai rencontré l'erreur 2176 (Paramètre de la propriété RowSource est trop long)...

Pour contourner ce problème, je me demandais s'il n'est pas possible d'enregistrer plutôt la requête sans filtrage sur le module et ainsi de coder un truc du genre :

Code :
1
2
3
4
5
If choix_module <> Tous Then
ZoneListe.RowSource=MaRequête
Else
ZoneListe.RowSource=MaRequête & Where "statut=choix_module"
End If
Qu'en pensez-vous ?

// Bon j'ai finalement dupliqué ma requête (une avec le filtre et une sans) et fait appel tantôt à l'une, tantôt à l'autre dans mion rowsource. Ca marche aussi nickel avec le Filter d'un sous-formulaire.

Merci pour tes conseils en tout cas !
Thomas75005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h29.


 
 
 
 
Partenaires

Hébergement Web