ApplyFilter erreur 7951

Le
Gloops
Bonjour tout le monde,

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 auc=
un
enregistrement n'est affiché.

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
(pareil en remplaçant Me par la désignation du formulaire en précis=
ant
explicitement son nom)

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

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.

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

Cela résulte-t-il d'une erreur de ma part par ailleurs, ou d'une erreur=

dans Access, qui probablement aurait déjà été remarquée ?

Manifestement le problème n'est pas systématique puisque des question=
s
ont été posées sur l'interprétation du résultat.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
3stone
Le #6344351
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)
Gloops
Le #6344181
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 ;)

Gloops
Le #6344161
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


3stone
Le #6344141
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)
Publicité
Poster une réponse
Anonyme