OVH Cloud OVH Cloud

DO...Until

11 réponses
Avatar
fth
Bonjour,
J'ai un petit soucis avec ceci:

a ubout d'un moment, j'a itoujours une erreur qui me dit
runtime error '3020'
update or cancelupdate without addnew or edit

il y a pourtant bien .edit ...
ceci dit, j'ai l'impression qu'il 'boucle' plusieurs fois...

merci pour vos lumières,

Frederic

Dim Rst As Recordset
Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.Recordset


With Rst
If Not .BOF Then
.MoveFirst

Do Until .EOF

.Edit
.Fields("Rmidi").Value = Me!DefmidiMange
.Fields("RmidiNbr").Value = Me!DefMidiNbr
.Update
'End If

.MoveNext
Loop
End If
End With

10 réponses

1 2
Avatar
J-Pierre
Bonjour,

Si tu viens d'ouvrir ton recordset, le .movefirst ne sert à rien, tu y es déjà. Par contre, tu ne testes pas EOF avant, si ton
recordset est vide, je ne sais pas ce que ça produit comme erreur.
If Not .BOF And Not .EOF Then...

J-Pierre

"fth" <infosSPAM?@matloc.be> a écrit dans le message de news:
Bonjour,
J'ai un petit soucis avec ceci:

a ubout d'un moment, j'a itoujours une erreur qui me dit
runtime error '3020'
update or cancelupdate without addnew or edit

il y a pourtant bien .edit ...
ceci dit, j'ai l'impression qu'il 'boucle' plusieurs fois...

merci pour vos lumières,

Frederic

Dim Rst As Recordset
Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.Recordset


With Rst
If Not .BOF Then
.MoveFirst

Do Until .EOF

.Edit
.Fields("Rmidi").Value = Me!DefmidiMange
.Fields("RmidiNbr").Value = Me!DefMidiNbr
.Update
'End If

.MoveNext
Loop
End If
End With



Avatar
LiR
Bonjour à vous,

Si le recordset est vide, BOF vaut forcément True (tout comme EOF), donc le
test sur BOF est suffisant.

J'ai testé le code de fth, il fonctionne.
Peut-être y a-t-til interaction entre le sous-formulaire et ses événements
pendant que le recordset est parcouru?

Il faut peut-être essayer avec RecordsetClone plutôt que recordset pour voir :

Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.RecordsetClone

Par ailleurs (mais cela n'a pas de rapport avec le présent problème), il
semblerait que le sous-formulaire en question appartienne au formulaire dans
lequel se déroule le code, dans ce cas on pourrait mettre directement :

Set Rst = Me.FSubMontDemDetail.Form.RecordsetClone



Bonjour,

Si tu viens d'ouvrir ton recordset, le .movefirst ne sert à rien, tu y es déjà. Par contre, tu ne testes pas EOF avant, si ton
recordset est vide, je ne sais pas ce que ça produit comme erreur.
If Not .BOF And Not .EOF Then...

J-Pierre

"fth" <infosSPAM?@matloc.be> a écrit dans le message de news:
Bonjour,
J'ai un petit soucis avec ceci:

a ubout d'un moment, j'a itoujours une erreur qui me dit
runtime error '3020'
update or cancelupdate without addnew or edit

il y a pourtant bien .edit ...
ceci dit, j'ai l'impression qu'il 'boucle' plusieurs fois...

merci pour vos lumières,

Frederic

Dim Rst As Recordset
Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.Recordset


With Rst
If Not .BOF Then
.MoveFirst

Do Until .EOF

.Edit
.Fields("Rmidi").Value = Me!DefmidiMange
.Fields("RmidiNbr").Value = Me!DefMidiNbr
.Update
'End If

.MoveNext
Loop
End If
End With








Avatar
3stone
Salut,

"fth"
| J'ai un petit soucis avec ceci:
|
|
| Do Until .EOF
|
| .Edit



Tu utilise ADO et DAO ?

Car ADO ne connait pas .EDIT


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
J-Pierre
Je persiste et signe:

Dans sa doc, Microsoft est catégorique: Pour tester si un recordSet est vide, IL FAUT TESTER BOF ET EOF. Alors, utile ou pas ?
Sur ce genre de chose, je préfère suivre les conseils de MS que les tiens :-)

De toutes façons, c'est Pierre qui a trouvé.....Pierre, je croyais que tu n'aimais pas ADO ? :-)

J-Pierre

"LiR" a écrit dans le message de news:
Bonjour à vous,

Si le recordset est vide, BOF vaut forcément True (tout comme EOF), donc le
test sur BOF est suffisant.

J'ai testé le code de fth, il fonctionne.
Peut-être y a-t-til interaction entre le sous-formulaire et ses événements
pendant que le recordset est parcouru?

Il faut peut-être essayer avec RecordsetClone plutôt que recordset pour voir :

Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.RecordsetClone

