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 30/05/2011, 21h57   #1
Membre du Club
 
Homme Guenaël LE MERRER
consultant environnement et développement d'applications de base de données
Inscription : janvier 2006
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme Guenaël LE MERRER
Âge : 38
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : consultant environnement et développement d'applications de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : janvier 2006
Messages : 210
Points : 65
Points : 65
Par défaut Clause Where avec In et référence à un formulaire

Bonjour

Tout est presque dans le titre...je cherche à faire une requête avec une clause where de type IN (1;2;3;4;5;10;100) ce qui fonctionne très bien quand je le tape ainsi mais... cette liste de nombre est issue d'une sélection d'une liste multiple d'un formulaire, je pensai donc y faire référence ainsi : IN (Forms!monform!machaine) mais que néni, rien ne fonctionne...avec des ; ou des , dans ma chaîne... j'ai même essayé avec un IN (Eval("Forms!monform!machaine")) pas mieux...
quelqu'un a t'il une idée ?
ou bien comment filtrer une requête à partir du résultat d'une sélection de liste multiple ?
merci de votre aide

guen
guen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 10h58   #2
Membre confirmé
 
Homme
Développeur amateur
Inscription : mars 2009
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Développeur amateur

Informations forums :
Inscription : mars 2009
Messages : 176
Points : 255
Points : 255
Bonjour,

Qu'est ce que tu veux dire par liste multiple?
Est ce une liste déroulante , des cases à cocher ou bien autre chose?
Si c'est une liste déroulante, une solution consiste à utiliser une boucle recordset pour alimenter le IN() par l'ensemble des valeurs de la liste déroulante

Cordialement
reedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 11h05   #3
Membre du Club
 
Homme Guenaël LE MERRER
consultant environnement et développement d'applications de base de données
Inscription : janvier 2006
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme Guenaël LE MERRER
Âge : 38
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : consultant environnement et développement d'applications de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : janvier 2006
Messages : 210
Points : 65
Points : 65
Bonjour

c'est une liste à choix multiple (pas déroulante). je n'ai pas de souci pour créer ma chaîne en fonction de mes sélections dans la liste 1;20;13;45;5;6 mais c'est pour récupérer cette chaîne dans ma clause IN de la requête que ça coince... c'est plus compliqué de passer par un recordset (ce qui serait effectivement tout à fait possible) car cette requête alimente un état. mon formulaire avec cette liste multiple est en réalité un formulaire de filtre/tri de cet état.
à moi que je crée ma requête en vba et que je mette à jour le sql toujours en vba mais je pensai qu'il y aurait une solution plus rapide...je trouve bizarre que je ne puisse pas récupérer ma chaîne dans un classique paramètre de requête
guen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 03h18   #4
Membre confirmé
 
Homme
Développeur amateur
Inscription : mars 2009
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Développeur amateur

Informations forums :
Inscription : mars 2009
Messages : 176
Points : 255
Points : 255
Bonjour,

Maintenant, je comprends mieux ton besoin.
Citation:
cette liste de nombre est issue d'une sélection d'une liste multiple d'un formulaire, je pensai donc y faire référence ainsi : IN (Forms!monform!machaine) mais que néni, rien ne fonctionne
Effectivement, il n'est pas possible de récupérer de cette façon les valeurs sélectionnées lorsqu’ on affaire à une liste à sélection multiple. Pour les récupérer il faut passer par la collection itemsselected.
Maintenant que nous pouvons récupérer les valeurs, la question qui se pose est comment les mettre au format de la clause « IN » de la requête SQL càd comme suit : In(val1;Val2;,,,,)

A mon sens il y’a 2 solutions .

Solution 1 : Elle consiste à concaténer les valeurs sélectionnées en veillant à les separer par des « ; » et à mettre le résultat dans une variable qui sera placée ensuite dans la clause IN. Cette solution parait simple mais nécessite toutefois de passer par un "querydef " pour composer la chaine SQL vu que le requêteur graphique d'Access (QBE) n'accepte pas qu'on insère directement des variables comme paramètres dans une requête.
Mais comme les querydef suppose une manipulation par VBA de la chaine SQL , cette solution ne me semble pas conseillé pour toi

Solution2:
cette solution est de loin la plus simple à mettre en œuvre.
Elle consiste à alimenter le IN par les données d'une table qui contiendra les valeurs sélectionnées dans la liste de choix. Le record source de ton état ressemblera donc un peu à ça: « select .....where id in (select * from T_SELECTION) ».
La table T_SELECTION quant à elle sera composée d'un seul champ et sera alimentée par recordset
Voici un exemple de code pour alimenter cette table
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Private Sub Commande16_Click()
Dim varitm As Variant
Dim rst As DAO.Recordset
'purge de la table T_SELECTION
DoCmd.RunSQL "delete * from T_SELECTION"
 
'alimentation de la table T_SELECTION
Set rst = CurrentDb.OpenRecordset("T_SELECTION", dbOpenTable)
For Each varitm In Forms![nomduform]![nomzonedeliste].ItemsSelected
    'Passer le recordset en mode Ajout
    rst.AddNew
    'affecter dans le champ1 de la table la valeur de l'element selectionné dans la zone de liste
    rst.Fields("champ1") = Forms!formulaire1!Liste4.ItemData(varitm)
    'met à jour le recordset
    rst.Update
Next
'ouverture de l'etat
DoCmd.Openreport "NomEtat", acNormal
'actualisation de la source de donnees de l'etat
DoCmd.Requery
 
End Sub

Cordialement,
reedy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 08h55   #5
Membre du Club
 
Homme Guenaël LE MERRER
consultant environnement et développement d'applications de base de données
Inscription : janvier 2006
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme Guenaël LE MERRER
Âge : 38
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : consultant environnement et développement d'applications de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : janvier 2006
Messages : 210
Points : 65
Points : 65
Merci pour cette réponse
Effectivement, je n'avais pas penser à la table temporaire..., c'est encore la meilleure solution. je la remplis depuis mon formulaire (en dao ou en sql) puis je la lie dans ma requête directement (et je mets ma requête en source de données de mon état). Bien vu !
je suis passé par du sql de ce type :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
    'mets à jour la table temp
    DoCmd.RunSQL "DELETE * FROM tabSelectionAdjuvant_TEMP"
 
    Dim var As Variant
 
    'vide la liste
    Me.liste_choix = ""
 
    'remplit la table temp avec le choix
    For Each var In Me.choix_adjuvants.ItemsSelected
        DoCmd.RunSQL "INSERT INTO tabSelectionAdjuvant_TEMP ( id_adjuvant ) SELECT " & Me.choix_adjuvants.Column(0, var)
    Next var
merci en tout cas
guen 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 17h30.


 
 
 
 
Partenaires

Hébergement Web