Gardez l'historique de toutes les modifications

Un des points faibles d'Access est qu'il ne garde aucune trace de vos modifications. A moins que vous ne fassiez manuellement une copie de vos tables ou de vos bases de données chaque jour, il vous sera impossible de savoir quand tel champ à été modifié.

Dans ce didacticiel, nous allons apprendre à créer un historique de toutes les modifications. Je travaille avec Access 2007, mais cette astuce est exploitable dans les versions antérieures.

Prenons un exemple simpliste pour comprendre. Créez une base de données "Test.accdb" (Ou Test.mdb si vous travaillez avec Access 2003 ou antérieur)

Dans cete nouvelle base de données, créez une table que vous nommerez T_Client. Installez-y les 6 champs suivants :

Mettez une clé primaire sur IDClient.

Définissez le champ EtatCivil comme "Assistant liste de choix", et entrez les données suivantes :

Nous avons donc l'IDClient (En NuméroAuto), le prénom et le nom de famille en texte, une liste déroulante, une case à cocher et un champ Mémo.

Lancez la table en mode saisie de données, et garnissez-là avec quelques clients, comme ceci :

Maintenant, admettons que vous fermez la base de données, et vous y revenez le lendemain. Vous apprenez que Juliette Martin s'est mariée, et qu'elle s'appelle désormais Juliette Perroud. Si vous changez son nom et son état civil, Access ne mémorisera nulle part que c'est anciennement Juliette Martin qui a changé de nom et d'état civil à telle date... Si, deux semaines après, vous vous acharnez à recherche Mademoiselle Martin (car vous aurez oublié la modification, ou, plus prosaïquement, ce n'est pas vous personnellement qui avez fait le changement, mais votre collaborateur par exemple), vous ne la retrouverez évidemment pas.

C'est donc ce regrettable état de fait que nous allons régler... C'est parti !

1. Créez une nouvelle table vide que vous appelerez T_Historique

Comme ceci :

Lorsque le didacticiel sera terminé, et que, comme exemple, nous marierons Juliette Martin, puis que nous mettrons ensuite Martine Lopez à la retraite, voici ce que notre table T_Historique contiendra (Vous ne remplissez donc PAS ceci à la main. Laissez vide !):

On met le nom de la table simplement parce que si vous désirez exploitez cette même table historique avec plusieurs tables, vous saurez toujours de quelle table il s'agit.

l'ID est indispensable : Si on ne le met pas, comment savoir de quel enregistrement il s'agit... Surtout dans le cas de la maise à la retraite de notre exemple.

La case à cocher est représentée par -1 pour coché et 0 pour pas coché, ce n'est pas très convivial mais c'est comme ça.

2. Créez un formulaire basé sur T_Client

Une fois créé, demandez le mode création.

Enregistrez ce formulaire sous F_Client (Raccourci clavier pour enregistrer : CTRL S)

Demandez les propriétés du formulaire, et dans l'onglet Evénements, choisissez Avant MAJ (MAJ = Mise A Jour), et sélectionnez [Procédure événementielle]

Vous êtes dans l'environnement VBA :

Avant d'aller plus loin : Si l'exemple que nous allons montrer vous renvoie des messages d'erreur, dans l'environnement VBA, allez dans le menu Outils/Références, et cochez cette case :

Avec Access 2007, je n'ai pas eu besoin de le faire, mais il est possible que ce soit indispensable dans les versions antérieures.

Voici donc l'environnement tel qu'il vous est montré après avoir choisi [Procédure événementielle]

Recopiez simplement le bout de code VBA suivant :

On Error Resume Next
For Ctr = 0 To Me.Controls.Count - 1
If Me.Controls(Ctr).ControlType = 106 Or Me.Controls(Ctr).ControlType = 109 Or Me.Controls(Ctr).ControlType = 111 Then
If Me.Controls(Ctr).Value <> Me.Controls(Ctr).OldValue Then
Dim T_Historique As Recordset
Set T_Historique = CurrentDb.OpenRecordset("T_Historique", DB_OPEN_TABLE)
T_Historique.AddNew
T_Historique("ID") = IDClient
T_Historique("NomTable") = Me.RecordSource
T_Historique("NomChamp") = Me.Controls(Ctr).Name
T_Historique("AncienneValeur") = Me.Controls(Ctr).OldValue
T_Historique("NouvelleValeur") = Me.Controls(Ctr).Value
T_Historique("DateHeure") = Now
T_Historique.Update
T_Historique.Close
End If
End If
Next

juste entre "private sub" et "End Sub" :

Ce qui serait bien, ce serait d'indenter le code, c'est a dire avancer certaines choses avec des espaces, pour rendre le truc plus "lisible"

Même si vous ne comprenez rien à ces lignes de VBA, ce n'est rien. L'important, c'est que ça marche. Fermez VBA avec la croix rouge en haut à droite

Vous vous retrouvez dans votre formulaire. Lancez le en mode saisie de données (appelé aussi Mode Formulaire)

Nous allons mettre en action ce que nous avons prévu : "Vous apprenez que Juliette Martin s'est mariée, et qu'elle s'appelle désormais Juliette Perroud.". Transformez donc :

en

Et voilà... C'est bon... Fermez le formulaire.

Ouvrez la table T_Historique... O heureuse surprise :

Bien... Allez, a vous de travailler un peu maintenant ! Essayez donc d'adapter cet exemple sur vos propres tables.... Ne vous effrayez pas devant le code VBA s'il vous parait monstrueux... Si vous regardez de plus près, vous comprendrez aisément ce qu'il faut changer pour que ça marche avec d'autres tables. En fait c'est juste le nom de l'ID, IDClient, que vous changerez en foinction de la table IDFournisseur, IDPatient, IDEnseignant, ...... Le reste, il n'y a pas grand chose à changer...

Merci de m'avoir lu jusqu'ici, et bonne journée !

---