Par ailleurs (mais cela n'a pas de rapport avec le présent problème), il
semblerait que le sous-formulaire en question appartienne au formulaire dans
lequel se déroule le code, dans ce cas on pourrait mettre directement :

Set Rst = Me.FSubMontDemDetail.Form.RecordsetClone



Bonjour,

Si tu viens d'ouvrir ton recordset, le .movefirst ne sert à rien, tu y es déjà. Par contre, tu ne testes pas EOF avant, si
ton
recordset est vide, je ne sais pas ce que ça produit comme erreur.
If Not .BOF And Not .EOF Then...

J-Pierre

"fth" <infosSPAM?@matloc.be> a écrit dans le message de news:
Bonjour,
J'ai un petit soucis avec ceci:

a ubout d'un moment, j'a itoujours une erreur qui me dit
runtime error '3020'
update or cancelupdate without addnew or edit

il y a pourtant bien .edit ...
ceci dit, j'ai l'impression qu'il 'boucle' plusieurs fois...

merci pour vos lumières,

Frederic

Dim Rst As Recordset
Set Rst = Forms!FMainFmD!FSubMontDemDetail.Form.Recordset


With Rst
If Not .BOF Then
.MoveFirst

Do Until .EOF

.Edit
.Fields("Rmidi").Value = Me!DefmidiMange
.Fields("RmidiNbr").Value = Me!DefMidiNbr
.Update
'End If

.MoveNext
Loop
End If
End With










Avatar
LiR
Je persiste et signe également...

1° :
Issu de l'Aide de Microsoft Access, en DAO comme en ADO :

"Si l'une des propriétés BOF ou EOF a la valeur True, il n'existe pas
d'enregistrement en cours."


2° :

Si le problème venait des curseurs ADO/DAO, nous n'aurions pas une erreur
d'exécution renvoyée par DAO 3020 "update or cancelupdate without addnew or
edit" , mais une erreur de compilation "membre de méthode ou de données
introuvable". Donc le curseur est bien un interprété par le compilateur comme
un curseur DAO.

(je signe : LiR)


Je persiste et signe:

Dans sa doc, Microsoft est catégorique: Pour tester si un recordSet est vide, IL FAUT TESTER BOF ET EOF. Alors, utile ou pas ?
Sur ce genre de chose, je préfère suivre les conseils de MS que les tiens :-)

De toutes façons, c'est Pierre qui a trouvé.....Pierre, je croyais que tu n'aimais pas ADO ? :-)

J-Pierre



Avatar
3stone
Salut Jean-Pierre,

"J-Pierre"
| Je persiste et signe:
|
| Dans sa doc, Microsoft est catégorique: Pour tester si un recordSet est vide, IL FAUT TESTER BOF
ET EOF. Alors, utile ou pas ?
| Sur ce genre de chose, je préfère suivre les conseils de MS que les tiens :-)


Set rst = ...

With Rst
Do Until .EOF

.MoveNext
Loop
End With

fait parfaitement l'affaire pour éviter les erreurs de recorset vide...



| Pierre, je croyais que tu n'aimais pas ADO ? :-)

J'utilise DAO préférenciellement...


Et... ne prends pas pour argent comptant ce que MS écrit ou "conseille"
et méfie toi carrément lorsque c'est une traduction
(trop souvant le traducteur ne comprend même pas ce qu'il écrit ;-(


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

En fait fth fait le test sur BOF uniquement pour pouvoir appeler MoveFirst
afin de se placer sur le premier enregistrement avant de parcourir le jeu.

Je pense qu'il a bien raison de faire cela au départ, surtout s'il utilise
le recordset du Formulaire, qui peut être placé sur n'importe quel
enregistrement.


Salut Jean-Pierre,

"J-Pierre"
| Je persiste et signe:
|
| Dans sa doc, Microsoft est catégorique: Pour tester si un recordSet est vide, IL FAUT TESTER BOF
ET EOF. Alors, utile ou pas ?
| Sur ce genre de chose, je préfère suivre les conseils de MS que les tiens :-)


Set rst = ...

With Rst
Do Until .EOF

.MoveNext
Loop
End With

fait parfaitement l'affaire pour éviter les erreurs de recorset vide...



| Pierre, je croyais que tu n'aimais pas ADO ? :-)

J'utilise DAO préférenciellement...


Et... ne prends pas pour argent comptant ce que MS écrit ou "conseille"
et méfie toi carrément lorsque c'est une traduction
(trop souvant le traducteur ne comprend même pas ce qu'il écrit ;-(


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




Avatar
LiR
J-Pierre,
j'avais oublié le détail qui explique pourquoi on ne se comprenait pas.

En fait, le but n'est pas de savoir si le jeu est vide, mais de s'assurer
qu'il n'est pas vide. C'est pourquoi tester BOF suffit.

car : BOF = False implique que je jeu n'est pas vide

effectivement, si on voulait tester si le jeu est vide, alors il faudrait
faire les 2 tests car :

(BOF = True) AND (EOF = True) si et seulement si le jeu est vide.

Je pense qu'on est d'accord sur ces 2 points?
Avatar
3stone
Salut,

"LiR"
| Je pense qu'il a bien raison de faire cela au départ, surtout s'il utilise
| le recordset du Formulaire, qui peut être placé sur n'importe quel
| enregistrement.


J'aurais de toutes façon utilisé le Clone ;-)


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
LiR
Je m'en doute bien!
C'est plus pour fth que je m'efforce d'être précis, mais je me demande qui
est le plus intéressé par tout cela : nous ou lui???

J'aimerais bien avoir un retour de sa part car franchement, je suis curieux
de savoir ce qui empêche ce code de fonctionner...


Salut,

"LiR"
| Je pense qu'il a bien raison de faire cela au départ, surtout s'il utilise
| le recordset du Formulaire, qui peut être placé sur n'importe quel
| enregistrement.


J'aurais de toutes façon utilisé le Clone ;-)


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




1 2