Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ApplyFilter erreur 7951

4 réponses
Avatar
Gloops
Bonjour tout le monde,

Pour contr=F4ler l'ex=E9cution d'un filtre (par formulaire), je v=E9rifie=
le=20
nombre d'enregistrements obtenus, de fa=E7on =E0 annuler le filtre si auc=
un=20
enregistrement n'est affich=E9.

Or, il s'av=E8re que le Recordset du formulaire n'est pas disponible (en =

tout cas pas =E0 tous les coups) pendant la proc=E9dure d'=E9v=E9nement=20
ApplyFilter (Access 2003 SP2 sur base Access 2000) : erreur 7951, "Vous=20
avez entr=E9 une expression dont la r=E9f=E9rence =E0 la propri=E9t=E9=20
Cl=F4neRecordset n'est pas valide.", sur le code suivant :
MsgBox Me.RecordsetClone.RecordCount
(pareil en rempla=E7ant Me par la d=E9signation du formulaire en pr=E9cis=
ant=20
explicitement son nom)

Si je mets Recordset plut=F4t que RecordsetClone le num=E9ro d'erreur n'e=
st=20
pas le m=EAme mais il y a aussi une erreur.

Je dois donc me contenter pendant l'ApplyFilter d'initialiser le=20
TimerInterval, pour tester le nombre d'enregistrements pendant le=20
Form_Timer, et red=E9clencher DoCmd.acCmdFilterByForm si aucun=20
enregistrement n'est obtenu.

=E7a marche, mais ... =E7a diminue le taux d'orthodoxie du code.

Cela r=E9sulte-t-il d'une erreur de ma part par ailleurs, ou d'une erreur=
=20
dans Access, qui probablement aurait d=E9j=E0 =E9t=E9 remarqu=E9e ?

Manifestement le probl=E8me n'est pas syst=E9matique puisque des question=
s=20
ont =E9t=E9 pos=E9es sur l'interpr=E9tation du r=E9sultat.

4 réponses

Avatar
3stone
Salut,

"Gloops"
Pour contrôler l'exécution d'un filtre (par formulaire), je vérifie le
nombre d'enregistrements obtenus, de façon à annuler le filtre si aucun
enregistrement n'est affiché.


Qu'est ce que tu utilise comme méthode ?

Me.Filter = "champ = 'machin'"
ou
DoCmd.ApplyFilter


Or, il s'avère que le Recordset du formulaire n'est pas disponible (en
tout cas pas à tous les coups) pendant la procédure d'événement
ApplyFilter (Access 2003 SP2 sur base Access 2000) : erreur 7951, "Vous
avez entré une expression dont la référence à la propriété
ClôneRecordset n'est pas valide.", sur le code suivant :
MsgBox Me.RecordsetClone.RecordCount


Tu as un recordset (jeux d'enregistrements) pour autant
que tu as des enregistrements...


(pareil en remplaçant Me par la désignation du formulaire en précisant
explicitement son nom)


Inutile, puisque Me est une instance du formulaire courant...


Si je mets Recordset plutôt que RecordsetClone le numéro d'erreur n'est
pas le même mais il y a aussi une erreur.


mieux vaut utiliser le RecordsetClone dans le cas présent


Je dois donc me contenter pendant l'ApplyFilter d'initialiser le
TimerInterval, pour tester le nombre d'enregistrements pendant le
Form_Timer, et redéclencher DoCmd.acCmdFilterByForm si aucun
enregistrement n'est obtenu.


sur minuterie ? brrrrr ;-))


ça marche, mais ... ça diminue le taux d'orthodoxie du code.


moi, tu sais... les religions :o)))

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
Gloops
3stone a écrit, le 31/01/2008 00:45 :
Qu'est ce que tu utilise comme méthode ?

Me.Filter = "champ = 'machin'"
ou
DoCmd.ApplyFilter


ApplyFilter, s'agissant d'un filtre par formulaire



Tu as un recordset (jeux d'enregistrements) pour autant
que tu as des enregistrements...


Ah, c'est spécifique aux filtres par formulaire, peut-être ?

Parce que j'ai souvent écrit sans problème

Set Rs = CurrentDb().OpenRecordset(strSQL)
If Rs.Recordset() <> 0 Then
Rs.MoveLast
MsgBox "Il y a " + VBA.Str$(Rs.Recordcount) + " enregistrements"
Else
MsgBox "Ce jeu d'enregistrements est vide."
End If
Rs.Close
Set Rs = Nothing

D'ailleurs, j'ai fini par contrôler la présence d'enregistrements de
cette manière, mais en reportant l'exécution dans le Timer.



(pareil en remplaçant Me par la désignation du formulaire en préc isant
explicitement son nom)


Inutile, puisque Me est une instance du formulaire courant...


Oui, enfin quelquefois, en désespoir de cause, il vaut mieux être tro p
prudent que pas assez.
Si on tape Me dans la fenêtre d'exécution, le formulaire est reconnu
pendant l'exécution, pas après.
Enfin là, effectivement, ça n'a rien changé.



Si je mets Recordset plutôt que RecordsetClone le numéro d'erreur n 'est
pas le même mais il y a aussi une erreur.


mieux vaut utiliser le RecordsetClone dans le cas présent


Ouaip. Me suis cassé le nez quand même. :)



Je dois donc me contenter pendant l'ApplyFilter d'initialiser le
TimerInterval, pour tester le nombre d'enregistrements pendant le
Form_Timer, et redéclencher DoCmd.acCmdFilterByForm si aucun
enregistrement n'est obtenu.


sur minuterie ? brrrrr ;-))


Pour fournir un code propre et clair, il faut avouer qu'on fait mieux.
Surtout que je me retrouve maintenant avec six traitements différents
dans le Timer, différenciés avec une variable publique, initialisée dans
les différentes procédures événementielles. Il va falloir que je mette
quelques commentaires judicieux, sinon ce n'était pas la peine de mettr e
en forme une analyse Merise sous Word (ben oui on n'a pas AMC partout).



ça marche, mais ... ça diminue le taux d'orthodoxie du code.


moi, tu sais... les religions :o)))



Je laisse comme c'est alors ?

Je garde quand même en réserve une question sur le changement de mode
d'affichage, pas à piquer des hannetons ...
Il va falloir que je relise un peu ça avant. ça promet d'être fumeu x
mais on peut quand même chercher à limiter les dégâts ;)

Avatar
Gloops
Gloops a écrit, le 31/01/2008 23:55 :
Set Rs = CurrentDb().OpenRecordset(strSQL)
If Rs.Recordset() <> 0 Then


Bon, ben ... on va aller dormir, hein :)

Je voulais bien entendu dire :

If Rs.Recordcount <> 0

Rs.MoveLast
MsgBox "Il y a " + VBA.Str$(Rs.Recordcount) + " enregistrements"
Else
MsgBox "Ce jeu d'enregistrements est vide."
End If
Rs.Close
Set Rs = Nothing


Avatar
3stone
re,

"Gloops"
Je voulais bien entendu dire :
If Rs.Recordcount <> 0



J'avais traductionné ;-))

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)