[Issue][Base] L'événement s'exécute 2 fois

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Rackham
Fraîchement OOthentifié
Messages : 9
Inscription : 19 mars 2010 18:47

[Issue][Base] L'événement s'exécute 2 fois

Message par Rackham »

Bonjour,

Issue http://www.openoffice.org/issues/show_bug.cgi?id=110324

Dans Base, j'utilise l'événement "avant l'opération d'enregistrement" du formulaire pour exécuter une macro.
Voici la macro :

Code : Tout sélectionner

Sub MajCAannuel
	dim PysCtrlCAmensuel as object
	dim PysCtrlCAannuel as object
	
	PysCtrlCAmensuel = ThisComponent.DrawPage.Forms.getByName("Clients").getByName("fmtCA mensuel")
	PysCtrlCAannuel = ThisComponent.DrawPage.Forms.getByName("Clients").getByName("numCA annuel")

	PysCtrlCAannuel.Value = PysCtrlCAannuel.CurrentValue + PysCtrlCAmensuel.CurrentValue
	PysCtrlCAannuel.commit	
End Sub
Lorsque je clique sur le bouton "Enregistrer l'enregistrement" de la barre de défilement, la macro "MajCAannuel" est exécutée 2 fois.

Pour reproduire le problème :
Ouvrir le fichier "Rackham, Macro.Base2.odb"
Ouvrir le formulaire "Clients"
Changer la valeur du champ "CAmensuel" à 10.00.
Cliquer sur le bouton "Enregistrer l'enregistrement" de la barre de défilement.
La valeur du champ "CAannuel" passe de 0.00 à 20.00, alors qu'elle devrait passer à 10.00.
C'est plus flagrant encore en plaçant un point d'arrêt dans la macro avant d'ouvrir le formulaire.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Rackham le 23 mars 2010 21:54, modifié 2 fois.
OOo 4.1.15 sous Windows 10 & 11
Avatar de l’utilisateur
spYre
InconditiOOnnel
InconditiOOnnel
Messages : 888
Inscription : 29 oct. 2008 19:02
Localisation : Liège, Belgique

Re: [Base] L'événement s'exécute 2 fois

Message par spYre »

Bonjour Rackham,

Je suppose que le commit de la dernière ligne relance l'événement.
Pourquoi ne pas plutôt affecter la macro à l'événement "avant actualisation" du contrôle fmtCA mensuel ?

Cordialement.
LibreOffice 3.3.4 + Report Builder
Windows 7 / Windows XP sp3
Ubuntu 11.10 / LMDE
Rackham
Fraîchement OOthentifié
Messages : 9
Inscription : 19 mars 2010 18:47

Re: [Base] L'événement s'exécute 2 fois

Message par Rackham »

Bonsoir spYre,

Merci pour ta solution.

Cependant, j'avais déjà trouvé sur le Forum l'utilisation de l'événement "après actualisation de l'enregistrement", que j'ai d'abord testé évidemment.

Ces 2 solutions ont un double inconvénient.
1-Lorsque l'on passe d'un enregistrement au suivant en utilisant la touche de tabulation, l'événement "avant actualisation de l'enregistrement" est activé, même si aucun champ n'a été modifié. Ce que je ne souhaite pas.
Même remarque si l'on utilise la flèche "enregistrement suivant" de la barre de défilement. Mais, dans ce cas l'événement est activé de façon aléatoire.
2-Si l'utilisateur saisi une 1er valeur, passe au champ suivant, puis se ravise et corrige la valeur, l'événement sera exécuté 2 fois et plus peut-être suivant sa dextérité du jour.

Dans ma solution, l'événement est activé seulement et seulement si un des champs a été modifié et que :
1-je demande explicitement la mise à jour (bouton enregistrer de la barre de défilement)
ou
2-j'utilise la tabulation.

Si aucun champ n'est modifié et que je passe à l'enregistrement suivant avec la tabulation, l'événement n'est pas activé.
Ma Base exemple a pour seul but d'illustrer le problème rencontré.
J'ai reçu une réponse du projet. :D
Il s'agit d'un problème de conception connu. :fou:
Une solution de contournement m'a été fournie.
Je l'a décrypte, je la teste et je revient sur le Forum, dés que possible.
OOo 4.1.15 sous Windows 10 & 11
Avatar de l’utilisateur
spYre
InconditiOOnnel
InconditiOOnnel
Messages : 888
Inscription : 29 oct. 2008 19:02
Localisation : Liège, Belgique

Re: [Base] L'événement s'exécute 2 fois

Message par spYre »

Rackham a écrit :Lorsque l'on passe d'un enregistrement au suivant en utilisant la touche de tabulation, l'événement "avant actualisation de l'enregistrement" est activé, même si aucun champ n'a été modifié. Ce que je ne souhaite pas.
Tu veux dire "après actualisation de l'enregistrement" ? Que ce soit l'événement "avant" ou "après", je ne reproduis pas : l'événement ne se déclenche qui si l'enregistrement est modifié.
Rackham a écrit :Même remarque si l'on utilise la flèche "enregistrement suivant" de la barre de défilement. Mais, dans ce cas l'événement est activé de façon aléatoire.
Même chose : j'ai testé un peu dans tous les sens, sans reproduire ce comportement aléatoire.
Rackham a écrit :Si l'utilisateur saisi une 1er valeur, passe au champ suivant, puis se ravise et corrige la valeur, l'événement sera exécuté 2 fois et plus peut-être suivant sa dextérité du jour.
Ok, je commence à comprendre. Mais quid si l'utilisateur se ravise après être passé à l'enregistrement suivant et revient en arrière ?
Rackham a écrit :Dans ma solution, l'événement est activé seulement et seulement si un des champs a été modifié et que :
1-je demande explicitement la mise à jour (bouton enregistrer de la barre de défilement)
ou
2-j'utilise la tabulation.
À tout hasard : l'événement "après actualisation de l'enregistrement" fonctionne de la même manière et sans bug.
Mais si l'idée est de pouvoir bloquer l'enregistrement en cas de mauvaise saisie, il ne conviendra évidemment pas...

