OVH Cloud OVH Cloud

Impossible de passer un objet Recorset par Référence dans une procédure ??

5 réponses
Avatar
News Groups
Bonjour,

Je un probléme avec le passage de recordset par référence :

Soit la procédure A :
Je déclare un RecordSet et je le passe par référence à la Procédure B
pour ensuite récupérer le nombre d'enregistrement pour faire un test (Test
A)
°° Public Sub MaProcedureA ()
°° Dim MonRst AS New ADODB.Recordset
°° Call MaProcédureB (MonRst)
°° MonRst.RecordCount ' Test A
°° End Sub

Soit la procédure B :
J'ouvre un RecordSet passé par référence
°° Public Sub MaProcedureB (MonRstVar AS ADODB.Recordset)
°° ....déclaration de la MaCommande
°° MonRstVar.Open MaCommande
°° MonRstVar.RecordCount ' Test B
°° End Sub

Le résultat est le suivant :
Le Test B est OK et le Test A génére une erreur : "impossible..sur un objet
fermé"
Cela ce comporte comme si MonRst passé par référence est bien ouvert dans
MaProcedureB (Test B : OK)
mais est refermé lors du retour à MaProcedureA !! :-( ??

Je ne comprend pas pourquoi,
quelqu'un peut-il m'aider pour faire passer correctement le RecordSet par
Référence ?

Je suis dans l'attente de votre aide,
Merci,encore,
Thierry.

5 réponses

Avatar
Ilan
bonjour,

ESSAIE de declarer MonRst en tant variable Public, donc accessible
pour les 2 procedures sinon declare
MaProcedure en tant que ADODB.recordset

Public Sub MaProcedureA ()
Dim MonRst AS New ADODB.Recordset
MonRst= MaProcédureB (MonRst)
MonRst.RecordCount ' Test A
End Sub

Public Sub ProcedureB (MonRstVar AS ADODB.Recordset) As ADODB.Recordset
....déclaration de la MaCommande
MonRstVar.Open MaCommande
MonRstVar.RecordCount ' Test B
MaProcedureB=MonRstVar
End Sub



Bonjour,

Je un probléme avec le passage de recordset par référence :

Soit la procédure A :
Je déclare un RecordSet et je le passe par référence à la Procédure B
pour ensuite récupérer le nombre d'enregistrement pour faire un test (Test
A)
°° Public Sub MaProcedureA ()
°° Dim MonRst AS New ADODB.Recordset
°° Call MaProcédureB (MonRst)
°° MonRst.RecordCount ' Test A
°° End Sub

Soit la procédure B :
J'ouvre un RecordSet passé par référence
°° Public Sub MaProcedureB (MonRstVar AS ADODB.Recordset)
°° ....déclaration de la MaCommande
°° MonRstVar.Open MaCommande
°° MonRstVar.RecordCount ' Test B
°° End Sub

Le résultat est le suivant :
Le Test B est OK et le Test A génére une erreur : "impossible..sur un objet
fermé"
Cela ce comporte comme si MonRst passé par référence est bien ouvert dans
MaProcedureB (Test B : OK)
mais est refermé lors du retour à MaProcedureA !! :-( ??

Je ne comprend pas pourquoi,
quelqu'un peut-il m'aider pour faire passer correctement le RecordSet par
Référence ?

Je suis dans l'attente de votre aide,
Merci,encore,
Thierry.






Avatar
Raymond [mvp]
Bonjour.

Je t'ai fait un exemple en DAO (plus simple) qui fonctionne, je viens de le
tester:
Private Sub Commande0_Click()
Dim Rs As DAO.Recordset
testB Rs
MsgBox "Rs= " & Rs.Name & ":" & Rs.RecordCount
Set Rs = Nothing
End Sub

Private Sub testB(Rs As DAO.Recordset)
Set Rs = CurrentDb.OpenRecordset("table1")
MsgBox "Rs= " & Rs.Name & ":" & Rs.RecordCount
End Sub

N'aurais-tu pas un nothing qui traine dans la procédure B ?

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"News Groups" a écrit dans le message de news:
417f7f3c$0$286$
Bonjour,

Je un probléme avec le passage de recordset par référence :

Soit la procédure A :
Je déclare un RecordSet et je le passe par référence à la Procédure B
pour ensuite récupérer le nombre d'enregistrement pour faire un test (Test
A)
°° Public Sub MaProcedureA ()
°° Dim MonRst AS New ADODB.Recordset
°° Call MaProcédureB (MonRst)
°° MonRst.RecordCount ' Test A
°° End Sub

Soit la procédure B :
J'ouvre un RecordSet passé par référence
°° Public Sub MaProcedureB (MonRstVar AS ADODB.Recordset)
°° ....déclaration de la MaCommande
°° MonRstVar.Open MaCommande
°° MonRstVar.RecordCount ' Test B
°° End Sub

