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 :

Requête via listbox multi-critères --> Possible sans VBA ?


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut Requête via listbox multi-critères --> Possible sans VBA ?
    Bonjour,

    Je découvre Access 2010 après avoir bidouillé sur 97 et 2003 et je découvre que les Zones de liste peuvent être multi-sélection. Et là je me dis que çà serait bien de pouvoir faire des requêtes de sélection en fonction des sélections multiples faites dans une Zone de liste. Cependant j'ai un doute sur la possibilité sans passer par VBA. Est ce possible svp ?

    Exemple :
    J'ai une table contenant la liste des départements, une autre la liste des communes.
    J'ai un formulaire ayant comme source la table des communes (à coté des communes il y a le champs "id département") et contentant une zone de liste des départements.
    A ce jour, via une requette, si je sélectionne par exemple le département 62, cela m'affiche la liste de toutes les communes du Pas de Calais.
    Mais si je sélectionne à la fois le 62 et le 59, cela ne m'affiche pas toutes les communes de ces deux départements.

    Si ce n'est possible directement, ce qui limite l'intérêt des Zone de sélection multiple, y a t'il une astuce sans VBA pour le faire svp ?

    J'ai essayé avec la fonction "In" dans la requête mais çà ne fonctionne pas.

    Merci d'avance pour vos éclaircissements.
    Bon we.

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Bonsoir,
    Il n'est pas possible d'utiliser la collection ItemSelected sans passer par VBA. Mais le code est assez simple et peut s'exécuter sur clic d'un bouton, par exemple :
    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
    Dim ctl As Control
    Dim varItm As Variant
    Dim stSQL As String
     
    Set ctl = Me.Liste0 ' Liste des départements
     
     If ctl.ItemsSelected.Count > 0 Then
        stSQL = "SELECT * FROM COMMUNES WHERE [id département] In ("
    End If
    ' Pour lire la sélection multiple
       For Each varItm In ctl.ItemsSelected
            Me.Liste2.AddItem (ctl.ItemData(varItm))
            stSQL = stSQL & "'" & ctl.ItemData(varItm) & "',"
     
       Next varItm
     
    ' Pour enlever la dernière virgule de la boucle et terminer l'instruction
    stSQL = Left(stSQL, Len(stSQL) - 1) & ");"
     
    ' Pour exécuter le code
    DoCmd.RunSQL stSQL
    ' ou pour charger le source d'un formulaire
    Me.RecordSource = stSQL

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Merci tee_grandbois Par contre peux tu me dire exactement où je mets quoi dans ma bdd stp ? Je dois suivre une formation en VBA sous access mais je ne sais encore quand (peut-être plusieurs mois) et j'ai besoin d'avancer sur ce point là de recherche.

    J'aimerais appliquer cette recherche multi-sélection à plusieurs formulaire donc je vais donner un exemple :

    J'ai un formulaire "GeocommuneForm" lié à la requête "GeocommuneReq".
    Le formulaire a deux listes à multisélection "RegionFiltre" et "DepartementFiltre" qui ont chacune deux colonnes, la première est la clé de la table "RegionTabl" et la seconde la clé de la table "DepartementTabl".

    Le but est lorsque je sélectionne plusieurs régions et/ou plusieurs département, le formulaire m'affiche les communes correspondantes à toutes ces sélections.

    Je pense qu'avec cette exemple, je pourrais l'appliquer ensuite à l'ensemble de mes formulaire, ben je l'espère

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Bonsoir,
    je te propose ce code qui te permet d'afficher les régions ou les départements sélectionnés.
    Tu as 2 listes à choix multiple : RegionFiltre et DepartementFiltre et un bouton btSelection, tu dois mettre le code dans l'évènement click de ton formulaire GeoCommuneForm :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Private Sub btSelection_Click()
     
    Dim ctlReg As Control
    Dim ctlDep As Control
    Dim varItm As Variant
    Dim stSQL As String
     
    On Error GoTo hd_err
    ' Déclaration des objets liste à sélection multiple
    Set ctlReg = Me.RegionFiltre
    Set ctlDep = Me.DepartementFiltre
     
    ' Si au moins une sélection effectuée
    If ctlReg.ItemsSelected.Count + ctlDep.ItemsSelected.Count > 0 Then
        stSQL = "SELECT * FROM GeoCommuneReq WHERE "
    End If
     
    ' Lecture de la sélection Régions
    If ctlReg.ItemsSelected.Count > 0 Then
        stSQL = stSQL & "([N°Region] In ("
     
        For Each varItm In ctlReg.ItemsSelected
            stSQL = stSQL & ctlReg.ItemData(varItm) & ","
        Next varItm
     
    ' Pour enlever la dernière virgule
        stSQL = Left(stSQL, Len(stSQL) - 1) & "))"
    End If
     
    ' Départements
     
    If ctlDep.ItemsSelected.Count > 0 Then
    ' Si au moins une région est sélectionnée
        If ctlReg.ItemsSelected.Count > 0 Then
            stSQL = stSQL & " OR "
        End If
        stSQL = stSQL & "([N°Dept] In ("
     
    ' Lecture de la sélection des département
            For Each varItm In ctlDep.ItemsSelected
                stSQL = stSQL & "'" & ctlDep.ItemData(varItm) & "',"
            Next varItm
     
    ' Pour enlever la dernière virgule
            stSQL = Left(stSQL, Len(stSQL) - 1) & "))"
    End If
     
    ' Fin d'instruction SQL et chargement des données sélectionnées
    If ctlReg.ItemsSelected.Count + ctlDep.ItemsSelected.Count > 0 Then
        stSQL = stSQL & ";"
        Me.RecordSource = stSQL
    End If
     
    Exit Sub
    hd_err:
    MsgBox "Erreur :" & Err.Number & " - " & Err.Description
    Resume Next
     
    End Sub
    Dans cet exemple, l'identifiant de Région est numérique et celui de Département est de type Texte (les valeurs sont donc entre ' '). On pourrait aussi proposer de choisir 'OR' ou 'AND' à l'aide d'une case à cocher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If ctlReg.ItemsSelected.Count > 0 Then
            stSQL = stSQL & iif(Me.boAnd=True," AND "," OR ")
        End If
    Mais dans ce cas, il faut noter que si on choisit "AND" cela risque de ne pas fonctionner correctement car un département ne peut appartenir qu'à une seule région et inversement, une région ne contient que certains départements.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Bonjour tee_grandbois,

    Désolé pour le retard, j'ai été occupé totalement à autre chose mais me revoilà sur ce projet de base Access. Je tenais tout d'abord te remercier pour ton aide.

    Cependant, j'ai un souci avec le code. J'ai en surbrillance ".RegionFiltre" et le message "Erreur de compilation : Membre de méthode ou de données introuvable".

    Je n'ai peut-être pas expliqué correctement comment était ma base de test et, du coup, le code ne correspond peut-être pas Ou bien j'ai oublié quelque chose. C'est pourquoi je joins à ce message une partie de ma base de test et la copie écran du message d'erreur.

    Sur le coup, j'avais l'impression qu'il s'agissait d'un problème du nom de ma zone de liste mais apparemment ce n'est pas çà. Je n'ai pas trouvé d'où cela venait.

    Si tu as le temps de regarder, j'en serais content

    J'aime bien regarder un bout de base Access, Excel, etc qui marche pour voir comment çà fonctionne et essayer de l'adapter à mes besoins. Mais encore faut il que la base fonctionne . Donc si tu as le temps de regarder, ensuite je pourrais décortiquer tout çà pour l'adapter à l'ensemble de mes formulaires.

    Bien à toi.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 273
    Points : 126
    Points
    126
    Par défaut
    Bonjour Jérôme,

    Citation Envoyé par Jerome_Hej Voir le message

    Cependant, j'ai un souci avec le code. J'ai en surbrillance ".RegionFiltre" et le message "Erreur de compilation : Membre de méthode ou de données introuvable".


    Sur le coup, j'avais l'impression qu'il s'agissait d'un problème du nom de ma zone de liste mais apparemment ce n'est pas çà. Je n'ai pas trouvé d'où cela venait.
    Ton problème vient bien des noms de tes zones de listes ==> il y a un espace devant RegionFiltre et DepartementFiltre.
    Supprime-le et tu n'auras plus le message d'erreur VBA.
    En revanche, il faut approfondir un peu pour que le département sélectionné soit le seul affiché avec ta région sélectionnée.

    Salutations

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    C'est exactement çà, merci beaucoup

    Parfois on passe des heures à chercher d'où vient un problème pour qu'au final çà soit un truc aussi simple

    Quel je fais

    Je vais essayer d'adapter tout çà dont la partie "département" qui ne fonctionne pas avec ce code.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    J'ai une question et un soucis avec le code :

    1) Question : en fait, où s'inscrit le code SQL que ce code VBA génère stp ? car après avoir fait la sélection et cliqué sur le bouton sélection :
    - quand je vais dans les propriétés du formulaire, c'est toujours ma requête "GeoRQCommuneRQ" qui est en source ;
    - quand je vais dans la requête, elle n'ai pas modifiée.

    Parfois, on peut lier un formulaire à une requête qui elle-même est liée à d'autres requêtes. Du coup, est ce toujours possible de cumuler ce code VBA et une requête de sélection ?

    2) Problème : quand j'ouvre le formulaire, il m'affiche tous les enregistrements. Quand je sélectionne une ou plusieurs régions de la zone de liste, il m'affiche ces régions sélectionnées. Par contre, quand je déselectionne toutes les régions, le formulaire ne m'affiche pas à nouveau toutes les régions. En fait, il ne fait rien.

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Bonsoir,
    j'ai corrigé 2 problèmes :
    - tes 2 zones de liste n'étaient pas en multi-sélection (propriété Sélection Multiple)
    - tu filtrais tes départements avec la mauvaise colonne de ta zone de liste DepartementFiltre.
    Et pour répondre à tes questions :
    1) la modification du RecordSource est temporaire, il faut peut-être chercher dans le forum s'il est possible de mémoriser le texte SQL.
    2) quand tu déselectionnes tes régions et tes départements, appuie sur le bouton "Sélection" pour tout afficher, car j'ai fait la modification.
    Je te poste ta base corrigée.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Merci tee_grandbois, cela fonctionne à merveille.

    Cela va apporter un vrai "+" à mes formulaires Access

    Maintenant, je vais avec cela.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Alors, j'essaye d'exécuter la fonction de "listage" des enregistrements sélectionnés dans la Zone de liste directement de la requête. Mais j'ai beau lire et relire et tester, cela ne fonctionne pas.

    Le code de ma fonction (mis dans un module vba) :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Public Function FiltresFonction(FormulaireNom As Form, _
                            ControleNom As Control) As String
     
        Dim ctlFiltre As Control
        Dim varItm As Variant
        Dim stSQL As String
     
        On Error GoTo hd_err
     
        ' Déclaration des objets liste à sélection multiple
        Set ctlFiltre = Forms!FormulaireNom.ControleNom
     
        ' Lecture de la sélection
        If ctlFiltre.ItemsSelected.Count > 0 Then
            stSQL = "In ("
     
            For Each varItm In ctlFiltre.ItemsSelected
                stSQL = stSQL & ctlFiltre.ItemData(varItm) & ","
            Next varItm
     
        ' Pour enlever la dernière virgule
            stSQL = Left(stSQL, Len(stSQL) - 1) & ")"
        End If
     
        FiltresFonction = stSQL
     
        Exit Function
    hd_err:
        MsgBox "Erreur :" & Err.Number & " - " & Err.Description
        Resume Next
     
    End Function
    Le SQL de ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM GeoTBLPaysTBL
    WHERE (((GeoTBLPaysTBL.GeoPaysId)=FiltresFonction("FiltreGeoPaysFRM","FiltrePaysZLT")));
    Le but est que la fonction crée la liste des enregistrements sélectionnés sous la forme de "in (selection1;selection2;selection3;etc) " et la requête reprend cette fonction comme critère du champs de la table.

    Faire cela éviterait de recopier le code VBA autant de fois qu'il y a de champs filtres dans ma base (des dizaines et dizaines). Il y aurait une requête par champs filtre que je lierais aux requêtes servant de base aux formulaires.

    Donc ma question (avant que je continue à chercher peut-être pour rien car ce n'est peut-être pas possible avec Access) : peut on appeler une fonction dans un critère d'une requête SVP ?

    au fait, le message d'erreur est "type de données incompatible dans l'expression du critère"

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Un problème résolu et un suivant arrive. Voici mon code VBA :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Public Function FiltresFonction(FormulaireNom As String, _
                                    ControleNom As String)
        Dim Frm As Form
        Dim ctlFiltre As Control
        Dim varItm As Variant
        Dim stSQL As String
     
        On Error GoTo hd_err
     
        ' Déclaration des objets liste à sélection multiple
        Set Frm = Forms(FormulaireNom)
        Set ctlFiltre = Frm(ControleNom)
     
        ' Lecture de la sélection
        If ctlFiltre.ItemsSelected.Count > 0 Then
            stSQL = ""
            For Each varItm In ctlFiltre.ItemsSelected
                stSQL = stSQL & ctlFiltre.ItemData(varItm) & ";"
            Next varItm
     
        ' Pour enlever la dernière virgule
            stSQL = Left(stSQL, Len(stSQL) - 1) & ""
     
        End If
     
        ' Fin d'instruction SQL et chargement des données sélectionnées
        If ctlFiltre.ItemsSelected.Count > 0 Then
            FiltresFonction = stSQL
            MsgBox (FiltresFonction)
        Else
            FiltresFonction = "6;7;9"
            MsgBox (FiltresFonction)
        End If
     
        Exit Function
     
    hd_err:
        MsgBox "Erreur :" & Err.Number & " - " & Err.Description
        Resume Next
     
    End Function
    et le critère de la requête pour le champs "GeoPaysId" :
    In (FiltresFonction("FiltreGeoPaysFRM";"FiltrePaysZLT"))
    Cela n'affiche aucun enregistrement.

    Par contre, si je remplace le "FiltresFonction("FiltreGeoPaysFRM";"FiltrePaysZLT")" par "4;5;6" la requête affiche bien les 3 enregistrements.

    Pourtant le code VBA donne bien FiltresFonction("FiltreGeoPaysFRM";"FiltrePaysZLT") = 4;5;6

    Je me demande s'il n'y a pas un problème de format que ramène la fonction VBA dans la requête. Qu'en pensez vous ?

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Bonsoir,
    il faudrait faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim stSQL As String
     
    stSQL = "SELECT * FROM GeoTBLPaysTBL " & _
            "WHERE (((GeoTBLPaysTBL.GeoPaysId) in (" &  FiltresFonction("FiltreGeoPaysFRM","FiltrePaysZLT") & ")));"
    Dans ta fonction FiltresFonction, il faut aussi remplacer le ';' par ',' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each varItm In ctlFiltre.ItemsSelected
    stSQL = stSQL & ctlFiltre.ItemData(varItm) & ";"
    Next varItm
    Un conseil pour plus de visibilité du code, utilises la balise code (symbole #) plutôt que quote.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Bonjour tee_grandbois,

    Je ne vois pas où je peux mettre ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim stSQL As String
     
    stSQL = "SELECT * FROM GeoTBLPaysTBL " & _
            "WHERE (((GeoTBLPaysTBL.GeoPaysId) in (" &  FiltresFonction("FiltreGeoPaysFRM","FiltrePaysZLT") & ")));"
    (merci pour le conseil de balise de forum)

    A la base je souhaitais mettre l'appel de la fonction dans ma requête, permettant ainsi par exemple d'appeler la même fonction pour plusieurs champs de la même requête.

    J'ai changé de bdd pour faire mes tests. J'ai donc deux Zones de liste : ListeZLT et FiltreChamp1ZLT. Cette première doit afficher des enregistrements d'une table en fonction des sélections faites dans la 2ième liste. Pour cela ListeZLT a pour propriété "Contenu" une requête comme ci-dessous.


    J'ai dans un module :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Option Compare Database
    Option Explicit
     
     
    Public Function FiltresFonction(FormulaireNom As String, _
                                    ControleNom As String)
        Dim Frm As Form
        Dim ctlFiltre As Control
        Dim varItm As Variant
        Dim stSQL As String
     
        On Error GoTo hd_err
     
        ' Déclaration des objets liste à sélection multiple
        Set Frm = Forms(FormulaireNom)
        Set ctlFiltre = Frm(ControleNom)
     
        ' Lecture de la sélection
        If ctlFiltre.ItemsSelected.Count > 0 Then
            stSQL = ""
            For Each varItm In ctlFiltre.ItemsSelected
                stSQL = stSQL & ctlFiltre.ItemData(varItm) & ","
            Next varItm
     
        ' Pour enlever la dernière virgule
            stSQL = Left(stSQL, Len(stSQL) - 1) & ""
     
        End If
     
        ' Fin d'instruction SQL et chargement des données sélectionnées
        If ctlFiltre.ItemsSelected.Count > 0 Then
            FiltresFonction = stSQL
            MsgBox (FiltresFonction)
        Else
            FiltresFonction = "6;7;9"
            MsgBox (FiltresFonction)
        End If
     
        Exit Function
     
    hd_err:
        MsgBox "Erreur :" & Err.Number & " - " & Err.Description
        Resume Next
     
    End Function
    puis dans ma requête, pour le champ "TestunTBLChamp1TBL" de la table "TestunTBL", le critère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    In (FiltresFonction("TestunFRM";"FiltreChamp1ZLT"))
    Trois situations se présentent :

    1) Lorsque j'ouvre mon formulaire et donc que rien n'est sélectionné dans le controle FiltreChamp1ZLT, j'ai les messages d'erreurs suivants qui se suivent :
    "Erreur:2455 - La référence d'une expression à la propriété | n'est pas valide."
    "Erreur:2455 - La référence d'une expression à la propriété | n'est pas valide."
    "Erreur:2186- Cette propriété n'est pas disponible en mode Création."
    "Erreur:92 - Boucle For non initialisée"
    "Erreur:5 - Argument ou appel de procédure incorrect"
    "Erreur:2455 - La référence d'une expression à la propriété | n'est pas valide."
    Une fenêtre vide
    Une fenêtre avec écrit le texte "6;7;9" venant de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Else
            FiltresFonction = "6;7;9"
    2) Lorsque le formulaire est ouvert, ma liste ListeZLT est vide. Je sélectionne un élément de ma liste FiltreChamp1ZLT et cela affiche l'enregistrement correspondant dans ListeZLT. Donc là, la sélection se fait bien. Pour info, j'ai une fenêtre indiquant la clé de ma sélection qui s'affiche (suite à mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If ctlFiltre.ItemsSelected.Count > 0 Then
            FiltresFonction = stSQL
            MsgBox (FiltresFonction)
    3) Lorsque je sélectionne plusieurs élément de ma liste FiltreChamp1ZLT alors ListeZLT se vide à nouveau. En résumé, mon filtre n'applique pas la multisélection Pourtant cela affiche bien dans la fenêtre les différentes clés de mes sélections (suite à mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If ctlFiltre.ItemsSelected.Count > 0 Then
            FiltresFonction = stSQL
            MsgBox (FiltresFonction)
    C'est-à-dire par exemple le texte
    1,2,3

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Bonsoir Jerome,
    Citation Envoyé par Jerome_Hej Voir le message
    Je ne vois pas où je peux mettre ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim stSQL As String
     
    stSQL = "SELECT * FROM GeoTBLPaysTBL " & _
            "WHERE (((GeoTBLPaysTBL.GeoPaysId) in (" &  FiltresFonction("FiltreGeoPaysFRM","FiltrePaysZLT") & ")));"
    Si tu utilises des formulaires, il faut mettre le code dans l'évènement qui t'a permis de filtrer tes enregistrements, sur click d'un bouton par exemple:
    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
    Dim stSQL As String
    Dim stFiltre As String
     
    ' Filtrage des enregistements selon la sélection du formulaire
    stFiltre = FiltresFonction("FiltreGeoPaysFRM","FiltrePaysZLT") 
     
    stSQL = "SELECT * FROM GeoTBLPaysTBL" 
     
    ' Chargement du RecordSource        
     
    If  stFiltre = "" Then
        Me.RecordSource = stSQL & ";"
    Else
        Me.RecordSource = stSQL & " WHERE (((GeoTBLPaysTBL.GeoPaysId) in (" &  stFiltre & ")));"
     
    End If

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 138
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup tee_grandbois du temps que tu prends pour répondre aux gens

    Je viens tout juste de trouver la solution à mes souhaits. En fait, j'essaye de trouver des codes VBA générique c'est-à-dire qui peuvent aller à de nombreux endroits de ma base sans être obligé de recopier x fois le même code.

    Et justement le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((GeoTBLPaysTBL.GeoPaysId) in (" &  stFiltre & ")));
    qui mentionne clairement la table dans le code VBA ne correspond pas à ce que j'essaye de faire. Sachant que je ne sais pas à l'avance si ce que je recherche est possible et c'est là toute la difficulté que j'ai.

    Je vous fais part de ce que j'ai réussi à faire :

    Code dans un module VBA :
    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
    24
    25
    26
    27
    28
    29
    30
    Public Function FiltresFonction(ChampNom As String, _
                                    FormulaireNom As String, _
                                    ControleNom As String) As Boolean
        ' Définitions
        Dim result As Boolean
        Dim frm As Form
        Dim ctlFiltre As Control
        Dim varItm As Variant
     
        ' Déclaration des objets liste à sélection multiple
        Set frm = Forms(FormulaireNom)
        Set ctlFiltre = frm(ControleNom)
        result = False
     
        If ctlFiltre.ItemsSelected.Count > 0 Then
     
            For Each varItm In ctlFiltre.ItemsSelected
                If ChampNom = ctlFiltre.ItemData(varItm) Then
                    result = True
                    Exit For
                End If
            Next varItm
     
        Else
            result = True
        End If
     
        FiltresFonction = result
     
    End Function
    Puis dans une case de ma requête :

    - sur la ligne "champ:" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Expr1: FiltresFonction([TestunTBLChamp1TBL];"TestunFRM";"FiltreChamp1ZLT")
    - sur la ligne "Critères:" :
    Vrai
    Et voilà, je sélectionne ce que je veux dans la zone de liste "FiltreChamp1ZLT" et la requête sort les enregistrements correspondant à chaque sélection de cette liste.

    De plus, lorsque je n'ai rien sélectionné dans la zone de liste (le cas quand j'ouvre mon formulaire), il affiche la totalité des enregistrements quand même. Ce via le code . C'est fait exprès.


    N'ayant pas trouvé ce type de code sur la FAQ ou autre, et s'il n'existe pas pour l'instant, je souhaiterais faire et proposer un petit tuto après avoir poussé un peu plus mon formulaire de recherche (j'ai d'autres points à voir encore). Est ce possible ? Je souhaite ainsi apporter ma contribution, ce qui serait normal car souvent c'est vous qui m'aidez.

    A bientôt.

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 768
    Points : 14 809
    Points
    14 809
    Par défaut
    Ce que tu souhaites faire est intéressant. Ce n'est pas évident au premier abord mais pas impossible. Pour éviter tout "harcodage", tu pourrais enrichir ta fonction avec des paramètres supplémentaires comme la table ou la requète entière, le ou les champs de la clause where et leur type
    car, pratiquement, tout objet peut être passé en paramêtre.

    Il faut quand même pour cela avoir une bonne maîtrise de la manipulation de tous ces objets.
    Tu pourrais aussi complètement changer ta fonction de manière à ne pas renvoyer un filtre mais carrément le RecordSet, ou la requète SQL.

    Dans ce cas, tu peux t'inspirer du célèbre tutoriel de caféine la recherche multi-critères

  18. #18
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 240
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 240
    Points : 213
    Points
    213
    Par défaut
    Bonjour tee_grandbois,

    je viens vers toi car j'ai un prblème que j'ai du mal à resoudre.

    Dans un formulaire, j'ai :
    - un texte_box
    - un bouton de commande "envoyer"
    - une liste_box

    Dans le texte_box, j'insere un numero de colis. J'appuie ensuite sur le bouton "envoyer" . Et, dans ma Liste_box, apparait les données issues de ma requete sql.
    Voici le code vba :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Option Compare Database
    Dim VNumerocolis As Variant
    Dim txt_ChaineSQL As String
    Dim strSQLSELECT As String
    Dim strSQLWHERE As String
    Dim strSQLGROUPBY As String
    Dim strSQLORDERBY As String
    Dim strSQLHAVING As String
     
    Private Sub Cmd_envoyer_Click()
    VNumerocolis = CVar(Texte_Numerocolis.Value)
    MsgBox VNumerocolis
     
    With Me.Listealertecolis
    .RowSourceType = "Table/Requête"
    .ColumnCount = 5 ' 
    .BoundColumn = 1 ' la colonne de reference
     
     
    strSQLSELECT = "SELECT T_codecolisQUALITE.numcolis, dbo_vwParts.DisplayName, [table_Affich-general].[Nom Porte principale], [table_Affich-general].DESTINATION, dbo_vwItemData.DischargeEventTime FROM T_codecolisQUALITE INNER JOIN ((dbo_vwItemData INNER JOIN dbo_vwParts ON dbo_vwItemData.DischargePartID = dbo_vwParts.ID) INNER JOIN [table_Affich-general] ON dbo_vwParts.DisplayName = [table_Affich-general].[Chute (format access)]) ON T_codecolisQUALITE.ItemID = dbo_vwItemData.ItemID"
    strSQLGROUPBY = "GROUP BY T_codecolisQUALITE.numcolis, dbo_vwParts.DisplayName, [table_Affich-general].[Nom Porte principale], [table_Affich-general].DESTINATION, dbo_vwItemData.DischargeEventTime"
    strSQLHAVING = "HAVING T_codecolisQUALITE.numcolis='" & VNumerocolis & "' AND (dbo_vwItemData.DischargeEventTime)>=(CVDate(Fix(Now()-(5/24)))+5/24);"
     
     
     
    txt_ChaineSQL = strSQLSELECT & vbCrLf & _
                    strSQLGROUPBY & vbCrLf & _
                    strSQLHAVING
     
     
     
    'Debug.Print txt_ChaineSQL
     
     
    MsgBox txt_ChaineSQL
     
    .RowSource = txt_ChaineSQL
    .Requery
    End With
     
    End Sub
     
     
    Private Sub Form_Load()
     
    Listealertecolis.RowSource = "" 'a chaque fois que j'ouvrir le formulaire il se vide
    End Sub
    Mon problème est le suivant:
    Actuellement, dans mon texte_box, je ne peux inserer qu 'un seul code colis ( code à 13 caractère) . Alors que je souhaiterais pouvoir y inserer au maximum 10 codes colis.
    Et là je ne sais pas comment m'y prendre.

    En résumé, Comment faire en sorteque la variable "Vumerocolis" puisse recherche
    10 codes colis contenues dans le texte_box

Discussions similaires

  1. [AC-2010] Requête pour l'insertion d'une valeur ? (sans VBA)
    Par fantazio77 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/10/2013, 17h48
  2. [AC-2010] Requête via listbox multi-critères sans VBA --> Possible via macro?
    Par Greg12345 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/11/2011, 20h20
  3. Réponses: 3
    Dernier message: 30/10/2011, 20h33
  4. [MySQL] Requête avec WHERE multi-critères
    Par flashnet dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/04/2010, 15h42
  5. Modification critére requête via formulaire
    Par frevale dans le forum Access
    Réponses: 1
    Dernier message: 02/11/2005, 21h30

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