OVH Cloud OVH Cloud

débutante : probleme d'écriture de filtre

15 réponses
Avatar
Sabine B.
Bonjour
Je chercher à trier des enregistrements à l'aide d'une procédure
évenementielle, je dois avoir un problème de définition de valeurs...je me
demande si je ne mélange pas des carottes et des navets!
Sur la commande clic d'un bouton rechercher d'une boite de dialogue j'ai la
procédure qui suit qui fonctionne bien .
Je cherche pour une autre boite de dialogue à faire presque la même chose la
seule différence étant que je veux ajouter un critère autre que la date dans
mon filtre mais Hélas access m'affiche lors de l'execution de cette
procédure :Incompatibilité de type?????
Fonctionne:
Select Case Me!ChoixConsultation
Dim Filter As String
Case 1
Filter = "[DateRMN2]=Date()"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 2
Filter = "[DateRMN2]> Date()-8"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter = "[DateRMN2]Between Forms![BdeD_RMN_C]![DateDebut]and
[Forms]![BdeD_RMN_C]![DateFin] "
End If
End If
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
End Select

Ne Fonctionne pas:
Dim Filter2 As String
Const ConstValeurInstrument = 4
Select Case Me!ChoixConsultation
Case 1
Filter2 = "[DateMS2]=Date()"
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 2
Filter2 = "[DateMS2]> Date()-20" And
"[NumRefAppareil].value=ConstValeurInstrument"
'ouvre le rapport cahier MS sur les 20 derniers jours pour l'instrument 4
(NumRefAppareil étant la clé primaire de ma table)
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter2 = "[DateMS2]Between Forms![BdeD_LCQ_C]![DateDebut]and
[Forms]![BdeD_LCQ_C]![DateFin]"
End If
End If
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
End Select

Merci pour votre aide.

Sabine

10 réponses

1 2
Avatar
Gilbert
Bonjour,

Essaie ça
Filter2 = "[DateMS2]> Date()-20" And "[NumRefAppareil].value=" &
ConstValeurInstrument

Gilbert

"Sabine B." a écrit dans le message de
news:4563e7cd$0$25921$
Bonjour
Je chercher à trier des enregistrements à l'aide d'une procédure
évenementielle, je dois avoir un problème de définition de valeurs...je me
demande si je ne mélange pas des carottes et des navets!
Sur la commande clic d'un bouton rechercher d'une boite de dialogue j'ai
la

procédure qui suit qui fonctionne bien .
Je cherche pour une autre boite de dialogue à faire presque la même chose
la

seule différence étant que je veux ajouter un critère autre que la date
dans

mon filtre mais Hélas access m'affiche lors de l'execution de cette
procédure :Incompatibilité de type?????
Fonctionne:
Select Case Me!ChoixConsultation
Dim Filter As String
Case 1
Filter = "[DateRMN2]Úte()"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 2
Filter = "[DateRMN2]> Date()-8"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter = "[DateRMN2]Between Forms![BdeD_RMN_C]![DateDebut]and
[Forms]![BdeD_RMN_C]![DateFin] "
End If
End If
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
End Select

Ne Fonctionne pas:
Dim Filter2 As String
Const ConstValeurInstrument = 4
Select Case Me!ChoixConsultation
Case 1
Filter2 = "[DateMS2]Úte()"
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 2
Filter2 = "[DateMS2]> Date()-20" And
"[NumRefAppareil].value=ConstValeurInstrument"
'ouvre le rapport cahier MS sur les 20 derniers jours pour l'instrument 4
(NumRefAppareil étant la clé primaire de ma table)
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter2 = "[DateMS2]Between Forms![BdeD_LCQ_C]![DateDebut]and
[Forms]![BdeD_LCQ_C]![DateFin]"
End If
End If
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
End Select

Merci pour votre aide.

Sabine




Avatar
Jean-Pierre
Bonjour Sabine,

Je reprends le code qui fonctionne, et je suis surpris que cela fonctionne:

Filter = "[DateRMN2]Between Forms![BdeD_RMN_C]![DateDebut]and [Forms]![BdeD_RMN_C]![DateFin] "

Il manque des séparateurs "espaces", et normalement, une date doit se trouver entre des délimiteurs "#". Es-tu bien sûr que ça
marche ?
Il me semble que ça devrait ressembler à:

Filter = "[DateRMN2] Between #" & Forms![BdeD_RMN_C]![DateDebut] & _
"# and #" & [Forms]![BdeD_RMN_C]![DateFin] & "#"

