OVH Cloud OVH Cloud

passage d'un recorset en parametre

9 réponses
Avatar
c.barbier
Comment on fait pour passer en parametre dans une procedure une
variable Recordset?

Merci beaucoup,

9 réponses

Avatar
Raymond [mvp]
bonsoir aussi.

dans ta procédure tu appelles ta fonction comme ceci:
Dim Rs As DAO.Recordset
Set Rs = Me.Recordset
Mafonction( Rs )

tu décris ta fonction comme ceci:
Public Function Mafonction(MonRs As DAO.Recordset) As Boolean
.....................
End Function

le tout par exemple seulement.
--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Comment on fait pour passer en parametre dans une procedure une
variable Recordset?

Merci beaucoup,



Avatar
c.barbier
Bonjour,
J''ai essaye de faire ce que vous m''avez dit mais il y a quelque chose
que je dois mal faire car ca ne marche pas. Il met un message d''erreur
disant « Invalid use of Me key word ». De plus, je n''ai pas compris
ce qu''est le Me. J''ai vu qu''il etait souvent utilise pour la
programmation des formulaires mais je n''ai pas trop compris ce que
c''est.
Voici ci-dessous la fonction dans laquelle je souhaite passer les
recordset en parametre et ensuite, j''ai mis la procedure d''appel de
la fonction.
Merci beaucoup pour votre aide,

Public Function Mvt_RCT_PO(code_article As String, rst_art As
DAO.Recordset, rst_mvt As DAO.Recordset) As Boolean

'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim QtePrecedente As Double

