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 :
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.