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 :
- Lancement de l'application
- Ouverture d'un formulaire en invisible
- Vérification de l'horaire à intervalle déterminé
- Si l'horaire est dépassé, affichage du formulaire en modal (blocage de l'application) pendant un temps donné
- 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 :
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 :
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 :
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.
Bien sûr, il faudra faire un peu de code, et nous nous intéresserons maintenant à deux évènement du formulaire :
dont voici le code :
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.
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.
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 :
DoCmd.OpenForm
"frmShutDownParameters"
, WindowMode:=
acHidden