'Ouverture et positionnement au debut de la table resultat
Set db_resultat = CurrentDb()
Set rst_resultat = db_resultat.OpenRecordset("SELECT * from
tbl_resultat")
'Ajout du mouvement et du resultat des calculs dans la table resultat
rst_resultat.AddNew
rst_resultat("CodeArticle") = code_article
rst_resultat("Designation") = rst_art![Description1]
rst_resultat("CodeMvt") = rst_mvt![Mouvement]
rst_resultat("TypeMvt") = rst_mvt![TypeMvt]
rst_resultat("Quantite1") = rst_mvt![QteMvt]
rst_resultat("PrixUnit1") = rst_mvt![Prix]
rst_resultat("Montant1") = rst_resultat("Quantite1") *
rst_resultat("PrixUnit1")
rst_resultat.Update

rst_resultat.Close 'Fermeture de la table resultat
'Liberation des variables permettant de designer la table resultat
Set rst_resultat = Nothing
Set db_resultat = Nothing

End Function




PROCEDURE OU LA FONCTION EST APPELEE

Sub Principale()

'variable permettant de designer la table article
Dim db_art As DAO.Database
Dim rst_art As DAO.Recordset

'variable permettant de designer la table mouvement
Dim db_mvt As DAO.Database
Dim rst_mvt As DAO.Recordset

'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim stock_final As Double 'valeur du stock final
Dim code_article As String 'code de l'article lu dans la table article
Dim article As String 'code article lu dans la table mouvement
Dim annee As Integer 'annee extraite de la date lu dans la table
mouvement
Dim annee_souhaitee As Integer 'annee pour laquelle l'utilisateur
souhaite connaitre la valeur du stock
Dim mois As Integer 'mois extrait de la date lu dans la table mouvement
Dim mois_souhaite As Integer 'mois pour lequel l'utilisateur souhaite
connaitre la valeur du stock


annee_souhaitee = Saisie_Annee_Souhaitee() 'recuperation de l'annee
saisi par l'utilisateur
mois_souhaite = Saisie_Mois_Souhaite() 'recuperation du mois saisi par
l'utilisateur
'Debug.Print annee_souhaitee 'affichage de la variable annee_souhaitee
stock_final = 0 'initialisation de la valeur du stock final a 0

'ouverture et positionnement au debut de la table article
Set db_art = CurrentDb()
Set rst_art = db_art.OpenRecordset("SELECT * from dbo_article_copie")

While Not rst_art.EOF 'tant que l'on n'a pas atteint la fin de la table
'si la valeur du champ AchetPlan de la table article n'est pas un
outil
If rst_art![AchetPlan] <> "OUT" Then
code_article = rst_art![Code] 'lecture du code article de la
table dbo-article

StockIni (code_article) 'Appel de la procedure permettant de
mettre la valeur du stock initial, d'un article donne, dans la table
resultat

'Ouverture et positionnement au debut de la table mouvement
Set db_mvt = CurrentDb()
Set rst_mvt = db_mvt.OpenRecordset("SELECT * from
dbo_mouvement_copie")

'Tant que l'on n'a pas atteint la fin de la table mouvement
While Not rst_mvt.EOF
article = rst_mvt![article] 'lecture du code article dans
la table des mouvements
annee = Year(rst_mvt![Date]) 'recuperation de l'annee dans
le champ date de la table mouvement
mois = Month(rst_mvt![Date]) 'recuperation du mois dans le
champ date de la table mouvement


If ((code_article = article) And (annee = annee_souhaitee)
And (mois = mois_souhaite)) Then
If rst_mvt![TypeMvt] = "RCT-PO" Then



''C''EST ICI QUE CA NE MARCHE PAS, IL N''ACCEPTE PAS LA LIGNE SUIVANTE
(IL BLOQUE SUR LE « ME »):
Set rst_art = Me.Recordset
Set rst_mvt = Me.Recordset
Mvt_RCT_PO (code_article,rst_art,rst_mvt)





End If


End If
rst_mvt.MoveNext 'passage au mouvement suivant
Wend

rst_mvt.Close 'fermeture de la table mouvement
'Liberation des variables objets permettant de designer la
table mouvement
Set rst_mvt = Nothing
Set db_mvt = Nothing

End If
rst_art.MoveNext 'passer a l'element suivant
Wend


rst_art.Close 'fermeture de la table article
'Liberation des variables objet permettant de designer la table article
Set rst_art = Nothing
Set db_art = Nothing

End Sub
Avatar
Raymond [mvp]
Bonjour.

Me indique l'objet formulaire sur lequel on se trouve et qui permet de ne
pas utiliser la fonction Forms!Nomformulaire!........ Mais on ne peut pas
utiliser Me dans un module standard. Ton recordset n'est pas le recordset
d'un formulaire mais un recordset normal que tu dois ouvrir comme les autres
et tu dois utiliser son nom pour te déplacer. d'ailleurs tu ne peux pas
définir deux recordset différents avec le Me.Recordset, ce n'est pas
logique.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Bonjour,
J''ai essaye de faire ce que vous m''avez dit mais il y a quelque chose
que je dois mal faire car ca ne marche pas. Il met un message d''erreur
disant « Invalid use of Me key word ». De plus, je n''ai pas compris
ce qu''est le Me. J''ai vu qu''il etait souvent utilise pour la
programmation des formulaires mais je n''ai pas trop compris ce que
c''est.
Voici ci-dessous la fonction dans laquelle je souhaite passer les
recordset en parametre et ensuite, j''ai mis la procedure d''appel de
la fonction.
Merci beaucoup pour votre aide,

Public Function Mvt_RCT_PO(code_article As String, rst_art As
DAO.Recordset, rst_mvt As DAO.Recordset) As Boolean

'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim QtePrecedente As Double

'Ouverture et positionnement au debut de la table resultat
Set db_resultat = CurrentDb()
Set rst_resultat = db_resultat.OpenRecordset("SELECT * from
tbl_resultat")
'Ajout du mouvement et du resultat des calculs dans la table resultat
rst_resultat.AddNew
rst_resultat("CodeArticle") = code_article
rst_resultat("Designation") = rst_art![Description1]
rst_resultat("CodeMvt") = rst_mvt![Mouvement]
rst_resultat("TypeMvt") = rst_mvt![TypeMvt]
rst_resultat("Quantite1") = rst_mvt![QteMvt]
rst_resultat("PrixUnit1") = rst_mvt![Prix]
rst_resultat("Montant1") = rst_resultat("Quantite1") *
rst_resultat("PrixUnit1")
rst_resultat.Update

rst_resultat.Close 'Fermeture de la table resultat
'Liberation des variables permettant de designer la table resultat
Set rst_resultat = Nothing
Set db_resultat = Nothing

End Function




PROCEDURE OU LA FONCTION EST APPELEE

Sub Principale()

'variable permettant de designer la table article
Dim db_art As DAO.Database
Dim rst_art As DAO.Recordset

'variable permettant de designer la table mouvement
Dim db_mvt As DAO.Database
Dim rst_mvt As DAO.Recordset

'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim stock_final As Double 'valeur du stock final
Dim code_article As String 'code de l'article lu dans la table article
Dim article As String 'code article lu dans la table mouvement
Dim annee As Integer 'annee extraite de la date lu dans la table
mouvement
Dim annee_souhaitee As Integer 'annee pour laquelle l'utilisateur
souhaite connaitre la valeur du stock
Dim mois As Integer 'mois extrait de la date lu dans la table mouvement
Dim mois_souhaite As Integer 'mois pour lequel l'utilisateur souhaite
connaitre la valeur du stock


annee_souhaitee = Saisie_Annee_Souhaitee() 'recuperation de l'annee
saisi par l'utilisateur
mois_souhaite = Saisie_Mois_Souhaite() 'recuperation du mois saisi par
l'utilisateur
'Debug.Print annee_souhaitee 'affichage de la variable annee_souhaitee
stock_final = 0 'initialisation de la valeur du stock final a 0

'ouverture et positionnement au debut de la table article
Set db_art = CurrentDb()
Set rst_art = db_art.OpenRecordset("SELECT * from dbo_article_copie")

While Not rst_art.EOF 'tant que l'on n'a pas atteint la fin de la table
'si la valeur du champ AchetPlan de la table article n'est pas un
outil
If rst_art![AchetPlan] <> "OUT" Then
code_article = rst_art![Code] 'lecture du code article de la
table dbo-article

StockIni (code_article) 'Appel de la procedure permettant de
mettre la valeur du stock initial, d'un article donne, dans la table
resultat

'Ouverture et positionnement au debut de la table mouvement
Set db_mvt = CurrentDb()
Set rst_mvt = db_mvt.OpenRecordset("SELECT * from
dbo_mouvement_copie")

'Tant que l'on n'a pas atteint la fin de la table mouvement
While Not rst_mvt.EOF
article = rst_mvt![article] 'lecture du code article dans
la table des mouvements
annee = Year(rst_mvt![Date]) 'recuperation de l'annee dans
le champ date de la table mouvement
mois = Month(rst_mvt![Date]) 'recuperation du mois dans le
champ date de la table mouvement


If ((code_article = article) And (annee = annee_souhaitee)
And (mois = mois_souhaite)) Then
If rst_mvt![TypeMvt] = "RCT-PO" Then



''C''EST ICI QUE CA NE MARCHE PAS, IL N''ACCEPTE PAS LA LIGNE SUIVANTE
(IL BLOQUE SUR LE « ME »):
Set rst_art = Me.Recordset
Set rst_mvt = Me.Recordset
Mvt_RCT_PO (code_article,rst_art,rst_mvt)





End If


End If
rst_mvt.MoveNext 'passage au mouvement suivant
Wend

rst_mvt.Close 'fermeture de la table mouvement
'Liberation des variables objets permettant de designer la
table mouvement
Set rst_mvt = Nothing
Set db_mvt = Nothing

End If
rst_art.MoveNext 'passer a l'element suivant
Wend


rst_art.Close 'fermeture de la table article
'Liberation des variables objet permettant de designer la table article
Set rst_art = Nothing
Set db_art = Nothing

End Sub
Avatar
c.barbier
Bonjour,
C&#8217;est bon, ca marche. Merci beaucoup pour les explications. Par
contre, lors de l&#8217;appel de la fonction, je suis obligee de mettre
une variable (l&#8217;appel est comme ceux-ci : resultat Mvt_RCT_PO(code_article, rst_art, rst_mvt)) alors que je ne veux rien
recupere mais sinon, il ne veut pas compiler. J&#8217;ai donc essaye de
definir la fonction comme une procedure. C&#8217;est a dire:
SubMvt_RCT_PO(code_article As String, rst_art As DAO.Recordset,
rst_mvt As DAO.Recordset)
Et j&#8217;ai defini l&#8217;appel de la procedure de la maniere
suivante:
Mvt_RCT_PO(code_article, rst_art, rst_mvt)
Mais ca ne marche pas. Il dit qu&#8217;il y a une erreur sur la ligne
d&#8217;appel de la procedure.

Saivez vous pourquoi, je ne peux pas definir la fonction comme une
procedure ?
Merci beaucoup,
Avatar
Raymond [mvp]
Enlève les paranthèses et ça marchera.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Bonjour,
C&#8217;est bon, ca marche. Merci beaucoup pour les explications. Par
contre, lors de l&#8217;appel de la fonction, je suis obligee de mettre
une variable (l&#8217;appel est comme ceux-ci : resultat > Mvt_RCT_PO(code_article, rst_art, rst_mvt)) alors que je ne veux rien
recupere mais sinon, il ne veut pas compiler. J&#8217;ai donc essaye de
definir la fonction comme une procedure. C&#8217;est a dire:
SubMvt_RCT_PO(code_article As String, rst_art As DAO.Recordset,
rst_mvt As DAO.Recordset)
Et j&#8217;ai defini l&#8217;appel de la procedure de la maniere
suivante:
Mvt_RCT_PO(code_article, rst_art, rst_mvt)
Mais ca ne marche pas. Il dit qu&#8217;il y a une erreur sur la ligne
d&#8217;appel de la procedure.

Saivez vous pourquoi, je ne peux pas definir la fonction comme une
procedure ?
Merci beaucoup,



Avatar
c.barbier
Bonjour,

Je vais vous paraitre un peu bete mais je ne vois pas quelles
parentheses je dois enlever? car meme si je fais une procedure, je dois
quand meme passer les variables en argument?
Merci beaucoup,
Avatar
Raymond [mvp]
soit tu fais: X = Mafonction( Rs )
soit tu fais : Mafonction Rs


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Bonjour,

Je vais vous paraitre un peu bete mais je ne vois pas quelles
parentheses je dois enlever? car meme si je fais une procedure, je dois
quand meme passer les variables en argument?
Merci beaucoup,



Avatar
c.barbier
Bonjour,

C&#8217;est parfait, ca marche. Merci beaucoup.
Par contre, je n&#8217;arrive pas a lire un champ de
l&#8217;enregistrement precedent. J&#8217;ai essaye la fonction
MovePrevious et FindPrevious mais ca ne marche pas.
Savez vous d&#8217;ou ca vient ?
Merci beaucoup,

Voici ci dessous la procedure :

Sub Mvt_RCT_PO(code_article As String, rst_art As DAO.Recordset,
rst_mvt As DAO.Recordset)
'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim QtePrecedente As Double

'Ouverture et positionnement au debut de la table resultat
Set db_resultat = CurrentDb()
Set rst_resultat = db_resultat.OpenRecordset("SELECT * from
tbl_resultat")
'Ajout du mouvement et du resultat des calculs dans la table resultat
rst_resultat.AddNew
rst_resultat("CodeArticle") = code_article
rst_resultat("Designation") = rst_art![Description1]
rst_resultat("CodeMvt") = rst_mvt![Mouvement]
rst_resultat("TypeMvt") = rst_mvt![TypeMvt]
rst_resultat("Quantite1") = rst_mvt![QteMvt]
rst_resultat("PrixUnit1") = rst_mvt![Prix]
rst_resultat("Montant1") = rst_resultat("Quantite1") *
rst_resultat("PrixUnit1")
rst_resultat.Update

'Calcul de la quantite en stock

rst_resultat.MovePrevious

Debug.Print rst_mvt![Mouvement]

&#8216;&#8217;C&#8217;&#8217;EST A LA LIGNE SUIVANTE BUG, Run-time
error 3021 No current record. Or, il y a
forcement un enregistrement car chaque article a une valeur de stock
initial qui est enregistre juste avant dans la table resultat
Debug.Print rst_resultat![Quantite3]


QtePrecedente = rst_resultat![Quantite3]
rst_resultat.MoveNext



rst_resultat.AddNew
rst_resultat("Quantite3") = rst_resultat("Quantite1") + QtePrecedente
rst_resultat.Update

rst_resultat.Close 'Fermeture de la table resultat
'Liberation des variables permettant de designer la table resultat
Set rst_resultat = Nothing
Set db_resultat = Nothing

End Sub
Avatar
Raymond [mvp]
Pour les déplacements, utiliser:
Rs.Move
Rs.MoveFirst
Rs.MoveLast
Rs.MoveNext
Rs.MovePrevious

exemple:
Private Sub Commande0_Click()
Dim rs As DAO.Recordset
Set rs = Me.Recordset
Fonc rs
End Sub
Function Fonc(rs As DAO.Recordset)
rs.MoveNext
rs.MoveNext
rs.MovePrevious
MsgBox rs.Fields(0)
End Function

dans ton cas l'enregistrement actif n'est pas déterminé car le addnew et le
update ne fixent pas l'enregistrement actif. tu dois te placer sur le
dernier enregistrement et ensuite revenir sur l'avant-dernier.
rst_resultat.Update
'Calcul de la quantite en stock
rst_resultat.MoveLast
rst_resultat.MovePrevious

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Bonjour,

C&#8217;est parfait, ca marche. Merci beaucoup.
Par contre, je n&#8217;arrive pas a lire un champ de
l&#8217;enregistrement precedent. J&#8217;ai essaye la fonction
MovePrevious et FindPrevious mais ca ne marche pas.
Savez vous d&#8217;ou ca vient ?
Merci beaucoup,

Voici ci dessous la procedure :

Sub Mvt_RCT_PO(code_article As String, rst_art As DAO.Recordset,
rst_mvt As DAO.Recordset)
'variable permettant de designer la table resultat
Dim db_resultat As DAO.Database
Dim rst_resultat As DAO.Recordset

Dim QtePrecedente As Double

'Ouverture et positionnement au debut de la table resultat
Set db_resultat = CurrentDb()
Set rst_resultat = db_resultat.OpenRecordset("SELECT * from
tbl_resultat")
'Ajout du mouvement et du resultat des calculs dans la table resultat
rst_resultat.AddNew
rst_resultat("CodeArticle") = code_article
rst_resultat("Designation") = rst_art![Description1]
rst_resultat("CodeMvt") = rst_mvt![Mouvement]
rst_resultat("TypeMvt") = rst_mvt![TypeMvt]
rst_resultat("Quantite1") = rst_mvt![QteMvt]
rst_resultat("PrixUnit1") = rst_mvt![Prix]
rst_resultat("Montant1") = rst_resultat("Quantite1") *
rst_resultat("PrixUnit1")
rst_resultat.Update

'Calcul de la quantite en stock

rst_resultat.MovePrevious

Debug.Print rst_mvt![Mouvement]

&#8216;&#8217;C&#8217;&#8217;EST A LA LIGNE SUIVANTE BUG, Run-time
error 3021 No current record. Or, il y a
forcement un enregistrement car chaque article a une valeur de stock
initial qui est enregistre juste avant dans la table resultat
Debug.Print rst_resultat![Quantite3]


QtePrecedente = rst_resultat![Quantite3]
rst_resultat.MoveNext



rst_resultat.AddNew
rst_resultat("Quantite3") = rst_resultat("Quantite1") + QtePrecedente
rst_resultat.Update

rst_resultat.Close 'Fermeture de la table resultat
'Liberation des variables permettant de designer la table resultat
Set rst_resultat = Nothing
Set db_resultat = Nothing

End Sub