Détection de modification dans un formulaire

Fabrice CONSTANS

Ce tutoriel traite de la détection des modifications des données dans un formulaire. Détecter les modifications des données dans un formulaire permet d'adapter l'interface au cas par cas et ainsi faciliter sa compréhension.

Commentez cet article : Commentez

- Titre : Détection de modification dans un formulaire

- Auteur : Fabrice CONSTANS

- Parution : 21 juillet 2013

- Mise à jour : 28 juillet 2013

- Licence : Copyright ® 2013 Fabrice CONSTANS. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 0. Introduction

- I. Fonctionnement

- I-A. En lecture

- I-B. En écriture

- II. Les pièges

- II-A. Open/Load d'un formulaire

- II-B. Les évènements « Dirty »

- III. Exemples

- III-A. Enregistrer une fiche

- III-B. Annulation de modification

- III-C. Changement de fiche

- III-D. Nouvelle Fiche

- III-E. Fermeture du formulaire

- IV. Conclusion

- V. Remerciements

0 - Introduction

« Dirty », sali ou souillé en français, est une propriété qui indique si les données du formulaire ont été modifiées. Il ne faut pas confondre la propriété « Dirty » avec l'évènement éponyme (« Si modification ») présent dans certains contrôles et que nous aborderons également dans ce tutoriel.

I - Fonctionnement

Voici les généralités à savoir sur cette propriété :

- « Dirty » est une propriété de type booléen ;

- « Dirty » est disponible en lecture/écriture ;

- « Dirty » n'est présente que dans les formulaires ;

- « Dirty » n'est accessible que si une source de formulaire est définie (propriété « Source du formulaire »). Dans le cas contraire, tout appel se verra sanctionné par le message d'erreur suivant :

À partir de Ms ACCESS 2010 le message change.

I-A - En lecture

En lecture la propriété « Dirty » indique l'état de l'enregistrement courant.

« False » indique que l'enregistrement n'est pas modifié.

« True » indique que l'enregistrement est modifié.

I-B - En écriture

L'utilisation de « Dirty » est intéressante autant en lecture qu'en écriture.

Lorsque « Dirty » est à « True », donc que l'enregistrement est modifié, on peut lui affecter la valeur « False ». Dans ce cas l'enregistrement est sauvegardé.

On peut également affecter « True » lorsque la propriété « Dirty » est à « False ». Il ne se passe rien de particulier sinon que l'enregistrement est considéré comme modifié. Si le sélecteur du formulaire est visible le crayon apparait.

II - Les pièges

La méconnaissance de l'interaction de la propriété avec son environnement peut provoquer des incohérences dans le fonctionnement attendu.

II-A - Open/Load d'un formulaire

Lors de la saisie d'un nouvel enregistrement, on souhaite affecter une valeur dynamique à un contrôle pour que l'utilisateur n'ait pas à la saisir ou qu'il n'en ait tout simplement pas le contrôle.

La facilité serait d'utiliser une affectation à la valeur du contrôle. C'est ici qu'est le piège.

Le code ci-dessous démontre le changement d'état de la propriété « Dirty » suite à l'affectation.

Debug.Print Me.Dirty  'False
Me.NomUtilisateur.Value = Environ("UserName")
Debug.Print Me.Dirty  'true

Le premier état de la propriété est « False », c'est normal l'enregistrement vient d'être chargé. Une fois l'affectation réalisée l'état est à « True », cela reste vrai puisque l'enregistrement vient d'être modifié.

Si vous utilisez une colonne de type « NuméroAuto » celle-ci sera incrémentée, même si vous faites une annulation avec la méthode ou la commande « Undo ».

Pour ne pas tomber dans ce piège il faut utiliser la propriété « DefaultValue » (Valeur par défaut).

Private Sub Form_Open(Cancel As Integer)
Debug.Print Me.Dirty  'False
Me.NomUtilisateur.DefaultValue = """" & Environ("UserName") & """"
Debug.Print Me.Dirty  'False
End Sub

Il s'agit là du piège principal de la propriété  « Dirty ».

II-B - Les évènements « Dirty »

Il faut également faire attention aux événements éponymes qui sont trompeurs. Ce tableau indique la modification de l'état de la propriété « Dirty» tout au long des événements.

Action

Objet

État Dirty

Ouverture du formulaire

Form_Open (Sur ouverture)

Faux

Affichage de l'enregistrement