J-Pierre
Avatar
Sabine B.
Bonsoir Jean Pierre
Pour répondre à ta question: oui mon code fonctionne correctement même si je
ne peux pas te dire pourquoi!
Il me rapporte les bon enregistrements, mais je suis toujours preneuse
d'infos pour éviter de taper des lignes comme un "sagouin"!!!
Je ne maîtrise ni les espaces ni l'utilisation de "&"...j'ai un peu de mal à
définir les différents types de valeurs...
Je suis aussi surprise de voir que ce code fonctionne même si je n'ai pas
définit avant : Dim Filter as String.....est ce réellement nécessaire?
J'ai substitué ta ligne qui semble plus rigoureuse ce qui fonctionne aussi
parfaitement

Merci à toi

Sabine


"Jean-Pierre" a écrit dans le
message de news:
Bonjour Sabine,

Je reprends le code qui fonctionne, et je suis surpris que cela
fonctionne:

Filter = "[DateRMN2]Between Forms![BdeD_RMN_C]![DateDebut]and
[Forms]![BdeD_RMN_C]![DateFin] "

Il manque des séparateurs "espaces", et normalement, une date doit se
trouver entre des délimiteurs "#". Es-tu bien sûr que ça marche ?
Il me semble que ça devrait ressembler à:

Filter = "[DateRMN2] Between #" & Forms![BdeD_RMN_C]![DateDebut] & _
"# and #" & [Forms]![BdeD_RMN_C]![DateFin] & "#"

J-Pierre



Avatar
Jean-Pierre
Bonsoir Sabine,

Au début de ton code, avant ta première procédure évènementielle (Private Sub) rajoute "Option Explicit", cette option impose
de définir explicitement les variables (Dim quelque chose), ça évite les erreurs de frappe qui amène des bugs. Ce n'est pas
nécessaire, mais je pense que c'est préférable.

Ca devrait donner:

Option Compare Database
Option Explicit

Private Sub Commande759_Click()
...
...

Dans le cas de ton Filter, Access évalue l'expression en remplaçant chaque variable par sa valeur. Si tu veux voir le résultat
qui est utilisé comme filtre à l'ouverture de ton formulaire, juste après ton instruction, rajoute MsgBox ..., ça deviendra
lumineux :-)

Filter = "[DateRMN2] Between #" & Forms![BdeD_RMN_C]![DateDebut] & _
"# and #" & [Forms]![BdeD_RMN_C]![DateFin] & "#"
MsgBox Filter


Docmd Open........
J-Pierre


Avatar
Eric
Bonsoir,

(Pas tout lu)
Ne serait-il pas préférable d'écrire la date au format US car le filtre
n'est rien d'autre qu'une clause WHERE sans le mot WHERE
donc un truc du genre :
Filter = "[DateRMN2] Between #" & _
Format(Forms![BdeD_RMN_C]![DateDebut],"mm/dd/yyyy") & "# And #" & _
Format(Forms![BdeD_RMN_C]![DateFin],"mm/dd/yyyy") & "#"

Bonsoir Sabine,

Au début de ton code, avant ta première procédure évènementielle (Private Sub) rajoute "Option Explicit", cette option impose
de définir explicitement les variables (Dim quelque chose), ça évite les erreurs de frappe qui amène des bugs. Ce n'est pas
nécessaire, mais je pense que c'est préférable.

Ca devrait donner:

Option Compare Database
Option Explicit

Private Sub Commande759_Click()
...
...

Dans le cas de ton Filter, Access évalue l'expression en remplaçant chaque variable par sa valeur. Si tu veux voir le résultat
qui est utilisé comme filtre à l'ouverture de ton formulaire, juste après ton instruction, rajoute MsgBox ..., ça deviendra
lumineux :-)

Filter = "[DateRMN2] Between #" & Forms![BdeD_RMN_C]![DateDebut] & _

"# and #" & [Forms]![BdeD_RMN_C]![DateFin] & "#"



MsgBox Filter
Docmd Open........
J-Pierre




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



Avatar
Jean-Pierre
Salut Eric,

Sabine a précisé qu'elle était débutante......

Au demeurant, avec ces formats, il y a assez longtemps, je ne me souviens plus des détails, mais il me semble qu'une date au
format américain, par exemple 11/12/2006 était mal interprétée par un système en français. Perso, j'utilise toujours
YYYY/MM/DD comme masque, et ça, ça marche toujours quel que soit l'environnement.

