Programmer vos tâches récurrentes dans Access

Denis Hulo

Objectif : apprendre à programmer vos tâches récurrentes dans Access.

Niveau requis : confirmé.

Commentez cet article : Commentez

- Titre : Programmer vos tâches récurrentes dans Access

- Auteur : Denis Hulo

- Parution : 15 septembre 2019

- Public visé :

- Licence : Copyright ® 2019 Denis Hulo. 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

- I. Introduction

- II. Table pour enregistrer les données des tâches

- III. Procédure d'exécution des tâches

- III-A-1. Exécution des tâches sur timer

- IV. Procédures associées aux tâches

- IV-A. SaveFile

- IV-B. TransferSpreadSheet

- IV-C. Alert

- V. Base de données à télécharger

- VI. Remerciements

I - Introduction

Un premier tutoriel expliquant comment générer des tâches planifiées a déjà été publié par Jean-Philippe André.
L'objectif de cet article est d'expliquer, au travers d'une base exemple, comment enregistrer dans une table des tâches récurrentes (sauvegardes de fichiers, alertes, transferts de tables..) en les associant à des procédures et à une période, pour ensuite les exécuter au bon moment en utilisant la méthode Run d'Access.

Pour mieux comprendre le fonctionnement de cet outil, on décomposera sa présentation en trois parties :

- table pour enregistrer les données des tâches ;

- procédure d'exécution des tâches ;

- code des procédures associées aux tâches.

Timer

II - Table pour enregistrer les données des tâches

On part d'une table T_Tache pour enregistrer les informations sur les tâches à exécuter :

Champ

Type de données

Description

IdTache

Numéro-auto

Numéro d'enregistrement

IntituleTache

Texte

Intitulé de la tâche

UniteTemps

Texte

Unité de temps (seonde, minute, heure, jour, mois, semaine, année)

PeriodeTemps

entier long

période en nombre de secondes, minutes, heures, jours, semaines, mois, ou années

DateProchaineExecution

Date/heure

Date de prochaine exécution de la tâche

DateFinExecution

Date/heure

Date de fin d'exécution de la tâche

NomProcedure

Texte

Nom de la procédure à exécuter

ArgumentProcedure

Texte

Argument de la procédure à exécuter

Active

Booléen

Indique si la tâche est active ou non

Exemples de tâches à exécuter :

Sauvegarde du fichier Access toutes les 30 minutes.

Transfert tous les mois des données sur les factures du mois précédent.

Alerte pour relancer un client toutes les semaines pour payer sa facture.

Table T_Tache

Pour exécuter la procédure on utilise la méthode Run avec le nom de la procédure en argument.

III - Procédure d'exécution des tâches

Extrait de l'aide :

Vous pouvez utiliser la méthode Run pour exécuter une procédure ou une fonction spécifiée par l’utilisateur ou Microsoft Access.

Syntaxe
expression.Run (Procédure, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, _ Arg14_, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, _ Arg27_, Arg28, Arg29, Arg30)

expression est une variable qui représente un objet Application.
...

Dans notre cas, on n'utilisera au plus qu'un argument, et la ligne de code ressemblera donc à :

application.Run NomProcedure, ArgumentProcedure

La procédure d'exécution des tâches les parcourt une à une :

Déroulé condensé de la procédure RunTasks

- On ouvre le Recordset contenant les informations sur les tâches actives ;

- Pour chaque enregistrement, on teste si la date de prochaine exécution de la tâche est inférieure ou égale à maintenant ;

- Si c'est le cas, on exécute la procédure associée à la tâche avec la méthode Run ;

- Puis on met à jour la date de sa prochaîne exécution.

Procédure RunTasks

Public Sub RunTasks()
' Procédure d'exécutions des tâches actives enregistrées
Dim db As DAO.Database ' référence à la base courante
Dim rs As DAO.Recordset ' référence au recordset lié à la table T_Tache
Dim periodeTemps As Long ' période d'exécution de la tâche en jours, semaines, mois ou années
Dim dateProchaineExecution As Date ' date de prochaine exécution de la tâche

Set db = CurrentDb