Cordialement.
LibreOffice 3.3.4 + Report Builder
Windows 7 / Windows XP sp3
Ubuntu 11.10 / LMDE
Rackham
Fraîchement OOthentifié
Messages : 9
Inscription : 19 mars 2010 18:47

Re: [Issue][Base] L'événement s'exécute 2 fois

Message par Rackham »

Bonsoir spYre,
Rackham : Lorsque l'on passe d'un enregistrement au suivant en utilisant la touche de tabulation, l'événement "avant actualisation de l'enregistrement" est activé, même si aucun champ n'a été modifié. Ce que je ne souhaite pas.
spYre : Tu veux dire "après actualisation de l'enregistrement" ? Que ce soit l'événement "avant" ou "après", je ne reproduis pas : l'événement ne se déclenche qui si l'enregistrement est modifié.
Tu ne l'as pas vu, parce qu'il y a un bogue dans le debogueur. Il ne s'arrête pas toujours sur les points d'arrêt.
Refait le test en incorporant une MsgBox dans la macro.
Rackham : Même remarque si l'on utilise la flèche "enregistrement suivant" de la barre de défilement. Mais, dans ce cas l'événement est activé de façon aléatoire.
spYre : Même chose : j'ai testé un peu dans tous les sens, sans reproduire ce comportement aléatoire.
Voici, comment y parvenir :
Ouvre le formulaire.
Change la valeur dans le champ "CA mensuel" en laissant le focus sur celui-ci.
Clique sur le bouton "enregistrement suivant". (tu recevras la boîte de dialogue, puisque l'enregistrement a été changé)
Patiente quelques secondes. (tu recevras la 2ème boîte de dialogue, celle-ci n'était pas prévue)
Clique de nouveau sur le bouton "enregistrement suivant". (tu recevras une nouvelle boîte de dialogue non sollicitée, et peut-être même une 2ème après quelques secondes)
Clique sur le bouton "enregistrement précédent", maintenant. (tu recevras etc...)
Ferme le formulaire. (tu recevras etc...)
Si l'utilisateur saisi une 1er valeur, passe au champ suivant, puis se ravise et corrige la valeur, l'événement sera exécuté 2 fois et plus peut-être suivant sa dextérité du jour.
Si l'utilisateur saisi une 1er valeur, passe au champ suivant, puis se ravise et corrige la valeur, l'événement sera exécuté 2 fois et plus peut-être suivant sa dextérité du jour.
Cette remarque est tout à fait pertinente.
Je souhaitais, juste, attirer l'attention sur le fait qu'en interceptant un événement au niveau d'un champ, il fallait ternir compte de la fréquence des mises à jour que cela allait entraîner.
Ceci étant dit, mon besoin n'est, évidement, pas d'ajouter la valeur d'un champ à la valeur d'un autre champ.
Je veux simplement illustrer par un exemple interpellant la double activation de l'événement. Si j'ajoute 10.00 à 0.00, je doit obtenir 10.00 et non 20.00.
Rackham : Dans ma solution, l'événement est activé seulement et seulement si un des champs a été modifié et que :
1-je demande explicitement la mise à jour (bouton enregistrer de la barre de défilement)
ou
2-j'utilise la tabulation.
spYre : À tout hasard : l'événement "après actualisation de l'enregistrement" fonctionne de la même manière et sans bogue.
Mais si l'idée est de pouvoir bloquer l'enregistrement en cas de mauvaise saisie, il ne conviendra évidemment pas...
Je désire exécuter ma macro lorsque tous les champs (1 ou plusieurs) ont été modifiés et pas à chaque modification de chacun des champs. C'est pourquoi l'événement "avant l'opération d'enregistrement" me semble le plus approprié.
Comme j'y ai détecté une anomalie, je la communique à celles et à ceux qui pourraient en avoir besoin.
OOo 4.1.15 sous Windows 10 & 11
Rackham
Fraîchement OOthentifié
Messages : 9
Inscription : 19 mars 2010 18:47

Re: [Issue][Base] L'événement s'exécute 2 fois

Message par Rackham »

Bonsoir,

Comme promis, voici, la solution de contournement qui m'a été fournie par le projet.

Code : Tout sélectionner

Sub MajCAannuel(oEvent as object)
	dim PysCtrlCAmensuel as object
	dim PysCtrlCAannuel as object

	if oEvent.Source.supportsService("com.sun.star.form.component.DataForm") = True then
		exit Sub
	end if
	
	PysCtrlCAmensuel = ThisComponent.DrawPage.Forms.getByName("Clients").getByName("fmtCA mensuel")
	PysCtrlCAannuel = ThisComponent.DrawPage.Forms.getByName("Clients").getByName("numCA annuel")

	PysCtrlCAannuel.Value = PysCtrlCAannuel.CurrentValue + PysCtrlCAmensuel.CurrentValue
	PysCtrlCAannuel.commit	
End Sub
Elle est simple et facile a mettre en application.
1-ajouter le nom d'un objet comme paramètre de la macro (ici, oEvent)
2-appeler la méthode "supportsService" de l'objet "Source" (ici, oEvent.Source) avec le nom de service "com.sun.star.form.component.DataForm"
3-tester la valeur retour de la méthode (boolean)
si elle est True on se trouve dans le cas du "Data Form" et on quitte la macro
si elle est False on se trouve dans le cas du "Form Controller" et on exécute la macro
OOo 4.1.15 sous Windows 10 & 11