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

access 2007, évènement beforeUpdate

8 réponses
Avatar
Alain Bourgeois
Bonjour,


j'aimerais pouvoir annuler une modification par l'utilisateur dans un
formulaire.
En access 2003 et précédents, appeler l'évènement beforeUpdate et mettre
"cancel" à true remettait la valeur avant modification dans la zone
(extrait de la doc on-line access 2003:
"If the user enters a new value in the control, the OldValue property
setting isn't changed until the data is saved (the record is updated).
If you cancel an update, the value of the OldValue property replaces the
existing value in the control."). Ca marchait très bien.

En 2007, par contre, plus rien ne marche correctement: le cancel ne
remet pas la valeur "avant modification" (oldvalue) dans la zone.
L'utilisateur doit impérativement appuyer sur "escape" ou fermer access
/ le formulaire dans certains cas (remettre l'ancienne valeur
redéclenche un beforeUpdate alors que rien n'a été modifié, c'est un peu
un comble!).

Y a-t-'il un patch ou une manière de remettre et réafficher
l'enregistrement dans l'état dans lequel il était avant la tentative de
mise à jour, comme cela se faisait dans les versions précédentes?


Merci,
Alain

8 réponses

Avatar
Raymond [mvp]
Bonsoir.
je ne sais pas quelle est ta version access 2003 (sp3 ?) mais avec le sp2,
le comportement est exactement le même en 2003 et en 2007, c'est à dire que
la valeur saisie n'est pas supprimée par le cancel mais par le Undo
uniquement. Le cancel n'annule que la dernière action et non toutes les
actions. pour retrouver l'ancienne valeur, il faut faire un
Me.Moncontrole.undo ou un Me.Undo avant le cancel.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000?
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90


"Alain Bourgeois" a écrit dans le message de news:

| Bonjour,
|
|
| j'aimerais pouvoir annuler une modification par l'utilisateur dans un
| formulaire.
| En access 2003 et précédents, appeler l'évènement beforeUpdate et mettre
| "cancel" à true remettait la valeur avant modification dans la zone
| (extrait de la doc on-line access 2003:
| "If the user enters a new value in the control, the OldValue property
| setting isn't changed until the data is saved (the record is updated).
| If you cancel an update, the value of the OldValue property replaces the
| existing value in the control."). Ca marchait très bien.
|
| En 2007, par contre, plus rien ne marche correctement: le cancel ne
| remet pas la valeur "avant modification" (oldvalue) dans la zone.
| L'utilisateur doit impérativement appuyer sur "escape" ou fermer access
| / le formulaire dans certains cas (remettre l'ancienne valeur
| redéclenche un beforeUpdate alors que rien n'a été modifié, c'est un peu
| un comble!).
|
| Y a-t-'il un patch ou une manière de remettre et réafficher
| l'enregistrement dans l'état dans lequel il était avant la tentative de
| mise à jour, comme cela se faisait dans les versions précédentes?
|
|
| Merci,
| Alain
Avatar
Alain Bourgeois
Merci, au moins quelqu'un qui maîtrise le sujet.
Je suis sous access 2003 sp2 mais la db est au format access 2K (mes
clients ont toutes les versions d'access).
Il y a cependant un bug avec les macros en beforeUpdate sous 2007 (bug
simple à reproduire et gros comme la tour eifel :) : exemple sous
http://www.kineuro.com/bug2007.mdb, formulaire PatientsAdd
-> Versions 2000->2003: on peut mettre "7" dans la zone NIS
-> Versions 2007: bonne chance).

J'ai aussi d'autres erreurs avec 2007 (rapports avec une taille de
papier personnalisée: ca marche pas, j'ai de plus en plus de clients qui
ralent), savez-vous quand le service pack 1 est prévu? Microsoft ne
fournit malheureusement plus la version 2003 et refuse les échanges pour
les versions OEM.

Merci,
Alain

"Raymond [mvp]" wrote:

Bonsoir.
je ne sais pas quelle est ta version access 2003 (sp3 ?) mais avec le sp2,
le comportement est exactement le même en 2003 et en 2007, c'est à dire que
la valeur saisie n'est pas supprimée par le cancel mais par le Undo
uniquement. Le cancel n'annule que la dernière action et non toutes les
actions. pour retrouver l'ancienne valeur, il faut faire un
Me.Moncontrole.undo ou un Me.Undo avant le cancel.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000?
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90

"Alain Bourgeois" a écrit dans le message de news:

| Bonjour,
|
|
| j'aimerais pouvoir annuler une modification par l'utilisateur dans un
| formulaire.
| En access 2003 et précédents, appeler l'évènement beforeUpdate et mettre
| "cancel" à true remettait la valeur avant modification dans la zone
| (extrait de la doc on-line access 2003:
| "If the user enters a new value in the control, the OldValue property
| setting isn't changed until the data is saved (the record is updated).
| If you cancel an update, the value of the OldValue property replaces the
| existing value in the control."). Ca marchait très bien.
|
| En 2007, par contre, plus rien ne marche correctement: le cancel ne
| remet pas la valeur "avant modification" (oldvalue) dans la zone.
| L'utilisateur doit impérativement appuyer sur "escape" ou fermer access
| / le formulaire dans certains cas (remettre l'ancienne valeur
| redéclenche un beforeUpdate alors que rien n'a été modifié, c'est un peu
| un comble!).
|
| Y a-t-'il un patch ou une manière de remettre et réafficher
| l'enregistrement dans l'état dans lequel il était avant la tentative de
| mise à jour, comme cela se faisait dans les versions précédentes?
|
|
| Merci,
| Alain


Avatar
Raymond [mvp]
Bonjour.

Le pack 1 n'est pas encore annoncé mais en général il arrive 12 mois après
sa sortie, ce qui ne saurait tarder.
je vais prendre mon temps et regarder un peu ta base.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000?
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90


"Alain Bourgeois" a écrit dans le message de news:

| Merci, au moins quelqu'un qui maîtrise le sujet.
| Je suis sous access 2003 sp2 mais la db est au format access 2K (mes
| clients ont toutes les versions d'access).
| Il y a cependant un bug avec les macros en beforeUpdate sous 2007 (bug
| simple à reproduire et gros comme la tour eifel :) : exemple sous
| http://www.kineuro.com/bug2007.mdb, formulaire PatientsAdd
| -> Versions 2000->2003: on peut mettre "7" dans la zone NIS
| -> Versions 2007: bonne chance).
|
| J'ai aussi d'autres erreurs avec 2007 (rapports avec une taille de
| papier personnalisée: ca marche pas, j'ai de plus en plus de clients qui
| ralent), savez-vous quand le service pack 1 est prévu? Microsoft ne
| fournit malheureusement plus la version 2003 et refuse les échanges pour
| les versions OEM.
|
| Merci,
| Alain
Avatar
Raymond [mvp]
à la première lecture, on remarque que tu utilises les macros au lieu du
code vba, ce que nous déconseillons formellement ici, même si 2007 apporte
les macros incorporées.
la traduction vba de ta macro donne ceci:

If (Eval("[SIS] Is Null")) Then
Exit Function
End If
If (Eval("DLookUp(""[SIS]"",""Patients"",""[SIS]=
Forms![PatientsAdd]![Sis] and [id Patient]<> Forms![PatientsAdd]![Id
Patient]"") Is Null")) Then
Exit Function
End If
Beep
MsgBox "Ce numéro NISS existe déjà", vbOKOnly, ""
DoCmd.CancelEvent

tout ça pour savoir si le numéro existe dans la table.
Forms![PatientsAdd]![Id Patient] n'existant pas dans ton formulaire, cela
provoque une erreur fatale d'exécution, en vba comme en macro, sauf que
access n'indique pas la provenance de l'erreur en mode macro.
pour la comparaison, tu peux indiquer plusieurs fois le même SIS pour le
même patient ?

je te conseille de passer directement par un dlookup en vba pous tester
cette existence.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000€
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90


"Raymond [mvp]" a écrit dans le message de news:
eH$LpG0$
| Bonjour.
|
| Le pack 1 n'est pas encore annoncé mais en général il arrive 12 mois après
| sa sortie, ce qui ne saurait tarder.
| je vais prendre mon temps et regarder un peu ta base.
|
| --
| @+
| Raymond Access MVP http://OfficeSystemAccess.seneque.net/
| http://officesystem.access.over-blog.com/
| Pour débuter sur le forum: http://www.mpfa.info/
|
| Partagez vos créations réalisées sous Office 2007 et gagnez peut-être
5000?
| !
|
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90
|
|
| "Alain Bourgeois" a écrit dans le message de news:
|
|| Merci, au moins quelqu'un qui maîtrise le sujet.
|| Je suis sous access 2003 sp2 mais la db est au format access 2K (mes
|| clients ont toutes les versions d'access).
|| Il y a cependant un bug avec les macros en beforeUpdate sous 2007 (bug
|| simple à reproduire et gros comme la tour eifel :) : exemple sous
|| http://www.kineuro.com/bug2007.mdb, formulaire PatientsAdd
|| -> Versions 2000->2003: on peut mettre "7" dans la zone NIS
|| -> Versions 2007: bonne chance).
||
|| J'ai aussi d'autres erreurs avec 2007 (rapports avec une taille de
|| papier personnalisée: ca marche pas, j'ai de plus en plus de clients qui
|| ralent), savez-vous quand le service pack 1 est prévu? Microsoft ne
|| fournit malheureusement plus la version 2003 et refuse les échanges pour
|| les versions OEM.
||
|| Merci,
|| Alain
|
|
Avatar
Alain Bourgeois
Dans ce cas précis, je ne peux pas mettre un code attribué à un autre
patient.
Dans ce cas précis, j'ai écrit le code en VBA et là n'est pas le
problème.

Le problème est qu'il y a une (grosse) application avec plus de 400
macros et 60 formulaires (en plus des modules).
Tout reconvertir en VBA est un boulot de titan (il faut ouvrir chaque
formulaire, prendre chaque contrôle de chaque formulaire, regarder les
macros associées à l'évènement et changer). Cette macro (et les 400
autres) fonctionne sans soucis en access '97->2003. Il n'y a pas
d'erreur de codage
dans cette macro (je n'ai enfreint aucune règle par rapport aux
spécifications de la version 2007), c'est un bug consistant et
reproductible.
Si encore, il y avait une doc disant "en access 2007, on ne peut plus
faire cancelEvent après un msgbox dans une macro" et qu'un outil
permettait de détecter les macros défectueuses et les endroits où elles
sont appelées, ce serait un moindre mal... mais ce n'est pas le cas.

Accepter de tout réécrire en vb à cause d'un bug dans l'exécution d'une
macro serait équivalent à demander à tous les users de réécrire tout
leur code VBA en macros si l'exécution en VBA avait un bug.
Pour moi, c'est vraiment un non-sens. Si microsoft laisse de tels bugs,
ils feraient mieux d'enlever l'onglet "macros" de access 2007... leur
résultat étant "unpredictable" pour raison inconnue.

Bien à vous,
Alain

"Raymond [mvp]" wrote:

à la première lecture, on remarque que tu utilises les macros au lieu du
code vba, ce que nous déconseillons formellement ici, même si 2007 apporte
les macros incorporées.
la traduction vba de ta macro donne ceci:

If (Eval("[SIS] Is Null")) Then
Exit Function
End If
If (Eval("DLookUp(""[SIS]"",""Patients"",""[SIS] > Forms![PatientsAdd]![Sis] and [id Patient]<> Forms![PatientsAdd]![Id
Patient]"") Is Null")) Then
Exit Function
End If
Beep
MsgBox "Ce numéro NISS existe déjà", vbOKOnly, ""
DoCmd.CancelEvent

tout ça pour savoir si le numéro existe dans la table.
Forms![PatientsAdd]![Id Patient] n'existant pas dans ton formulaire, cela
provoque une erreur fatale d'exécution, en vba comme en macro, sauf que
access n'indique pas la provenance de l'erreur en mode macro.
pour la comparaison, tu peux indiquer plusieurs fois le même SIS pour le
même patient ?

je te conseille de passer directement par un dlookup en vba pous tester
cette existence.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000€
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90

"Raymond [mvp]" a écrit dans le message de news:
eH$LpG0$
| Bonjour.
|
| Le pack 1 n'est pas encore annoncé mais en général il arrive 12 mois après
| sa sortie, ce qui ne saurait tarder.
| je vais prendre mon temps et regarder un peu ta base.
|
| --
| @+
| Raymond Access MVP http://OfficeSystemAccess.seneque.net/
| http://officesystem.access.over-blog.com/
| Pour débuter sur le forum: http://www.mpfa.info/
|
| Partagez vos créations réalisées sous Office 2007 et gagnez peut-être
5000?
| !
|
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90
|
|
| "Alain Bourgeois" a écrit dans le message de news:
|
|| Merci, au moins quelqu'un qui maîtrise le sujet.
|| Je suis sous access 2003 sp2 mais la db est au format access 2K (mes
|| clients ont toutes les versions d'access).
|| Il y a cependant un bug avec les macros en beforeUpdate sous 2007 (bug
|| simple à reproduire et gros comme la tour eifel :) : exemple sous
|| http://www.kineuro.com/bug2007.mdb, formulaire PatientsAdd
|| -> Versions 2000->2003: on peut mettre "7" dans la zone NIS
|| -> Versions 2007: bonne chance).
||
|| J'ai aussi d'autres erreurs avec 2007 (rapports avec une taille de
|| papier personnalisée: ca marche pas, j'ai de plus en plus de clients qui
|| ralent), savez-vous quand le service pack 1 est prévu? Microsoft ne
|| fournit malheureusement plus la version 2003 et refuse les échanges pour
|| les versions OEM.
||
|| Merci,
|| Alain
|
|


Avatar
Raymond [mvp]
je n'avais pas connaissance de 400 macros dans ton application ce qui change
totalement la donne.
je te tiens au courant.

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000?
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90


"Alain Bourgeois" a écrit dans le message de news:

| Dans ce cas précis, je ne peux pas mettre un code attribué à un autre
| patient.
| Dans ce cas précis, j'ai écrit le code en VBA et là n'est pas le
| problème.
|
| Le problème est qu'il y a une (grosse) application avec plus de 400
| macros et 60 formulaires (en plus des modules).
| Tout reconvertir en VBA est un boulot de titan (il faut ouvrir chaque
| formulaire, prendre chaque contrôle de chaque formulaire, regarder les
| macros associées à l'évènement et changer). Cette macro (et les 400
| autres) fonctionne sans soucis en access '97->2003. Il n'y a pas
| d'erreur de codage
| dans cette macro (je n'ai enfreint aucune règle par rapport aux
| spécifications de la version 2007), c'est un bug consistant et
| reproductible.
| Si encore, il y avait une doc disant "en access 2007, on ne peut plus
| faire cancelEvent après un msgbox dans une macro" et qu'un outil
| permettait de détecter les macros défectueuses et les endroits où elles
| sont appelées, ce serait un moindre mal... mais ce n'est pas le cas.
|
| Accepter de tout réécrire en vb à cause d'un bug dans l'exécution d'une
| macro serait équivalent à demander à tous les users de réécrire tout
| leur code VBA en macros si l'exécution en VBA avait un bug.
| Pour moi, c'est vraiment un non-sens. Si microsoft laisse de tels bugs,
| ils feraient mieux d'enlever l'onglet "macros" de access 2007... leur
| résultat étant "unpredictable" pour raison inconnue.
|
| Bien à vous,
| Alain
Avatar
Raymond [mvp]
RE.

J'ai regardé un peu ta macro et effectivement, elle fonctionne bien sous
access 2003 et ne fonctionne pas sous 2007. C'est l'action ArrêtMacro qui ne
s'exécute pas correctement car si on la remplace par une autre action
cellec-ci s'exécute bien correctement. Je te conseillerais de prendre
contact avec le service support microsoft pour savoir ce que tu peux faire.
Par ailleurs, j'ai regardé ta macro et on peut contourner le problème tout
en la simplifiant pour ne pas avoir l'action ArrêtMacro.
1-condition:
Pas EstNull([SIS]) Et Pas EstNull(RechDom("[SIS]";"Patients";"[SIS]=
Forms![PatientsAdd]![Sis] and [id Patient]<> Forms![PatientsAdd]![Id
Patient]"))
action: BoîteMsg
arguments: Ce numéro NISS existe déjà; Oui; Aucun;
2-condition: ... (3points de continuation)
action: AnnulerEvénement

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000€
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90


"Raymond [mvp]" a écrit dans le message de news:
eWYqkk5$
| je n'avais pas connaissance de 400 macros dans ton application ce qui
change
| totalement la donne.
| je te tiens au courant.
|
Avatar
Alain Bourgeois
J'ai signalé le bug au support par e-mail il y a 3 mois, pas eu de
réponse.
J'ai téléphoné au support pour demander qu'un de mes clients qui venait
d'acheter access 2007 puisse l'échanger contre une version 2003, ils ne
sont pas d'accord.
A mon humble avis, le support va me demander de payer pour me dire que
c'est un bug et que je dois attendre le SP1.

"Raymond [mvp]" wrote:

RE.

J'ai regardé un peu ta macro et effectivement, elle fonctionne bien sous
access 2003 et ne fonctionne pas sous 2007. C'est l'action ArrêtMacro qui ne
s'exécute pas correctement car si on la remplace par une autre action
cellec-ci s'exécute bien correctement. Je te conseillerais de prendre
contact avec le service support microsoft pour savoir ce que tu peux faire.
Par ailleurs, j'ai regardé ta macro et on peut contourner le problème tout
en la simplifiant pour ne pas avoir l'action ArrêtMacro.
1-condition:
Pas EstNull([SIS]) Et Pas EstNull(RechDom("[SIS]";"Patients";"[SIS] > Forms![PatientsAdd]![Sis] and [id Patient]<> Forms![PatientsAdd]![Id
Patient]"))
action: BoîteMsg
arguments: Ce numéro NISS existe déjà; Oui; Aucun;
2-condition: ... (3points de continuation)
action: AnnulerEvénement

--
@+
Raymond Access MVP http://OfficeSystemAccess.seneque.net/
http://officesystem.access.over-blog.com/
Pour débuter sur le forum: http://www.mpfa.info/

Partagez vos créations réalisées sous Office 2007 et gagnez peut-être 5000€
!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid"7641a0-797c-44d5-8774-d820448dbe90

"Raymond [mvp]" a écrit dans le message de news:
eWYqkk5$
| je n'avais pas connaissance de 400 macros dans ton application ce qui
change
| totalement la donne.
| je te tiens au courant.
|