OVH Cloud OVH Cloud

Filtre "vide"

9 réponses
Avatar
Nathalie Lebas
Bonjour à tous,

Est-il possible de contrôler un filtre. J'ai un formulaire qui permet de
défiler des fiches produits et les filtrer par thème, marque ...
Lorsque le résultat du filtre est aucun produit, le formulaire se grise et
l'on doit sortir brutalement.
Existe-t-il une solution pour vérifier le résultat du filtre avant son
exécution.
Voici le code que j'applique :
Private Sub f_mar_AfterUpdate()
Dim myfilter As String

If IsNull(Me!f_ref) And IsNull(Me!f_lib) And IsNull(Me!f_the) And
IsNull(Me!f_lig) And IsNull(Me!f_mar) And IsNull(Me!f_typ) And
IsNull(Me!f_sai) And IsNull(Me!f_styl) Then
DoCmd.ShowAllRecords
Exit Sub
End If

myfilter = ""
If Not IsNull(Me!f_ref) Then
myfilter = myfilter + "[fpr_code]= """ + Me!f_ref + """ and "
End If
If Not IsNull(Me!f_lib) Then
myfilter = myfilter + "[fpr_des] like """ + Me!f_lib + """ and "
End If
If Not IsNull(Me!f_the) Then
myfilter = myfilter + "[fpr_the]= " & Me!f_the & " and "
End If
If Not IsNull(Me!f_lig) Then
myfilter = myfilter + "[fpr_ligne]= " & Me!f_lig & " and "
End If
If Not IsNull(Me!f_mar) Then
myfilter = myfilter + "[ma_code]= """ + Me!f_mar + """ and "
End If
If Not IsNull(Me!f_sai) Then
myfilter = myfilter + "[fpr_sais]= """ + Me!f_sai + """ and "
End If
If Not IsNull(Me!f_typ) Then
myfilter = myfilter + "[fpr_typ]= " & Me!f_typ & " and "
End If
If Not IsNull(Me!f_styl) Then
myfilter = myfilter + "[fpr_style]= """ + Me!f_styl + """ and "
End If

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If

DoCmd.ApplyFilter , myfilter
End Sub
Merci de votre aide
--
Nathalie

9 réponses

Avatar
snide
quelle est la question ?

si my_filtre est vide, ne pas appliquer le filtrage ?
il suffit de sortir si le filtre est vide :

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
Else
exit sub
End If

docmd....



Denis
Avatar
Leti
Bonjour,

Aprés le :
DoCmd.ApplyFilter , myfilter

tu peux ajouter le test suivant :
If me.recordset.recordcount = 0 Then DoCmd.ShowAllRecords


Bonjour à tous,
Est-il possible de contrôler un filtre. J'ai un formulaire qui permet de
défiler des fiches produits et les filtrer par thème, marque ...
Lorsque le résultat du filtre est aucun produit, le formulaire se grise et
l'on doit sortir brutalement.
Existe-t-il une solution pour vérifier le résultat du filtre avant son
exécution.
Voici le code que j'applique :
Private Sub f_mar_AfterUpdate()
Dim myfilter As String
If IsNull(Me!f_ref) And IsNull(Me!f_lib) And IsNull(Me!f_the) And
IsNull(Me!f_lig) And IsNull(Me!f_mar) And IsNull(Me!f_typ) And
IsNull(Me!f_sai) And IsNull(Me!f_styl) Then
DoCmd.ShowAllRecords
Exit Sub
End If

myfilter = ""
If Not IsNull(Me!f_ref) Then
myfilter = myfilter + "[fpr_code]= """ + Me!f_ref + """ and "
End If
If Not IsNull(Me!f_lib) Then
myfilter = myfilter + "[fpr_des] like """ + Me!f_lib + """ and "
End If
If Not IsNull(Me!f_the) Then
myfilter = myfilter + "[fpr_the]= " & Me!f_the & " and "
End If
If Not IsNull(Me!f_lig) Then
myfilter = myfilter + "[fpr_ligne]= " & Me!f_lig & " and "
End If
If Not IsNull(Me!f_mar) Then
myfilter = myfilter + "[ma_code]= """ + Me!f_mar + """ and "
End If
If Not IsNull(Me!f_sai) Then
myfilter = myfilter + "[fpr_sais]= """ + Me!f_sai + """ and "
End If
If Not IsNull(Me!f_typ) Then
myfilter = myfilter + "[fpr_typ]= " & Me!f_typ & " and "
End If
If Not IsNull(Me!f_styl) Then
myfilter = myfilter + "[fpr_style]= """ + Me!f_styl + """ and "
End If

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If
DoCmd.ApplyFilter , myfilter
End Sub
Merci de votre aide
--
Nathalie


Avatar
Nathalie Lebas
Bonjour,
Excuses-moi, je n'ai pas été assez précise.
Mon problème est après l'application du filtre. Si aucun enregistrement ne
répond aux critères du filtrage, l'écran devient alors gris et il faut sortir
brutalement.
Je recherche donc un moyen de vérifier la présence de données après filtrage
mais avant affichage !
a+
--
Nathalie



quelle est la question ?

si my_filtre est vide, ne pas appliquer le filtrage ?
il suffit de sortir si le filtre est vide :

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
Else
exit sub
End If

docmd....



Denis





Avatar
Nathalie Lebas
Bonjour,
Merci de ta réponse. Je viens de tester mais cela ne fonctionne pas. Je
pense qu'il faudrait intervenir avant l'applyfilter.
A+
--
Nathalie



Bonjour,

Aprés le :
DoCmd.ApplyFilter , myfilter

tu peux ajouter le test suivant :
If me.recordset.recordcount = 0 Then DoCmd.ShowAllRecords


Bonjour à tous,
Est-il possible de contrôler un filtre. J'ai un formulaire qui permet de
défiler des fiches produits et les filtrer par thème, marque ...
Lorsque le résultat du filtre est aucun produit, le formulaire se grise et
l'on doit sortir brutalement.
Existe-t-il une solution pour vérifier le résultat du filtre avant son
exécution.
Voici le code que j'applique :
Private Sub f_mar_AfterUpdate()
Dim myfilter As String
If IsNull(Me!f_ref) And IsNull(Me!f_lib) And IsNull(Me!f_the) And
IsNull(Me!f_lig) And IsNull(Me!f_mar) And IsNull(Me!f_typ) And
IsNull(Me!f_sai) And IsNull(Me!f_styl) Then
DoCmd.ShowAllRecords
Exit Sub
End If

myfilter = ""
If Not IsNull(Me!f_ref) Then
myfilter = myfilter + "[fpr_code]= """ + Me!f_ref + """ and "
End If
If Not IsNull(Me!f_lib) Then
myfilter = myfilter + "[fpr_des] like """ + Me!f_lib + """ and "
End If
If Not IsNull(Me!f_the) Then
myfilter = myfilter + "[fpr_the]= " & Me!f_the & " and "
End If
If Not IsNull(Me!f_lig) Then
myfilter = myfilter + "[fpr_ligne]= " & Me!f_lig & " and "
End If
If Not IsNull(Me!f_mar) Then
myfilter = myfilter + "[ma_code]= """ + Me!f_mar + """ and "
End If
If Not IsNull(Me!f_sai) Then
myfilter = myfilter + "[fpr_sais]= """ + Me!f_sai + """ and "
End If
If Not IsNull(Me!f_typ) Then
myfilter = myfilter + "[fpr_typ]= " & Me!f_typ & " and "
End If
If Not IsNull(Me!f_styl) Then
myfilter = myfilter + "[fpr_style]= """ + Me!f_styl + """ and "
End If

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If
DoCmd.ApplyFilter , myfilter
End Sub
Merci de votre aide
--
Nathalie




Avatar
Eric
Bonjour,

Dans ta procédure tu mets quelque chose comme :
En début :
Dim rst as DAO.Recordset, strCritere as String

Juste après la définition de ton filtre et la correction des 4 derniers
caractères :
If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If
set rst = Me.RecordsetClone
strCritere = myFilter
rst.FindFirst strCritere
If rst.NoMatch Then Exit Sub
DoCmd.ApplyFilter , myfilter

et à la fin de la procédure :
rst.Close
Set rst=Nothing

Bonjour,
Merci de ta réponse. Je viens de tester mais cela ne fonctionne pas. Je
pense qu'il faudrait intervenir avant l'applyfilter.
A+


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...
pas fait attention,
If rst.NoMatch Then Exit Sub à corriger comme suit :
If rst.NoMatch Then GoTo Sortie
et sous le docmd.applyfilter ...
Sortie:
rst.Close
Set rst = Nothing

c'est plus propre et la variable-objet libérée.

Bonjour,

Dans ta procédure tu mets quelque chose comme :
En début :
Dim rst as DAO.Recordset, strCritere as String

Juste après la définition de ton filtre et la correction des 4 derniers
caractères :
If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If
set rst = Me.RecordsetClone
strCritere = myFilter
rst.FindFirst strCritere
If rst.NoMatch Then Exit Sub
DoCmd.ApplyFilter , myfilter

et à la fin de la procédure :
rst.Close
Set rst=Nothing


Bonjour, Merci de ta réponse. Je viens de tester mais cela ne
fonctionne pas. Je pense qu'il faudrait intervenir avant l'applyfilter.
A+





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Nathalie Lebas
Bonjour,
Je te remercie pour ta réponse. J'ai testé ton code mais j'ai un souci.
Lorsque tu fais un premier filtrage, le filtre s'applique et filtre bien. Si
il n'y a pas de données correspondantes aux critères choisi, rien ne se
passe, c'est très bien.
Par contre, si tu filtres une deuxième fois sans avoir supprimé tous les
critères du premier filtre et réaffiché tous les enregistrements, le deuxième
filtre ne se fait pas.
As-tu une idéee du problème ?
Merci encore de ton aide
a+
--
Nathalie



..../...
pas fait attention,
If rst.NoMatch Then Exit Sub à corriger comme suit :
If rst.NoMatch Then GoTo Sortie
et sous le docmd.applyfilter ...
Sortie:
rst.Close
Set rst = Nothing

c'est plus propre et la variable-objet libérée.

Bonjour,

Dans ta procédure tu mets quelque chose comme :
En début :
Dim rst as DAO.Recordset, strCritere as String

Juste après la définition de ton filtre et la correction des 4 derniers
caractères :
If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If
set rst = Me.RecordsetClone
strCritere = myFilter
rst.FindFirst strCritere
If rst.NoMatch Then Exit Sub
DoCmd.ApplyFilter , myfilter

et à la fin de la procédure :
rst.Close
Set rst=Nothing


Bonjour, Merci de ta réponse. Je viens de tester mais cela ne
fonctionne pas. Je pense qu'il faudrait intervenir avant l'applyfilter.
A+





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr





Avatar
Eric
Bonsoir,

Le problème se trouve, à mon avis, au niveau des évènements. Tu lances
ton filtre après la MAJ du champ f_mar. Si tu ne modifies pas ce champ,
le filtre est inopérant. Il faut donc qu'à un moment donné tu vides les
critères du premier choix et relances la procédure mais que se
passe-t-il si tu ne renseignes pas f_mar ?

De loin il est difficile de te proposer une solution totalement
opérationnelle mais tu peux essayer ceci ; ça ne te videra pas les zones
initialement renseignées mais désactivera le filtre et redonnera tous
les enregistrements qui seront à nouveau filtrés si myFilter est
renseigné partiellement au moins :

Private Sub f_mar_AfterUpdate()
' Annuler le filtre
Me.FilterOn = False
If IsNull(Me!f_ref) And IsNull(Me!f_lib) And IsNull(Me!f_the) And
IsNull(Me!f_lig) And IsNull(Me!f_mar) And IsNull(Me!f_typ) And
IsNull(Me!f_sai) And IsNull(Me!f_styl) Then
'DoCmd.ShowAllRecords
Exit Sub
End If
Dim myfilter As String
Dim rst As DAO.Recordset, critere As String
Set rst = Me.RecordsetClone
myfilter = ""
If Not IsNull(Me!f_ref) Then
myfilter = myfilter + "[fpr_code]= """ + Me!f_ref + """ and "
End If
If Not IsNull(Me!f_lib) Then
myfilter = myfilter + "[fpr_des] like """ + Me!f_lib + """ and "
End If
If Not IsNull(Me!f_the) Then
myfilter = myfilter + "[fpr_the]= " & Me!f_the & " and "
End If
If Not IsNull(Me!f_lig) Then
myfilter = myfilter + "[fpr_ligne]= " & Me!f_lig & " and "
End If
If Not IsNull(Me!f_mar) Then
myfilter = myfilter + "[ma_code]= """ + Me!f_mar + """ and "
End If
If Not IsNull(Me!f_sai) Then
myfilter = myfilter + "[fpr_sais]= """ + Me!f_sai + """ and "
End If
If Not IsNull(Me!f_typ) Then
myfilter = myfilter + "[fpr_typ]= " & Me!f_typ & " and "
End If
If Not IsNull(Me!f_styl) Then
myfilter = myfilter + "[fpr_style]= """ + Me!f_styl + """ and "
End If

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If

critere = myfilter
rst.FindFirst critere
If rst.NoMatch Then GoTo Sortie
Me.Filter = myfilter
Me.FilterOn = True
Sortie:
Set rst = Nothing
End Sub

Après, il te faudra rechercher à quel moment tu vides les zones à la
base de la construction de ton filtre.

(PS: code écrit à main levée sans tester)

Bonjour,
Je te remercie pour ta réponse. J'ai testé ton code mais j'ai un souci.
Lorsque tu fais un premier filtrage, le filtre s'applique et filtre bien. Si
il n'y a pas de données correspondantes aux critères choisi, rien ne se
passe, c'est très bien.
Par contre, si tu filtres une deuxième fois sans avoir supprimé tous les
critères du premier filtre et réaffiché tous les enregistrements, le deuxième
filtre ne se fait pas.
As-tu une idéee du problème ?
Merci encore de ton aide
a+


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Nathalie Lebas
Salut,
Merci. Le filteron règle bien mon problème. Maintenant, je peux filtrer
plusieurs fois de suite sans problème. S'il existe des enregistrements
correspondants à mon filtre, il apparaisent sinon l'ensemble des
enregistrements s'affiche. C'est parfait et répond à ce que je cherchais à
faire.
Merci encore
A+
--
Nathalie



Bonsoir,

Le problème se trouve, à mon avis, au niveau des évènements. Tu lances
ton filtre après la MAJ du champ f_mar. Si tu ne modifies pas ce champ,
le filtre est inopérant. Il faut donc qu'à un moment donné tu vides les
critères du premier choix et relances la procédure mais que se
passe-t-il si tu ne renseignes pas f_mar ?

De loin il est difficile de te proposer une solution totalement
opérationnelle mais tu peux essayer ceci ; ça ne te videra pas les zones
initialement renseignées mais désactivera le filtre et redonnera tous
les enregistrements qui seront à nouveau filtrés si myFilter est
renseigné partiellement au moins :

Private Sub f_mar_AfterUpdate()
' Annuler le filtre
Me.FilterOn = False
If IsNull(Me!f_ref) And IsNull(Me!f_lib) And IsNull(Me!f_the) And
IsNull(Me!f_lig) And IsNull(Me!f_mar) And IsNull(Me!f_typ) And
IsNull(Me!f_sai) And IsNull(Me!f_styl) Then
'DoCmd.ShowAllRecords
Exit Sub
End If
Dim myfilter As String
Dim rst As DAO.Recordset, critere As String
Set rst = Me.RecordsetClone
myfilter = ""
If Not IsNull(Me!f_ref) Then
myfilter = myfilter + "[fpr_code]= """ + Me!f_ref + """ and "
End If
If Not IsNull(Me!f_lib) Then
myfilter = myfilter + "[fpr_des] like """ + Me!f_lib + """ and "
End If
If Not IsNull(Me!f_the) Then
myfilter = myfilter + "[fpr_the]= " & Me!f_the & " and "
End If
If Not IsNull(Me!f_lig) Then
myfilter = myfilter + "[fpr_ligne]= " & Me!f_lig & " and "
End If
If Not IsNull(Me!f_mar) Then
myfilter = myfilter + "[ma_code]= """ + Me!f_mar + """ and "
End If
If Not IsNull(Me!f_sai) Then
myfilter = myfilter + "[fpr_sais]= """ + Me!f_sai + """ and "
End If
If Not IsNull(Me!f_typ) Then
myfilter = myfilter + "[fpr_typ]= " & Me!f_typ & " and "
End If
If Not IsNull(Me!f_styl) Then
myfilter = myfilter + "[fpr_style]= """ + Me!f_styl + """ and "
End If

If myfilter <> "" Then
myfilter = Left$(myfilter, Len(myfilter) - 4)
End If

critere = myfilter
rst.FindFirst critere
If rst.NoMatch Then GoTo Sortie
Me.Filter = myfilter
Me.FilterOn = True
Sortie:
Set rst = Nothing
End Sub

Après, il te faudra rechercher à quel moment tu vides les zones à la
base de la construction de ton filtre.

(PS: code écrit à main levée sans tester)

Bonjour,
Je te remercie pour ta réponse. J'ai testé ton code mais j'ai un souci.
Lorsque tu fais un premier filtrage, le filtre s'applique et filtre bien. Si
il n'y a pas de données correspondantes aux critères choisi, rien ne se
passe, c'est très bien.
Par contre, si tu filtres une deuxième fois sans avoir supprimé tous les
critères du premier filtre et réaffiché tous les enregistrements, le deuxième
filtre ne se fait pas.
As-tu une idéee du problème ?
Merci encore de ton aide
a+


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr