Access et Fichiers Batch : Passage de Paramètres

Jean-Philippe ANDRÉ

L'objectif de ces quelques lignes est de mettre en lumière les possibilités de passage de paramètres à Access depuis Batch.

- Titre : Access et Fichiers Batch : Passage de Paramètres

- Auteur : Jean-Philippe ANDRÉ

- Parution : 9 avril 2009

- Licence : Copyright ® 2009 Jean-Philippe ANDRÉ. 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. Avertissements

- III. Pré-requis

- IV. Exemple d'un besoin utilisateur

- V. Utilisation des tâches planifiées

- V-A. Comment utiliser le planificateur de tâches Windows

- V-B. Comment créer une tâche planifiée ?

- V-B-1. Lancer la création d'une nouvelle tâche

- V-B-2. Paramétrer la nouvelle tâche

- V-B-3. Exemple de planification

- VI. Utilisation des fichiers batch

- VI-A. Comment créer un fichier batch

- VI-B. Outils de développement

- VII. Ouverture d'Access par un batch

- VIII. Exécution automatique dans Access

- IX. Priorité de traitement des données

- X. Passage de paramètres

- XI. Plusieurs comportements ?

- XII. Codes VBA et Batch

- XII-A. Idée générale

- XII-B. Fonction initiale

- XII-C. Exemples

- XII-C-1. Lancement d'une requête

- XII-C-2. Lancement d'une macro

- XII-C-3. Lancement d'un formulaire

- XII-D. Combinaison de plusieurs paramètres de type d'exécution identique

- XII-D-1. Exemple : exécution de plusieurs requêtes

- XII-D-2. Exemple : exécution de plusieurs macros

- XII-E. Plus loin dans la combinaison des paramètres

- XII-E-1. Paramètres de types d'exécution différents

- XII-E-2. Exécution de plusieurs paramètres de types différents

- XIII. Conclusion

- XIV. Remerciements

I - Introduction

Cet article fait suite à la constatation du besoin de certains membres d'automatiser le lancement de requêtes dans Access depuis un fichier batch. Automatiser un lancement ? Un fichier batch ? Que de notions qui seront ici expliquées dans ces quelques lignes. L'article initiateur de celui-ci est celui de Loufab, que vous pouvez retrouver ici : Utilisation des options de démarrage de la ligne de commande. Le but de cet article est de partir des exemples donnés avec la fonction /cmd (voir le chapitre en question) pour multiplier les comportements à l'ouverture de la base selon les paramètres qu'on lui passera. Elle permettra aux utilisateurs de gérer eux-mêmes des lancements automatiques totalement autonomes, sans une présence obligatoire devant la machine.

II - Avertissements

Pour cet article il est bon de définir une convention d'écriture. Le caractère " doit être scrupuleusement reproduit. L'utilisation de la touche F1 est vivement conseillée à tous les stades de l'utilisation d'ACCESS. L'amélioration constante de l'aide en fait un partenaire de choix dans l'apprentissage permanent d'ACCESS. Personnellement je ne peux m'en passer, ne serait-ce que pour mémoire.

III - Pré-requis

Bien qu'elle ne soit pas obligatoire, je recommande la lecture de l'article précédemment cité de Loufab. Les fonctions VBA évoquées sont documentées dans l'aide en ligne ainsi que dans la FAQ à votre disposition ici : https://access.developpez.com/faq.

IV - Exemple d'un besoin utilisateur

Plaçons-nous dans le cas d'un utilisateur travaillant dans la finance.
Il travaille avec des plates-formes boursières, qui lui délivrent des données tout au long de la journée.
Une journée type de ses activités avec une application Access pourrait se dérouler de la façon suivante :
Il souhaite effectuer un traitement à 9h00, une récupération des prix de la veille, à la fermeture de la bourse de Paris. Il effectue sur des données des calculs puis les met à disposition des autres équipes.
A 11h00, il doit lancer d'autres traitements, pour la vérification des notations des entreprises, avec pour conséquence d'imposer des suspensions de validations, si certains critères ne sont pas respectés.
A 14h00, un export sous Excel doit être généré avec les données de la matinée.
A 17h30, la valorisation des portefeuilles des gérants avant la fermeture de la bourse.
A 18h00, les données doivent être stockées sur le serveur des équipes risques pour une contre valorisation.