Si j'étais courageux, début décembre, je ferais des tests :-)

J-Pierre

"Eric" a écrit dans le message de news: %
Bonsoir,

(Pas tout lu)
Ne serait-il pas préférable d'écrire la date au format US car le filtre n'est rien d'autre qu'une clause WHERE sans le mot
WHERE
donc un truc du genre :
Filter = "[DateRMN2] Between #" & _
Format(Forms![BdeD_RMN_C]![DateDebut],"mm/dd/yyyy") & "# And #" & _
Format(Forms![BdeD_RMN_C]![DateFin],"mm/dd/yyyy") & "#"

Bonsoir Sabine,

Au début de ton code, avant ta première procédure évènementielle (Private Sub) rajoute "Option Explicit", cette option
impose de définir explicitement les variables (Dim quelque chose), ça évite les erreurs de frappe qui amène des bugs. Ce
n'est pas nécessaire, mais je pense que c'est préférable.

Ca devrait donner:

Option Compare Database
Option Explicit

Private Sub Commande759_Click()
...
...

Dans le cas de ton Filter, Access évalue l'expression en remplaçant chaque variable par sa valeur. Si tu veux voir le
résultat qui est utilisé comme filtre à l'ouverture de ton formulaire, juste après ton instruction, rajoute MsgBox ..., ça
deviendra lumineux :-)

Filter = "[DateRMN2] Between #" & Forms![BdeD_RMN_C]![DateDebut] & _

"# and #" & [Forms]![BdeD_RMN_C]![DateFin] & "#"



MsgBox Filter
Docmd Open........
J-Pierre


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





Avatar
Sabine B.
Bonsoir Gilbert,

Merci pour ta réponse.....
Hélas cela ne fonctionne toujours pas.
J'ai coupé l'expression en deux afin de voir où se localise le problème,
j'ai donc créé un filtre simple uniquement sur mon instrument...déjà
là...il y a un problème:

Dim Filter2 As String
Select Case Me!ChoixConsultation
...
Case 2
Const ConstValeurInstrument = 4
Filter2 = "[NumRefAppareil].value =" & ConstValeurInstrument

DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2

Une fenêtre apparait me demandant de saisir la valeur de NumRefAppareil.....
si je tape la valeur, il ne trie pas pour autant les enregistrements....
Chose étrange si je tape une valeur autre que 4 il considère qu'il n'y a pas
de réponse...et déclanche ma procédure sur absence d'enregistrement de mon
état.
(Remarque: j'ai d'autres instruments d'enregistrés...pour lesquels ils
existe des enregistrement dans mon état!)

Je ne pense pas qu'il y ait une erreur sur la syntaxe du champs dans mon
état...
Je ne comprends pas le problème...

Je vais continuer à creuser....


Sabine
"Gilbert" a écrit dans le message de news:
%
Bonjour,

Essaie ça
Filter2 = "[DateMS2]> Date()-20" And "[NumRefAppareil].value=" &
ConstValeurInstrument

Gilbert

"Sabine B." a écrit dans le message de
news:4563e7cd$0$25921$
Bonjour
Je chercher à trier des enregistrements à l'aide d'une procédure
évenementielle, je dois avoir un problème de définition de valeurs...je
me
demande si je ne mélange pas des carottes et des navets!
Sur la commande clic d'un bouton rechercher d'une boite de dialogue j'ai
la

procédure qui suit qui fonctionne bien .
Je cherche pour une autre boite de dialogue à faire presque la même chose
la

seule différence étant que je veux ajouter un critère autre que la date
dans

mon filtre mais Hélas access m'affiche lors de l'execution de cette
procédure :Incompatibilité de type?????
Fonctionne:
Select Case Me!ChoixConsultation
Dim Filter As String
Case 1
Filter = "[DateRMN2]Úte()"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 2
Filter = "[DateRMN2]> Date()-8"
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter = "[DateRMN2]Between Forms![BdeD_RMN_C]![DateDebut]and
[Forms]![BdeD_RMN_C]![DateFin] "
End If
End If
DoCmd.OpenReport "CahierRMN", acViewPreview, , Filter
End Select

