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

Access Discussion :

Recherches multicritères formulaire [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut Recherches multicritères formulaire
    Bonjour à tous,

    J'ai essayé de créer un fichier access permettant de faire des recherches multicritères en me basant sur l'article de Jean Ballat http://jeannot45.developpez.com/arti...multicriteres/.
    Malheureusement je bloque sur la manière de combiner des listes déroulantes avec des zones de saisies de texte.
    Il y a aussi un problème au niveau des statistiques de recherche.
    Ci-joint le fichier en question.

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Bonjour,
    Le problème vient (entre autres) de ce que les critères de recherche ont été placés dans un sous-formulaire du formulaire principal, alors que dans le tutoriel ces critères sont placés dans le formulaire principal. De ce fait la désignation des champs devient vraiment compliquée (et change suivant que l'on utilise le formulaire en tant que formulaire ou en tant que sous-formulaire).
    Est-il vraiment indispensable de faire des listes déroulantes dépendantes l'une de l'autre?
    Bonne continuation.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je pense ne pas avoir été assez précis dans la formulation de mon problème.
    Voici donc quelques explications:
    J'ai créé un formulaire pour effectuer des recherches multicritères.
    Le formulaire lance une requête suivant les éléments que j'ai sélectionné dans les combo-box ou saisi dans la zone texte.

    Problème, lorsque je clique sur les liste déroulantes pour choisir les éléments qui m'intéresse, j'ai un message me demandant de définir au préalable ces éléments.
    Les zones de texte ne marchent pas bien non plus.

    Nom : Image1.png
Affichages : 1897
Taille : 365,8 Ko

    J'ai du mal à déterminer ou se trouve exactement le problème, d'autant que je me suis efforcé de coller au mieux avec le tuto de Jean Ballat.

    Merci d'avance pour votre aide.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour EricDgn,

    Désolé, je n'avais pas vu ta réponse avant de poster.
    Je vais essayer de tout regrouper en un seul formulaire et je reviens vers toi.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour à tous,

    J'ai retravaillé le problème et je suis parvenu à un résultat en optant pour une solution plus simple:
    -les infos des zones de listes sont issues directement de ma table de données
    -l'affichage se fait via une requête basé sur les valeurs définies dans le formulaire.

    Il me reste néanmoins un problème qui concerne la zone de saisie de texte:je ne peux rechercher un produit que si je tape le nom en entier.
    Je voudrais qu'il suffise que je saisisse uniquement une partie du nom du produit pour que la recherche se fasse.

    J'ai essayé de résoudre le problème en passant par du vba.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Sub Txt_produit_acheté_Change()
    Dim critère_produit_acheté As String
    critère_produit_acheté = "*" & Txt_produit_acheté.Value & "*"
    MsgBox (critère_produit_acheté) 'test pour vérifier le fonctionnement
    End Sub
    Mais ça ne marche pas car quand dans ma requête je remplace :
    [Formulaires]![F_gérer_réclamation]![Txt_produit_acheté] par critère_produit_acheté, la requête ne fonctionne pas.
    Je pensais que définir le critère_produit_acheté en public sub devrait suffir, mais visiblement non.

    En revanche, pour tester, j'ai placé un bouton Commande53 dans le formulaire, et quand je clique dessus, il me renvoie bien critère_produit_acheté.

    J'ai aussi essayé d'ajouter directement des * * dans le critère de la requête:
    "*" & [Formulaires]![F_gérer_réclamation]![Txt_produit_acheté] & "*"
    mais ça ne marche pas non plus.

    Si vous avez des idées je suis preneur

    Merci d'avance
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Bonjour,

    Je n'ai pas tout regardé, mais je ferais déjà les remarques suivantes.

    Dans les tables, il ne faut jamais utiliser comme nom de champ: nom. A un moment ou un autre Access va s'emmêler les pinceaux car il y a une confusion possible entre nom et name (name traduit en français devenant nom). Cela se produit entre autres quand on crée des requêtes avec l'outil de création de requêtes.

    Personnellement j'évite d'utiliser des lettres accentuées dans les noms de champs (et de n'importe quel objet en général) car cela peut poser des problèmes lorsque l'on veut convertir les tables dans un autre format que celui d'Access. Pas de première importance, mais c'est une bonne habitude à prendre.

    Ce n'est pas parce qu'un champ est masqué qu'il est vide. Ainsi, si Cocher_liste_nom est coché, qu'une valeur est entrée dans liste_nom, et qu'ensuite Cocher_liste_nom est décochée, la valeur entrée dans liste_nom y reste (bien que masquée), sauf instruction forçant de l'enlever.

    En mode création de formulaire, il faut marquer les champs liste_nom, liste_ville et txt_produit_acheté comme non visible, et mettre comme valeur par défaut 0 pour les 3 champs Cocher_...

    A mon avis, ce n'est pas une bonne idée d'inscrire dans la requête source d'un sous-formulaire des critères de sélection (comme dans la requête R_réclamation). Pour moi, il vaut mieux faire une requête générale (sans critères) et ensuite appliquer des filtres au sous-formulaire (voir dans l'Aide de Access), par exemple de la façon suivante:

    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
    60
    61
    62
    Option Explicit
     
    Private Sub Cocher_txt_produit_Click()
       Me.Txt_produit_acheté.Visible = Not Me.Txt_produit_acheté.Visible
       If Me.Txt_produit_acheté.Visible = False Then
          Me.Txt_produit_acheté = ""
       End If
       filtrer
    End Sub
     
    Private Sub Cocher_liste_nom_Click()
       Me.liste_nom.Visible = Not Me.liste_nom.Visible
       If Me.liste_nom.Visible = False Then
          Me.liste_nom = ""
       End If
       filtrer
    End Sub
     
    Private Sub Cocher_liste_ville_Click()
       Me.liste_ville.Visible = Not Me.liste_ville.Visible
       If Me.liste_ville.Visible = False Then
          Me.liste_ville = ""
       End If
       filtrer
    End Sub
     
    Private Sub liste_nom_AfterUpdate()
       filtrer
    End Sub
     
    Private Sub liste_ville_AfterUpdate()
       filtrer
    End Sub
     
    Private Sub Txt_produit_acheté_AfterUpdate()
       filtrer
    End Sub
     
    Private Sub filtrer()
       Dim sFiltre As String
       sFiltre = ""
       If Me.liste_nom <> "" Then
          sFiltre = "[Pnom] = '" & Me.liste_nom & "'"
       End If
       If Me.Txt_produit_acheté <> "" Then
          If sFiltre <> "" Then sFiltre = sFiltre & " AND "
          sFiltre = sFiltre & "[produit_acheté] Like '*" & Me.Txt_produit_acheté & "*'"
       End If
       If Me.liste_ville <> "" Then
          If sFiltre <> "" Then sFiltre = sFiltre & " AND "
          sFiltre = sFiltre & "[ville] = '" & Me.liste_ville & "'"
       End If
       With Me.F_sélection_réclamation.Form
          .Filter = sFiltre
          If sFiltre = "" Then
             .FilterOn = False
          Else
             .FilterOn = True
          End If
          Debug.Print ".FilterOn: "; .FilterOn, .Filter
       End With
    End Sub
    Bonne continuation.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Bonjour EricDgn,

    Merci beaucoup, ton code marche super bien!

    Désolé de t'ennuyer encore, mais penses-tu qu'il soit possible de lier les critères de recherche de manière à ce qu'on ne puisse appliquer un second filtre qu'aux éléments qui correspondent déjà au premier (limiter la possibilité de choix dans les listes déroulantes)?
    Est-ce que ça marcherait si on basait le contenu des listes non plus sur la table, mais sur une requête auquelle on appliquerait le filtre que tu as créé?

    Autre question, j'ai rajouté un formulaire ou on choisi les données que l'on veut afficher.
    Par exemple, je veux afficher uniquement le montant des réclamations, pas les remises et les gains.
    A quoi ressemblerait un code qui irait "décocher" l'affichage des colonnes correspondantes dans les requêtes réclamations et négociations?

    Merci d'avance.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Bonjour,
    lier les critères de recherche de manière à ce qu'on ne puisse appliquer un second filtre qu'aux éléments qui correspondent déjà au premier (limiter la possibilité de choix dans les listes déroulantes)
    Possible, sauf pour le champTxt_produit_acheté. ... mais reste à faire.

    contenu des listes non plus sur la table, mais sur une requête
    Table ou requête en RecordSource (Source de données), c'est pareil. Un filtre peut y être appliqué. Si une requête est utilisée comme source de données, il peut y avoir des problèmes pour l'ajout/modification/suppression des données, en général quand elle contient des liaisons entre tables et/ou des champs calculés.

    ajouté un formulaire ou on choisi les données que l'on veut afficher
    Simple. Plutôt que de fermer le formulaire, c'est plus simple de le masquer, ainsi la valeur choisie reste disponible.
    Ensuite on rend les champs et étiquettes visibles ou non soit à l'ouverture du formulaire concerné (ou à l'activation, ou à la réception du focus).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Form_Current()
       Dim v As Boolean
       If Form_F_choix.CadreChoix.Value = 1 Then
          v = False   '--- masqué
       Else
          v = True    '--- visible
       End If
       Me.remise_et.Visible = v
       Me.remise.Visible = v
       Me.gain_de_négociation_et.Visible = v
       Me.gain_de_négociation.Visible = v
    End Sub
    Plutôt que de mettre l'ouverture de ce formulaire en AutoExec, il est plus indiqué de forcer l'ouverture au démarrage d'Access, cela dans les Options d'Access:
    Nom : OptionAccess.jpg
Affichages : 1612
Taille : 56,4 Ko
    Personnellement, je préfère l'affichage en fenêtres à l'affichage en onglets.

    Il est aussi possible de jouer sur les propriétés 'Afficher sélecteur' et 'Boutons de déplacement' des formulaires pour les présenter en fenêtres plus propres.

    Le formulaire F_gérer_réclamation est en fait un formulaire "indépendant": n'est pas lié à des données (ni table, ni requête). Ce sont les sous-formulaires qui affichent des données (liées à des tables ou des requêtes).

    Une bonne habitude est d'éviter les lettres accentuées dans les noms des champs et autres objets.

    Bonne continuation.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 181
    Points : 5 512
    Points
    5 512
    Par défaut
    Pour faire des listes déroulantes filtrées les unes en fonction des autres, un moyen est de faire est le suivant:
    - créer une requête simple contenant les champs Nom, Prénom, Ville, Produit, dénommée rNomVilleProduit0
    - en faire une semblable mais filtrée, dénommée rNomVilleProduit
    - utiliser cette requête rNomVilleProduit comme source pour établir les listes déroulantes (en utilisant le regroupement)
    - mettre à jour la requête filtrée rNomVilleProduit à chaque modification d'un champ de filtrage
    Ce qui donne pour la routine filtrer:
    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
    Private Sub filtrer()
       Dim sFiltre As String, sSQL As String
       sFiltre = ""
       '--- filtre sur base de listes déroulantes
       If Me.liste_nom <> "" Then
          sFiltre = "[Pnom] = '" & Me.liste_nom & "'"
       End If
       If Me.Txt_produit_acheté <> "" Then
          If sFiltre <> "" Then sFiltre = sFiltre & " AND "
          sFiltre = sFiltre & "[produit_acheté] Like '*" & Me.Txt_produit_acheté & "*'"
       End If
       If Me.liste_ville <> "" Then
          If sFiltre <> "" Then sFiltre = sFiltre & " AND "
          sFiltre = sFiltre & "[ville] = '" & Me.liste_ville & "'"
       End If
       If Me.liste_Pprenom <> "" Then
          If sFiltre <> "" Then sFiltre = sFiltre & " AND "
          sFiltre = sFiltre & "[Pprénom] = '" & Me.liste_Pprenom & "'"
       End If
       '--- mise à jour de la requête source des listes déroulantes
       sSQL = CurrentDb.QueryDefs("rNomVilleProduit0").SQL
       If sFiltre <> "" Then
          sSQL = Left(sSQL, Len(sSQL) - 3)
          sSQL = sSQL & " WHERE " & sFiltre
       End If
       CurrentDb.QueryDefs("rNomVilleProduit").SQL = sSQL
       Me.Recalc
       '--- filtrage des données
       With Me.F_sélection_réclamation.Form
          .Filter = sFiltre
          If sFiltre = "" Then
             .FilterOn = False
          Else
             .FilterOn = True
          End If
          Debug.Print ".FilterOn: "; .FilterOn, .Filter
       End With
    End Sub
    En pratique, je ne suis pas certain que cela vraiment une bonne idée.

    Bonne continuation.

    P.S. Il faut absolument ajouter un champ indexé dans la table de base.
    Fichiers attachés Fichiers attachés

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Ok, ça marche super bien, merci!

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

Discussions similaires

  1. [AC-2007] Recherche multicritères (formulaire)
    Par jacques potier dans le forum IHM
    Réponses: 7
    Dernier message: 26/07/2011, 19h59
  2. Réponses: 4
    Dernier message: 13/06/2006, 21h08
  3. [débutant]recherche multicritères sur formulaire
    Par maitreblitosaure dans le forum IHM
    Réponses: 5
    Dernier message: 09/06/2006, 22h44
  4. Formulaire de recherche multicritères
    Par Michel DELAVAL dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 09h32
  5. Formulaire Recherche MultiCritère et RunTime
    Par fbu78 dans le forum Runtime
    Réponses: 9
    Dernier message: 06/01/2006, 17h52

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