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

À partir de Ms ACCESS 2010 le message change.

image

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.

image

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.

 
Sélectionnez
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).

 
Sélectionnez
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é.

 
Sélectionnez
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.

 
Sélectionnez
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.

 
Sélectionnez
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.

 
Sélectionnez
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.

 
Sélectionnez
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.