Comment détecter la modification de données dans un formulaire au travers de cet article.
http://loufab.developpez.com/tutorie...ns_formulaire/
N'hésitez pas à commenter ce tutoriel.
Comment détecter la modification de données dans un formulaire au travers de cet article.
http://loufab.developpez.com/tutorie...ns_formulaire/
N'hésitez pas à commenter ce tutoriel.
Et encore un des mystères de Access révélé :-).
Merci pour ce tutorial très clair et exhaustif.
A+
Salut, fabrice, bravo et super ! très clair et instructif.
Je me permettrai juste 2 petites remarques de pinailleur : je trouve certaines définitions d'évènements, dans la 1ère colonne du tableau II-B, un peu confuses. Notamment les Before/AfterUpdate du contrôle et surtout du formulaire : oui, ils peuvent être déclenchés par une perte de focus, mais aussi par bien d'autres évènements comme un clic sur le sélecteur d'enregistrement, la fermeture... Ils ne se déclenchent, par contre, que si le contrôle (ou au moins un des contrôles, pour le formulaire) a été modifié... Suis je clair ?
Par ailleurs, l'exemple Form_Current (III-C) ne fonctionnera pas. Comme tu l'as bien montré dans le tableau, si un enregistrement est modifié,
- l'évènement Form_BeforeUpdate aura Dirty = vrai (pas enregistré : possibilité d'annuler)
- Form_AfterUpdate > Dirty = faux (enregistrement terminé),
et donc, nécessairement
- Form_Current (le dernier !) > Dirty = Faux.
En effet Etienne je suis entièrement d'accord avec ton analyse.
Bonjour,
Bravo pour ce nouveau tuto...
Pour ma part, la propriété Dirty exprime un usage aussi significatif que son nom.
Tout comme moi, certains ingé de Microsoft eux-mêmes ne l'utilisent pas dans certains des développements dont j'ai eu les source ; ils préfèrent user d'une classe avec une propriété booléenne qui fait la même chose à la différence que l'on à la main sur le comportement.
Par ailleurs, adepte du mode déconnecté dans mes développements, je suis contraint d'user d'un autre procédé pour ma part bien plus fiable.
Pour finir, je construits le plus souvent des formulaires pour la saisie/création et d'autres pour la consultation et donc, cela limite les risques
En tout état de cause, bien utilisé, il peut rendre effectivement service aux neophytes sur le comportement des données.
Argy
Un Dirty manuel !
Un booléen qui change d'état suivant les évènements habituellement concernés. Peut-on voir ça ?!
Bah, il n'y a rien d'extraordinaire...
Au lieu de capter la propriété Dirty en son sens, on affecte un booléen au moment souhaité et on contrôle sa valeur au moment souhaité aussi.
Pourquoi donc..? A vrai dire, je ne sais pas trop mais pour ma part, un climat de confiance à l'égard de la propriété Dirty et son comportement par fois bizarre peut être l'explication.
Argy
Bonjour,
Je suis en train de m'auto-former sur VBA pour Access tout en réalisant une application. Je suis tombé sur ce tuto puis cette discussion. Le Dirty a l'air intéressant mais au vu de ce qui est dit plus haut, je me demande si l'utiliser ne me créera pas certains bugs que j'aurais du mal à gérer.
Quels sont vos retours d'expériences sur son utilisation svp ?
Si vous avez eu des bugs avec, y avez vous trouvé une solution et si oui lesquelles ?
Merci à ceux qui réalisent des tuto et qui me permettent d'apprendre beaucoup de choses.
Qu'est ce que tu appelles bugs ? Une mauvaise utilisation de la propriété/méthode ?
Je l'utilise fréquemment pour ne pas dire systématiquement et je n'ai pas constaté de bugs. Sinon comme l'indique argy il s'agit d'une boite noire qu'on ne contrôle pas réellement.
+ 1 pour Fabrice et son article.
J'utilise aussi la propriété Dirty et l'évènement correspondant depuis longtemps, ne serait-ce que pour mettre "en lumière" le (sous-)formulaire en cours de saisie, jusqu'à l'enregistrement...
Sans problème.
Mais c'est peut être mon côté grunge qui me le fait apprécier ?
Oui c'est ça
Bon, pour ma part, ainsi que je l'ai précisé, je créé mon "propre dirty"...
Voici un exemple pratique :
Code Dans le formulaire : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 Option Compare Database Private cMyClass As MyClass Private m_sFirstName As String Private Property Get FirstName() As String FirstName = m_sFirstName End Property Private Property Let FirstName(ByVal sFirstName As String) m_sFirstName = sFirstName End Property Private Sub Form_Timer() Me.lblDirtyStatus.Caption = IIf(cMyClass.DataChanged, "Modifié", "Inchangé") End Sub Private Sub Form_Unload(Cancel As Integer) If cMyClass.DataChanged Then If MsgBox("On sauvegarde ce qui a changé ?", vbQuestion + vbYesNo) = vbYes Then '[...] End If End If Set cMyClass = Nothing End Sub Private Sub txtFirstName_Exit(Cancel As Integer) With cMyClass .DataChanged = .ChangesMadeOnForm(Me!txtFirstName, FirstName) End With End Sub Private Sub Form_Load() Me.TimerInterval = 1000 Set cMyClass = New MyClass GetCurrentValues End Sub Private Sub GetCurrentValues() FirstName = Nz(Me!txtFirstName, "") End Sub
Code Module de classe : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Option Compare Database Private m_bDataChanged As Boolean Public Property Get DataChanged() As Boolean DataChanged = m_bDataChanged End Property Public Property Let DataChanged(ByVal bDataChanged As Boolean) m_bDataChanged = bDataChanged End Property Public Function ChangesMadeOnForm(ByVal DataField As Variant, ByVal OldFieldValue As Variant) If Len(Nz(DataField, "")) Then ChangesMadeOnForm = StrComp(DataField, OldFieldValue, vbTextCompare) <> 0 End If End Function
Certes, j'avoue, ça fait plus de code mais ici, si la personne annule l'entrée en cours de saisie ou retape la même valeur, l'effet "pseudo Dirty" est à False.
C'est ma vision même si elle est criticable, elle peut donner des idées.
Et puis, autre point primordial, mes formulaires sont toujours en mode déconnecté ; donc difficile de faire des boulettes dans ce cas ou alors, il faut le faire exprès
Argy
Partager