ACCESS: filtre par formulaire

Bonjour à tous,
quelqu'un saurait comment faire pour qu'un formulaire lorsqu'on l'ouvre soit directement en mode filtre par formulaire?
Merci d'avance
Aurore

28 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Le fil aborde comment ouvrir un formulaire Access directement en mode filtre par formulaire et lancer la recherche selon des critères saisis. Plusieurs réponses suggèrent d'utiliser un déclencheur sur ouverture du formulaire, d'appliquer un filtre via DoCmd ou d'assembler une requête conditionnelle selon les champs remplis. Des propositions évoquent notamment la construction dynamique d'une clause WHERE et l'enregistrement de la requête comme source de données du formulaire dépendant. En parallèle, certains soulignent qu'un filtre par sélection peut être envisagé comme alternative simplifiée, lorsque la base présente peu de critères obligatoires.

Bobot (l’IA à votre service)
  1. Modérateur
    Si tes 38 critères sont indépendants, quel est l'intérêt du filtre ?

    Si c'est ce que j'ai compris, je te propose cela :

    - sélection des critères
    - appui sur un bouton (nécessaire puisque certains critères sont optionnels)
    - création d'une requête qui recherche tous les enr correspondant aux critères choisis
    - affichage d'un formulaire basé sur cette requête
    - sélection de l'enr souhaité
    - édition

    Ca irait ?

    A+ Blux
     "Les cons, ça ose tout.
    C'est même à ça qu'on les reconnait"
    1. Modérateur
      Salut,

      dans les propriétés du formulaire, onglet 'données', il y a un champ nommé 'filtre' qui correspond au filtre souhaité et qui sera chargé avec le formulaire.

      Mais il ne sera pas appliqué automatiquement. Pour cela, il faut écrire un peu de code dans l'évènement 'surouverture' et exécuter la méthode 'applyfilter' (dixit la doc).

      Des renseignements plus détaillés sont dispo dans l'aide, à la rubrique 'filtre'.

      A+ Blux
       "Les cons, ça ose tout.
      C'est même à ça qu'on les reconnait"
      1. Bonsoir,

        En réponse à ta question.
        c'est à dire Mettre en mode "filtrer par formulaire" un formulaire de saisie afin de se servir de ce même formulaire pour visualiser le résultat enregistrement par enregistrement voila la réponse.

        Place un Bouton sur un autre Formulaire pour ouvrir ton formulaire en mode "Filtrer par formulaire" et applique lui ce code.
         
        	Private Sub Btn_Click()
        
            		DoCmd.OpenForm "F_TonFormulaire"
            		DoCmd.RunCommand acCmdFilterByForm
            
        	End Sub
        


        Ensuite seul une barre de commande peut activer le filtre.
        En effet, le mode "Filtrer par formulaire" désactive tous les évènements des contrôles du formulaire.
        Ceci dit, par défaut, la barre de commande "Filtre/Tri" s'affiche automatiquement en mode "Filtrer par formulaire".

        Afin si tu ne veux pas être obligé de te taper ton précédent filtre à effacer à chaque sélection place ce code sur le chargment de ton formulaire.

        	Private Sub Form_Load()
        
        		DoCmd.Maximize
        		Me.Filter = ""
        		Mon1erchamp.SetFocus
        	End Sub
        


        En espérant qu'il ne soit pas trop tard, bonne continuation.

        stéphan
      2. Pour ceux qui sont fâches avec les codes, Il suffit de lancer une macro '' Excecuter commande'' / ''Filtrer par formulaire'' à l'ouverture du formulaire ( propriété '' sur ouverture '' )
    2. Merci Blux T'es un choux
      mais pourrait tu me donner quelque renseignements sur la methode aplyfilter: c'est un docmd, quels sont ses parametres sais-tu l'utiliser?
      merci encore
      Aurore
      1. Modérateur
        Ben oui, mais si on simplifie :

        Tu crées une requête en vba en testant les champs :
        Mareq = "SELECT * FROM matable WHERE "
        if not isnull(champ1.value) then
           mareq = mareq + " critere1 = '" & champ1.value & "'"
        end if
        if not isnull(champ2.value) then
           mareq = mareq + " critere2 = '" & champ2.value & "'"
        end if
        ....
        if not isnull(champ38.value) then
           mareq = mareq + " critere38 = '" & champ38.value & "'"
        end if
        mareq = mareq + " ;"
        Il ne reste plus qu'à mettre un .recordsource = mareq pour ton deuxième formulaire.

        Ca irait ?

        Mais faut gérer les AND, je l'ai pas mis, mais bon, c'est l'esprit qui vaut...

        A+ Blux
         "Les cons, ça ose tout.
        C'est même à ça qu'on les reconnait"
        1. Modérateur
          D'après l'aide (que tu devrais consulter...) :

          Cet exemple utilise la méthode ApplyFilter pour n'afficher que les enregistrements contenant le nom Roi dans le champ Nom:
          DoCmd.ApplyFilter , "Nom = 'Roi'"


          A+ Blux
           "Les cons, ça ose tout.
          C'est même à ça qu'on les reconnait"
          1. d'après ce que j'ai compris dans l'aide (pas grand chose je bosse dans une boite américaine et tout est en anglais).
            Applyfilter sert comme son nom l'indique à valider un filtre déjà existant. mais tout ce que je désire c'est arriver sur le formulaire en mode filtre pour formulaire sans devoir cliquer sur l'icone m'amenant dans ce mode.
            J'ai un second problème: comment basé un autre formulaire sur le résultat de ce premier filtre?
            1. Modérateur
              Pour arriver au mode filtré, encore faut-il définir un filtre !
              C'est l'objet de mon premier message : enregistrer un filtre avec le formulaire...
              L'icone de passage en mode filtré n'est opérationnelle que si un filtre est défini.

              Pour ton deuxième problème, je ne pense pas que l'on puisse baser un formulaire sur un formulaire filtré, il vaudrait mieux baser le formulaire sur une requête...

              A+ Blux
               "Les cons, ça ose tout.
              C'est même à ça qu'on les reconnait"
              1. Je ne veux pas arriver en mode filtrer just arriver et pouvoir sélectionner les valeurs que je veux dans les champs que je veux sans devoir presser filtre par formulaire. Ensuite je pense que je serai obligé de revenir en mode normal pour pouvoir presser sur un bouton m'ouvrant mon deuxième formulaire en mode tabulaire donc tous les tuples conprenant ces valeurs sont afficher, je click sur celui qu'il me faut et il m'ouvre mon état.

                Je pense que il y a à peu près tout si tu pouvais m'aider je te serai infinement reconnaissant

                merci Aurore
                1. Modérateur
                  D'après ce que tu expliques, il semblerait que tes champs dans le formulaire soient indépendants. Dans ce cas, mets les en liste déroulante, laisse l'utilsateur choisir les bonnes valeurs dans toutes les listes, et à l'appui sur un bouton tu récupères les données des listes déroulantes pour ouvrir un autre formulaire...

                  Ou alors j'ai pas saisi où tu voulais en venir...

                  A+ Blux
                   "Les cons, ça ose tout.
                  C'est même à ça qu'on les reconnait"
                  1. Tu veux que je les récupère avec une requete
                    Champs = liste dans le formulaire
                    Je vois ce que tu veux dire mais j'ai 38 champs au choix ce qui me fait 274 000 000 de possibillités. En faisant une ligne à la minute ça devrait pas me prendre plus de 10 000 ans...
                    en fait c'est pour ça que je me suis dirigé vers les filtre par formulaire...
                    1. Modérateur
                      10 000 ans...
                      ben comme ça, tu seras jamais au chômage... :-)

                      Je n'ai pas compris ce que tu souhaites faire : où sont tes données, pourquoi veux-tu les filtrer ?

                      Sache qu'il est parfaitement possible de modifier dynamiquement les données présentées dans une liste déroulante.

                      Ex :

                      un formulaire avec une liste des marques (de voitures), une liste des modèles et une liste des couleurs.

                      Le choix de 'bmw' dans la première liste fera que la deuxième ne proposera que les modèles bmw et ainsi de suite...

                      A+ Blux
                       "Les cons, ça ose tout.
                      C'est même à ça qu'on les reconnait"
                      1. Le but est de sortir un état avec une seule ligne.
                        Pour cela il y a 38 champs dans ma table principal qui peuvent etre un critère de séléction ou pas.
                        ex : taille = grand / apparance = moche / épaisseur = mince
                        ex2 : taille = petit / épaisseur = mince
                        donc j'ai un formulaire permettant de faire cette saisie et après un deuxième formulaire en mode tabulaire s'ouvre avec tous les tuples comprenant ces infos.
                        On en choisi un et l'état avec cette ligne s'affiche
                        1. C'était mon idée de base mais le probleme c'est que les 38 champs sont optionnel donc dans la requete qui les récupère je peu avoir quelque chose dans mon premier champs et rien dans le 37 autres ou le 1er , le 2eme et les 36 autres vides ...etc et tu fais ça pour les 38 champs ce qui me fait 274 000 000 de ou c'est un peu bcp non ?
                          1. Très bonne idée je vai essayer merci bcp t'es un amour
                            1. Modérateur
                              Euh, ma femme va pas apprécier, ni mon fils ;-)

                              A+ Blux
                               "Les cons, ça ose tout.
                              C'est même à ça qu'on les reconnait"
                          2. J'essaye et je te donne des nouvelles
                            merci encore
                            mais ton mareq c'est une variable?
                            Si c'est le cas t'es sur que je peux basé un recordsource dessus?
                            1. Modérateur
                              mareq est de type string

                              forms![mondeuxiemeformulaire].recordsource = mareq

                              ou

                              DoCmd.OpenForm "mondeuxiemeformulaire", acNormal, , mareq

                              A+ Blux
                               "Les cons, ça ose tout.
                              C'est même à ça qu'on les reconnait"
                              1. Désolé de faire une nouvelle fois appel à toi mais ça marche pas un message d'erreur s'affiche: (traduit en français) access ne peut pas trouver le formulaire mondeuxiemeformulaire se référant à du code vb...
                                c'est bizarre t'es sur qu'on peut lier le recordsource à une variable
                                et si je la déclare pas mareq et que je nomme une requete comme ça
                                1. Modérateur
                                  Je confirme : on peut bien lier le recordsource à une variable (si elle contient quelque chose au format nécessaire, c'est à dire une requête). C'est ce que je fais depuis de nombreuses années ;-)

                                  Ton erreur vient sûrement du fait que le formulaire dont tu souhaites changer une propriété n'est pas ouvert...

                                  Ouvre ton formulaire 'mondeuxiemeformulaire' et laisse-le en icône, exécute ensuite la procédure du formulaire principal, ça devrait aller beaucoup mieux !

                                  A+ Blux
                                   "Les cons, ça ose tout.
                                  C'est même à ça qu'on les reconnait"
                                  1. effectivement ça joue un rôle mais un message d'erreur ( The action or method is invalid because the form or report isn't bound to a table or query.) apparait encore meme en simplifiant a fond la requete de cette façon:
                                    mareq = "SELECT * FROM T_molecule ;"
                                    stDocName = "f_name1"
                                    DoCmd.OpenForm stDocName, acNormal, , mareq
                                    vois-tu l'erreur
                                    merci encore pour tout ce que tu fais pour moi c'est vraiment cool
                                    Aurore
                                    1. Modérateur
                                      Voui c'est normal...

                                      Un form doit être basé sur une requête ou une table.

                                      Quand on l'ouvre, on met une restriction (mareq), mais dans ce cas 'mareq' doit être la fin d'une requête sans le WHERE... J'avais commis l'erreur en l'indiquant dans mon message 19 (mais je l'ai pas corrigé pensant que tu ne l'utiliserais pas)

                                      En résumé :

                                      Pour ouvrir un formulaire :

                                      mareq = "critere1 = '" + valeur1.value + "'"

                                      Pour affecter un recordsource à un objet (genre liste déroulante)

                                      mareq = "SELECT....WHERE...."

                                      C'est quoi comme molécules pour que l'on ait le choix de 'moche' ?
                                      Cyclohexane, ADN, paradichlorobenzene ? :-)
                                      Ou alors c'est en oncologie (et c'est moins drôle) ?

                                      A+ Blux
                                       "Les cons, ça ose tout.
                                      C'est même à ça qu'on les reconnait"
                                      • 1
                                      • 2