Fermeture Automatique d'une Base Access

Comment fermer automatiquement une base Access restée ouverte, à une date, ou une heure donnée ?
Cette question revient très souvent, aussi, j'ai pensé que vous fournir un petit outils exemple, à cet effet ne serait pas négligeable.
Bonne lecture !

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. Concepts de Base

1.1. L'Idée

La question première était : Comment puis-je faire pour fermer automatiquement une base de données, à partir d'un moment précis, par exemple, tous les soir ...

La solution que je préconise ici est assez simple à réaliser. Vous pourrez chercher des adaptations tout aussi simples pour permettre, par exemple, la fermeture automatique de toutes les bases clientes connectée à une base de données placée sur un serveur.

Comment allons-nous nous y prendre ? Nous ne connaissons pas l'heure en cours, si ce n'est en récupérant l'heure système par une fonction. Il faut donc passer son temps à vérifier que l'heure définie comme étant la limite n'est pas atteinte !

Le processus s'effectuera donc comme suit :

  1. Lancement de l'application
  2. Ouverture d'un formulaire en invisible
  3. Vérification de l'horaire à intervalle déterminé
  4. Si l'horaire est dépassé, affichage du formulaire en modal (blocage de l'application) pendant un temps donné
  5. Puis fermeture automatique de la base de données

1.2. Les Outils

Le seul outil simple, et vraiment important dans notre cas, à notre disposition est le formulaire. Il est le seul à posséder une fonction de Timer, et ses capacités d'affichage nous seront d'une grande aide. Nous allons donc avoir besoin :

  • d'une table contenant divers paramètres tels la durée entre deux vérifications, l'heure limite pour la fermeture de la base ;
  • d'un formulaire qui servira à la vérification de l'horaire et à l'affichage de l'information à l'utilisateur ;
  • d'une petite instruction à placer au lancement de l'application pour charger le formulaire... en invisible pour ne pas perturber l'utilisateur.

2. La table

2.1. La Structure

J'ai créé une table nommée tblShutDownParameters
Elle contient les champs suivants :

  • prmID : (Numérique - Octet) ID... s'assure qu'il n'y a qu'une seule ligne par la règle de validation
  • prmShutDownAt : (Date/Heure) Fermeture automatique de la base à ... (heure)
  • prmScannTimer : (Numérique - Entier Long) Nombre de secondes entre chaque vérification
  • prmShowTimer : (Numérique - Entier Long) Nombre de secondes pour afficher le message

Libre à vous de rajouter des champs si vous souhaitez, par exemple, activer/désactiver la fonction de ShutDown, l'automatiser pour certains jours, etc

2.2. Les Trucs et Astuces

Il fallait absolument empêcher qu'il y ait plus d'un enregistrement dans cette table. J'ai donc utilisé une technique amusante :

Le champ prmID est défini avec les propriétés suivantes :

  • Type de données : Numérique
  • Taille : Octet
  • Valeur par défaut : 1
  • Valide si : =1

Ainsi, la valeur entière ne pourra pas être autre chose que 1. Ce champ étant, par ailleurs défini en clé primaire, donc unique (cf le tutoriel sur les jointures) il sera impossible de créer une nouvelle ligne, une fois la ligne d'identifiant 1 créée.

La manipulation de quelques autres propriétés vous permettra d'affiner la saisie de l'utilisateur, comme par exemple ici, pour la saisie du champ prmShowTimer :

Image non disponible

3. Le Formulaire

Le formulaire va être l'âme de la solution. Aussi, nous allons détailler sa conception et son usage ci-après :

3.1. Le Formulaire

Le formulaire, dans notre cas, est lié à la table. Ceci n'est pas une obligation, et on pourrait imaginer qu'à chaque vérification de l'heure, il faille rechercher à nouveau les paramètres, afin de s'assurer qu'aucune modification de ces derniers n'existe, notamment dans le cas d'une mise en réseau de la solution.

Afin d'en définir un affichage correct, la plupart des propriétés de l'onglet Format a été modifiée, comme vous pouvez le constater sur l'image suivante :

Image non disponible

Pareillement, il a fallu veiller à certains aspects des données du formulaire. Permettre la modification des paramètres, sans pour autant les supprimer ni en ajouter, par exemple. Voici comment je m'y suis pris :

Image non disponible

Le formulaire sera défini en Fen. Indépendante et Fen. Modale, afin de bloquer l'usage de l'application à l'utilisateur pendant toute la durée de l'affichage de l'information.

Image non disponible

Bien sûr, il faudra faire un peu de code, et nous nous intéresserons maintenant à deux évènement du formulaire :

Image non disponible

dont voici le code :

Code de l'évènement d'activation
Sélectionnez

Private Sub Form_Current()
    'Lors de l'activation de l'enregistrement,
    '      les paramètres par défaut son générés
    Me.TimerInterval = Me.prmScannTimer * 1000
End Sub

