OVH Cloud OVH Cloud

filtre d'un formulaire... Aidez moi SVP !!!

5 réponses
Avatar
Thomas B.
Bonjour à tous,

Débutant en access, je suis heurté au problème suivant... J'ai un formulaire basé sur une table comportant les champs [NOM] [CODE POSTAL] [VILLE] (ainsi que d'autres, mais ca n'est pas la question ).

J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE] [VILLE_RECHERCHE], et un bouton d'action. Je souhaite que lorsque le bouton d'action est pressé, un filtre s'exerce de la manière suivante : par défaut (si le champ texte est "vide", aucun filtre ne soit exercé sur le critère, et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un filtre s'exerce et s'applique aux enregistrements contenant (et pas commençant ni étant exactement) le texte saisi...

J'ai essayé sans succès de passer par un formulaire généré par une requête avec une condition where basée sur la valeur des champs. J'ai tenté également quelques macros mais sans succès jusqu'ici...

Quelqu'un aurait-il la gentillesse de m'aider à comprendre comment construire cela ?

Cordialement,

Thomas B.

5 réponses

Avatar
Buddy
Saut

C'est simple, tu testes la présence de texte dans tes champs et tu montes ton critère.

'-------------------------------------------------
Private Sub btnFiltre_Click()
On Error Goto ErrorHere:

Dim strFiltre As String, strFiltreNom As String, strFiltreCP As String, strFiltreVille As String, strSQLSource as String

strFiltre = ""
strFiltreNom = pvsFiltreNom
strFiltreCP = pvsFiltreCP
strFiltreVille = pvsFiltreVille

If Len(strFiltreNom) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreNom
Else
strFiltre = strFiltreNom
End If
End If

If Len(strFiltreCP) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreCP
Else
strFiltre = strFiltreCP
End If
End If

If Len(strFiltreVille) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreVille
Else
strFiltre = strFiltreVille
End If
End If

If Len(strFiltre) > 0 Then
strSQLSource = "SELECT * FROM TaTable WHERE " & strFiltre & ";"
Else
strSQLSource = "SELECT * FROM TaTable;"
End If

'Si tes résultats sortent dans un ssForm
Me.NomSSForm.Form.RecordSource = strSQLSource

'Si tes résultats sortent dans une zone de liste
zdlResultatsFiltres = strSQLSource

'Sinon
Me.RecordSource = strSQLSource
Me.Requery

ExitHere:
Exit Sub

ErrorHere:
MsgBox Err.Number & " - " & Err.Description, vbOkOnly, "Erreur"
Resume ExitHere
End Sub

'-------------------------------------------------
Private Sub pvsFiltreNom() As String
pvsFiltreNom = ""
If Len(Nz(Nom_Recherche, ""))>0 Then pvsFiltreNom = "NOM Like '*" & Replace(Nom_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreCP() As String
pvsFiltreCP = ""
If Len(Nz(CP_Recherche, ""))>0 Then pvsFiltreCP = "[CODE POSTAL] Like '*" & Replace(CP_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreVille() As String
pvsFiltreVille = ""
If Len(Nz(Ville_Recherche, ""))>0 Then pvsFiltreVille = "VILLE Like '*" & Replace(Ville_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------

Ouala
Bye
Buddy

"Thomas B." <Thomas a écrit dans le message de
news:
Bonjour à tous,

Débutant en access, je suis heurté au problème suivant... J'ai un formulaire basé sur une table comportant les champs [NOM]
[CODE POSTAL] [VILLE] (ainsi que d'autres, mais ca n'est pas la question ).


J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE] [VILLE_RECHERCHE], et un bouton d'action. Je souhaite que lorsque
le bouton d'action est pressé, un filtre s'exerce de la manière suivante : par défaut (si le champ texte est "vide", aucun filtre

ne soit exercé sur le critère, et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un filtre s'exerce et
s'applique aux enregistrements contenant (et pas commençant ni étant exactement) le texte saisi...

J'ai essayé sans succès de passer par un formulaire généré par une requête avec une condition where basée sur la valeur des
champs. J'ai tenté également quelques macros mais sans succès jusqu'ici...


Quelqu'un aurait-il la gentillesse de m'aider à comprendre comment construire cela ?

Cordialement,

Thomas B.


Avatar
Greg
Thomas,
Je passais par là :-) et ...
Je pense que cela fonctionne pour "étant exactement".
Pour "Contenant", je crois qu'il y a une fontion "Mid" mais je ne sais pas
grand chose sur elle.

SubPrivate TonBouton_Click()
Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "TonFormulaire"
stLinkCriteria = "[Nom]='" & Nz(Me![Nom_Recherche];*) & "'" & "AND [Code
Postal]='" & Nz(Me![CP_Recherche];*) & "'" & "AND [Ville]='" &
Nz(Me![Ville_Recherche];*) & "'")