' ouverture du recordset lié aux tâches actives à planifier
Set rs = db.OpenRecordset("select * from T_Tache where Active", dbOpenDynaset)

Do Until rs.EOF ' on parcourt les différentes tâches
' si la date et l'heure de prochaine exécution est arrivée ou passée
If (rs!dateProchaineExecution <= Now()) Then

' il faut lancer la tâche et recalculer la date de prochaîne exécution de la tâche
If Nz(rs!ArgumentProcedure, "") = "" Then ' si pas d'argument à la procédure
Run (rs!NomProcedure) ' on exécute la procédure à l'aide de la méthode run
Else ' sinon
' on exécute la procédure à l'aide de la méthode run avec un argument supplémentaire
Run rs!NomProcedure, rs!ArgumentProcedure
End If

' puis on recalcule la date de prochaîne exécution
periodeTemps = rs!periodeTemps ' on copie la période en nombre de jours, semaines, mois ou années.

Select Case rs!UniteTemps ' en fonction de l'unité temporelle (jour, semaine, mois, année)

Case "Seconde" ' si l'unité est la seconde
' on ajoute le nombre de secondes à la date de prochaine exécution désormais passée
dateProchaineExecution = DateAdd("s", periodeTemps, rs!dateProchaineExecution)

Case "Minute" ' si l'unité est la minute
' on ajoute le nombre de minutes à la date de prochaine exécution désormais passée
dateProchaineExecution = DateAdd("n", periodeTemps, rs!dateProchaineExecution)

Case "Heure" ' si l'unité est l'heure
' on ajoute le nombre d'heures à la date de prochaine exécution désormais passée
dateProchaineExecution = DateAdd("h", periodeTemps, rs!dateProchaineExecution)

Case "Jour" ' si l'unité est le jour
' on ajoute le nombre de jours à la date de prochaine exécution désormais passée
dateProchaineExecution = rs!dateProchaineExecution + periodeTemps

Case "Semaine"
' on ajoute le nombre de semaines à la date de prochaine exécution désormais passée
dateProchaineExecution = rs!dateProchaineExecution + (7 * periodeTemps)

Case "Mois"
' on ajoute le nombre de mois à la date de prochaine exécution désormais passée
dateProchaineExecution = DateAdd("m", periodeTemps, rs!dateProchaineExecution)

Case "Année"
' on ajoute le nombre d'année à la date de prochaine exécution désormais passée
dateProchaineExecution = DateAdd("yyyy", periodeTemps, rs!dateProchaineExecution)

End Select