Ce code se lancera automatiquement lorsque l'enregistrement en cours, donc le premier enregistrement, donc le seul est unique possible, au vu de ce que nous avons décis précédemment, s'activera. Il définira automatiquement la valeur de la propriété TimerInterval du formulaire, en fonction de ce que nous aurons prédéfini dans la table, au niveau du champ prmScannTimer.

Code de l'évènement timer
Sélectionnez

Private Sub Form_Timer()
    'ATTENTION : Les infos de la table sont en Secondes
    '            Les infos attendues en millisecondes.
    '            Penser à toujours multiplier par 1000 !
    '
    '
    'Sur le timer ...
    'Si l'heure limite est passée ...
    If TimeValue(Now()) >= TimeValue(Me.prmShutDownAt) Then
        'Si l'intervalle a déjà été remis à l'affichage
        If Me.TimerInterval = Me.prmShowTimer.Value * 1000 Then
            'Alors, quitter l'appli
            Application.Quit

        'Sinon,
        Else
            'mettre l'intervalle d'affichage
            'Et afficher le formulaire
            Me.TimerInterval = Me.prmShowTimer.Value * 1000
            Me.Visible = True
        End If
    'Sinon,
    Else
        'Rendre de toutes façons le formulaire invisible
        Me.Visible = False
    End If
End Sub

Ce bout de code est des plus intéressant, car, à chaque fois que le timer - le délai avant prochaine exécution, défini dans la table - est passé cette procédure se lance.

Il commence par tester si l'horaire limite est dépassé, puis la valeur de l'intervalle donné au Timer.

Si l'intervalle du Timer est celui de l'affichage, alors, il ferme l'application.

Sinon, il va afficher le formulaire, sans oublier de modifier la valeur de l'intervalle du Timer afin de définir la durée de l'affichage.

3.2. Les contrôles

3.2.1. La Zone de Texte : txtMessage

Nous avons besoin d'afficher un message à l'utilisateur. Par exemple : "La base va se fermer dans xxx secondes"

Une étiquette serait suffisante, mais, pour pouvoir dynamiquement afficher les secondes définies dans notre table, une Zone de Texte sera préférable. Au niveau de sa propriété Source Contrôle, nous aurons alors un expression telle que :

="La base va se fermer automatiquement dans " & [prmShowTimer] & " secondes"

Personnellement, j'ai fait le choix de mettre ce contrôle dans le premier onglet d'un contrôle Onglet, et de mettre l'ensemble des champs de la table dans le 2ème Onglet.

3.2.2. L'Onglet : ctlOnglet

Vous l'avez compris, nous avons un contrôle Onglet avec 2 pages

Le contrôle onglet contient quelques propriétés très intéressantes comme la possibilité de masquer les onglets, ce que nous utiliserons pour que l'utilisateur ne voie pas nos paramètres. Il s'agit de la propriété Style que vous voyez ici :

Ce contrôle ne sert à rien, dans le cas présent. Cependant, vous pourrez imaginer un moyen de rendre les onglets visibles afin de vous permettre une modification des paramètres ... La solution du masquage des onglets sert énormément dans le cas de la création d'assistant-like, et c'est la raison pour laquelle j'ai souhaité vous la montrer.

Image non disponible

4. Comment exécuter cet outils

Pour exécuter cet outils, vous devez soit le réaliser, soit le télécharger dans la rubrique suivante. Si vous choisissez de le télécharger, importez la table et le formulaire dans votre base. A partir de là, vous avez essentiellement 2 solutions : Soit un formulaire de démarrage dans votre application, soit une macro AUTOEXEC, mais de toutes les façons, il faudra lancer automatiquement le formulaire à l'ouverture.

Si vous optez pour la macro AUTOEXEC, ajoutez la commande OuvrirFormulaire, sans oublier de préciser que le Mode Fenêtre est 'Masquée'.

Si la solution VBA vous convient mieux, une ligne comme :

Exemple de code pour le lancement de l'outils
Sélectionnez

    DoCmd.OpenForm "frmShutDownParameters", WindowMode:=acHidden

5. Télécharger la base source ...

Vous pouvez télécharger un exemple zippé de cette base au format Access 97 ici

Pour les versions Access 2000 et ultérieures, vous pouvez télécharger un exemple zippé de cette base ici

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Mes tutoriels :
(23/10/04) La notion de Classe de Formulaire Access
(21/08/04) Access - Les Bases : Introduction et Conception
(20/08/04) Fermer automatiquement une base Access
(28/03/04) Comprendre les jointures / Relations dans Access
Mes articles :
(21/06/04) Faut-il Développer en PME (Le Monde Informatique)
(15/03/04) Les Nouveautés Access 2003
Mes sites :
Sur access-maxence
Mon blog
Case Studio (Logiciel de modélisation de données)
En cours de production :
Access - Les Bases : Suite et Fin
Tutoriel sur les Sous-Formulaires
En Projet :
Listing explicatif des fonctions d'Access
Access - Perfectionnement : Exploitation des données
Access - Expert : Interface et automatisation
Access - VBA
Access - VBA : Perfectionnement

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.