Le résultat est le suivant :
Le Test B est OK et le Test A génére une erreur : "impossible..sur un
objet
fermé"
Cela ce comporte comme si MonRst passé par référence est bien ouvert dans
MaProcedureB (Test B : OK)
mais est refermé lors du retour à MaProcedureA !! :-( ??

Je ne comprend pas pourquoi,
quelqu'un peut-il m'aider pour faire passer correctement le RecordSet par
Référence ?

Je suis dans l'attente de votre aide,
Merci,encore,
Thierry.





Avatar
News Groups
Merci de votre aide,

Réponse Ilan :
* "..ESSAIE de declarer MonRst en tant variable Public .."
C'est justement pouir ne pas utiliser de variable globale Public que je
passe par référence.
* "..sinon declare MaProcedure en tant que ADODB.recordset.."
Au final MaProcedure est en fait une function qui prend une valeur
booléenne.

Réponse Raymond :
* "..exemple en DAO ... qui fonctionne.."
J'ai effectivement testé en DAO est c'est bien OK, mais en ADO c'est une
autre histoire !!

Après analyse, il se trouve que le problème vient du fait
que je ferme ma connexion à la fin de MaProcedureB :
°° MaCommande.ActiveConnection.Close
Donc si je ne fais pas cela, tout fonctionne !! :-)

Ce qui me dérange c'est que je reste avec une connection ouverte plus
utilisée !! :-(
Donc il faut que j'approfondisse la question pour avoir un code propre.

Je tiens le forum au courant...
si vous avez des remarques...ne pas hésiter..

Merci encore,
Thierry.



"News Groups" a écrit dans le message de news:
417f7f3c$0$286$
Bonjour,

Je un probléme avec le passage de recordset par référence :

Soit la procédure A :
Je déclare un RecordSet et je le passe par référence à la Procédure B
pour ensuite récupérer le nombre d'enregistrement pour faire un test (Test
A)
°° Public Sub MaProcedureA ()
°° Dim MonRst AS New ADODB.Recordset
°° Call MaProcédureB (MonRst)
°° MonRst.RecordCount ' Test A
°° End Sub

Soit la procédure B :
J'ouvre un RecordSet passé par référence
°° Public Sub MaProcedureB (MonRstVar AS ADODB.Recordset)
°° ....déclaration de la MaCommande
°° MonRstVar.Open MaCommande
°° MonRstVar.RecordCount ' Test B
°° End Sub

Le résultat est le suivant :
Le Test B est OK et le Test A génére une erreur : "impossible..sur un
objet

fermé"
Cela ce comporte comme si MonRst passé par référence est bien ouvert dans
MaProcedureB (Test B : OK)
mais est refermé lors du retour à MaProcedureA !! :-( ??

Je ne comprend pas pourquoi,
quelqu'un peut-il m'aider pour faire passer correctement le RecordSet par
Référence ?

Je suis dans l'attente de votre aide,
Merci,encore,
Thierry.





Avatar
Raymond [mvp]
Il me semblait bien que tu fermais.

Faut mettre ton close dans la procédure A ou une autre procédure qui aurait
le même recordset en paramètre.
par principe on met le close dans la même procédure que le dim.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"News Groups" a écrit dans le message de news:
417f99bb$0$29529$
Merci de votre aide,

Réponse Ilan :
* "..ESSAIE de declarer MonRst en tant variable Public .."
C'est justement pouir ne pas utiliser de variable globale Public que je
passe par référence.
* "..sinon declare MaProcedure en tant que ADODB.recordset.."
Au final MaProcedure est en fait une function qui prend une valeur
booléenne.

Réponse Raymond :
* "..exemple en DAO ... qui fonctionne.."
J'ai effectivement testé en DAO est c'est bien OK, mais en ADO c'est une
autre histoire !!

Après analyse, il se trouve que le problème vient du fait
que je ferme ma connexion à la fin de MaProcedureB :
°° MaCommande.ActiveConnection.Close
Donc si je ne fais pas cela, tout fonctionne !! :-)

Ce qui me dérange c'est que je reste avec une connection ouverte plus
utilisée !! :-(
Donc il faut que j'approfondisse la question pour avoir un code propre.

Je tiens le forum au courant...
si vous avez des remarques...ne pas hésiter..

Merci encore,
Thierry.



Avatar
News Groups
Effectivement, je ferme mon recordset et sa connection :
MonRst.Close
MonRst.ActiceConnection.Close

et tout fonctionne. !! :-)

Merci encore Raymond,

Thierry.


"Raymond [mvp]" a écrit dans le message de
news:
Il me semblait bien que tu fermais.

Faut mettre ton close dans la procédure A ou une autre procédure qui
aurait

le même recordset en paramètre.
par principe on met le close dans la même procédure que le dim.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"News Groups" a écrit dans le message de news:
417f99bb$0$29529$
Merci de votre aide,

Réponse Ilan :
* "..ESSAIE de declarer MonRst en tant variable Public .."
C'est justement pouir ne pas utiliser de variable globale Public que
je


passe par référence.
* "..sinon declare MaProcedure en tant que ADODB.recordset.."
Au final MaProcedure est en fait une function qui prend une valeur
booléenne.

Réponse Raymond :
* "..exemple en DAO ... qui fonctionne.."
J'ai effectivement testé en DAO est c'est bien OK, mais en ADO c'est
une


autre histoire !!

Après analyse, il se trouve que le problème vient du fait
que je ferme ma connexion à la fin de MaProcedureB :
°° MaCommande.ActiveConnection.Close
Donc si je ne fais pas cela, tout fonctionne !! :-)

Ce qui me dérange c'est que je reste avec une connection ouverte plus
utilisée !! :-(
Donc il faut que j'approfondisse la question pour avoir un code propre.

Je tiens le forum au courant...
si vous avez des remarques...ne pas hésiter..

Merci encore,
Thierry.