Bref, plutôt que d'imposer une présence continue et un lancement manuel de chacune des procédures en cours de journée, à horaires précises, on veut pouvoir automatiser ces lancements avec des outils simples à mettre en place.

V - Utilisation des tâches planifiées

Dans une journée, un utilisateur peut souhaiter effectuer des tâches diverses (lancer une requête, mettre à jour un fichier, générer un état, etc.). Ces tâches devant parfois être effectuées à des horaires précis (ouverture/fermeture de la bourse, mise à jour des données par des robots, début/fin de journée, etc.), il est courant d'utiliser un planificateur de tâches. Celui-ci peut être intégré au système d'exploitation ou bien être indépendant et installé sur le poste de travail.
NB : une synchronisation avec un serveur de temps peut être nécessaire.

V-A - Comment utiliser le planificateur de tâches Windows

Sous Windows XP, on accède aux tâches planifiées via le menu
Démarrer>Paramètres>Panneau de configuration>Tâches Planifiées

Fenêtre des tâches planifiées Windows

Une tâche planifiée est une tâche qui peut être lancée :

- A une date prédéfinie

- A un horaire prédéfini

- A une fréquence prédéfinie

V-B - Comment créer une tâche planifiée ?

V-B-1 - Lancer la création d'une nouvelle tâche

- Double clic sur Création d'une tâche planifiée

ou

- Clic droit>Nouveau>Tâche Planifiée

V-B-2 - Paramétrer la nouvelle tâche

- En passant par l'Assistant

1. Choix du fichier batch à lancer

2. Choix de la fréquence

3. Choix de l'horaire du lancement et du début du traitement

4. Spécification du compte duquel sera lancée la tâche

5. Validation de la tâche nouvellement créée

- En passant par le clic droit

1. Clic droit sur la nouvelle tâche>Propriété

2. Choix du programme à exécuter : Parcourir

3. Choix de la fréquence et de l'horaire du lancement de la tâche

4. Optionnel : Précision sur la fin de vie de la tâche

5. Validation de la nouvelle tâche

V-B-3 - Exemple de planification

Le planificateur exécute/ouvre un fichier, indiqué par l'utilisateur (C:\temp\bd1.mdb), avec un horaire (08h00), une fréquence (toutes les heures) et une durée de vie de la tâche dans le temps (jusqu'au 30 avril 2009).

VI - Utilisation des fichiers batch

La fonction de base d'un fichier batch (qui s'exécute manuellement ou depuis un planificateur de tâches) est d'exécuter une suite de commandes DOS. L'article de Loufab indique les principales syntaxes auxquelles les utilisateurs ont affaire. Une ligne DOS se décompose basiquement en 2 parties :

- le logiciel A avec lequel on souhaite ouvrir un fichier B

- le répertoire du fichier B à exécuter avec le logiciel A

Le fichier batch porte l'extension .bat et s'exécute avec un double-clique sur le fichier.

VI-A - Comment créer un fichier batch

Un fichier batch est un simple fichier texte. Il peut être créé et rempli depuis n'importe quel éditeur de texte. Le cours de Victor Laurie à ce sujet https://windows.developpez.com/cours/ligne-commande/ est très complet.

VI-B - Outils de développement

Plusieurs outils sont possibles. Ma préférence va à NotePad++ : http://notepad-plus.sourceforge.net/fr/site.htm D'autres outils sont téléchargeables à l'adresse suivante : http://astase.com/produits/

VII - Ouverture d'Access par un batch

Il est possible de lancer Access en exécutant un fichier batch. La ligne de commande DOS basique est la suivante :

Start /WAIT msaccess.exe "C:\temp\bd1.mdb"

Cela lance Access, attend que l'application soit chargée et Access se charge d'ouvrir le fichier bd1.mdb, situé dans le répertoire C:\temp de la machine. De la même façon, comme indiqué dans l'article de Loufab, il est possible d'exécuter une macro après avoir ouvert le fichier bd1. Si on veut lancer la macro Macro1, la ligne de commande sera alors :

Start /WAIT msaccess.exe "C:\temp\bd1.mdb" /x Macro1

