IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Clause Where avec In et référence à un formulaire [Toutes versions]


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 336
    Points : 166
    Points
    166
    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

  2. #2
    Membre actif
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Mars 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Mars 2009
    Messages : 177
    Points : 270
    Points
    270
    Par défaut
    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

  3. #3
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 336
    Points : 166
    Points
    166
    Par défaut
    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

  4. #4
    Membre actif
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Mars 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Mars 2009
    Messages : 177
    Points : 270
    Points
    270
    Par défaut
    Bonjour,

    Maintenant, je comprends mieux ton besoin.
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  5. #5
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 336
    Points : 166
    Points
    166
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete SQL clause WHERE avec variable
    Par gabule dans le forum JDBC
    Réponses: 6
    Dernier message: 09/01/2019, 11h04
  2. Clause where avec une date..
    Par bobic dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/04/2008, 16h12
  3. Clause WHERE avec numéro de colonne au lieu du nom
    Par droog dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 17/10/2007, 23h41
  4. Clause WHERE avec CURDATE()
    Par etiennelj dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/07/2007, 16h13
  5. [Oracle / Sql] clause where avec resultat d'une requete
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 2
    Dernier message: 31/01/2006, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo