OVH Cloud OVH Cloud

recorsetclone

10 réponses
Avatar
JPG
Bonjour,

J'ai ce code :

Dim rst As Recordset

set rst = Me.recordsetclone
rst.movefirst
do until rst.eof
(...)
rst.movenext
loop

J'ai l'impression que movenext (et peut-être movefirst) ne marchent pas.

alors que rst.recordcount me donne bien le nombre que j'attends.

Merci beaucoup pour votre aide.

10 réponses

Avatar
Bill2
JPG wrote:
Bonjour,

J'ai ce code :

Dim rst As Recordset

set rst = Me.recordsetclone


euh, tu es sur que le "Me" désigne bien un objet recordset ?
C'est étonnant je trouve ...

Comment est crée le 1er recordset, celui que tu veux cloner ?
--
Bill2

Avatar
JPG
Bonjour,

En fait, il ne s'agissait pas vraiment du code d'origine, je l'avais
simplifié pour ne pas vous embrouiller.

L'idée de mon code est de faire le tour de tous les contrôles de mon form et
de me ballader dans les enregistrements de mes sous form.

Le vrai code étant :

Public Function LesControles(MonForm As Object)
'avec MonForm étant le nom du formulare (père)

Dim Ctl, ctl2 As Control
Dim frm As Form
Dim rst As DAO.Recordset

For Each Ctl In MonForm.Controls



If Ctl.ControlType = acSubform Then

Set frm = Ctl.Form
Set rst = frm.RecordsetClone
rst.MoveFirst

Do Until rst.EOF
' à remplacer peut-être par For Each rst In (what ???)

Debug.Print rst.RecordCount 'ça marche
For Each ctl2 In Ctl.Controls
(...)
Next
rst.MoveNext
Loop


Merci pour tout.
Avatar
Bill2
JPG wrote:


Set frm = Ctl.Form
Set rst = frm.RecordsetClone
rst.MoveFirst



teu veux récupérer le recordset utilisé par ton form, c'est bien ça ?

Tout ce que je peux te dire, c'est ce n'est pas la bonne méthode !

RecordsetClose s'applique à un obj recordSet, et toi tu l'appliques à un obj
form ... pas bon ça ...

Regarde du côte dé Form.source (je sais meme pas si ça existe ...)
mais ce qu'il te faut, c'est trouver la "source" de donnée de ton form !

--
Bill2

Avatar
JPG
Dans ce cas, pourquoi :

rst.recordcount
fonctionne
et que quand je tape rst.
l'infobulle me propose tous les move(first last next) ?


JPG wrote:


Set frm = Ctl.Form
Set rst = frm.RecordsetClone
rst.MoveFirst



teu veux récupérer le recordset utilisé par ton form, c'est bien ça ?

Tout ce que je peux te dire, c'est ce n'est pas la bonne méthode !

RecordsetClose s'applique à un obj recordSet, et toi tu l'appliques à un obj
form ... pas bon ça ...

Regarde du côte dé Form.source (je sais meme pas si ça existe ...)
mais ce qu'il te faut, c'est trouver la "source" de donnée de ton form !

--
Bill2






Avatar
JPG
D'autant plus que dans l'aide d'ACCESS je trouve le code suivant :

Sub Print_Field_Names()
Dim rst As Recordset, intI As Integer
Dim fld As Field

Set rst = Me.RecordsetClone
For Each fld in rst.Fields
' Print field names.
Debug.Print fld.Name
Next
End Sub

avec s'applique à : Objet Form



JPG wrote:


Set frm = Ctl.Form
Set rst = frm.RecordsetClone
rst.MoveFirst



teu veux récupérer le recordset utilisé par ton form, c'est bien ça ?

Tout ce que je peux te dire, c'est ce n'est pas la bonne méthode !

RecordsetClose s'applique à un obj recordSet, et toi tu l'appliques à un obj
form ... pas bon ça ...

Regarde du côte dé Form.source (je sais meme pas si ça existe ...)
mais ce qu'il te faut, c'est trouver la "source" de donnée de ton form !

--
Bill2






Avatar
3stone
Salut,

"JPG"
| J'ai ce code :
|
| Dim rst As Recordset
|
| set rst = Me.recordsetclone
| rst.movefirst
| do until rst.eof
| (...)
| rst.movenext
| loop
|
| J'ai l'impression que movenext (et peut-être movefirst) ne marchent pas.


Mais si, rst.MoveNext fonctionne parfaitement...
(dailleurs, ici, le rst.MoveFirst ne sert à rien...)

tu devrais plutôt dire ce que tu tente de faire !
si c'est pour faire défiller les enregistrements à l'écran, tu oublie la
synchronisation du .Bookmark (vu que tu est sur le clone ! )


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
JPG
En fait, je crois que je commence à comprendre, mais je n'arrive pas à
trouver de solution.

Voici mon code :
Public Function LesControles(Monform As Object)
Dim Ctl, ctl2 As Control
Dim frm As Form
Dim rst As DAO.Recordset
For Each Ctl In Monform.Controls

If Ctl.ControlType = acSubform Then

Set frm = Ctl.Form
Set rst = frm.RecordsetClone


Do Until rst.EOF
For Each ctl2 In Ctl.Controls
If ctl2.Tag = "verif" Then
If IsNull(ctl2) Then
ctl2.BackColor = 65535
Exit Function
Else
ctl2.BackColor = -2147483643
End If
End If
Next
rst.movenext
Loop
End If

Next Ctl

End Function

J'ai mis dans le commentaire de mon contrôle "Vériif" et m'en sers pour
vérifier que la valeur est bien remplie. Si elle ne l'est pas, j'arrête la
fonction et je mets contrôle en jaune.

Cette manipulation ne marche que pour les enregistrements visibles sur
l'écran et un debug.print de mon contrôle ne me donne que la valeur de cet
enregistrement.

C'est pourquoi j'ai pensé que le movenext ne marchait pas.


Salut,

"JPG"
| J'ai ce code :
|
| Dim rst As Recordset
|
| set rst = Me.recordsetclone
| rst.movefirst
| do until rst.eof
| (...)
| rst.movenext
| loop
|
| J'ai l'impression que movenext (et peut-être movefirst) ne marchent pas.


Mais si, rst.MoveNext fonctionne parfaitement...
(dailleurs, ici, le rst.MoveFirst ne sert à rien...)

tu devrais plutôt dire ce que tu tente de faire !
si c'est pour faire défiller les enregistrements à l'écran, tu oublie la
synchronisation du .Bookmark (vu que tu est sur le clone ! )


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/





Avatar
3stone
Salut,

"JPG"
| En fait, je crois que je commence à comprendre, mais je n'arrive pas à
| trouver de solution.



Dans ce cas, explique (clairement -:) ce que tu cherche à faire !




| Voici mon code :
| Public Function LesControles(Monform As Object)
| Dim Ctl, ctl2 As Control

'ici Ctl est déclaré Variant

'écrire
Dim Ctl As Control, Ctl2 As Control


| Dim frm As Form
| Dim rst As DAO.Recordset
| For Each Ctl In Monform.Controls
|
| If Ctl.ControlType = acSubform Then
|
| Set frm = Ctl.Form
| Set rst = frm.RecordsetClone


Pourquoi le set rst ???

tu souhaite boucler sur tous les textbox d'un sous-formulaire en mode continu ??

=> cela ne fonctionne pas !

la deuxième ligne et suivantes ne sont que des "objets clones" de la première ligne
on ne peux pas les adresser individuellement de cette façon!
Utilise la mise en forme conditionnelle ou alors celle-ci :

http://mypage.bluewin.ch/w.stucki/Formulaires.htm#Couleurs



| Do Until rst.EOF
| For Each ctl2 In Ctl.Controls
| If ctl2.Tag = "verif" Then
| If IsNull(ctl2) Then
| ctl2.BackColor = 65535
| Exit Function
| Else
| ctl2.BackColor = -2147483643
| End If
| End If
| Next
| rst.movenext
| Loop
| End If
|
| Next Ctl
|
| End Function
|
| J'ai mis dans le commentaire de mon contrôle "Vériif" et m'en sers pour
| vérifier que la valeur est bien remplie. Si elle ne l'est pas, j'arrête la
| fonction et je mets contrôle en jaune.
|
| Cette manipulation ne marche que pour les enregistrements visibles sur
| l'écran et un debug.print de mon contrôle ne me donne que la valeur de cet
| enregistrement.
|
| C'est pourquoi j'ai pensé que le movenext ne marchait pas.


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
JPG
Bonsoir,

Le but de ma manoeuvre est de pouvoir balayer tous les enregistrements des
sous formulaires de mon formulaire.
J'ai trois sous formulaires :
- le premier "Dossier" qui ne peut avoir qu'un seul enregistrement,
- le second "Créance" qui ne peut avoir qu'un seul enregistrement mais qui
dépend de la créance,
- le troisième et dernier "Client" qui doit avoir au moins un enregistrement
et qui dépend de la créance.

Je veux donc balayer tous les champs de tous les enregistrements de mes sous
formulaires qui ont une remarque "Tag" en propriété égale à "Vérif"...

... m'arrêter à celui qui n'aura pas de valeur renseignée et le mettre en
jaune.

J'arrive à tout faire sauf sur le dernier sous formulaire où je ne peux lire
que l'enregistrement qui apparaît sur l'écran.

Peut-être que l'utilistation du clône n'est pas judicieuse mais c'est pour
l'insant la seule qui me permet de compter le nombre d'enegistrements de mon
sous formulaire et d'espérer en faire le tour par une boucle.

Je développe un outil qui permettra juste de mettre "verif" dans le tag d'un
champ pour savoir si oui ou non l'enregistrement est valide, espérant ainsi,
ne pas avoir à paramétrer des requêtes complexes quand je ne serai plus là.

Merci (encore) pour votre aide.



Salut,

"JPG"
| En fait, je crois que je commence à comprendre, mais je n'arrive pas à
| trouver de solution.



Dans ce cas, explique (clairement -:) ce que tu cherche à faire !




| Voici mon code :
| Public Function LesControles(Monform As Object)
| Dim Ctl, ctl2 As Control

'ici Ctl est déclaré Variant

'écrire
Dim Ctl As Control, Ctl2 As Control


| Dim frm As Form
| Dim rst As DAO.Recordset
| For Each Ctl In Monform.Controls
|
| If Ctl.ControlType = acSubform Then
|
| Set frm = Ctl.Form
| Set rst = frm.RecordsetClone


Pourquoi le set rst ???

tu souhaite boucler sur tous les textbox d'un sous-formulaire en mode continu ??

=> cela ne fonctionne pas !

la deuxième ligne et suivantes ne sont que des "objets clones" de la première ligne
on ne peux pas les adresser individuellement de cette façon!
Utilise la mise en forme conditionnelle ou alors celle-ci :

http://mypage.bluewin.ch/w.stucki/Formulaires.htm#Couleurs



| Do Until rst.EOF
| For Each ctl2 In Ctl.Controls
| If ctl2.Tag = "verif" Then
| If IsNull(ctl2) Then
| ctl2.BackColor = 65535
| Exit Function
| Else
| ctl2.BackColor = -2147483643
| End If
| End If
| Next
| rst.movenext
| Loop
| End If
|
| Next Ctl
|
| End Function
|
| J'ai mis dans le commentaire de mon contrôle "Vériif" et m'en sers pour
| vérifier que la valeur est bien remplie. Si elle ne l'est pas, j'arrête la
| fonction et je mets contrôle en jaune.
|
| Cette manipulation ne marche que pour les enregistrements visibles sur
| l'écran et un debug.print de mon contrôle ne me donne que la valeur de cet
| enregistrement.
|
| C'est pourquoi j'ai pensé que le movenext ne marchait pas.


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/




Avatar
3stone
Salut,

"JPG"
| Le but de ma manoeuvre est de pouvoir balayer tous les enregistrements des
| sous formulaires de mon formulaire.
| J'ai trois sous formulaires :
| - le premier "Dossier" qui ne peut avoir qu'un seul enregistrement,
| - le second "Créance" qui ne peut avoir qu'un seul enregistrement mais qui
| dépend de la créance,
| - le troisième et dernier "Client" qui doit avoir au moins un enregistrement
| et qui dépend de la créance.
|
| Je veux donc balayer tous les champs de tous les enregistrements de mes sous
| formulaires qui ont une remarque "Tag" en propriété égale à "Vérif"...
|
| ... m'arrêter à celui qui n'aura pas de valeur renseignée et le mettre en
| jaune.


Non, tu toi balayer toutes les zones de texte, pas le recordset !



| J'arrive à tout faire sauf sur le dernier sous formulaire où je ne peux lire
| que l'enregistrement qui apparaît sur l'écran.


lire le contenu des textbox...


| Peut-être que l'utilistation du clône n'est pas judicieuse mais c'est pour
| l'insant la seule qui me permet de compter le nombre d'enegistrements de mon
| sous formulaire et d'espérer en faire le tour par une boucle.
|
| Je développe un outil qui permettra juste de mettre "verif" dans le tag d'un
| champ pour savoir si oui ou non l'enregistrement est valide, espérant ainsi,
| ne pas avoir à paramétrer des requêtes complexes quand je ne serai plus là.

oui, mais le "tag" sera commun à tous les enregistrements !
à moins que dans la table tu ais créé un champ du nom "tag" ??


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/