NB : Dans le cas où les noms de fichiers ou macros sont composés (existence d'espaces entre les mots), il est obligatoire de mettre les noms entre guillemets.

Start /WAIT msaccess.exe "C:\temp\bd1.mdb" /x "Ma Super Macro 1"

Cette ligne permettant de lancer la macro " Ma Super Macro 1 ". Les possibilités de batch ne se limitent heureusement pas à un choix de macro à lancer. L'article de Loufab indique les spécifications demandées à Access lors de son ouverture.

VIII - Exécution automatique dans Access

L'utilisateur peut sélectionner le formulaire qu'il souhaite lancer à l'ouverture en sélectionnant dans le menu Outils>Démarrage.

Le formulaire suivant s'ouvre et permet de sélectionner le nom du formulaire (zone " Afficher formulaire/page ").

De la même façon, il est possible de lancer des macros à l'ouverture, en nommant la première macro " AutoExec ". Tout un processus alliant macro/code VBA/génération d'état pourra être possible. L'avantage de ce système est de pouvoir effectuer à chaque ouverture la même série de processus sans qu'une intervention de l'utilisateur soit forcément nécessaire. L'inconvénient d'une manipulation automatique à l'ouverture est qu'un processus peut avoir lieu à un moment critique, modifiant des données qui ne devraient pas l'être, à cause d'un lancement trop hâtif ou trop tardif. Toutefois, l'auteur peut biaiser l'exécution automatique en ouvrant la base depuis Windows, en enfonçant la touche Shift.

IX - Priorité de traitement des données

Une question doit aussi être désormais posée : qui a la priorité ? Batch ou AutoExec ? Dans notre cas on étudie le comportement issu du code Batch suivant :

Start /WAIT msaccess.exe "C:\temp\bd1.mdb" /x Macro1

Ce fichier ouvrira une nouvelle application Access et demandera à lancer la macro Macro1.
NB : ce type de lancement s'affranchit du fait qu'un fichier soit déjà ouvert ou pas. Il l'ouvre en plusieurs exemplaires. Les problèmes liés à un accès multi utilisateur font déjà l'objet d'un article de Dolphy35 (Comment utiliser une application en mode multi-utilisateurs). Access lance toujours en priorité la macro AutoExec à l'ouverture. L'application lance ensuite la macro spécifiée sur la ligne de commande précisée dans le fichier batch.
Dans notre cas, en faisant apparaitre des boîtes de message dans les macros, on aura un déroulement comme suit :

puis

NB : si on exécute la ligne batch suivante

Start /WAIT msaccess.exe "C:\temp\bd1.mdb" /x AutoExec

On lancera deux fois la macro AutoExec, et non pas une seule fois.

X - Passage de paramètres

On cherche donc à faire passer des informations à Access afin de paramétrer son comportement. On verra dans le chapitre 9 les codes batch et VBA à mettre en œuvre pour influer sur le comportement du fichier à l'ouverture. En dehors d'une information stockée dans un fichier, une table ou dans le système, il est possible de faire passer directement les informations depuis la ligne de commande batch.
Cette information peut donc se résumer à une chaîne de caractères.

La nouvelle étape est donc pour le développeur de mettre en place une nomenclature d'écriture, qui soit efficace et logique pour être naturelle, mais suffisamment complexe pour passer un grand nombre d'informations si nécessaire. L'information peut se limiter à un nom de formulaire à ouvrir, à une macro à lancer, à une requête à exécuter… mais si d'un coup on veut passer les trois à la suite ? Il faut donc mette en place un séparateur, qui délimitera chaque élément qu'on souhaitera faire passer en tant que paramètre.

XI - Plusieurs comportements ?

Le comportement d'un fichier, quel drôle d'idée ! Et pourtant on peut trouver de bons exemples de ce qu'on pourrait définir comme comportement d'un fichier. Son autonomie, par exemple, où un fichier effectue une série de processus seul, sans autre intervention de l'utilisateur que son ouverture initiale. Des menus qui apparaissent ou non selon le compte utilisateur, selon son niveau d'accréditation. De la même façon, on peut imaginer le grossissement des polices d'écriture pour un utilisateur qu'on aura identifié comme déficient visuel.

Il est possible de paramétrer toutes ces propriétés dans Access. Le développeur doit donc préparer la gestion en amont. Cette gestion des individus passe souvent par une table des utilisateurs. Mais il serait pratique qu'en cas d'absence d'administrateur, un simple fichier puisse contenir toutes ces informations et qu'Access puisse y lire ces informations (qui je suis ? ce que je vais faire ? quels sont mes droits ?).
Bien que non présent nativement dans les fonctions Access, l'auteur se propose d'utiliser les propriétés de traitement de chaînes de caractères pour imposer un comportement au fichier Access dès son ouverture par le fichier batch.

XII - Codes VBA et Batch

XII-A - Idée générale

Il est possible de passer des paramètres depuis le fichier batch à la suite de la fonction Command( ) /cmd.

Option

/CMD ou ;

Ligne de commande

start /WAIT_msaccess.exe "C:\temp\bd1.mdb" /cmd "paramètre"
ou
start /WAIT msaccess.exe "C:\temp\bd1.mdb" ; "paramètre"

Description

Ouvre le fichier en passant le paramètre spécifié.

Ces paramètres sont ensuite récupérés par la fonction Command( ) dans une fonction VBA, lancée à l'ouverture du fichier mdb.

XII-B - Fonction initiale

La fonction qui permet de récupérer les paramètres passés dans le batch est de la forme :

Function StartUp( )
Dim monparam as Variant  ' déclare une variable

monparam = Command( )     ' affecte la valeur transmise à la variable
If Not IsNull(monparam) Then     'si la variable est nulle
If Len(monparam)>0 Then     'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
'code de traitement
End If
End If

End Function

On doit donc créer une macro nommée AutoExec, qui exécutera la fonction StartUp.

On enregistre cette macro avec le nom AutoExec.

Les chapitres suivants montreront les exemples d'exécution de différents objets dans Access. Y seront successivement indiqués les cas d'utilisation de ces codes, leur traitement dans la fonction StartUp( ) et les résultats attendus.

XII-C - Exemples

XII-C-1 - Lancement d'une requête

Ici, on souhaite afficher le résultat d'une requête Action, id est de type UPDATE, DELETE, SELECT … INTO, DROP, etc.

La ligne de commande batch serait du type

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "SELECT MonChamp1, MonChamp2 INTO MaTableBis FROM MaTable;"

Le code VBA sera donc

Function StartUp( )
Dim monparam as Variant  ' déclare une variable

monparam = Command( )     ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then     'si la variable est nulle
If Len(monparam)>0 Then     'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
CurrentDb.Execute monparam
End If
End If
End Function

On estimera que le code SQL est valide. Une gestion d'erreur peut être intégrée dans le module StartUp().

XII-C-2 - Lancement d'une macro

Ici, on souhaite lancer une macro dont on passera le nom en paramètre. La ligne de commande batch serait du type

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "MaMacro"

Le code VBA sera donc :

Function StartUp( )
Dim monparam as Variant  ' déclare une variable
monparam = Command( )     ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then     'si la variable est nulle
If Len(monparam)>0 Then     'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
DoCmd.RunMacro monparam
End If
End If
End Function

A noter qu'une autre manière d'exécuter une macro est de lancer directement la ligne commande suivante :

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /x MaMacro

XII-C-3 - Lancement d'un formulaire

Ici, on souhaite ouvrir un formulaire dont on passera le nom en paramètre. La ligne de commande batch sera

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "MonForm"

Le code VBA sera donc :

Function StartUp( )
Dim monparam as Variant  ' déclare une variable

monparam = Command( )     ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then     'si la variable est nulle
If Len(monparam)>0 Then     'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
DoCmd.OpenForm monparam
End If
End If

End Function

A noter qu'une autre manière d'ouvrir un formulaire au démarrage est de le spécifier dans les options : Outils>Démarrage. On a donc pu voir les principales exécutions issues des paramètres. Le paragraphe suivant a pour but de complexifier le raisonnement en passant plusieurs paramètres.

XII-D - Combinaison de plusieurs paramètres de type d'exécution identique

L'idée est de séparer chacun des paramètres par un pipe " | ", et de traiter tous les paramètres les uns à la suite des autres. La méthode employée par l'auteur ici n'est pas la plus usitée, le lecteur pourra bien évidemment trouver d'autres façons d'aborder le sujet.

XII-D-1 - Exemple : exécution de plusieurs requêtes

Ligne de commande

start /WAIT msaccess.exe "C:\temp\bd1.mdb" ; "SELECT MonChamp1 INTO MaTableBis FROM MaTable;|SELECT MonChamp1 INTO MaTableTer FROM MaTableBis ;"

On utilise la fonction Split() pour récupérer les différents paramètres.

Function StartUp()
Dim monparam As Variant  ' déclare une variable
Dim RecuperationSplit As Variant
Dim i As Integer
monparam = Command()     ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then    'si la variable est nulle
If Len(monparam) > 0 Then   'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
RecuperationSplit = Split(monparam, "|")
For i = 0 To UBound(RecuperationSplit)
DoCmd.RunSQL RecuperationSplit(i)
Next i
End If
End If
End Function

Etat de la base initiale

Résultat après lancement du batch

On constate que les bases MaTableBis et MaTableTer ont bien été créées.

XII-D-2 - Exemple : exécution de plusieurs macros

Ligne de commande

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "MaMacro1|MaMacro2"

On utilise la fonction Split() pour récupérer les différents paramètres.

Function StartUp()
Dim monparam As Variant  ' déclare une variable
Dim RecuperationSplit As Variant
Dim i As Integer
monparam = Command()     ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then    'si la variable est nulle
If Len(monparam) > 0 Then   'on s'assure qu'un paramètre a été passé, sinon pas de comportement particulier
RecuperationSplit = Split(monparam, "|")
For i = 0 To UBound(RecuperationSplit)
DoCmd.RunMacro RecuperationSplit(i)
Next i
End If
End If
End Function

XII-E - Plus loin dans la combinaison des paramètres

XII-E-1 - Paramètres de types d'exécution différents

En partant de l'exemple donné plus haut, on peut pousser le raisonnement de l'exécution des paramètres selon leur type. On appliquera donc une nomenclature pour se retrouver. Chaque paramètre sera précédé d'un identifiant mono caractère alphanumérique.
Par souci de compréhension, on prendra comme exemples :

Identifiant alphanumérique

Objet associé

Fonction de lancement VBA

Exemple

F

Formulaire (Form)

DoCmd.OpenForm

FMonForm

M

Macro

DoCmd.RunMacro

MMaMacro

Q

Requête (Query)

CurrentDb.Execute

QMaQuery

Etc.

On lancera donc la ligne de commande suivante :

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "mMaMacro"

Le code VBA sera le suivant :

Function Startup()
Dim monparam    As Variant                               ' déclare une variable

monparam = Command()                           ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then    ' si la variable est nulle
If Len(monparam) > 0 Then
Select Case UCase(Left(monparam, 1))
Case "Q":
CurrentDb.Execute Right(monparam, Len(monparam) - 1)
Case "M":
DoCmd.RunMacro Right(monparam, Len(monparam) - 1)
Case "F":
DoCmd.OpenForm Right(monparam, Len(monparam) - 1)
End Select
Application.Quit
End If
End If
End Function

XII-E-2 - Exécution de plusieurs paramètres de types différents

De la même façon que pour la gestion de plusieurs paramètres de même type, on adapte les derniers exemples pour obtenir cette ligne de commande :

start /WAIT msaccess.exe "C:\temp\bd1.mdb" /cmd "mMaMacro|FMonForm"

On souhaite donc d'abord lancer la macro MaMacro puis ouvrir le formulaire MonForm. Le code VBA sera donc le suivant :

Function Startup()
Dim monparam    As Variant  ' déclare une variable
Dim RecuperationSplit As Variant
Dim i As Integer

monparam = Command() ' affecte la valeur transmise à la variable

If Not IsNull(monparam) Then    ' si la variable est nulle
If Len(monparam) > 0 Then
RecuperationSplit = Split(monparam, "|")
For i = 0 To UBound(RecuperationSplit)
Select Case UCase(Left(RecuperationSplit(i), 1))
Case "Q":
CurrentDb.Execute Right(RecuperationSplit(i), Len(RecuperationSplit(i)) - 1)
Case "M":
DoCmd.RunMacro Right(RecuperationSplit(i), Len(RecuperationSplit(i)) - 1)
Case "F":
DoCmd.OpenForm Right(RecuperationSplit(i), Len(RecuperationSplit(i)) - 1)
End Select
Next i
End If
End If

End Function

XIII - Conclusion

Il est donc possible pour un utilisateur de générer des fichiers batch qui passent des paramètres dans Access, et que ceux-ci soient lus et compris par l'application. La nomenclature de programmation proposée dans cet article n'est qu'un exemple, libre à chacun d'adapter les idées de traitement des paramètres passés par le fichier batch.

XIV - Remerciements

Je tiens à remercier l'équipe de Developpez.com pour la qualité du site, Philippe JOCHMANS, Morgan BILLY et Laurent Dardenne pour la relecture de cet article, et de tous ceux qui contribuent à l'entraide autour du développement dans le cadre personnel et professionnel.