' si la date de fin d'exécution de la tâche est atteinte ou dépassée
If dateProchaineExecution >= Nz(rs!dateFinExecution, #1/1/3000#) Then
rs.Edit
rs!Active = False ' on déactive la tâche
rs.Update
Else
rs.Edit
rs!dateProchaineExecution = dateProchaineExecution ' on enregistre la date de prochaine exécution
rs.Update
End If

End If

rs.MoveNext ' enregistrement suivant

Loop

' libération des variables
rs.Close
Set rs = Nothing

Set db = Nothing
End Sub

Gros plan sur les commandes de lancement d'une procédure :

' il faut lancer la tâche et recalculer la date de prochaîne exécution de la tâche
If Nz(rs!ArgumentProcedure, "") = "" Then ' si pas d'argument à la procédure
Run (rs!NomProcedure) ' on exécute la procédure à l'aide de la méthode run
Else ' sinon
' on exécute la procédure à l'aide de la méthode run avec un argument supplémentaire
Run rs!NomProcedure, rs!ArgumentProcedure
End IF

L'exécution des tâches s'effectue sur l'événement Timer du formulaire F_ProgrammerTaches .

Formulaire F_ProgrammerTaches

III-A-1 - Exécution des tâches sur timer

Pour paramétrer le Timer du formulaire on a besoin de définir l'intervalle minuterie en millisecondes, par exemple, pour exécuter la procédure RunTasks toutes les 60 secondes, on saisit sur cette propriété 60 000 (ms).

Propriétés Timer

Ensuite, on doit placer la procédure d'exécution des tâches sur l'événement Timer :

Private Sub Form_Timer()
RunTasks ' exécution des tâches sur timer
End Sub

Pour définir manuellement l'intervalle d'exécution de la procédure sur Timer on peut aussi saisir une valeur dans la zone de texte IntervalleMinuterie, représentant l'intervalle de temps exprimé en millisecondes entre 2 exécutions :

Private Sub IntervalleMinuterie_AfterUpdate()
' définit l'intervalle minuterie après mise à jour de la zone de texte
' si 0 arrêt du timer
Me.TimerInterval = Me.IntervalleMinuterie ' copie de la valeur de la zone de texte dans la propriété TimerInterval du formulaire
End Sub

IV - Procédures associées aux tâches

On décrit les procédures contenues dans le module M_Taches et permettant d'exécuter les différentes tâches.

IV-A - SaveFile

La procédure sauvegarde la totalité de la base active :

Procédure SaveFile

Public Sub SaveFile()
' Procédure de sauvegarde du fichier Access
Dim fso As Object ' référence à fso
Dim cheminFichier As String ' variable pour le chemin complet du fichier sur le disque
Dim nomFichier As String ' variable pour le nom du fichier
Dim nomDossier As String ' variable pour le nom du dossier de sauvegarde

Set fso = CreateObject("Scripting.FileSystemObject") ' Création de l'objet fso

nomDossier = CurrentProject.Path & "\Sauvegarde" ' dossier de sauvegarde
cheminFichier = CurrentProject.FullName ' chemin complet du fichier Access
nomFichier = CurrentProject.Name ' nom du fichier Access

If Dir(nomDossier, vbDirectory) = "" Then ' si le dossier n'existe pas
fso.CreateFolder nomDossier ' création du dossier de sauvegarde
End If

' copie du fichier Access dans le dossier de sauvegarde
fso.CopyFile cheminFichier, nomDossier & "\" & nomFichier & " - " & Format(Date, "yyyy-mm-dd") & ".accdb"

' Affichage du message de succès de la sauvegarde
MsgBox "Sauvegarde du fichier réalisée avec succès !", vbExclamation

' On libère la variable fso
Set fso = Nothing

End Sub

IV-B - TransferSpreadSheet

La procédure transfère dans un fichier Excel les données des factures du mois précédent, affichées dans la requête R_FactureMoisPrecedent :

Procédure TransfertSpreadSheet

Public Sub TransferSpreadSheet()
' Procédure de transfert des données de la requête R_FactureMois dans un fichier Excel
Dim fso As Object ' référence à fso
Dim cheminFichier As String ' variable pour le chemin complet du fichier sur le disque
Dim nomDossier As String ' variable pour le nom du dossier de sauvegarde

Set fso = CreateObject("Scripting.FileSystemObject")

nomDossier = CurrentProject.Path & "\Factures mensuelles" ' dossier de sauvegarde
cheminFichier = nomDossier & "\Factures " & Format(DateAdd("m", -1, Date), "yyyy-mm") & ".xlsx" ' chemin complet du fichier Access

If Dir(nomDossier, vbDirectory) = "" Then ' si le dossier n'existe pas
fso.CreateFolder nomDossier ' création du dossier de sauvegarde
End If

' transfert de la table Access vers le fichier Excel
DoCmd.TransferSpreadSheet acExport, acSpreadsheetTypeExcel12Xml, "R_FactureMoisPrecedent", cheminFichier, True

' Affichage du message de succès du transfert
MsgBox "Transfert de la table réalisé avec succès !", vbExclamation

' On libère la variable fso
Set fso = Nothing

End Sub

IV-C - Alert

La procédure affiche le message d'alerte passé en argument:

Procédure Alert

Public Sub Alert(msg As String)
' on affiche le message d'alerte passé en argument
MsgBox msg, vbExclamation, "Alerte !"
End Sub

V - Base de données à télécharger

La base jointe décrite dans le tutoriel est au format accdb.

VI - Remerciements

Je tiens à remercier ..., ..., ..., et ... pour m'avoir conseillé pour la réalisation de cet article, ainsi que ... pour sa relecture.