DoCmd.OpenForm stDocName, , , stLinkCriteria

End Sub

Si cela peut te servir en attendant que quelqu'un te donne une solution plus
adéquate à ce que tu veux ou si cela te sert de base pour l'amélñiorer toi.
Tan mieux! :-)
Je te préviens aussi que je suis pas du tout un pro de VBA donc je ne te le
garanti pas 100% libre d'erreur :-(
Par exemple, je ne suis pas sûr le caractère * vale pour dire que cela soit
égal à "n'importe quoi".

Bonne journée

Greg

"Thomas B." <Thomas escribió en el mensaje
news:
Bonjour à tous,

Débutant en access, je suis heurté au problème suivant... J'ai un
formulaire basé sur une table comportant les champs [NOM] [CODE POSTAL]

[VILLE] (ainsi que d'autres, mais ca n'est pas la question ).

J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE]
[VILLE_RECHERCHE], et un bouton d'action. Je souhaite que lorsque le bouton

d'action est pressé, un filtre s'exerce de la manière suivante : par défaut
(si le champ texte est "vide", aucun filtre ne soit exercé sur le critère,
et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un
filtre s'exerce et s'applique aux enregistrements contenant (et pas
commençant ni étant exactement) le texte saisi...

J'ai essayé sans succès de passer par un formulaire généré par une requête
avec une condition where basée sur la valeur des champs. J'ai tenté

également quelques macros mais sans succès jusqu'ici...

Quelqu'un aurait-il la gentillesse de m'aider à comprendre comment
construire cela ?


Cordialement,

Thomas B.


Avatar
Thomas B.
Super !!! Merci ENORMEMENT pour cette réponse on-ne-peut-plus complète !!!

J'avoue que je vais mettre un peu de temps pour la digérer entièrement, mais d'ici demain ca s'ra bon !

Juste 1 question que j'ai pas compris lors de mes lectures... Mon résultat final n'est pas un sous-formulaire mais le filtre du formulaire sur lequel les champs Nom_Recherche & Cie sont...

La syntaxe est bien :
Me.Filter = strSQLSource
Me.FilerOn = True

?

Encore mille merci,

Thomas B.

Saut

C'est simple, tu testes la présence de texte dans tes champs et tu montes ton critère.

'-------------------------------------------------
Private Sub btnFiltre_Click()
On Error Goto ErrorHere:

Dim strFiltre As String, strFiltreNom As String, strFiltreCP As String, strFiltreVille As String, strSQLSource as String

strFiltre = ""
strFiltreNom = pvsFiltreNom
strFiltreCP = pvsFiltreCP
strFiltreVille = pvsFiltreVille

If Len(strFiltreNom) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreNom
Else
strFiltre = strFiltreNom
End If
End If

If Len(strFiltreCP) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreCP
Else
strFiltre = strFiltreCP
End If
End If

If Len(strFiltreVille) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreVille
Else
strFiltre = strFiltreVille
End If
End If

If Len(strFiltre) > 0 Then
strSQLSource = "SELECT * FROM TaTable WHERE " & strFiltre & ";"
Else
strSQLSource = "SELECT * FROM TaTable;"
End If

'Si tes résultats sortent dans un ssForm
Me.NomSSForm.Form.RecordSource = strSQLSource

'Si tes résultats sortent dans une zone de liste
zdlResultatsFiltres = strSQLSource

'Sinon
Me.RecordSource = strSQLSource
Me.Requery

ExitHere:
Exit Sub

ErrorHere:
MsgBox Err.Number & " - " & Err.Description, vbOkOnly, "Erreur"
Resume ExitHere
End Sub

'-------------------------------------------------
Private Sub pvsFiltreNom() As String
pvsFiltreNom = ""
If Len(Nz(Nom_Recherche, ""))>0 Then pvsFiltreNom = "NOM Like '*" & Replace(Nom_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreCP() As String
pvsFiltreCP = ""
If Len(Nz(CP_Recherche, ""))>0 Then pvsFiltreCP = "[CODE POSTAL] Like '*" & Replace(CP_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreVille() As String
pvsFiltreVille = ""
If Len(Nz(Ville_Recherche, ""))>0 Then pvsFiltreVille = "VILLE Like '*" & Replace(Ville_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------

Ouala
Bye
Buddy

"Thomas B." <Thomas a écrit dans le message de
news:
Bonjour à tous,

Débutant en access, je suis heurté au problème suivant... J'ai un formulaire basé sur une table comportant les champs [NOM]
[CODE POSTAL] [VILLE] (ainsi que d'autres, mais ca n'est pas la question ).


J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE] [VILLE_RECHERCHE], et un bouton d'action. Je souhaite que lorsque
le bouton d'action est pressé, un filtre s'exerce de la manière suivante : par défaut (si le champ texte est "vide", aucun filtre

ne soit exercé sur le critère, et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un filtre s'exerce et
s'applique aux enregistrements contenant (et pas commençant ni étant exactement) le texte saisi...

J'ai essayé sans succès de passer par un formulaire généré par une requête avec une condition where basée sur la valeur des
champs. J'ai tenté également quelques macros mais sans succès jusqu'ici...


Quelqu'un aurait-il la gentillesse de m'aider à comprendre comment construire cela ?

Cordialement,

Thomas B.







Avatar
Thomas B.
Merci, greg ! Tu as bien fait de passer :)

Je vais voir dans quelle mesure je peux réexploiter la fonction "like" (qui semble mieux répondre à ce que je veux) et ta proposition qui semble faire un filtre !

Je te tiens au courant dès que j'ai testé, encore merci !


Thomas,
Je passais par là :-) et ...
Je pense que cela fonctionne pour "étant exactement".
Pour "Contenant", je crois qu'il y a une fontion "Mid" mais je ne sais pas
grand chose sur elle.

SubPrivate TonBouton_Click()
Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "TonFormulaire"
stLinkCriteria = "[Nom]='" & Nz(Me![Nom_Recherche];*) & "'" & "AND [Code
Postal]='" & Nz(Me![CP_Recherche];*) & "'" & "AND [Ville]='" &
Nz(Me![Ville_Recherche];*) & "'")

