Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recordsetclone, no current record - please help

1 réponse
Avatar
Alain Bourgeois
Chers tous,


je pense avoir trouvé un bug (énorme) dans access 2K (toutes les mises à
jour sont installées.


J'ai un formulaire continu, basé sur une requête où les mises à jour
sont permises. La requête comprend un order by. Le formulaire ne
comprend ni orderby ni filtre.
J'ai un champs oui/non nommé [Séance Prestée].
J'ai un champs numérique [Nb1] que je positionne à l'ouverture du
formulaire et lorsque ce champs oui/non [Scéance prestée] est modifié.

But du jeu: faire +1 chaque fois qu'une scéance est prestée et avoir un
listing du type:
seance nb1
xxxx Oui 1
xxxx Oui 2
xxxx Non
xxxx Oui 3
xxxx Oui 4
xxxx Non
xxxx Oui 5
xxxx Oui 6
xxxx Non
xxxx Oui 7



J'ai écrit une méthode qui calcule le compteur en parcourant le
recordsetclone de début à la fin:

Private Sub update_nb1()
Dim i As Integer, r As Recordset
i = 0
Set r = Me.RecordsetClone
If Not (r.EOF And r.BOF) Then
r.MoveFirst
While Not r.EOF
If r![Scéance prestée] Then
i = i + 1
' update nb1
If Nz(r!Nb1, -1) <> i + 1 Then
r.Edit
r!Nb1 = i
r.Update
End If
Else
' update nb1
If Not IsNull(r!Nb1) Then
r.Edit
r!Nb1 = Null
r.Update
End If
End If
r.MoveNext
Wend
End If
Set r = Nothing

End Sub


Cette méthode est donc exécutée à l'ouverture et dans l'évènement
AfterUpdate de la zone [Séance prestée]. Ca a l'air de fonctionner à
priori... sauf que la lorque je modifie une ligne, ca ne marche pas: la
nouvelle valeur de [Séance prestée] n'est pas prise en compte!!!!


J'ai modifié le code en faisant (c'est tordu, et vraiment pas propre,
mais c'est le seul moyen qui marche! (sic) ):
Private Sub update_nb1()
Dim i As Integer, r As Recordset, b As Boolean
i = 0
Set r = Me.RecordsetClone
If Not (r.EOF And r.BOF) Then
r.MoveFirst
While Not r.EOF
b = Me.Recordset.EOF And Me.Recordset.BOF
If Not b Then b = Me.Recordset!ID = r!ID
If b Then ' si current record, update formulaire
If Me![Scéance prestée] Then
i = i + 1
' update nb1
If Me!Nb1 & "" <> i & "" Then
Me.Recordset.Edit
Me.Recordset!Nb1 = i
Me.Recordset.Update
End If
Else
' update nb1
If Me!Nb1 & "" > "" Then
Me.Recordset.Edit
Me.Recordset!Nb1 = Null
Me.Recordset.Update
End If
End If
Else' update recordsetclone
If r![Scéance prestée] Then
i = i + 1
' update nb1
If Nz(r!Nb1, -1) <> i Then
r.Edit
r!Nb1 = i
r.Update
End If
Else
' update nb1
If r!Nb1 & "" > "" Then
r.Edit
r!Nb1 = Null
r.Update
End If
End If
End If
r.MoveNext
Wend
End If
Set r = Nothing
Me.Requery
Me.Refresh
End Sub


Ca a l'air de marcher de prime abord.

Mais si je modifie la 5e ligne puis que je modifie la première ligne,
il se plante sur Me.Recordset!ID = r!ID, car Me.Recordset!ID n'est plus
accessible (no current record), alors que je viens de modifier la
ligne!!!!!!!

Quelqu'un peut-il m'expliquer pourquoi??????????????????????????? Et
comment contourner?



Alain Bourgeois
www.self-mail.com
www.kineuro.com

PS: si vous pouviez mettre mon e-mail en cc de votre réponse, ce serait
génial.

1 réponse

Avatar
Michel Walsh
Salut,



SELECT a.SéanceID, LAST(a.[Séance Prestée]), COUNT(*)
FROM maTable As a INNER JOIN maTable As b
ON a.SéanceID>=b.SéanceID
WHERE b.[Séance Prestée]



Cela suppose que [Séance Prestée] est booléen, et que SéanceID augmente
selon la chronologie ( SéanceID 3 a lieu avant SéanceID4 )



Espérant être utile,
Vanderghast, Access MVP


"Alain Bourgeois" wrote in message
news:
Chers tous,


je pense avoir trouvé un bug (énorme) dans access 2K (toutes les mises à
jour sont installées.


J'ai un formulaire continu, basé sur une requête où les mises à jour
sont permises. La requête comprend un order by. Le formulaire ne
comprend ni orderby ni filtre.
J'ai un champs oui/non nommé [Séance Prestée].
J'ai un champs numérique [Nb1] que je positionne à l'ouverture du
formulaire et lorsque ce champs oui/non [Scéance prestée] est modifié.

But du jeu: faire +1 chaque fois qu'une scéance est prestée et avoir un
listing du type:
seance nb1
xxxx Oui 1
xxxx Oui 2
xxxx Non
xxxx Oui 3
xxxx Oui 4
xxxx Non
xxxx Oui 5
xxxx Oui 6
xxxx Non
xxxx Oui 7



J'ai écrit une méthode qui calcule le compteur en parcourant le
recordsetclone de début à la fin:

Private Sub update_nb1()
Dim i As Integer, r As Recordset
i = 0
Set r = Me.RecordsetClone
If Not (r.EOF And r.BOF) Then
r.MoveFirst
While Not r.EOF
If r![Scéance prestée] Then
i = i + 1
' update nb1
If Nz(r!Nb1, -1) <> i + 1 Then
r.Edit
r!Nb1 = i
r.Update
End If
Else
' update nb1
If Not IsNull(r!Nb1) Then
r.Edit
r!Nb1 = Null
r.Update
End If
End If
r.MoveNext
Wend
End If
Set r = Nothing

End Sub


Cette méthode est donc exécutée à l'ouverture et dans l'évènement
AfterUpdate de la zone [Séance prestée]. Ca a l'air de fonctionner à
priori... sauf que la lorque je modifie une ligne, ca ne marche pas: la
nouvelle valeur de [Séance prestée] n'est pas prise en compte!!!!


J'ai modifié le code en faisant (c'est tordu, et vraiment pas propre,
mais c'est le seul moyen qui marche! (sic) ):
Private Sub update_nb1()
Dim i As Integer, r As Recordset, b As Boolean
i = 0
Set r = Me.RecordsetClone
If Not (r.EOF And r.BOF) Then
r.MoveFirst
While Not r.EOF
b = Me.Recordset.EOF And Me.Recordset.BOF
If Not b Then b = Me.Recordset!ID = r!ID
If b Then ' si current record, update formulaire
If Me![Scéance prestée] Then
i = i + 1
' update nb1
If Me!Nb1 & "" <> i & "" Then
Me.Recordset.Edit
Me.Recordset!Nb1 = i
Me.Recordset.Update
End If
Else
' update nb1
If Me!Nb1 & "" > "" Then
Me.Recordset.Edit
Me.Recordset!Nb1 = Null
Me.Recordset.Update
End If
End If
Else' update recordsetclone
If r![Scéance prestée] Then
i = i + 1
' update nb1
If Nz(r!Nb1, -1) <> i Then
r.Edit
r!Nb1 = i
r.Update
End If
Else
' update nb1
If r!Nb1 & "" > "" Then
r.Edit
r!Nb1 = Null
r.Update
End If
End If
End If
r.MoveNext
Wend
End If
Set r = Nothing
Me.Requery
Me.Refresh
End Sub


Ca a l'air de marcher de prime abord.

Mais si je modifie la 5e ligne puis que je modifie la première ligne,
il se plante sur Me.Recordset!ID = r!ID, car Me.Recordset!ID n'est plus
accessible (no current record), alors que je viens de modifier la
ligne!!!!!!!

Quelqu'un peut-il m'expliquer pourquoi??????????????????????????? Et
comment contourner?



Alain Bourgeois
www.self-mail.com
www.kineuro.com

PS: si vous pouviez mettre mon e-mail en cc de votre réponse, ce serait
génial.