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

IHM Discussion :

Erreur 2185 à la création d'un filtre


Sujet :

IHM

  1. #1
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut Erreur 2185 à la création d'un filtre
    Bonjour à toutes et à tous,

    Je veux appliquer un filtre à un formulaire. J'ai pour cela une zone de texte "txtRecherche" dans l'entête du formulaire. Le filtre est créé et appliqué dans l'événement OnChange du champ txtRecherche en fonction des lettres entrées dans le champ et porte sur le champ Ent. Le code de cette méthode est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        With Me
     
                strFiltre = "Ent Like '" & .txtRecherche.Text & "*'"
     
                .Filter = strFiltre
                .FilterOn = True
     
        End With
    Le problème est le suivant :
    Si je rentre une lettre dans txtRecherche pour laquelle il existe des enregistrements dont le champ Ent commence par cette lettre, pas de problème, tout fonctionne bien. Lorsque j'efface cette lettre, tous les enregistrements redeviennent visibles. Jusque-là, c'est normal aussi.

    Si je tape une lettre ne correspondant à aucun enregistrement, le formulaire n'affiche aucun enregistrement, ce qui est encore normal

    Mais si je veux effacer cette lettre pour laquelle il n'y a pas d'enregistrement ou l'écraser par une lettre "fonctionnant", j'obtiens un message d'erreur d'exécution 2185 (et non 2815 comme je l'ai indiqué par erreur précédemment) disant : "Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé."

    Je précise que le contrôle txtRecherche a toujours le focus, ce qui est exigé par la propriété text. Sinon, ça ne fonctionnerait pas non plus avec les "bonnes" lettres.

    J'ai pu établir que lorsque je tape une lettre pour laquelle il existe des enregistrements, la valeur de Me.txtRecherche,Text est la lettre que j'ai tapée et le type de la valeur est String, mais qu'en revanche, si je tape une lettre sans enregistrement correspondant, le contenu de Me.txtRecherche.Text devient "Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé." et le type du contenu devient Integer. L'erreur se produit donc quand je veux appliquer le filtre sur un filtre ne renvoyant aucun enregistrement, mais c'est au "tour suivant", quand je veux spécifier une autre lettre dans mon champ de recherche/filtrage qu'elle se manifeste, par la boîte d'erreur.

    Où est l'erreur? En quoi le fait de spécifier un filtre ne générant pas de résultat corrompt-il mon champ de recherche?

    Merci d'avance

    Philippe

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    En en utilisant .Value au lieu de .text ?

  3. #3
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Non, .Value ne convient pas, car .Value correspond à la valeur qui est déjà enregistrée dans le contrôle, après être sorti du contrôle. .Text correspond au contenu qui est en cours de frappe. Tant que je ne sors pas du contrôle, .Value me renverra la valeur qui existait avant que je commence à entrer du texte. Or ce que je veux, c'est vraiment déclencher l'événement On Change à chaque lettre que je frappe.

  4. #4
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    J'ajoute quelques précisions à ma demande :

    Bien qu'il soit fondamentalement le même, j'ai un peu modifié le code qui est désormais comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim strFiltre As String
        With Me
                  strFiltre = "[Ent] Like '" & .txtRecherche.Text & "*'"
     
                .Filter = strFiltre
                .FilterOn = True
                .txtRecherche.SetFocus
                .txtRecherche.SelStart = Len(Nz(.txtRecherche, "")) + 1
        End With

    Et voici ce qui se passe à l'exécution lorsque je tape dans le contrôle txtRecherche (placé dans l'en-tête du formulaire) une lettre pour laquelle il n'y a aucune entrée dans le source de mon formulaire continu :



    On voit que la lettre entrée (un "j") qui était le contenu de la propriété .text avant la ligne est passée dans la propriété .value, ce qui suggère que le focus a brièvement quitté le contrôle txtRecherche.

    Pourtant, la fenêtre espion montre que le contrôle actif est toujours txtRecherche, même avant l'instruction .SetFocus. De même, ce contrôle est toujours activé (.enabled).

    Autre paradoxe, .txtRecherche est détecté sans erreur dans la ligne .SetFocus, mais ses propriétés (.selstart ou .value) ne le sont pas à la ligne suivante, alors que, rappelons le, le contrôle est actif et activé. L'erreur se produit à l'exécution de la ligne en jaune.

    Par ailleurs, si je tente ensuite de modifier les lettres entrées dans .txtRecherche, j'obtiens à chaque fois une erreur 2185, dès l'exécution de la
    ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strFiltre = "[Ent] Like '" & .txtRecherche.Text & "*'"
    qui fait référence au même contrôle. Bref, le contrôle txtRecherche devient totalement inexploitable.

    Bizarrement, j'ai aussi une case à cocher dans le pied du formulaire qui place un autre type de filtre sur le même recordset. Lorsque je l'active, le filtre de la case à cocher semble "réinitialiser" le tout : le filtrage des enregistrement fonctionne bien, et le contrôle .txtRecherche est à nouveau opérationnel!

    Les questions sont donc :
    • pourquoi n'y a-t-il pas d'erreur lorsque des enregistrements correspondent à la lettre-filtre et y a-t-il une erreur lorsqu'aucun enregistrement ne correspond au filtre?
    • en quoi le fait qu'aucun enregistrement ne correspond au filtre a-t-il une influence sur le contrôle indépendant txtRecherche, et ce d'autant plus que j'utilise une variable écran pour passer du contrôle au filtre?
    • qu'est-ce qui explique que l'erreur 2185 se déclenche, alors que le contrôle en question est bel et bien actif et activé?
    • qu'est-ce qui bloque? Pourquoi l'application d'un autre filtre par un autre moyen débloque-t-il, entre autres, ma zone de texte indépendante txtRecherche?

    Je sais bien que le problème peut toujours se contourner au moyen d'un code plus ou moins alambiqué, ou en déplaçant la zone de texte dans le formulaire parent (ce qui fonctionne, mais est moins logique à mes yeux), mais j'ai un certain goût pour le code propre, simple et concis, d'une part, et, d'autre part, je ne suis apparemment pas le seul sur ce forum qui a eu des problème avec l'erreur 2185.

    Merci à ceux qui ont eu la patience de tout lire, un merci encore plus grand à ceux qui auront essayé de comprendre le problème et ma reconnaissance éternelle à celle ou celui qui trouvera la solution.

  5. #5
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Pour l'heure, je m'en suis sorti avec le code suivant :

    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
    Private Sub txtRecherche_Change()
     
    Dim strCritère As String
    Dim strFiltre As String
    Dim strSQL As String
    Dim dbs As Database
    Dim rst As Recordset
    Dim iCpte As Long
     
        With Me
     
            strCritère = Nz(.txtRecherche.Text, "")
     
            strSQL = "SELECT Count(tEntrées.Entrée) AS CompteEntrées " _
                      & "FROM tEntrées " _
                      & "WHERE left(tEntrées.Entrée," _
                           & CStr(Len(strCritère)) & ") = '" & strCritère & "' ;"
     
            Set dbs = CurrentDb
            Set rst = dbs.OpenRecordset(strSQL)
            rst.MoveFirst
            iCpte = rst.Fields(0)
     
            If iCpte = 0 Then
                Exit Sub
            Else
                strFiltre = "[Ent] Like '" & strCritère & "*'"
                .Filter = strFiltre
                .FilterOn = True
                .txtRecherche.SetFocus
                .txtRecherche.SelStart = Len(Nz(.txtRecherche, "")) + 1
            End If
        End With
     
    End Sub
    Ça marche, mais j'avoue que ça ne me satisfait pas vraiment. Outre la lourdeur de la chose, je crains que ça ne ralentisse l'exécution de la méthode (qui s'exécute à chaque frappe d'une lettre dans le champ txtRecherche, rappelons-le) quand ma table sera importante.

    Donc, même si ça marche, le problème initial n'est pas résolu, car on n'en connaît pas la cause et on ne l'a pas vraiment solutionnée.

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut une piste (tardive)
    Citation Envoyé par St-Jean Voir le message
    Bonjour à toutes et à tous,

    Je veux appliquer un filtre à un formulaire. J'ai pour cela une zone de texte "txtRecherche" dans l'entête du formulaire. Le filtre est créé et appliqué dans l'événement OnChange du champ txtRecherche en fonction des lettres entrées dans le champ et porte sur le champ Ent. Le code de cette méthode est le suivant :

    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
        With Me
    
    ICI :
               .Repaint
    ...
    
                strFiltre = "Ent Like '" & .txtRecherche.Text & "*'"
    PREFERER :
                strFiltre = "Ent Like """ & .txtRecherche.Text & "*"""
    Pour le cas où tu aurais une apostrophe dans le nom de l'ent         
        
                .Filter = strFiltre
                .FilterOn = True
                    
        End With
    Le problème est le suivant :
    Si je rentre une lettre dans txtRecherche pour laquelle il existe des enregistrements dont le champ Ent commence par cette lettre, pas de problème, tout fonctionne bien. Lorsque j'efface cette lettre, tous les enregistrements redeviennent visibles. Jusque-là, c'est normal aussi.

    Si je tape une lettre ne correspondant à aucun enregistrement, le formulaire n'affiche aucun enregistrement, ce qui est encore normal

    Mais si je veux effacer cette lettre pour laquelle il n'y a pas d'enregistrement ou l'écraser par une lettre "fonctionnant", j'obtiens un message d'erreur d'exécution 2185 (et non 2815 comme je l'ai indiqué par erreur précédemment) disant : "Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé."

    Je précise que le contrôle txtRecherche a toujours le focus, ce qui est exigé par la propriété text. Sinon, ça ne fonctionnerait pas non plus avec les "bonnes" lettres.

    J'ai pu établir que lorsque je tape une lettre pour laquelle il existe des enregistrements, la valeur de Me.txtRecherche,Text est la lettre que j'ai tapée et le type de la valeur est String, mais qu'en revanche, si je tape une lettre sans enregistrement correspondant, le contenu de Me.txtRecherche.Text devient "Impossible de faire référence à une propriété ou de la définir pour un contrôle si ce dernier n'est pas activé." et le type du contenu devient Integer. L'erreur se produit donc quand je veux appliquer le filtre sur un filtre ne renvoyant aucun enregistrement, mais c'est au "tour suivant", quand je veux spécifier une autre lettre dans mon champ de recherche/filtrage qu'elle se manifeste, par la boîte d'erreur.

    Où est l'erreur? En quoi le fait de spécifier un filtre ne générant pas de résultat corrompt-il mon champ de recherche?

    Merci d'avance

    Philippe

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    J'ai aujourd'hui exactement le même problème.

    J'ai essayé la méthode Repaint mais je ne crois pas qu'elle fonctionne ( a moins que je l'ai mal placée...). Si aujourd'hui quelqu'un a trouvé la solution , je suis preneur ! Je vous envoie mon code similaire au sien :

    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
    Private Sub recherche_par_nom_Change()
     
     
    Me.Repaint
    If Me.recherche_par_nom.Text = "" Then
        Me.FilterOn = False
        Me.recherche_par_nom.SetFocus
    Else
        Me.Filter = "Client.nom LIKE """ & Me.recherche_par_nom.Text & "*"""
        If Me.FilterOn = False Then
            Me.FilterOn = True
        End If
        Me.recherche_par_nom.SelStart = Len(Me.recherche_par_nom.Text) 'Erreur de cette ligne si aucun client n'existe !
    End If
     
    End Sub
    PS : ce qui est bizarre, c'est que je crois que la source du formulaire (la requête sql) est à l'origine du problème, car avant, quand la requête était simple et sans jointure ca marchait très bien, mais depuis que la requête comporte des jointures, l'erreur apparait. Est ce une coïncidence? Je ne comprends pas le lien....

  8. #8
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    En fait, j'ai plutôt provisoirement contourné le problème que réellement trouvé une solution, grâce à un code comme celui que je reproduis ci-dessous (le code ne répond pas à toute ma problématique, et je n'ai pas le temps de chercher une solution définitive pour le moment, mais je te donne au moins l'idée) :

    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
     
    ' [...]
     
    On Error GoTo ErrPropTextNonDéfinie
            strPremLettres = Me.txtRecherche.Text
    On Error GoTo 0
     
    ' [...]
    Exit Sub ' ne pas oublier cette instruction si on ne veut pas que le code 
                ' ci-dessous s'exécute même en l'absence d'erreur
    'Gestion de l'erreur
    ErrPropTextNonDéfinie:
        If strPremLettres = "" Then
            strPremLettres = Nz(Me.txtRecherche.Value, "")
        End If
        Resume Next
    En fait, il semble que lorsque le contrôle TextBox est vide dans certains cas, la propriété .Text du contrôle n'est plus définie, d'où l'erreur.

    Mon traitement d'erreur consiste donc, en cas d'erreur, à aller lire la propriété Value au lieu de Text en cas d'erreur. C'est loin d'être parfait, car on exploite alors la valeur antérieure à celle qu'on espérait récupérer au moyen de la propriété Text, mais ça permet de contourner le message d'erreur. Mais comme je l'ai dit plus haut, il s'agit là d'une piste, non d'une solution.

    Autre élément de piste : j'ai essayé de récupérer la dernière lettre tapée dans le contrôle au moyen de l'événement KeyDown pour la mettre dans .Tag, puis la récupérer dans le code de la procéduire qui me renvoie l'erreur, mais là encore, ce n'est qu'une piste qui n'est pas totalement satisfaisant.

    Je continue de creuser.
    J'espère que ces bouts de piste pourront t'aider.

    Ph.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Merci d'être revenu sur le sujet , je vais chercher mais je n'ai pas trop de temps non plus...

    Merci encore !

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Ne faudrait-il pas faire un setFocus sur l'objet pour utiliser cette propriété ?

    Tchuss.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je suis tombé sur votre sujet et celui ci a pleinement retenu mon attention puisque j'ai le meme type de problème.

    Un formulaire, un champ texte, un bouton de commande et une zone de liste.
    Lorsque je filtre (donc remplissage du champ texte + clic sur bouton commande) et qu'il y a des résultats, pas de soucis.

    S'il n'y en a pas...c'est le drame (ou plutôt l'erreur 2185 )
    Enfin, ca va l'être...

    Je m'explique. Si aucun enregistrement ne correspond au filtre, sur la prochaine touche activée, je me prends l'erreur.


    Mon code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Len(Nz(Me.txtCritAncienContrat.Text, "")) > 9 And KeyCode <> vbKeyBack And KeyCode <> vbKeyLeft And KeyCode <> vbKeyUp And KeyCode <> vbKeyDown And KeyCode <> vbKeyRight And KeyCode <> vbKeyDelete Then KeyCode = 0
    La chose bizarre, comme vous l'avez souligné, c'est qu'il semble bien y avoir un changement de nature de la valeur du champ texte. Personnellement, je ne cherche pas à tout supprimer, juste un chiffre (la propriété .text reste donc normalement valide et valable, puisqu'il y a du texte dans mon champ)
    De plus, après avoir cliqué sur "ok", je retrouve bien ce que je voulais...

    Je vais tenter d'investiguer plus la dessus (j'ai un peu de temps moi ) et trouver une solution...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Je serais un peu du même avis que Tofalu ! en transformant peu être par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    Dim strFiltre As String
        With Me
                  strFiltre = "[Ent] Like '" & .txtRecherche.Text & "*'"
                
                .Filter = strFiltre
                .FilterOn = True
                .txtRecherche.SetFocus
                .txtRecherche.SelStart = Len(Nz(.txtRecherche.value, 0)) + 1
        End With
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  13. #13
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut J'ai une solution qui me convient (fonctionnellement parlant)
    La solution: Faire un sous formulaire !

    Je suis d'accord, c'est moche , c'est lourd , c'est chiant , et c'est pas pratique . Mais de tous ce que j'ai essayer ces 4 dernières années... c'est la seul chose que j'ai trouvé qui donne un bon résultat.

    PS: Je viens de trouver la solution y'a 2 min
    De toutes les choses que j'ai perdue,
    Celle qui me manque le plus...
    c'est mon esprit !

Discussions similaires

  1. Création d'un filtre gaussien
    Par leviet dans le forum Signal
    Réponses: 3
    Dernier message: 06/03/2007, 18h54
  2. Erreur lors de création d'un MDE
    Par delcroixf dans le forum Access
    Réponses: 1
    Dernier message: 11/02/2007, 07h45
  3. [Swing][JTable] création d'un filtre d'affichage
    Par TheMorpheus dans le forum Composants
    Réponses: 2
    Dernier message: 25/04/2006, 11h50
  4. erreur 2185
    Par gyzmo5 dans le forum Access
    Réponses: 4
    Dernier message: 23/01/2006, 13h22
  5. Erreur pour la création d'un XMLService
    Par jacma dans le forum XMLRAD
    Réponses: 13
    Dernier message: 25/07/2005, 23h26

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