DoCmd.OpenForm stDocName, , , stLinkCriteria

End Sub

Si cela peut te servir en attendant que quelqu'un te donne une solution plus
adéquate à ce que tu veux ou si cela te sert de base pour l'amélñiorer toi.
Tan mieux! :-)
Je te préviens aussi que je suis pas du tout un pro de VBA donc je ne te le
garanti pas 100% libre d'erreur :-(
Par exemple, je ne suis pas sûr le caractère * vale pour dire que cela soit
égal à "n'importe quoi".

Bonne journée

Greg

"Thomas B." <Thomas escribió en el mensaje
news:
Bonjour à tous,

Débutant en access, je suis heurté au problème suivant... J'ai un
formulaire basé sur une table comportant les champs [NOM] [CODE POSTAL]

[VILLE] (ainsi que d'autres, mais ca n'est pas la question ).

J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE]
[VILLE_RECHERCHE], et un bouton d'action. Je souhaite que lorsque le bouton

d'action est pressé, un filtre s'exerce de la manière suivante : par défaut
(si le champ texte est "vide", aucun filtre ne soit exercé sur le critère,
et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un
filtre s'exerce et s'applique aux enregistrements contenant (et pas
commençant ni étant exactement) le texte saisi...

J'ai essayé sans succès de passer par un formulaire généré par une requête
avec une condition where basée sur la valeur des champs. J'ai tenté

également quelques macros mais sans succès jusqu'ici...

Quelqu'un aurait-il la gentillesse de m'aider à comprendre comment
construire cela ?


Cordialement,

Thomas B.







Avatar
Buddy
Non, non c'est bien
Me.RecordSource = strSQLSource
Me.Requery

Je m'en souviens plus bien, mais je crois que dès que tu changes la source d'un form, il est automatiquement rafraichi donc je pense
que le Me.Requery n'est pas nécessaire.

Ah, au fait, tes champs NOM_RECHERCHE, CP_RECHERCHE, VILLE_RECHERCHE doivent être indépendants sur ton form
On fait pareil que le fonction Filter, mais en mieux et on code la source du form entièrement.

Ouala
Bye
Buddy

"Thomas B." a écrit dans le message de
news:
Super !!! Merci ENORMEMENT pour cette réponse on-ne-peut-plus complète !!!

J'avoue que je vais mettre un peu de temps pour la digérer entièrement, mais d'ici demain ca s'ra bon !

Juste 1 question que j'ai pas compris lors de mes lectures... Mon résultat final n'est pas un sous-formulaire mais le filtre du
formulaire sur lequel les champs Nom_Recherche & Cie sont...


La syntaxe est bien :
Me.Filter = strSQLSource
Me.FilerOn = True

?

Encore mille merci,

Thomas B.

Saut

C'est simple, tu testes la présence de texte dans tes champs et tu montes ton critère.

'-------------------------------------------------
Private Sub btnFiltre_Click()
On Error Goto ErrorHere:

Dim strFiltre As String, strFiltreNom As String, strFiltreCP As String, strFiltreVille As String, strSQLSource as String

strFiltre = ""
strFiltreNom = pvsFiltreNom
strFiltreCP = pvsFiltreCP
strFiltreVille = pvsFiltreVille

If Len(strFiltreNom) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreNom
Else
strFiltre = strFiltreNom
End If
End If

If Len(strFiltreCP) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreCP
Else
strFiltre = strFiltreCP
End If
End If

If Len(strFiltreVille) > 0 Then
If Len(strFiltre) > 0 Then
strFiltre = strFiltre & " AND " & strFiltreVille
Else
strFiltre = strFiltreVille
End If
End If

If Len(strFiltre) > 0 Then
strSQLSource = "SELECT * FROM TaTable WHERE " & strFiltre & ";"
Else
strSQLSource = "SELECT * FROM TaTable;"
End If

'Si tes résultats sortent dans un ssForm
Me.NomSSForm.Form.RecordSource = strSQLSource

'Si tes résultats sortent dans une zone de liste
zdlResultatsFiltres = strSQLSource

'Sinon
Me.RecordSource = strSQLSource
Me.Requery

ExitHere:
Exit Sub

ErrorHere:
MsgBox Err.Number & " - " & Err.Description, vbOkOnly, "Erreur"
Resume ExitHere
End Sub

'-------------------------------------------------
Private Sub pvsFiltreNom() As String
pvsFiltreNom = ""
If Len(Nz(Nom_Recherche, ""))>0 Then pvsFiltreNom = "NOM Like '*" & Replace(Nom_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreCP() As String
pvsFiltreCP = ""
If Len(Nz(CP_Recherche, ""))>0 Then pvsFiltreCP = "[CODE POSTAL] Like '*" & Replace(CP_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------
Private Sub pvsFiltreVille() As String
pvsFiltreVille = ""
If Len(Nz(Ville_Recherche, ""))>0 Then pvsFiltreVille = "VILLE Like '*" & Replace(Ville_Recherche, "'", "''") & "*'"
End Sub
'-------------------------------------------------

Ouala
Bye
Buddy

"Thomas B." <Thomas a écrit dans le message de
news:
Bonjour Ãf tous,

DÃf©butant en access, je suis heurtÃf© au problÃf¨me suivant... J'ai un formulaire basÃf© sur une table comportant les
champs [NOM]



[CODE POSTAL] [VILLE] (ainsi que d'autres, mais ca n'est pas la question ).

J'ai par ailleurs 3 zones textes [NOM_RECHERCHE] [CP_RECHERCHE] [VILLE_RECHERCHE], et un bouton d'action. Je souhaite que
lorsque



le bouton d'action est pressÃf©, un filtre s'exerce de la maniÃf¨re suivante : par dÃf©faut (si le champ texte est "vide",
aucun filtre


ne soit exercÃf© sur le critÃf¨re, et si dans [VILLE_RECHERCHE] ou [NOM_RECHERCHE] du texte est saisi, un filtre s'exerce et
s'applique aux enregistrements contenant (et pas commenÃf§ant ni Ãf©tant exactement) le texte saisi...

J'ai essayÃf© sans succÃf¨s de passer par un formulaire gÃf©nÃf©rÃf© par une requÃfªte avec une condition where basÃf©e
sur la valeur des



champs. J'ai tentÃf© Ãf©galement quelques macros mais sans succÃf¨s jusqu'ici...

Quelqu'un aurait-il la gentillesse de m'aider Ãf comprendre comment construire cela ?

Cordialement,

Thomas B.