Ne Fonctionne pas:
Dim Filter2 As String
Const ConstValeurInstrument = 4
Select Case Me!ChoixConsultation
Case 1
Filter2 = "[DateMS2]Úte()"
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 2
Filter2 = "[DateMS2]> Date()-20" And
"[NumRefAppareil].value=ConstValeurInstrument"
'ouvre le rapport cahier MS sur les 20 derniers jours pour l'instrument 4
(NumRefAppareil étant la clé primaire de ma table)
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
Case 3
If IsNull([DateDebut]) Or IsNull([DateFin]) Then
MsgBox "Vous devez taper une date de début et une date de fin."
DoCmd.GoToControl "DateDebut"
Else
If [DateDebut] > [DateFin] Then
MsgBox "La date de fin doit être postérieure à la date de
début."
DoCmd.GoToControl "DateDebut"
Else
Filter2 = "[DateMS2]Between Forms![BdeD_LCQ_C]![DateDebut]and
[Forms]![BdeD_LCQ_C]![DateFin]"
End If
End If
DoCmd.OpenReport "CahierMS", acViewPreview, , Filter2
End Select

Merci pour votre aide.

Sabine








Avatar
Eric
Bonsoir Jean-Pierre,

...
Sabine a précisé qu'elle était débutante......


Oui, peut-être, mais si sa date de début est le 03/05/06
et celle de fin le 10/05/06 (en date au format français)
elle récupèrera la période du 5 mars 06 au 5 octobre 06
donc vaut mieux la prévenir, ne crois-tu pas ?

Au demeurant, avec ces formats, il y a assez longtemps, je ne me souviens plus des détails, mais il me semble qu'une date au
format américain, par exemple 11/12/2006 était mal interprétée par un système en français. Perso, j'utilise toujours
YYYY/MM/DD comme masque, et ça, ça marche toujours quel que soit l'environnement.


Jamais eu de probleme avec des dates au format US dans du SQL.
Mais, sait-on jamais ...

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

Avatar
Jean-Pierre
Bonsoir Eric,

Je viens de faire le test en reprenant tes dates, j'ai fait une requête avec comme critère de sélection:
= #03/05/06# Et <= #10/05/06#:
Les lignes sélectionnées vont bien du 3 au 10 mai 2006.


J'abandonne, toute personne voulant bien faire des tests poussés bénéficiera de ma reconnaissance éternelle :-)

J-Pierre

"Eric" a écrit dans le message de news:
Bonsoir Jean-Pierre,

...
Sabine a précisé qu'elle était débutante......


Oui, peut-être, mais si sa date de début est le 03/05/06
et celle de fin le 10/05/06 (en date au format français)
elle récupèrera la période du 5 mars 06 au 5 octobre 06
donc vaut mieux la prévenir, ne crois-tu pas ?

Au demeurant, avec ces formats, il y a assez longtemps, je ne me souviens plus des détails, mais il me semble qu'une date
au format américain, par exemple 11/12/2006 était mal interprétée par un système en français. Perso, j'utilise toujours
YYYY/MM/DD comme masque, et ça, ça marche toujours quel que soit l'environnement.


Jamais eu de probleme avec des dates au format US dans du SQL.
Mais, sait-on jamais ...

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



Avatar
Eric
re Jean-Pierre,

Dans le générateur de requête, je suis d'accord avec toi, le format Fr
ne pose pas de problème, mais si tu regardes le SQL généré par le
générateur, tu y verras les dates transposées au format americain.
Par contre, sur la clause d'un filtre que tu écris en US puisque tu as
mis un 'BETWEEN' et 'AND' tu dois les inscrire au format US.

Ok ?

Bonsoir Eric,

Je viens de faire le test en reprenant tes dates, j'ai fait une requête avec comme critère de sélection:

= #03/05/06# Et <= #10/05/06#:


Les lignes sélectionnées vont bien du 3 au 10 mai 2006.

J'abandonne, toute personne voulant bien faire des tests poussés bénéficiera de ma reconnaissance éternelle :-)

J-Pierre

"Eric" a écrit dans le message de news:

Bonsoir Jean-Pierre,


...
Sabine a précisé qu'elle était débutante......


Oui, peut-être, mais si sa date de début est le 03/05/06
et celle de fin le 10/05/06 (en date au format français)
elle récupèrera la période du 5 mars 06 au 5 octobre 06
donc vaut mieux la prévenir, ne crois-tu pas ?


Au demeurant, avec ces formats, il y a assez longtemps, je ne me souviens plus des détails, mais il me semble qu'une date
au format américain, par exemple 11/12/2006 était mal interprétée par un système en français. Perso, j'utilise toujours
YYYY/MM/DD comme masque, et ça, ça marche toujours quel que soit l'environnement.


Jamais eu de probleme avec des dates au format US dans du SQL.
Mais, sait-on jamais ...

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






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



1 2