Form_Current (Sur activation)

Faux

Modification du contenu d'un contrôle

Form_Dirty (Si modification)

Faux

Control_Dirty (Si modification)

Faux

Control_Change (Sur changement)

Vrai

Le contrôle perd le focus

Control_BeforeUpdate (Avant MAJ)

Vrai

Le contrôle a perdu le focus

Control_AfterUpdate (Après MAJ)

Vrai

Le contrôle a perdu le focus

Form_BeforeUpdate (Avant MAJ)

Vrai

Clic sur enregistrement suivant

Form_AfterUpdate (Après MAJ)

Faux

Affichage enregistrement suivant (sauvegarde).

Form_Current (Sur activation)

Faux

On peut voir que lors des événements « Dirty» d'un contrôle et d'un formulaire, la propriété « Dirty» ne passe pas à « True ». On rencontre souvent cette erreur due essentiellement à une interprétation au lieu d'un apprentissage.

Pour en savoir plus sur ces événements vous pouvez vous référer au tutoriel suivant :

Les événements avec Microsoft Access : Les Formulaires

III - Exemples

Au travers des exemples suivants nous allons utiliser la propriété « Dirty».

III-A - Enregistrer une fiche

Ce code met en lumière le cas classique de l'enregistrement d'une fiche. On teste d'abord si l'enregistrement a été modifié.

Private Sub btnEnregistrer_Click()
' enregistre la fiche courante
If Me.Dirty Then ' Est-elle modifiée ?
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub

III-B - Annulation de modification

La possibilité d'annuler la modification en cours est importante pour les utilisateurs qui ne sont pas habitués à la touche « Echap». Comme pour la sauvegarde on teste d'abord si la fiche a été modifiée.

Private Sub btnAnnuler_Click()
' annule la modification
If Me.Dirty Then Me.Undo
End Sub

III-C - Changement de fiche

Lors du changement d'enregistrement, on peut être amené à vérifier que l'enregistrement est en cours de modification. L'événement  « Form_Current » (Sur activation) permet de détecter ce changement d'enregistrement. On teste l'état de la propriété « Dirty », si elle est à « True » on affiche le message.

Private Sub Form_Current()
If Me.Dirty Then  ' Est-elle modifiée ?
If MsgBox("Souhaitez-vous enregistrer les modifications ?", vbExclamation + vbYesNo + vbDefaultButton2) = vbYes Then
DoCmd.RunCommand acCmdSaveRecord
End If
Endif
End Sub

III-D - Nouvelle Fiche

De même lorsqu'on veut créer une nouvelle fiche, il est important de savoir si l'actuelle est en cours de modification ou encore si elle est valide.

Dans l'événement « Sur Clic » d'un bouton « Créer » on peut imaginer le double contrôle ; fiche modifiée et fiche valide.

Private Sub btnCreer_Click()
If Me.Dirty Then ' Est-elle modifiée ?
If Not ficheValide() Then ' Est-elle valide ?
Exit Sub ' Je reste sur la fiche
Else
Me.Dirty = False ' Je sauvegarde.
End If
End If
DoCmd.GoToRecord , , acNewRec  ' modifiée et valide
End Sub

III-E - Fermeture du formulaire

Lors de la fermeture d'un formulaire, c'est l'occasion de connaitre les intentions de l'utilisateur. Le prévenir que la fiche est en cours de modification peut faire toute la différence.

Private Sub BtnFermer_Click()
If Me.Dirty Then ' Est-elle modifiée ?
If MsgBox("Souhaitez-vous enregistrer les modifications ?", vbExclamation + vbYesNo + vbDefaultButton2) = vbYes Then
If ficheValide() Then ' Est-elle valide ?
Me.Dirty = False ' Je sauvegarde.
Else
Exit Sub  ' J'abandonne la fermeture.
End If
End If
DoCmd.Close  ' Je ferme le formulaire.
Exit Sub

IV - Conclusion

Comme vous l'avez vu, l'utilisation de la propriété « Dirty » est assez triviale lorsqu'on la maitrise. Elle rend de précieux services et permet d'enrichir le comportement d'une application. Vous pouvez retrouver d'autres exemples de son utilisation dans le cours lié à la Classe MELA.

V - Remerciements

Je remercie Pierre FAUCONNIER et Philippe JOCHMANS pour leur relecture technique et leurs conseils avisés ainsi que f-Leb pour la correction.