Escolar Documentos
Profissional Documentos
Cultura Documentos
Synthèse
de cours
&
exercices
corrigés
Access 2007
Microsoft®
®
et VBA
collection
Synthex
Bernard MINOT
Access Livre Page I Mercredi, 27. f vrier 2008 7:28 07
Informatique
Synthèse
de cours
& exercices
corrigés
Access 2007 ®
et VBA
Bernard Minot
université Paris-Est
collection
Synthex
Access Livre Page II Mercredi, 27. f vrier 2008 7:28 07
ISBN : 978-2-7440-4014-6
ISSN : 1768-7616
Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚
et 3˚ a) du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson
Education France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.
Access Livre Page III Mercredi, 27. f vrier 2008 7:28 07
Sommaire
Introduction 1
Sommaire III
Access Livre Page IV Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 1 Mercredi, 27. f vrier 2008 7:28 07
Introduction
Introduction 1
Access Livre Page 2 Mercredi, 27. f vrier 2008 7:28 07
se positionne au plus près des besoins des PME : ni trop complexe, auquel cas il serait
réservé aux professionnels de l’informatique, ni trop léger et voué alors à un échec
commercial certain.
mieux bien connaître la palette des outils à disposition (les types de contrôles dans le jar-
gon du métier) afin de choisir à bon escient celui qui sera le plus pertinent pour l’utilisa-
teur. L’esthétique des formulaires, qui peut être relativement poussée si le dessinateur veut
s’en donner la peine, comptera ici beaucoup moins que l’efficacité dans la présentation et
le traitement des données.
En premier lieu, mais l’utilisateur ne le verra pas, le moteur de base de données Microsoft
Jet des versions 2003 et antérieures a été remplacé par ADE (Access Data Engine) ; l’une des
conséquences de cette évolution se constate dans le changement de type de fichier
(« .accdb » à la place de « .mdb »), qui rend toutes les versions antérieures incompatibles.
Access 2007 peut lire les fichiers « .mdb » mais Access 2003 ne lit pas les fichiers « .accdb ».
L’utilisateur aura donc tout intérêt à transférer ses bases au nouveau format, avec les
nombreuses implications visuelles que cela entraîne.
Introduction 3
Access Livre Page 4 Mercredi, 27. f vrier 2008 7:28 07
Et sur ce point, les concepteurs d’applications Access ne seront pas aidés par le nouveau
produit : alors que la version 2003 était dotée d’un assistant graphique fort commode
pour réaliser rapidement des menus complets, le nouvel outil, qui utilise désormais le
langage XML, nécessite la saisie manuelle du code sur un éditeur externe à Access !
Autre innovation, le volet de navigation, à gauche de l’écran, présente tous les objets de la
base et peut, le cas échéant, devenir une forme de menu général (en plus de la barre de
menu et des rubans). L’ergonomie générale des applications développées s’en trouvera
donc fortement modifiée, même si ce volet peut être rétractable.
Alors qu’Access 2003 présentait toujours ses éléments en pleine page, la version 2007 offre
la possibilité d’ouvrir simultanément de nombreux documents et de les présenter sous
forme d’onglets supérieurs, un peu à la manière des onglets bas d’Excel. Le graphisme
général a ainsi été profondément modifié, le plus souvent en mieux : les zones de date, par
exemple, sont désormais systématiquement associées à un petit calendrier, alors que tou-
tes les colonnes peuvent être triées et filtrées avec les mêmes menus contextuels que sous
Excel.
Les assistants à la création d’objets (requêtes, formulaires, états) ont été poussés à tel point
qu’un simple clic suffit désormais à une génération immédiate, sans même d’étapes de
conception, devenues seulement optionnelles. Microsoft insiste là sur la capacité d’Access
à monter très vite de petits projets d’entreprise : il s’agit du créneau essentiel d’utilisation
du produit.
Tout au contraire, Microsoft n’insiste plus sur la mise en ligne sur Internet des projets
Access, secteur dans lequel d’autres concurrents, notamment du monde libre avec des
produits comme MySQL, ont largement pris de l’avance. En revanche, tous les pro-
duits Office peuvent désormais partager des données sur un site SharePoint sous Win-
dows Server 2003, publié sur Internet. Cette nouvelle notion permet de partager et de
synchroniser, par exemple, des tables communes à tous les services d’une petite entre-
prise.
La taille maximale d’un fichier « .accdb », enfin, est maintenue à 2 Go, comme dans les
versions antérieures, limitant par là les velléités de projets inadaptés. À l’inverse
d’Excel, qui a multiplié par 1 000 le nombre de cellules d’une feuille, Access reste donc
contraint dans son ancienne volumétrie : les projets plus ambitieux devront passer à
SQL Server !
Structure de l’ouvrage
Le dessin général du livre reprend, très classiquement, l’ordre dans lequel est construite
une base de données. Mais nous avons inséré des points sur lesquels il nous semble indis-
pensable d’insister.
Le premier chapitre part à la découverte du produit via une base de données fournie par
Microsoft pour répondre aux questions du néophyte. Quels sont les éléments constituant
une base de données ? Comment lie-t-on tous ces éléments entre eux ? À la découverte du
vocabulaire se joint une réflexion sur la manière dont se construit un système d’infor-
mation.
Périmètre de l’ouvrage
Toutes les fonctionnalités et tous les détails d’Access ne sont pas passés en revue. Il ne s’agit
pas d’une encyclopédie inventoriant l’exhaustivité des possibilités offertes : il faudrait
pour cela un ouvrage beaucoup plus volumineux, que d’autres ont déjà fait, qui servirait plus
de référentiel occasionnel que de livre de travail et d’études.
Tout au contraire, il nous a été difficile de ne pas aborder certains sujets un peu moins
importants : après arbitrage, le livre contient l’essentiel des fonctions utilisées généra-
lement et, parmi celles-ci, de très simples comme d’assez complexes.
Introduction 5
Access Livre Page 6 Mercredi, 27. f vrier 2008 7:28 07
Dans la partie relative à la programmation en langage Visual Basic, il nous a paru plus
important d’insister sur l’utilisation du langage SQL via VBA et sur la notion de jeu
d’enregistrements qui ouvre la voie à de nombreux programmes, plutôt que sur la partie
boucles ou gestion des entrées/sorties.
• ceux qui pratiquent déjà Access et profitent de la version 2007 pour approfondir leurs
connaissances ;
• ceux qui pratiquent déjà Access et ressentent le besoin d’un appui pour passer à la nouvelle
version, en particulier pour mettre à jour les bases de données déjà conçues ;
• tous les professionnels qui, de près ou de loin, ont besoin de mettre en place de petites
bases de données dans le cadre de leur métier de gestionnaire, dans la plus large acception
du terme.
Les suppléments
Les fichiers des exercices et des exemples, au format source « .accdb », sont téléchargeables
sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr. Le lecteur pourra les mettre
en œuvre pour son apprentissage, mais aussi les compléter et se constituer ainsi sa propre
base d’exemples.
L’auteur
Bernard Minot est professeur associé (PAST) à l’université Paris-Est. Docteur en histoire
économique, diplômé d’audit informatique et Certified Information Systems Auditor, il
dirige également un cabinet d’audit informatique. Sa mission à l’université consiste à
rapprocher les mondes universitaire et professionnel ; dans ce cadre, il assure un ensei-
gnement sur la mise en pratique des tableurs et des bases de données, ainsi que sur l’audit
informatique.
Remerciements
Remerciements à Jean-Michel Léry, relecteur méthodique et efficace, pour son assistance.
Une attention toute particulière pour Caroline Rimbault-Minot et sa constante
complicité.
Introduction 7
Access Livre Page 8 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 9 Mercredi, 27. f vrier 2008 7:28 07
9
Access Livre Page 10 Mercredi, 27. f vrier 2008 7:28 07
Figure 1.1
Démarrage
d’Access.
• Le pavé central permet de choisir parmi des bases de données « prêtes à l’emploi »
concernant des domaines variés (Contacts, Etudiants, etc.).
• L’icône en haut à gauche du pavé central permet de créer un fichier vide qui contiendra
ultérieurement tous les objets que l’on créera.
• La partie droite de l’écran permet d’ouvrir des fichiers déjà créés ou des bases récemment
utilisées.
La base de données à sélectionner se trouve sous le libellé « Exemple » de la partie de gauche
de l’écran et s’appelle « Northwind ».
1. Cliquez sur « Exemple » à gauche.
2. Cliquez sur « Northwind ».
3. Cliquez sur le bouton « Créer » en bas à droite après avoir noté le chemin où sera créé
le fichier Northwind.accdb 1.
4. Une boîte message propose la connexion sous un nom d’utilisateur : prendre celui par
défaut et cliquer sur Connexion.
1. Dans une configuration Microsoft Vista, le fichier est inséré sous C:\Users\Nom_Utilisateur\Documents ; dans une configuration
Microsoft XP, il sera sous C:\Documents and Settings\Nom_Utilisateur\Mes documents.
Figure 1.2
L’accueil dans la base de données se visualise comme à la figure 1.2.
1
Chapitre
1. Il n’existe pas, comme dans Word ou Excel, d’option de menu supplémentaire et spécifique « Développeur ».
La partie gauche de l’écran intègre un volet de navigation qui contient et représente tous
les objets de la base, qu’ils soient préexistants ou créés par l’utilisateur. La nature même
des objets n’est pas toujours indiquée, la seule distinction étant désormais établie par le
logo de l’objet. Fondamentalement, on retiendra donc les grandes classes suivantes,
comme elles se présentent à la figure 1.3.
Figure 1.3
Types et logos
des objets Access.
• Les tables contiennent les données stockées ; leur nombre est illimité. Ces tables peu-
vent être en relation les unes avec les autres, d’où l’expression de base de données
relationnelle.
• Les requêtes mémorisent des instructions d’interrogation des tables. On parlera dans
d’autres bases de données de « Vues ». Une requête peut être lancée à tout moment
pour obtenir des résultats soit de visualisation, soit de manipulation des données
(ajout, modification, suppression).
• Les formulaires génèrent des masques de visualisation des données. Alors que l’affi-
chage des tables n’a pour rendu qu’une grille de données (un peu comme dans un
tableur), les formulaires procurent une interface homme/machine agréable. Un formu-
laire peut être basé directement sur une table mais aussi sur une requête ; il permet
toutes les manipulations de données.
• Les états permettent les impressions ; paramétrables, ils autorisent des tris et totali-
sations des données à imprimer.
• Les macros, fondamentalement différentes de celles d’Excel, mémorisent des actions
présélectionnées. Elles peuvent être lancées directement ou bien à partir de boutons
créés dans des formulaires.
• Les modules sont des containers de code Visual Basic. Ils peuvent être écrits directement
ou résulter de la traduction de macros.
Le volet de navigation peut être caché pour laisser plus de place et de visibilité aux formu-
laires et autres objets ouverts. Cliquez sur le double chevron tourné vers la gauche pour le
faire disparaître ; il sera possible de le faire réapparaître à tout moment.
Alors que cette partie gauche de l’écran était constante dans les versions d’Access anté-
rieures à 2007, elle est maintenant devenue paramétrable. L’idée consiste à permettre de
construire une sorte de menu en utilisant cette partie de l’écran et non plus la barre de menus
1
Chapitre
supérieure comme par le passé. Le volet de navigation comprend la mention « Les Comp-
toirs » en haut : il s’agit d’un libellé et d’un menu 1 créés par le programmeur pour afficher
les objets voulus. En dessous, « Clients et commandes », « Inventaires et achats » sont de
grandes rubriques contenant elles-mêmes les objets Access. Ainsi, l’objet « Les dix premières
commandes » compris dans la rubrique « Clients et commandes » est une requête, alors
que l’objet immédiatement en dessous est un formulaire. Un double-clic sur l’un de ces
objets en permet l’ouverture dans la partie droite de l’écran.
1. Cliquez sur le triangle tourné vers le bas, situé en haut à droite du Volet de Navigation.
Une zone de liste déroulante permet d’ordonner différemment les objets de la liste.
2. Cliquez sur « Type d’objet » : le volet de navigation n’affiche plus que les grandes classes
d’objets Access vues plus haut.
3. Développez les tables en cliquant sur le double chevron tourné vers le bas : vous listez
la totalité des tables contenues dans la base (voir figure 1.4).
Figure 1.4
Visualisation des
seules tables dans le
volet de navigation.
Un clic sur le triangle à droite de « Tous les objets Access » suivi du choix de « Les Comptoirs »
permet de revenir à la situation de départ.
Cette manipulation montre que le travail sur la base Northwind peut s’opérer de deux
manières :
• soit en qualité de simple utilisateur grâce aux menus de gauche tels qu’ils ont été conçus
par le programmeur ;
1. Et plus précisément une « catégorie » du volet de navigation comme on le verra plus loin.
• soit en qualité de développeur, en affichant tous les objets, même ceux qui ne sont pas
inclus dans le volet de navigation préparamétré.
Outre ces deux approches, il est possible d’afficher les objets sous divers autres ordonnan-
cements comme les dates de création ou de modification, l’association d’objets (tables et
formulaires liés par exemple) et d’autres critères encore. Il est inutile, au moins dans un
premier temps, de multiplier les affichages sous peine de se disperser dans différentes voies
d’accès aux objets.
Un clic droit sur la catégorie « Les Comptoirs », en haut à gauche, ouvre une fenêtre
déroulante qui présente, en sus des options déjà vues :
• Les « Options de navigation », qui permettront plus tard de monter des menus person-
nalisés.
• Un « Volet de recherche » ouvrant une petite fenêtre de recherche en haut du volet de
navigation. Les recherches se feront par mot-clé, l’établissement de la liste résultante se
réalisant au fur et à mesure de la saisie.
enregistrement d’une série de 49. Il est plus rapide d’employer les boutons de déplacement
que les flèches directionnelles du clavier. Ces boutons permettent respectivement, et de
gauche à droite, d’aller au premier, au précédent, au suivant et au dernier de la liste.
Parmi les champs affichés, certains ont des caractéristiques bien particulières :
• le champ Date de commande, quand il est actif, s’accompagne d’un petit calendrier à
droite qui devrait permettre le choix d’une date ;
• le champ Représentant est une zone de liste déroulante qui affiche tous les représentants
présents dans la base ;
• le champ Client est une autre zone de liste déroulante.
Là encore, toutes ces commodités de saisie sont des artifices créés par le programmeur
pour simplifier ou guider la tâche de l’utilisateur. Nous apprendrons à les créer dans les
prochains chapitres.
En haut de chaque colonne, chaque nom de champ s’accompagne d’un petit triangle à sa
droite, dont l’ouverture donne la possibilité de trier et filtrer la liste suivant de nombreux
critères (voir figure 1.5).
Figure 1.5
Tris et filtres sur une
liste de formulaire.
• Les deux premières lignes proposent de trier par ordre alphabétique : Access sait que la
colonne concernée est alphabétique et suggère d’emblée un critère de tri logique.
• La ligne Filtres de texte propose de nombreux critères de filtres comme Est égal à,
Commence ou Ne commence pas par, etc.
Note
On rappelle ici la distinction fondamentale entre tri et filtre : un tri réordonne une liste en conser-
vant tous les arguments, un filtre ne fait plus apparaître dans une liste que les enregistrements
correspondant aux critères préétablis.
• Le dernier encart, plus bas, énumère des cases à cocher correspondant aux occurrences
trouvées dans la colonne. Le fait de décocher l’une de ces cases provoque la disparition
de la liste des items cités.
Cette présentation des tris et filtres est exactement similaire à celle des autres produits de
la gamme Office 2007. Elle s’adapte à la nature de chaque colonne visée : un clic sur le
triangle voisin du champ Date d’expédition propose des critères de filtre très raffinés sur
la base de dates, alors que celui portant sur les colonnes de chiffres de droite ne sélectionne
que des filtres numériques.
Enfin, nous pouvons remarquer que le bouton « Afficher la facture » est un bouton
contextuel qui affiche la facture correspondant exactement à la ligne de commande active
au moment du clic. Là encore, il s’agit d’un mécanisme créé de toutes pièces par le
programmeur.
Figure 1.6
Table des clients.
La table des clients s’affiche comme une feuille de données, identique à celle d’Excel.
• Les noms de champ se présentent en en-têtes.
• Les clients apparaissent en liste ; il existe apparemment un ordre par numéro d’ID, mais
il ne s’agit que d’un artifice dû au fait que les clients ont été entrés dans la base dans
l’ordre présenté ici : l’ordre de saisie des clients n’influe pas sur la présentation à l’écran.
Il est possible que les numéros se retrouvent ultérieurement en désordre et il reviendra
à l’utilisateur de présenter ses éditions avec des critères de tri.
1. Le même résultat peut être obtenu par un clic droit sur l’état et en sélectionnant « Aperçu avant impression ».
• À l’ouverture, le curseur se positionne sur la cellule la plus en haut à droite : les flèches
directionnelles ou le taquet de tabulation du clavier permettent de naviguer dans les
champs ou les enregistrements, à l’horizontale ou à la verticale.
• Un carré contenant le signe + débute chaque ligne ; cette présentation dépend des rela-
tions établies entre les tables. Dans le cas présent, il existe un lien permanent entre la
table des clients et celles des commandes : à un client donné correspond 0 ou plusieurs
commandes. Si l’on clique sur le signe plus, en décalé et en dessous de la ligne du client,
les lignes de commandes que celui-ci a déjà émises apparaissent. Un clic sur le signe
moins rétablit l’affichage d’origine.
Presque toutes les zones de cette table sont modifiables directement, avec tous les dangers
que de telles manipulations entraînent. Seule la première colonne de la table, contenant le
numéro identifiant de chaque client, n’est pas modifiable. Le nom de la première société,
par exemple, se modifie sans difficulté ; pire, on peut le remplacer par le nom d’une autre
société existant déjà dans le fichier. Il est donc possible de créer des doublons apparents,
mais l’on ne peut pas en faire reproche au programmeur : il est tout à fait envisageable que
deux clients portent le même nom (DUPONT par exemple) tout en étant domiciliés à
deux adresses différentes !
En modifiant une quelconque donnée dans cette source d’informations qu’est la table,
l’impact du changement se répercutera sur tous les objets de la base en aval : les requêtes,
les formulaires et les états.
La saisie des données prend donc une importance toute particulière :
• Toutes les modifications opérées sur une ligne d’enregistrement ne sont définitivement
prises en compte que lorsque l’utilisateur passe sur un autre enregistrement ou ferme la
table ; la touche « Echap » rétablit toutes les données (même sur plusieurs champs)
dans l’état où elles se trouvaient initialement tant qu’un autre enregistrement n’est pas
atteint. Inversement, il n’existe aucun bouton de validation : dès qu’un nouvel enregis-
trement est atteint les changements deviennent définitifs dans le précédent.
• Il n’existe pas nécessairement de masque de saisie dans la table : par exemple, tous les
numéros de téléphone affichés ont le format international standard, mais il est possible
de saisir un numéro non conforme (1234 par exemple). Le masque de saisie existe pro-
bablement dans le formulaire de saisie ou de modification d’un client, non dans la table
source.
• Contrairement à Excel, ou d’autres programmes bureautiques, les modifications
apportées dans les données sont définitivement enregistrées sur le disque dur : il n’est
pas nécessaire de manipuler le bouton « Office » et l’option « Enregistrer ».
En faisant défiler la fenêtre de la table vers la droite, on notera une colonne particulière
dotée de « trombones » et d’un type tout nouveau dans Access 2007. Un double clic sur
l’un de ces trombones permet de joindre une pièce externe à un enregistrement précis.
Dans le cas présent, on pourrait joindre à l’enregistrement du client n˚ 1 des pièces comme
sa photo ou le document Word contenant le contrat signé.
La liste des données qui s’affiche reprend, de manière non exhaustive, des informations
issues de trois tables (que l’on pourra consulter si nécessaire) :
• une table des fournisseurs ;
• une table des bons de commande ;
• une table de détail des bons de commande.
Parmi les champs affichés, la date de création du bon de commande, par exemple, est tout
à fait modifiable : tout changement affectera l’affichage en cours, mais aussi, et surtout,
la donnée de base contenue dans la table des bons de commande. Dans ce cas de figure, la
requête sert de masque de saisie pour intervenir sur la table d’origine.
Il est clair que le programmeur doit interdire aux utilisateurs de telles interventions en
mettant en place des méthodes contrôlées d’accès aux données.
Figure 1.7
Formulaire
de dialogue.
Figure 1.8
Formulaire d’accès
aux données.
Ici, Access ne liste pas l’ensemble des clients (formulaire dit continu), mais présente les
clients les uns après les autres (formulaire dit unique). Les boutons de déplacement, en
bas, permettent non seulement de faire défiler les clients, mais aussi, à droite, d’accéder
directement à la création d’un nouveau client. Le programmeur a également prévu des
boutons « Enregistrer » et « Nouveau », en haut, pour faire la même opération ; on verra,
en effet, qu’il existe souvent de nombreuses manières de faire la même opération dans la
même grille-écran.
La saisie des données est régie par des règles identiques à celles qui sont applicables dans
les tables : appuyer sur la touche « Echap » annule toute l’opération. En revanche, le for-
mulaire peut être assorti de masques de saisie ou de conditions de validation qui auront
été posées par le programmeur. On peut, par exemple, imaginer qu’un contrôle de valida-
tion prohibe une adresse e-mail si la chaîne de caractères entrée ne comporte pas de signe
arobase (@).
Jusqu’à présent, nous avons ouvert les objets contenus dans la base et créés par le pro-
grammeur en mode formulaire. Ce mode, le plus naturel, est celui de l’utilisateur. En
double-cliquant sur un objet, quel qu’il soit, on accède aux objets dans ce mode. Pour le
programmeur qui dessine les objets (tables, requêtes et autres formulaires), l’affichage
propre à la mise en œuvre doit se faire en mode création. Au cours des manipulations qui
suivent, nous passerons alternativement du mode formulaire au mode création, pour en
découvrir les différences fondamentales :
1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ».
2. Cliquez du bouton droit sur le formulaire « Boîte de dialogue États ventes » (notez
que dans le ruban du menu « Accueil », l’icône Affichage de droite est grisée et ne peut
pas être sélectionnée).
3. Dans la fenêtre contextuelle qui s’ouvre, cliquez sur « Mode création ».
Le formulaire, que nous avions précédemment ouvert en mode normal par un double-
clic, s’affiche maintenant sous une tout autre présentation, propre au concepteur du
formulaire (voir figure 1.9).
Figure 1.9
Exemple de
formulaire ouvert
en mode création.
Chaque carré, chaque bouton présent dans l’objet formule se nomme contrôle. Ils sont
modifiables en toute liberté, ce qu’on se gardera bien de faire pour le moment !
Vous aurez peut-être remarqué que l’icône du ruban d’Accueil est devenue active lors de
l’ouverture en mode création :
1. Cliquez sur le bouton « Affichage » du menu « Accueil ».
2. Repositionnez l’affichage en mode formulaire : vous constatez que la « Boîte de dialogue
États des ventes » a repris l’apparence que nous lui connaissions auparavant.
3. Fermez la fenêtre avec la croix du coin supérieur droit.
4. Si Access demande l’accord pour enregistrer les modifications dans la structure du for-
mulaire, répondez bien évidemment : « Non » ; le formulaire conçu par le programmeur
ne doit pas être modifié.
5. Fermez toutes les fenêtres de la partie droite de l’écran.
De la même manière, vous pouvez ouvrir tous les autres objets de la base :
• soit en mode création pour le concepteur de la base ;
• soit en mode utilisateur, celui-ci étant variable suivant la nature de l’objet ; il existe dif-
férents modes que nous étudierons plus tard : le mode feuille de données, le mode
formulaire, le mode tableau croisé dynamique, et d’autres encore.
Vous pouvez constater encore cette distinction fondamentale entre les deux modes
d’ouverture avec une table :
1. Dans le volet de navigation, si nécessaire, développez la classe « Tables ».
2. Cliquez du bouton droit sur la table « Clients ».
3. Ouvrez cette table en mode création.
Figure 1.10
La table « Clients » s’ouvre avec l’apparence de la figure 1.10.
1
Chapitre
Exemple de table
ouverte en mode
création.
Comme on l’a vu, la base Northwind est tout entière contenue dans le seul fichier « Nor-
thwind.accdb ». L’extension de ce fichier correspond au nouveau format des bases de
données Access 2007. Les anciens fichiers des versions antérieures étaient, eux, suffixés
« .mdb ». Une base de données sous l’ancien format peut s’ouvrir avec Access 2007 en
mode compatibilité ; en revanche, une base de données accdb ne peut pas s’ouvrir avec
Access 2003. Il sera préférable, dès que possible, de transformer les anciennes bases au
nouveau format ; la procédure en est un peu spécifique :
1. Créez une nouvelle base de données vide.
2. Cliquez dans le menu « Données Externes » sur le bouton « Access ».
3. À l’aide du bouton « Parcourir », pointez la base de données au format mdb.
4. Dans la fenêtre « Importer », cliquez sur le bouton « Sélectionner tout » (si vous souhaitez
récupérer la totalité des objets de l’ancienne base).
5. Cliquez sur « OK » 1.
Lorsqu’une base de données « .accdb » est ouverte, le système d’exploitation Windows
crée provisoirement un autre fichier, suffixé « .laccdb », destiné à contrôler le partage de la
base. Au moment où tous les utilisateurs simultanés d’une base ferment l’application, le
système supprime automatiquement ce fichier « laccdb ».
1. Si des barres de menus avaient été programmées dans l’ancienne base, elles seront déplacées dans une nouvelle option du menu général
« Compléments ».
Résumé
Le programme Access génère une base de données, mais aussi un ensemble d’outils
permettant de créer des applications entières. Ces éléments sont :
• des tables, contenant les données ;
• des requêtes, permettant d’interroger les structures de tables mises en place ;
• des formulaires présentant les données dans une interface homme/machine adaptée ;
• des états destinés à imprimer des résultats ;
• un langage de programmation, VBA.
Le volet de navigation peut servir de générateur de menus afin d’aider l’utilisateur à
atteindre les objets de la base en mode formulaire ou feuille de données, c’est-à-dire en
tant que gestionnaire quotidien de la base et non pas de concepteur.
À tout moment, et pourvu que le concepteur n’ait pas fermé l’accès au mode création,
tous les objets s’affichent soit en mode création pour le concepteur, soit en mode normal
pour les utilisateurs.
Problèmes et exercices
1
Chapitre
Ces premiers exercices ont pour objectif de familiariser le lecteur avec l’environnement
d’Access en mode utilisateur final. On insistera sur l’effet des choix du programmeur sur
le déroulement des actes de l’utilisateur : cette démarche ouvrira la voie aux développements
des chapitres suivants.
Les exercices choisis permettront de montrer que la maîtrise d’Access ne passe pas seule-
ment par une bonne connaissance des options du logiciel et de ses fonctionnalités. Il est
nécessaire aussi (voire d’abord) de dominer le sujet par une vue d’ensemble de l’appli-
cation qui sera conçue. Pour plus de clarté, on dissociera toujours les données stables de
l’application (tables), d’une part, et les processus modifiant ou augmentant les données
stockées, d’autre part. Cette division, toute théorique, est à la base d’une analyse solide de
l’objet global à concevoir et à mettre en œuvre.
• Énoncé Dans cet exercice, vous devez vous placer en tant qu’utilisateur de la base Northwind,
c’est-à-dire un professionnel de la vente.
1. À l’aide des outils déjà existants dans cette base, créez un nouveau client (libellé au
choix).
2. Puis, créez une commande sur la base de produits déjà existants et en stock. Vérifiez
votre travail et allez jusqu’à la facturation des produits commandés.
1. Il n’existe pas, d’emblée, de formulaire de création d’un nouveau client : c’est un choix délibéré du concepteur qui, d’une certaine manière,
se justifie.
Figure 1.11
Remplissage du
formulaire de
création d’un
nouveau client.
3. Ouvrez la liste déroulante des clients en haut à gauche et choisissez le nouveau client
créé. Les onglets qui apparaissent à ce moment permettent de commencer la saisie de
la commande.
1
Chapitre
• facturé ;
• expédié ;
• fermé.
Au plan de la base de données Access, tous ses objets vont être mis à contribution :
• Les données relatives aux clients, fournisseurs, produits, représentants et transporteurs
sont stockés dans des tables différentes.
• Les commandes sont stockées dans d’autres tables qui, nécessairement, seront en relation
avec les tables précédentes. On y adjoindra des notions d’état.
• Des requêtes permettent d’afficher, au moment voulu, les données nécessaires, reconsti-
tuées en croisant les informations des deux types de tables évoqués précédemment.
• Des formulaires présentent, de manière cohérente et compréhensible, des données
issues des requêtes.
• Des états, éventuellement à caractère légal comme la facture, matérialisent l’acte
commercial en utilisant d’autres requêtes.
• Un programme présente, logiquement et au moment voulu, les formulaires, et contrôle
en permanence le respect des procédures.
puristes pourront reprocher au concepteur de n’avoir pas précisé cela dans la fenêtre
en question ni dans les encarts supérieurs de chacun des formulaires.
1
Chapitre
Figure 1.12
Liste des
commandes
fournisseur
en cours.
Dans cette liste, les commandes fournisseurs ont, suivant les cas, deux états possibles :
Soumise ou Approuvé. Celles qui ne sont pas approuvées ne comportent ni nom d’appro-
bateur, ni date (ni, a fortiori, de date de paiement) 1.
1. Double-cliquez sur la commande la plus récente, en haut, celle que vous venez de
générer.
2. Cliquez sur le bouton « Approuver l’achat » : automatiquement, Access appose la date
du jour dans la zone de date d’approbation et « colle » le nom de l’utilisateur en cours
dans la zone « Approuvé par ».
3. Fermez la fenêtre et constatez que la liste n’est pas mise à jour immédiatement : il faut
appuyer sur la touche F5 (ou fermer et rouvrir le formulaire) pour rafraîchir la liste.
Exercices
1. Il n’existe pas de commande fournisseur déclarée « fermée ». En fait, le programme est inachevé et il n’existe pas de moyen de fermer une
commande fournisseur, même lorsque tous les champs sont correctement remplis.
Note
Ces dernières manipulations nous conduisent à déceler trois imperfections dans le programme :
Imperfection sur le fond, tout d’abord : il n’est pas logique que la même personne ait à la fois le
droit de soumettre une commande fournisseur et simultanément le droit de l’approuver. La sépa-
ration des fonctions, liée au contrôle interne dans l’entreprise, n’est pas opérationnelle. Au pire,
et en admettant qu’il ne soit pas utile d’approuver une commande, le passage par une étape
d’approbation ne sert dès lors informatiquement à rien*.
Dans la mesure où le bouton « Approuver l’achat » vient coller automatiquement le nom de l’uti-
lisateur dans la zone, il n’y a nul besoin de créer à cet endroit une zone de liste déroulante qui
affiche tous les utilisateurs ; une simple zone de texte eût suffi.
Il manque une ligne de programme pour provoquer un rafraîchissement de la liste au moment de
la fermeture du bon de commande.
* En fait, le programmeur a bien prévu une notion de privilège d’approbateur dans la base mais ne l’a pas mise
en œuvre. Le représentant Cencini, premier de la liste, et sous le nom duquel on se connecte par commodité a
tous les droits.
1. La case à cocher a ici une double vocation un peu particulière : d’une part, elle est une case à cocher simple qui indique un état (on
constatera à tout moment que le produit est entré en inventaire), d’autre part, le simple fait de cocher lance une action précise, celle d’ajouter
l’article à l’inventaire. Cette double utilisation simultanée du même objet est relativement peu orthodoxe.
3. Double-cliquez sur le produit Beer : vous ouvrez la table des produits et ciblez plus
précisément cet article (voir figure 1.13).
1
Chapitre
Figure 1.13
Fiche produit.
Comme on l’a vu plus haut, l’affichage en mode formulaire unique des articles de la table
s’adjoint, en bas d’écran, de boutons de déplacement, d’un filtre et d’un mode Recherche.
En haut, le formulaire comprend deux onglets « Détail du produit » et « Historique des
achats/commandes ». En cliquant sur ce deuxième onglet, on lit tous les mouvements du
produit en entrée et en sortie. On comprend donc que le même formulaire, au travers de
deux onglets, vise deux domaines bien distincts pour nous maintenant : d’une part, le
produit lui-même, d’autre part, la synthèse des commandes clients/fournisseurs du même
produit.
• Énoncé En reprenant les deux exercices précédents, représentez graphiquement les processus et
les états mis en place depuis la commande à un fournisseur jusqu’à la facture à un client
Exercices
* Solution Il existe de nombreuses manières de représenter graphiquement des processus et des états.
Dans la mesure où le lecteur n’est pas spécialiste de ce type de représentation, on prendra
des schémas de type UML (Unified Modeling Language), tout en gardant une certaine
liberté dans le formalisme.
Un diagramme d’activité représente les actions successives, de haut en bas, de gestion des
bons de commande fournisseur et client (voir figure 1.14). L’important, ici, consiste à
montrer l’ordonnancement des actions et les deux cas de figure, si l’article commandé par
le client est disponible ou non.
Figure 1.14
Représentation
de la gestion
des commandes
sous forme
de diagramme
d’activité.
Dans la figure 1.14, la possibilité de passer du circuit client au circuit fournisseur a bien été
représentée, bien qu’un peu abusivement : l’utilisateur a le droit d’arrêter la commande au
moment où il est informé qu’un article est non disponible et n’est pas obligé de passer aux
actions de la partie gauche du schéma. Au contraire, la possibilité de passer au traitement
des commandes clients, lorsqu’un article est réceptionné, n’est pas dessinée.
Le trait noir épais de la partie gauche, appelé barre de synchronisation par les professionnels,
exprime la nécessité de présence des deux actions, commande fournisseur et approbation,
pour pouvoir continuer le fil des actions.
Les cercles noirs, en haut de figure, représentent le point d’entrée dans le processus, les
doubles cercles, en bas, les points finaux.
Un autre type de représentation appelé « diagramme d’état », plus statique, synthétise les
différents états par lesquels passe le bon de commande client.
Il n’est pas indispensable de procéder à des représentations graphiques très poussées lors-
que l’application à développer avec Access conserve des objectifs modestes et une portée
limitée. Toutefois, ces illustrations permettent de faciliter le débat nécessaire entre le(s)
développeur(s) et les utilisateurs, qui doit avoir lieu lors de la conception du produit
logiciel. Elles peuvent servir de base, en partie, à l’amorce d’un cahier des charges et per-
mettent au développeur, surtout, d’avoir une idée bien claire de la problématique et des
objectifs à poursuivre.
Figure 1.15
Représentation de
1
Chapitre
la gestion des
commandes client
sous forme de
diagramme d’état.
• Énoncé En reprenant les deux premiers exercices, énumérez graphiquement les données, regroupées
par grands ensembles, entrant dans le cadre de l’application.
* Solution Les données se regroupent dans des tables, comme nous l’avons vu dans la partie théorique de
ce chapitre. Ici, nous n’abordons volontairement pas les liens entre les tables, mais uniquement
leur contenu. Il s’agit de dissocier les domaines de chaque table et de ne pas les mélanger.
Figure 1.16
CLIENT FOURNISSEUR TRANSPORTEUR EMPLOYE
Représentation des N° de client N° de fournisseur N° de transporteur N° d’employé
données essentielles Raison sociale Raison sociale Raison sociale Nom
de la base Adresse Adresse Adresse Prénom
Fonction
Northwind. Rôle
Dans la réalité, la base de données est plus complexe : ne sont représentées ici que les don-
nées essentielles qui seront décomposées par la suite. En revanche, le dessin général est
incontournable.
Exercices
• Clients, fournisseurs, transporteurs et employés regroupent des entités bien distinctes qui
ne peuvent en aucun cas constituer un seul fichier des « partenaires » de l’entreprise.
• Chacun des ensembles mis en place dispose d’une numérotation qui lui est propre : à
l’intérieur d’un même ensemble, chaque client, par exemple, a un numéro propre qui
lui sert d’identifiant. Par commodité, on parlera d’ID (pour l’IDentity américain).
• Certains libellés, et en particulier les identifiants, se retrouvent dans d’autres tables que
dans leur propre univers : le numéro de client dans la commande client, le numéro de
fournisseur dans la table des commandes fournisseur.
• Il n’existe qu’une seule table « Produit » dont les numéros se retrouvent dans les tables
des commandes, aux fournisseurs comme aux clients : s’agissant de négoce, les produits
à l’achat sont bien les mêmes que ceux qui seront revendus (sans transformation).
• Les deux tables des commandes fournisseurs et clients ont chacune une notion d’état
(soumis, fermé, facturé, expédié) qui reprend les aspects abordés lors de l’analyse des
processus.
• Les deux tables des commandes ne comportent pas le prix de la commande ou tout
autre information inutile : la quantité commandée suffit puisque l’information du prix
unitaire est stockée dans la table des produits.
On notera que le pluriel n’est jamais utilisé dans la figure 1.16 : on parle de la notion de
client et non pas du fichier des clients (au pluriel). Une démarche correcte consiste à
manipuler le concept et non la réalité finale : il est évident qu’il existera des centaines de
clients, fournisseurs et autres éléments dans la base. Une propriété affirmée pour vraie
concernant un élément doit nécessairement rester vraie pour tous les éléments de la même
classe ; voilà pourquoi le concept n’a pas à s’appliquer au pluriel.
Le concepteur de la base Northwind, en fait, a démultiplié certains ensembles, qui ont été
synthétisés ci-dessus, pour en arriver au modèle de la figure 1.17. Pour visualiser ce
modèle 1 :
1. Cliquez dans la barre de menu sur « Outils de base de données ».
2. Cliquez sur l’icône Relations.
Figure 1.17
Modèle relationnel
de la base
Northwind.
1. Pour notre part, nous n’approuvons pas, dans la conception de la base, de nombreux points visibles sur ce modèle. Les tables sont notées au
pluriel, ce qui est contraire aux standards en la matière. Les identifiants sont notés par le seul libellé « ID » sans préciser de quel ID il s’agit. De
nombreux champs sont notés avec des espaces, ce qui complique passablement le travail des programmeurs dans les requêtes SQL. Le mot
« Commandes » de la table du même nom sous-entend « Commande_Client » alors que le mot « Bons de commandes » sous-entend
« Commande_Fournisseur », d’où des confusions syntaxiques très risquées. Et il ne s’agit là que des éléments les plus frappants !
* Solution Il s’agit de modifier les contrôles de ce formulaire : il est donc impératif de passer en mode
création pour en modifier les propriétés :
1. Dans le volet de navigation, cliquez du bouton droit sur le formulaire « Détails du
client ».
2. Dans la fenêtre contextuelle, cliquez sur « Mode création » ; vous visualisez le formu-
laire tel qu’il apparaît à la figure 1.18.
Figure 1.18
Formulaire de saisie
des clients en mode
création.
5. Seul l’onglet « Données » est accessible, mais il est préférable d’afficher toutes les
propriétés en utilisant l’onglet « Toutes ».
6. Descendez jusqu’à l’item « Masque de saisie ».
7. Sur la même ligne, à droite, cliquer sur le carré muni de trois points.
Figure 1.19
Assistant Masque
de saisie d’Access.
Le modèle relationnel,
2
Chapitre
37
Access Livre Page 38 Mercredi, 27. f vrier 2008 7:28 07
1. Ce principe peut être outrepassé si des obligations d’ordre légal, par exemple, contraignent au stockage de données validées et archivées
(paie, facturation, etc.). Ceci ne remet pas en cause la théorie.
verra comme une zone de liste déroulante. Le dessin des deux tables mises en œuvre sera
celui de la figure 2.1.
2
Chapitre
Figure 2.1
Modèle relationnel
simplifié Civilité-
Contact.
La notation utilisée dans la figure 2.1 est particulière, nous y reviendrons plus loin.
Attachons-nous d’abord à comprendre le schéma général.
Les deux carrés représentent des « containers » des données qui y seront stockées, non les
données elles-mêmes. La table « CIVILITE » de gauche ne contiendra, en définitive, que
trois enregistrements que l’on pourra décrire très exactement comme à la figure 2.2.
Figure 2.2
Contenu de la table
CIVILITE.
Dans la table « CIVILITE », il n’existe aucune allusion aux contacts du carnet d’adresses.
En revanche, la table « CONTACT » comporte un champ nommé « ID_CIVILITE » ; ce
dernier ne contiendra pas de données telles que M. ou Madame, mais uniquement les
chiffres correspondants de la table « CIVILITE », et dans la pratique les chiffres 1 ou 2 ou
3. Le même champ « ID_CIVILITE » se retrouve dans les deux tables « CIVILITE » et
« CONTACT ».
On notera tout de suite qu’il n’existe pas dans la figure 2.1, pour le moment, de trait (de
lien) entre les deux « ID_CIVILITE », celui de la table « CIVILITE » et celui de la table
« CONTACT » ; cette présentation est volontaire. Il peut exister un lien réel, entré dans
la base de données et que l’on traitera plus loin ; mais il peut aussi ne pas en exister.
L’important, fondamentalement, réside dans la présence effective d’un champ ID dans
la table « CONTACT » qui corresponde à une valeur contenue dans la table « CIVI-
LITE ».
Enfin, la figure 2.1 montre un libellé parfaitement identique du terme « ID_CIVI-
LITE » dans les deux containers de droite et de gauche. Cette volonté sémantique n’est
pas obligatoire, mais optionnelle : Access saurait rapprocher deux colonnes ne portant
pas le même nom. En revanche, et pour des raisons évidentes de clarté dans la démar-
che, nous déconseillons fortement de nommer différemment les deux colonnes dans
chacune des tables.
À l’intérieur d’une même table, chaque item de l’ensemble (en d’autres termes chaque
enregistrement), doit pouvoir être identifié de manière unique et obligatoire. La réunion
de ces deux conditions permet de considérer l’information d’identification comme une clé
primaire de la table. En reprenant l’exemple de la table « CIVILITE », la colonne « ID_civi-
lite » doit :
• être obligatoire, le champ ne peut pas être vide (null) ;
• contenir des valeurs parmi lesquelles ne se trouve aucun doublon.
Dès lors que ces deux conditions sont respectées, on peut considérer que la colonne
« ID_civilite » est l’identifiant des enregistrements qu’on ajoutera à la table.
Un bon principe de base consiste à créer systématiquement un champ de clé primaire
dans toutes les nouvelles tables, même lorsque le besoin immédiat n’en est pas évident.
Inversement, il est possible qu’une table contienne une clé primaire constituée de plusieurs
champs ; nous étudierons ce cas plus loin.
La nature de cette clé primaire peut être variée et il n’existe pas d’obligation particulière
sur ce point. La plupart du temps, on utilisera un code numérique, le plus simple, et pour
lequel Access propose une solution d’incrémentation automatique. Mais une clé primaire
peut aussi être constituée de lettres (pensons à la codification à trois lettres de tous les
aéroports du monde : JFK pour l’un des aéroports de New York et CDG pour celui de
Roissy) ou bien toute autre organisation. On évitera des clés primaires trop compliquées
ou générant des problèmes légaux (le numéro de Sécurité sociale par exemple).
Le choix d’une clé primaire étant primordial, on portera une attention particulière à sa
validité dans tous les cas de figure à traiter ultérieurement. Par exemple, il est maladroit
d’identifier les villes de France au moyen de leur code postal : un bureau de Poste peut
couvrir plusieurs communes. S’il n’existe pas de besoin particulier d’identifier toutes les
communes de France, ce choix portera la table à environ 8 000 enregistrements ; dans
le cas contraire (et le plus général), il sera plus judicieux d’utiliser les codes Insee des
communes (environ 36 000).
On réfléchira également à l’étendue de la codification : pour reprendre l’exemple des aéro-
ports, la codification choisie à trois lettres permet d’enregistrer 263 aéroports soit 19 604
au maximum.
Dès qu’une donnée peut se répéter plusieurs fois sous diverses formes, il devient nécessaire
de mettre en place un système permettant d’adopter un référentiel. Imaginons une table
« ETUDIANT » contenant les coordonnées de ceux-ci. Si un champ de cette table doit
contenir le dernier diplôme obtenu par les étudiants, il est maladroit de créer une simple
zone de texte dans laquelle l’utilisateur aura toute liberté de saisir les valeurs qui lui sem-
blent les plus adéquates. Dans ce cas précis, il y a fort à craindre qu’une personne saisira
« Baccalauréat scientifique mention Bien », pendant qu’une deuxième mettra « Bac S
Mention B », et une dernière « Bac S ». Nul doute qu’il ne sera pas possible de faire des
requêtes structurées sur de pareils libellés. Il devient donc indispensable d’établir un sys-
tème relationnel entre les étudiants et leurs diplômes, à l’image de la figure 2.3.
2
Chapitre
Figure 2.3
Modèle relationnel
simplifié Etudiant-
Diplôme.
Imaginons maintenant que la volonté du développeur consiste à enregistrer tous les diplô-
mes obtenus par les étudiants. Il ne peut pas exister, parmi les champs de la table, un
champ DIPLOMES au pluriel, destiné à recevoir la liste des diplômes déjà obtenus par
l’étudiant. En admettant que le programmeur ait prévu 255 caractères de long pour rem-
plir le champ de données, la saisie « au kilomètre » de diplômes variés ne constituera
qu’un ensemble totalement inexploitable par la suite. Chaque champ ne doit donc com-
porter qu’une et une seule information : cette information doit être réduite à son expres-
sion élémentaire. Certes, une solution bâtarde consisterait à multiplier les champs
DIPLOME1, DIPLOME2, etc., mais on imagine aisément que le procédé est excessivement
limité : un étudiant brillant dépassera nécessairement, tôt ou tard, le nombre de diplômes
prévus. De plus, les requêtes qui seront faites pour compter les diplômes par étudiant, par
exemple, s’avéreront très compliquées à mettre en place.
Le système relationnel de la figure 2.3 ne suffit dès lors plus et il est nécessaire de passer à
une forme plus élaborée telle que celle de la figure 2.4.
Figure 2.4
Modèle relationnel
Etudiant_Diplôme.
Dans le modèle détaillé de la figure 2.4, il est possible d’insérer un infinité de diplômes à
une infinité d’étudiants, grâce à l’insertion d’une table intermédiaire dont nous verrons le
fonctionnement dans le point suivant. Notons tout de suite que cette présentation permet
aussi d’insérer des informations nouvelles telles que la mention au diplôme ou la date
d’obtention.
Les relations entre les tables doivent être conjuguées logiquement avant d’être mises en
place. On focalisera l’attention sur le rapport quantifiable entre les deux tables à relier.
La conjugaison s’exprime, pour reprendre les exemples précédents, de la manière
suivante :
Un contact porte une et une seule civilité (on ne peut être simultanément Monsieur et
Madame) ; une civilité s’applique à plusieurs contacts (le carnet d’adresses peut comporter
plusieurs Monsieur et plusieurs Madame).
Un bon de commande client correspond à la commande d’un et un seul client (si un autre
client fait une autre commande, y compris portant sur les mêmes articles, un autre bon de
commande sera rédigé) ; un client peut faire zéro, une, ou une infinité de commandes.
Un bon de commande fournisseur est soumis par un et un seul représentant (celui qui
s’est connecté initialement à la base) ; un représentant peut rédiger zéro, un ou plusieurs
bons de commande fournisseur.
Dans ces trois énoncés, la conjugaison semble naturelle et logique ; elle intègre d’emblée
une relation de un à plusieurs. En revanche, il arrivera fréquemment que la mise face-à-
face de deux tables induise des conjugaisons diverses. Étudions donc les cas de figure
possibles, qui se limitent logiquement à trois :
les relations de 1 à plusieurs, déjà vues ;
les relations de 1 à 1 ;
les relations de plusieurs à plusieurs.
Les relations de 1 à 1
Nous supposons la présence de deux tables contenant des données relatives, par exemple,
à vos contacts professionnels, d’une part, et à vos contacts personnels, d’autre part. La conju-
gaison de ces deux tables peut se décliner ainsi :
• un contact professionnel correspond soit à zéro, soit à un et au plus un contact personnel
(un partenaire commercial peut aussi être un ami !) ;
• un contact personnel correspond soit à zéro, soit à un et au plus un contact personnel
(même raison).
Nous sommes ici devant une relation de un à un. A priori, et pourvu que les uns et les
autres n’aient pas de rôle particulier à jouer dans le système d’information à mettre en
place, il n’y a aucune raison pour ne pas fusionner purement et simplement les deux
fichiers. La seule opération à mettre en place avant ladite fusion consiste à créer une pro-
priété particulière à la table qui fusionne les deux fichiers pour distinguer les « commerciaux »
des « amis personnels ». Cet exemple peut être généralisé : les relations de un à un dans
une base bien conçue n’existent pas 1.
1. Seul cas de figure possible : si la table doit compter plus de 255 colonnes, il sera nécessaire de créer une table « fille ».
concerne des élèves qui apprennent des langues vivantes au lycée. La conjugaison des relations
serait, en première analyse, la suivante :
• un lycéen apprend plusieurs langues ;
• une langue est apprise par plusieurs lycéens.
La relation semble plurielle dans les deux sens. En l’état, elle ne sera pas gérable par une
base de données, et il s’avère obligatoire de développer cette relation plurielle dans les
deux sens en deux relations de un à plusieurs. Dans le cas des lycéens, cela nous conduira
à la proposition suivante :
• un lycéen fait un choix pour une langue ;
• un choix de langue s’applique à plusieurs lycéens ;
et
• un choix de lycéen porte sur une langue ;
• une langue donne lieu à plusieurs choix.
En d’autres termes, on intercale une table intermédiaire entre les deux tables des lycéens et
des langues (voir figure 2.5).
Figure 2.5
Modèle relationnel
Lycéen-Langue.
Figure 2.6
Contenu des tables
du modèle
relationnel Lycéen-
Langue.
La problématique du temps
Il est toujours nécessaire de réfléchir sur la notion de temps. La conjugaison de la relation
doit être vraie à un instant t et à tous les instants t’, t’’, etc. Si l’évolution dans le temps doit
changer la nature de la relation, alors le modèle relationnel doit en tenir compte.
Imaginons un salarié nouvellement embauché ; aux premiers jours de son emploi, il sera
placé à un certain niveau de la Convention Collective Nationale (CCN) de laquelle il relève.
Or, il est probable que le même salarié, avec l’ancienneté et de nouvelles qualifications, pro-
gressera dans l’échelle de la Convention collective. Si l’échelon est simplement porté comme
un champ parmi d’autres dans la table « SALARIE », la valeur contenue dans ce champ devra
être modifiée dans la table « SALARIE » au moment de sa promotion. Malheureusement, la
valeur précédente disparaîtra définitivement et il ne sera plus possible de faire une reconsti-
tution de carrière et connaître la vitesse de promotion du salarié dans l’entreprise.
Aussi, la panoplie complète des outils relationnels doit être mise en œuvre pour arriver au
modèle présenté à la figure 2.7.
Figure 2.7
Modèle relationnel
Salarié-Convention
Collective
Nationale.
Figure 2.8
Modèle relationnel
Salarié-Lien de
parenté.
Ici, Access créé fictivement une table « SALARIE_1 », qui représente la même table que
« SALARIE » et permet de représenter la relation d’un salarié à un autre. Dans la table
« PARENTE », on mettra le libellé des parentés possibles (frère, sœur, cousin, père, etc.).
Dans la table « LIEN_DE_PARENTE », on insérera le lien entre un salarié et un autre.
Pour parfaitement exprimer le lien de parenté frère/sœur entre Anatole et Zoé, deux enre-
gistrements seront nécessaires dans la table « LIEN_DE_PARENTE » :
• le premier avec un « ID_SALARIE1 » sur Anatole et un « ID_SALARIE2 » sur Zoé
(l’« ID_PARENTE » étant positionné à Frère) ;
• le second avec un « ID_SALARIE1 » sur Zoé et un « ID_SALARIE2 » sur Anatole
(l’« ID_PARENTE » étant positionné à Sœur) 1.
1. Les deux relations entre le lien de parenté et la table salarié devront impérativement comporter l’option de suppression en cascade des
enregistrements correspondants car, sans cette option, toute suppression de salarié ayant un rapport de parenté avec un autre deviendrait
impossible (voir dans la section de ce même chapitre la notion de suppression en cascade).
Cette première approche théorique étant bien assimilée, des cas pratiques peuvent être
abordés.
Nous allons créer une base « de travail » et y créer des tables et autres objets Access. Vous
aurez donc à conserver en permanence ce fichier.
1. Fermez toutes les applications éventuellement ouvertes.
2. Démarrez Access.
3. Cliquez sur l’icône Base de données vide.
4. En bas à droite, indiquez le nom de base « BASE_DE_TRAVAIL.ACCDB » en lieu et
place du libellé « Base de Données1.accdb » donné par défaut.
5. Le répertoire de classement est par défaut le répertoire « Mes Documents » ; changez-
le si nécessaire (retenez alors le nouveau chemin !).
6. Cliquez sur le bouton « Créer ».
7. Immédiatement, la table « Table1 » de la nouvelle base est créée, qui contient déjà une
nouvelle table, nommée Table1, laquelle est déjà ouverte en mode saisie.
8. Cliquez sur la croix en haut à droite pour fermer ce premier objet (et apprendre ainsi,
dès le démarrage, à créer une table).
9. Dans la barre de menus, cliquez sur « Créer », puis sur l’icône Table.
Immédiatement une nouvelle table est créée, ouverte en mode saisie.
Il est déconseillé d’utiliser ce mode pour créer la nouvelle table (ses propriétés ne seront
pas accessibles et les champs seront nommés Champ1, Champ2, etc.).
10. Cliquez sur l’icône Affichage en haut à gauche.
11. Access propose d’enregistrer la table sous un nouveau nom : saisissez « SALARIE » 1.
La fenêtre de création de table apparaît sous l’apparence de la figure 2.9.
Figure 2.9
Fenêtre de création
de table.
1. Dans la totalité de l’ouvrage, nous utilisons des conventions de noms que nous recommandons : les noms de tables et noms de champs sont
entrés en majuscules (non accentués), sans aucun espace. L’absence d’accentuation limite les possibilités d’erreurs, l’absence d’espace évite au
programmeur de cerner les noms de champ par des crochets ([ ]) dans la saisie des requêtes SQL. On verra plus loin que l’aspect « esthétique »
de la présentation des tables peut être retrouvé grâce à la notion de « Légende ».
La partie supérieure comporte tous les champs de la table pendant que la partie inférieure
affiche les propriétés de chacune des lignes, ligne par ligne, au fur et à mesure et suivant le
positionnement du pointeur du pavé supérieur.
2
Chapitre
Access propose d’emblée de commencer la table par un champ de clé primaire symbolisé
dans la colonne de gauche par une petite clé jaune. Ce premier point étant conforme aux
recommandations énoncées dans la partie théorique, nous le maintiendrons. Le premier
champ s’appelle par défaut « N˚ » : ce début de libellé peut être conservé et continué par
une précision sur le type de numéro ; le champ pourra être nommé « N˚SALARIE », par
exemple. Malheureusement, le signe « ˚ » du « N˚ » peut poser des problèmes par la suite :
c’est la raison pour laquelle de nombreux programmeurs utilisent plutôt « ID_SALARIE »
(sans espace), mais avec un soulignement (underscore) entre « ID » et « SALARIE ». La
faute à ne pas commettre, à l’inverse, consiste à nommer le champ « ID » ou « N˚ » sans
autre précision. Access accepte ce type de confusion alors que d’autres bases ne l’acceptent
pas ; dans tous les cas de figure, cette démarche maladroite exposera ultérieurement à de
forts risques de confusion entre les tables.
Le type de données de la future colonne de la table, indiqué à droite, est « NuméroAuto » :
en clair, cela signifie qu’Access incrémentera d’une unité chaque nouvel enregistrement.
Cette présentation, bien que peu pratique dans certains cas, est conservée ici.
Dans le pavé inférieur, les zones à vérifier sont les suivantes :
• Le type de données « NuméroAuto » est de la forme d’un entier long (à retenir pour la
création des clés étrangères ultérieurement).
• Les nouvelles valeurs seront sous la forme d’incrément et non pas des valeurs aléatoires
(sans doublon).
• Le format, ici, n’a pas à être précisé.
• La légende peut être renseignée en respectant parfaitement l’orthographe ; nous suggé-
rons donc par exemple « Numéro de salarié » (avec les espaces et l’accentuation). La
légende apparaîtra automatiquement en lieu et place du code « ID_SALARIE » dans
tous les formulaires et états.
• L’index est positionné à « Oui Sans doublon » : cette disposition est obligatoire pour un
champ de clé primaire.
• Balises actives et Aligner le texte seront abordés plus loin.
Sur la deuxième ligne de la colonne Nom de champ, saisissez le libellé « NOM_SALA-
RIE » : encore une fois, cette convention de nom peut paraître lourde, mais elle entre dans
une démarche logique. Il peut exister un grand nombre de tables dans lesquelles le vocable
NOM sera employé ; dans une petite base, on peut déjà imaginer NOM_CLIENT, NOM_
FOURNISSEUR, NOM_SALARIE, par exemple. C’est la raison pour laquelle il est utile de
préciser de quel nom il s’agit afin que le Dictionnaire des données, c’est-à-dire l’ensemble
des noms de champs, ne comporte pas de doublons.
Access propose par défaut (à droite du nom de champ) que le format des données soit
de type Texte, ce qui, pour le cas présent, est valide. La longueur par défaut, indiquée en
bas, est de 255 caractères, mais peut être réduite (un nom de salarié excédera rarement
La description des champs, à droite, peut être remplie, aux seules fins de documenter
l’application ; la table doit avoir les caractéristiques précisées à la figure 2.10
2
Chapitre
Figure 2.10
Table SALARIE en fin
de création.
Dans la mesure où la table a déjà été nommée « SALARIE » antérieurement, il n’est plus
utile de repréciser ce paramètre. Il suffit de fermer l’onglet en cours et d’accepter l’enregis-
trement des modifications.
En procédant de la même manière, créez une nouvelle table nommée « CCN » (pour
Convention Collective Nationale) et dotée des champs suivants :
• « ID_CCN », clé primaire, à incrémentation automatique ;
• « LIBELLE_CCN », zone de texte de 100 caractères, obligatoire.
Toujours de la même manière, créez une troisième et dernière table nommée
« AFFECTATION_CCN » et dotée des champs suivants :
• « ID_AFFECTATION_CCN », clé primaire, à incrémentation automatique ;
• « ID_SALARIE », zone numérique au format nombre entier, obligatoire ;
• « ID_CCN », zone numérique au format nombre entier, obligatoire ;
• « DATE_AFFECTATION_CCN », zone au format date obligatoire à laquelle on ajou-
tera la valeur par défaut Date() (qui mettra automatiquement la date du jour à chaque
nouvel enregistrement).
Figure 2.11
Tables CCN et
AFFECTATION_CCN
en fin de création.
Il est souhaitable d’effectuer la saisie de ces renseignements avec un soin extrême pour
épargner au développeur de fastidieux retours en arrière. Il faut prévoir tous les cas de
figure avant d’avancer dans les opérations ; il est toujours possible d’ajouter des champs,
d’en supprimer ou de les renommer, mais ces démarches sont hasardeuses.
Jusqu’à maintenant, toutes les relations explicitées entre des tables n’ont eu qu’un fonde-
ment sémantique. C’est parce que nous avons utilisé le vocable « ID_SALARIE », par
exemple, à la fois dans la table « SALARIE » et dans la table « AFFECTATION_CCN » que
le lecteur a fait le rapprochement, se doutant que les valeurs contenues dans ces champs de
la table devaient pouvoir être appariées. Au-delà de cette démarche intellectuelle, il n’y a
rien dans la base de données, à ce stade, pour contrôler si les appariements des valeurs
vont effectivement se réaliser.
En d’autres termes, et au stade où se trouve la création de la base, il est possible d’attribuer
le coefficient 250 de la Convention Collective au premier salarié venu alors même que ce
coefficient n’existe pas dans la table « CCN » ; de la même manière, il est possible de créer
une ligne d’affectation dans la table « AFFECTATION_CCN » alors que le salarié n’existe pas !
Une base de données peut très bien fonctionner ainsi 1 : le contrôle de la saisie des valeurs
est alors reporté sur le programme informatique d’interface homme/machine qui, en
conséquence, s’alourdit considérablement.
Il est infiniment plus efficace d’utiliser les contraintes d’intégrité référentielle que comporte
toute base de données relationnelle afin de garantir la cohérence des valeurs contenues
dans chacune des tables. En reprenant le premier exemple des deux tables « CONTACT »
et « CIVILITE », il est possible de poser une contrainte d’intégrité référentielle via le
champ « ID_CIVILITE » qui se trouve simultanément dans les deux tables :
1. C’est malheureusement trop souvent le cas, même sur des bases de données plus puissantes qu’Access. Seules des problématiques de
répartition des tables dans les environnements client/serveur, ou bien des impératifs de migrations de données peuvent légitimer l’absence
d’intégrité référentielle dans la base.
Figure 2.12
Paramétrage
d’une relation.
1. Dans le cas présent, cette modification est impossible dans la mesure où le champ « ID_SALARIE » de la table « SALARIE » est un
« NuméroAuto ». La validation de l’option de mise à jour en cascade n’a donc aucun intérêt dans cette configuration.
Figure 2.13
Modèle relationnel
Salarié-CCN.
On ne saurait que trop recommander la mise en place des contraintes d’intégrité référen-
tielle dès les premiers instants de la création de la base de données ; il sera toujours très
ardu d’ajouter ces contraintes lorsque des données auront déjà été enregistrées. En effet,
Access refusera cette mise en place si tous les enregistrements ne respectent pas la nouvelle
règle.
Résumé
La création des objets fondamentaux que sont les tables dans une base Access doit procé-
der d’une réflexion méthodique préalable sur la conception et l’organisation des informa-
tions à gérer. Cette réflexion s’appuiera sur Merise comme base méthodologique. Toutes
les tables créées comporteront systématiquement un identifiant, tous les champs créés ne
contiendront que des données élémentaires, non décomposables. Des relations seront
impérativement mises en place entre toutes les tables, en reportant la clé primaire des
tables principales sur un champ de clé étrangère dans la table à mettre en relation. Toutes
les relations seront unifiées dans un rapport d’Un-à-plusieurs, sauf exceptions.
Les relations ne doivent pas seulement être possibles, mais formalisées par l’établissement
de contraintes d’intégrité référentielle.
Problèmes et exercices
2
Chapitre
Les exercices ci-après permettent de mettre en place les fondements d’une base de données
dans divers systèmes d’information. Chaque fois, les modèles demandés se limitent à
l’essentiel de la base, sans entrer dans le détail qu’exigerait un véritable développement
logiciel. Dans tous les cas, il s’agit :
• de réfléchir sur l’architecture du système d’information ;
• de créer les tables nécessaires ;
• d’établir les relations.
• Énoncé Vous devez concevoir le système d’information d’une petite bibliothèque municipale qui
prête des livres.
1. Commencez par porter sur le papier vos premières approches. Pensez à dissocier la
gestion des adhérents et celle des livres, et définissez les relations entre ces deux entités.
2. Créez les tables nécessaires.
3. Mettez en place les contraintes d’intégrité référentielle.
• une table « LIVRE » qui contient la clé primaire « ID_LIVRE » et tous les champs relatifs
à la fiche du livre ;
• une table « EMPRUNT » qui contient une clé primaire, la clé étrangère « ID_LIVRE »
et la clé étrangère « ID_ADHERENT ». Un champ supplémentaire « DATE_
EMPRUNT » permet de connaître la date de l’emprunt.
Réfléchissons à présent sur le choix des clés primaires :
• Dans la table « ADHERENT », l’ID pourra être constitué d’un simple numéro incré-
mentiel : le premier aura le numéro 1, le suivant 2, etc. Il suffira de prévoir, dans le
programme, un contrôle pour éviter qu’un adhérent déjà inscrit ne soit pas recréé
une deuxième fois.
• Dans la table « EMPRUNT », pour les mêmes raisons, une numérotation incrémen-
tielle suffira.
• En revanche, la clé primaire de la table « LIVRE » pose un nouveau problème ;
admettons qu’une numérotation incrémentielle soit choisie, l’achat de deux exem-
plaires d’un même livre va aller à l’encontre du principe merisien de l’unicité de
l’information : la fiche d’un livre sera remplie deux fois sous deux numéros. Or, une
telle possibilité est quasi certaine : une bibliothèque de prêt, même modeste, risque fort
d’acheter au moins trois ou quatre exemplaires des Quatre Mousquetaires d’Alexandre
Dumas pour répondre à la demande des collégiens. Une autre idée pourrait consister à
prendre pour identifiant du livre son ISBN (International Standard Book Number), mais
dans ce cas, si deux livres identiques sont achetés, le deuxième ISBN sera vu comme
un doublon et rejeté.
Le modèle initial est donc faux et nécessite de nouveaux développements.
L’insertion d’une nouvelle table « EXEMPLAIRE » s’avère indispensable, pour désigner
non pas la notion de livre, mais celle du volume qui sera rangé sur une étagère. L’étude de
la relation entre un livre et un exemplaire s’exprime par les postulats suivants :
• Un livre est acheté en un ou plusieurs exemplaires ;
• Un exemplaire correspond à un et un seul livre.
Ici, la relation s’exprime immédiatement comme étant de un-à-plusieurs.
La table « EXEMPLAIRE » contient une clé primaire « ID_EXEMPLAIRE » à incrémenta-
tion automatique, à laquelle on pourra ajouter une notion de date d’achat et d’état du
volume (neuf, bon état, médiocre, à mettre au pilon). Il faut ajouter à ces champs la clé
étrangère « ID_LIVRE » correspondant au livre concerné.
La table « LIVRE » contient une clé primaire « ISBN » et tous les champs utiles à un fichier
bibliographique (titre, auteur, éditeur, etc.).
Naturellement, il serait possible maintenant d’étendre la base de données à un classe-
ment bibliographique plus large en créant des tables des auteurs, des éditeurs, etc.
Toutefois, et s’agissant d’une petite bibliothèque, on considérera ces extensions non
indispensables.
physique.
Créez la base de données « Bibliothèque ». Créez ensuite la table « ADHERENT » à
l’image de la table « SALARIE » du cours et avec les champs suivants :
• ID_ADHERENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• NOM_ADHERENT, Texte, 50 caractères, Null interdit, Indexé avec doublons.
• PRENOM_ADHERENT, Texte, 50 caractères, Null interdit, non indexé.
• ADRESSE1_ADHERENT, Texte, 100 caractères, Null interdit, non indexé.
• ADRESSE2_ADHERENT, Texte, 100 caractères, Null autorisé, non indexé.
• CP_ADHERENT, Texte, 5 caractères, Null interdit, non indexé.
• VILLE_ADHERENT, Texte, 50 caractères, Null interdit, non indexé.
Pour chaque champ, n’omettez pas de compléter la zone « Légende » afin de rendre compré-
hensibles les intitulés techniques des noms de champ.
Créez la table « LIVRE » avec les items suivants :
• ISBN_LIVRE, clé primaire, Texte, 18 caractères, Indexé sans doublons. La création de la
clé donnera lieu à l’insertion d’un masque de saisie déjà existant (masque ISBN).
• TITRE_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon.
• AUTEUR_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon.
• EDITEUR_LIVRE, Texte, 50 caractères, Null autorisé, non indexé.
• DATE_LIVRE, Numérique, Entier, Null autorisé, non indexé (on indiquera seulement
l’année de parution).
• NB_PAGES_LIVRE, Numérique, Entier, Null autorisé, non indexé.
• PRIX_LIVRE, Numérique, Réel double, Null autorisé.
Créez la table « EMPRUNT » avec les caractéristiques suivantes :
• ID_EMPRUNT, clé primaire, NuméroAuto, Entier long, Indexé sans doublon.
• ID_ADHERENT, Numérique, Entier Long, Null interdit, non indexé.
• ID_EXEMPLAIRE, Numérique, Entier Long, Null interdit, non indexé.
• DATE_EMPRUNT, Date, Format « Date, Général » (date et heure complets).
• RETOUR_EMPRUNT, Date, Format « Date, Général ».
La création de la table « EXEMPLAIRE » va nous permettre de découvrir une nouvelle
fonction.
• Créez la table et son identifiant « ID_EXEMPLAIRE », clé primaire, NuméroAuto,
Entier long, Indexé sans doublon.
• Créez le champ « ISBN_LIVRE », texte, 18 caractères, non indexé (clé étrangère).
Exercices
Figure 2.14
Modèle relationnel
d’une bibliothèque
de prêt.
• Énoncé Vous devez concevoir le système d’information d’un organisme de formation. Les clients
de cette société, spécialisée dans la formation informatique, sont tous eux-mêmes des
sociétés commerciales qui envoient leurs salariés à des formations. L’organisme salarie
(en CDD) des formateurs en free-lance pour assurer des sessions de formation portant
sur divers sujets.
Vous devez donc mettre en relation les notions de société cliente, salarié, formateur,
cours, session de formation et salle de formation, puis créer les tables nécessaires.
1. Première approche conceptuelle. Pour vous aider, nous vous indiquons le processus
opérationnel :
• Relation client, salarié, embauche.
• Relation salarié, session, inscription.
• Relation session et formateur.
• Relation cours et session.
• Relation session et salle de formation.
2. Création des tables de la base.
1. La relation établie ici recouvre une approche « puriste » du modèle relationnel. Dans bien des systèmes d’information, on considèrera que
les cas de multi-employeurs ou de salariés qu’on retrouve dans plusieurs entreprises clientes est trop marginal pour mériter une table
intermédiaire « EMBAUCHE ». En effet, l’introduction de cette table alourdit singulièrement les procédures d’inscription d’un nouveau salarié
à une nouvelle session de formation. Dans bien des cas, les concepteurs préféreront les solutions dans lesquelles un même salarié est entré
plusieurs fois dans la base de données au titre de plusieurs employeurs.
La table intermédiaire « INSCRIPTION » servira, par exemple, à établir la base des listes
d’émargement de la formation.
La session se conjugue avec le formateur de la manière suivante :
• une session est assurée par un et un seul formateur ;
• un formateur assure une ou plusieurs formations.
Il n’y a donc pas lieu de développer cet aspect. On notera toutefois que, dans cette organi-
sation, la session ne peut être assurée que par un seul formateur : on exclut par là une
session où plusieurs intervenants sont nécessaires.
Le cours (la matière enseignée) s’associe à la session par la relation :
• une session concerne un et un seul cours ;
• un cours donne lieu à plusieurs sessions.
La salle de formation se lie avec la session ainsi :
• une session a lieu dans une et une seule salle ;
• une salle reçoit plusieurs sessions (dans le temps).
Ici encore, nous excluons le cas où une session de plusieurs jours pourrait avoir lieu dans
plusieurs salles.
Le dessin global (et réduit à ses seules clés du modèle relationnel) sera celui de la figure 2.15.
Figure 2.15
Première approche
du modèle
relationnel
d’un organisme
de formation.
• ID_COURS, (clé étrangère de la table COURS), Numérique, Entier long, Null interdit,
Non indexé.
• ID_SALLE, (clé étrangère de la table SALLE), Numérique, Entier long, Null interdit,
Non indexé.
• ID_FORMATEUR, (clé étrangère de la table FORMATEUR), Numérique, Entier long,
Null interdit, Non indexé.
• Énoncé Imaginez que vous êtes le responsable informatique du système télépéage. Les grands
principes : un groupement d’intérêt économique nommé Télépéage réunit toutes les
sociétés d’autoroute françaises (Sanef, APRR, Escota, etc.). Chaque société d’autoroute
possède des péages. Les particuliers ou les entreprises peuvent louer un ou plusieurs bad-
ges à coller sur le pare-brise du véhicule (mais le badge n’est pas nécessairement associé à
un véhicule précis). Le passage à un péage est automatiquement détecté, à l’entrée
comme à la sortie, de sorte que les voyages sont facturés en fin de mois et en bloc pour
tous les passages d’un badge. Vous devez concevoir le système d’information de Télé-
péage, en vous limitant aux tables essentielles du modèle.
1. Commencez par mettre sur papier vos premières approches conceptuelles.
2. Créez les tables nécessaires et les contraintes d’intégrité référentielle.
* Solution Bien que relativement simple, le modèle relationnel du système télépéage demande un
niveau d’abstraction assez élevé et recèle quelques pièges si ses éléments fondamentaux ne
sont pas bien dissociés.
1. Conception du système
En premier lieu, la notion de péage doit être précise : par péage, on entend, non pas un
groupement de passages, tous abrités par une grande arche, mais un couloir de péage par
lequel ne peut passer qu’un seul véhicule en même temps. Cette distinction revêt la plus
haute importance pour arriver à bien conjuguer les relations à mettre en place, en particulier
considérant le facteur temps. La notion de péage comporte donc les caractéristiques sui-
vantes :
• un numéro d’ordre ;
• un nom générique (Chartres nord, Chartres centre, Chartres sud par exemple) ;
• un n˚ de couloir dans la station de péage.
Cette seule énumération nous conduit à penser qu’il serait judicieux de créer deux tables,
l’une pour les stations, l’autre pour les couloirs en les liant ainsi :
• une station comporte un ou plusieurs couloirs ;
• un couloir est situé dans une et une seule station.
Il s’agit là d’une relation de un-à-plusieurs ne nécessitant pas de développements supplé-
mentaires.
La présence de deux types de clients, les particuliers et les entreprises, pourrait induire en
erreur et pousser le concepteur à créer deux tables distinctes. Cette dissociation n’est pas
nécessaire et compliquerait beaucoup le modèle pour un faible avantage. La seule problé-
2
Chapitre
matique de la fusion des deux types de clientèle concernera les zones obligatoires de la
fiche client, différentes pour les uns et les autres. Dans les deux cas, particulier ou entre-
prise, un client peut louer un ou plusieurs badges (un particulier peut très bien louer 3
badges, pour lui-même et ses deux enfants). Le badge apparaît donc comme un élément
indispensable du modèle : ce n’est pas le client qui passe le péage, mais son badge, ce qui
est très différent (le locataire peut très bien prêter son badge à un ami).
La relation à mettre en place pourrait donc se conjuguer ainsi :
• un client possède un ou plusieurs badges ;
• un badge appartient à un et un seul client.
Mais cette dernière affirmation est-elle exacte à tous les instants ? Certainement non. Il est
envisageable qu’un client rende son badge au système télépéage, pour beaucoup de motifs
valables, et que ce dernier soit mis en location auprès d’un autre et nouveau client. En
d’autres termes, si le badge est considéré comme une non-valeur et qu’il est jeté après
usage, alors l’affirmation précédente est juste ; dans le cas contraire (qui est le cas actuel),
la relation doit s’exprimer ainsi :
• un client possède un ou plusieurs badges ;
• un badge est loué par plusieurs clients (dans le temps).
Étant plurielle dans les deux sens, la relation doit se développer selon le modèle suivant :
• un client contracte une ou plusieurs locations ;
• une location concerne un et un seul client ;
et
• une location concerne un et un seul badge ;
• un badge peut donner lieu à plusieurs locations.
La notion de passage au péage, elle, traduit la relation qui existe entre un badge et un couloir
de péage ; elle donne lieu à l’affirmation suivante :
• un badge passe par plusieurs couloirs de péage (évidemment pas au même moment !) ;
• un couloir de péage voit passer plusieurs badges (évidemment pas ensemble, le couloir
étant trop étroit !) ;
Laquelle doit être développée ainsi :
• un badge effectue plusieurs passages dans un couloir (dans le temps) ;
• un passage correspond à un badge et un seul ;
et
• un passage correspond à un couloir et un seul ;
• un couloir enregistre plusieurs passages.
Exercices
Le prix qui sera facturé au client doit être incorporé dans le modèle. Assurément, il ne
peut pas être intégré directement dans la table des stations de péage puisqu’il est fonction
non pas d’une seule station mais du degré de proximité avec une autre station. Il s’agit
donc bien d’une relation réflexive de la table « STATION » avec elle-même.
• une station de départ correspond à un prix pour joindre une autre station d’arrivée (il
n’est pas possible de faire demi-tour sur une autoroute !) ;
• une station d’arrivée correspond à un prix pour être jointe à une station de départ.
Cette affirmation laisse entendre que le modèle permet d’intégrer des prix différents pour
l’aller et le retour depuis une station vers une autre. On peut également ajouter une date
de tarif qui permettra de gérer dans le temps les augmentations inéluctables.
Pour terminer, les sociétés d’autoroute doivent être liées aux stations de péage :
• une société d’autoroute possède une ou plusieurs stations ;
• une station est possédée par un et un seul concessionnaire.
Cette première étape de réflexion bénéficiera d’un premier brouillon sur le papier, où l’on
se contentera de jeter les petits carrés des tables, les identifiants et les clés étrangères, et les
relations. Le brouillon devrait donner un résultat voisin de la figure 2.16.
Figure 2.16
Première approche
du modèle
relationnel du
système télépéage.
C’est volontairement que ce modèle ne représente pas les tables contenant, par exemple,
les éléments de la réalisation de la facturation. En revanche, toutes les informations sont
en place pour réaliser ladite facturation tant au profit des sociétés d’autoroutes (qui per-
çoivent, au final, les droits de péage) et les clients (qui paient leurs passages). La table
« PASSAGE », la plus sollicitée de toutes, sera automatiquement incrémentée par les systèmes
de barrières. Sa lecture mensuelle sera à la base de la facturation.
1. Un index avec doublon pourrait être posé sur les deux champs « RAISON_SOCIALE_CLIENT » et « NOM_CLIENT » pour améliorer les
recherches, mais cet index aurait a gérer de nombreuses valeurs « Null », ce qui le rendrait peu performant.
Il ne faut évidemment pas créer de table « STATION_1 » comme l’indique le modèle rela-
tionnel de la figure 2.15 : cette présentation est fictive et Access gérera automatiquement la
relation réflexive de la table « STATION » sur elle-même.
Table « PEAGE » : • ID_PEAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_STATION, (clé étrangère de la table « STATION »), Numérique, Entier long, Null
interdit, non indexé.
• NO_PEAGE, Numérique, Entier, Null interdit, non indexé (pour indiquer le numéro
du couloir dans la station de péages).
Table « PASSAGE » : • ID_PASSAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_PEAGE, (clé étrangère de la table PEAGE), Numérique, Entier long, Null interdit,
non indexé.
• ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit,
non indexé.
• DATE_PASSAGE, Date, Null interdit, non indexé. Il est très important, ici que le format de
la date soit de type Général, indiquant aussi l’heure exacte de passage.
Table « TARIF » : • ID_TARIF, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_STATION1, (première clé étrangère de la table « STATION »), Numérique, Entier
long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage de
départ.
• ID_STATION2, (deuxième clé étrangère de la table « STATION »), Numérique, Entier
long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage
d’arrivée.
• PRIX_TARIF, Numérique, Réel Double, Null interdit, Non indexé.
• DATE_TARIF, Date au format Général, Null interdit, Non indexé.
Table « BADGE » : • ID_BADGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons.
• CODEBARRE_BADGE, Texte, 13 caractères, Null interdit, Indexé sans doublon.
Table « LOCATION » : • ID_LOCATION, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons.
• ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit,
Non indexé.
• ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit,
Non indexé.
• DATEDEBUT_LOCATION, Date au format abrégé, Null interdit, Non indexé.
• DATEFIN_LOCATION, Date au format abrégé, Null autorisé, Non indexé.
Table « STE_AUT » : La table « STE_AUT » sera en tous points identique à celle des clients. Il est néanmoins
dangereux de pratiquer la création de cette table en effectuant un copier/coller de la table
des clients. Les noms de champs, en particulier, doivent tous être suffixés « _STE_AUT » et
non plus « _CLIENT ».
Vous terminerez l’exercice en mettant en place toutes les relations grâce au bouton « Relations
des Outils de base de données ». N’oubliez pas de cocher l’option d’intégrité référentielle ;
la mise à jour ou la suppression en cascade ne sont pas indispensables.
d’acquisition de données,
importer et attacher
1. Les importations de données..... 66
Il existe de multiples manières d’acquérir des don-
2. Les liaisons de données ............ 71 nées dans Access. On peut les importer complète-
Problèmes et exercices
ment dans une base déjà existante, mais, au-delà
1. Importer des données
au format Excel ....................... 75 de cette première approche, on peut attacher des
2. Importer des données
au format CSV ........................ 77
sources de données à une base sans avoir à les
3. Importer des données manipuler dans Access. Ces données acquises,
d’une autre base Access........... 79
4. Établir les contraintes
le logiciel offre un puissant assistant pour créer
référentielles............................ 80 des requêtes propres à interroger la masse d’infor-
mations et réaliser aisément de lourds traitements.
Le même outil peut servir à insérer de nouvelles
données, à les modifier ou à les supprimer.
65
Access Livre Page 66 Mercredi, 27. f vrier 2008 7:28 07
Dans la mesure où les produits Microsoft sont intégrés les uns aux autres, la manière la
plus aisée de récupérer des données dans Access consiste simplement à les copier et les coller,
mais avec une option spécifique.
1. Créez une nouvelle base de données nommée « MesContacts » et rangée dans vos
documents favoris.
2. Créez une table nommée « CP », dotée de deux colonnes nommées « CODE » et
« VILLE », toutes deux de type texte de 255 caractères de long (valeur par défaut).
Supprimez toute clé primaire créée par défaut de sorte que la table ne comporte que
deux colonnes.
3. Ouvrez la table « CP » en mode Feuille de données en double-cliquant sur le nom de la
table.
4. Ouvrez le fichier « Codes_Postaux_France.xlsx ».
5. Mettez en surbrillance la totalité des deux colonnes A et B.
6. Appuyez sur Ctrl + C (copier).
7. Sans nécessairement fermer Excel, repassez sur la feuille Access vierge de la table
« CP ».
8. Dans la barre de menu « Accueil », cliquez sur le petit triangle en bas de l’icône Coller.
9. Cliquez sur « Coller par ajout ».
Access affiche un message d’insertion identique à celui de la figure 3.1.
Cette manipulation appelle quelques commentaires :
• L’emploi du simple « coller » (Ctrl+V) aurait généré un message d’erreur : si Access
cherche à coller l’ensemble des 8 004 enregistrements dans un seul champ, il n’y par-
viendra évidemment pas (« texte trop long pour être modifié » dit le message erreur).
C’est donc bien un « Coller par ajout » qu’il faut utiliser.
Figure 3.1
Ajout des codes
3
Chapitre
postaux dans
la table CP.
• Access cherchera à coller les données dans la mesure du possible : les deux colonnes qui
réceptionnent les données sont au format texte et d’une très grande largeur, le collage
sera donc effectif. Mais en supposant que la colonne « Ville » soit initialement au for-
mat numérique, l’importation ne se fera pas, car les données ne sont pas conformes.
Access proposera de créer une table des erreurs d’importations qui contiendra tous les
enregistrements en erreur.
• Le collage étant réalisé, on remarque que la première ligne, qui contenait dans Excel les
libellés de colonne n’a pas été collée, alors qu’elle aurait pu être importée, puisque
les colonnes destinataires ont un format texte conforme.
Le copier/coller par ajout sera toujours possible, qu’il s’agisse d’une feuille Excel, d’un
tableau dans Word, d’un fichier texte ou de toute autre source, à condition que les formats
source et destination soient compatibles.
Figure 3.2
Ajout des codes
postaux dans la
table CP.
• Access adapte le mieux possible le niveau d’index. Toutefois, il ne lit pas la totalité de la
colonne et propose un niveau moyen : ici, l’index sans doublon peut être choisi
puisqu’il n’y a pas de doublon.
3
Chapitre
Figure 3.3
Étape 3 d’une
importation Excel.
L’étape suivante concerne la clé primaire de la table ; par défaut, Access propose d’ajouter
une colonne qui servira de clé primaire à incrémentation automatique. Dans le cas pré-
sent, la colonne « CODE » n’ayant pas de doublon peut très bien constituer une clé
primaire.
Il est possible ensuite de renommer l’onglet Excel par un nom de table non existant dans
la base importatrice : nommez la table « CODE_POSTAL ».
À ce stade, tous les paramètres de l’importation sont en place et il serait possible de cliquer
sur « Terminer » ; toutefois Access permet d’enregistrer ces paramètres pour reproduire
la même opération ultérieurement. Il suffira alors de cliquer dans le ruban du menu
« Données externes » sur l’icône Importations enregistrées pour exécuter le même type
d’importation de nouvelles fois.
Figure 3.4
Étape 1 d’une
importation de
fichier texte
délimité.
Dans le pavé inférieur, la lecture du texte permet de bien identifier la nature du fichier et la
définition du séparateur, ici le point-virgule. L’étape qui suit validera le choix du séparateur et
la présence des en-têtes de colonnes.
Toutes les étapes suivantes sont identiques à celles qui ont été décrites dans la section 1.2
des importations depuis Excel.
Figure 3.5
Étape 2 d’une
importation de
fichier texte de
longueur fixe et
mémorisation des
paramètres.
3. Access propose la liste des tables contenues dans la base ciblée, comme à la figure 3.6.
Figure 3.6
Choix des tables à
lier à la base active.
4. Cliquez sur le bouton « Sélectionner tout » puis sur « OK » : toutes les tables sont
attachées.
Il est fréquent de lier une base Access à une base Microsoft SQL Server (ou une autre base :
Oracle, DB2, MySQL, etc.) ; cette liaison nécessite une procédure particulière :
1. Dans le ruban du menu « Données externes », cliquez sur l’icône Plus dans le pavé
« Importer ».
2. Cliquez sur « Bases de données ODBC ».
3. Cliquez sur « Lier à la source de données » en créant une « table attachée » puis sur
« OK ».
4. Vous devez créer un fichier « .dsn » qui contiendra vos paramètres de connexion :
cliquez sur « nouveau ».
5. Sélectionnez le pilote correspondant à la base à laquelle vous voulez vous connecter
(Oracle, SQL Server).
6. Cliquez sur « Parcourir » pour préciser le chemin et le nom du fichier « .dsn » à créer.
7. Donnez un nom à votre fichier puis cliquez sur « Suivant » pour voir la grille-écran
que montre la figure 3.7.
Figure 3.7
Paramétrage de la
connexion ODBC.
Contrairement aux liens avec Access, l’accès à la base de données via ODBC est condi-
tionné par la mise au point des moyens d’accès à cette base : le paramétrage représenté à la
figure 3.8 est donc primordial.
3
Chapitre
Figure 3.8
Paramétrage du
login à la base
de données.
Figure 3.9
Tables, vues et
autres objets
disponibles sous
SQL Server.
Figure 3.10
Logos des liaisons.
Pour retrouver l’emplacement des fichiers source (sauf connexion ODBC), cliquez du
bouton droit sur la « table attachée » puis sélectionnez le « Gestionnaire de tables liées ».
Cette option permet également de mettre à jour les liaisons.
Résumé
Access dispose de tous les outils nécessaires pour importer des données de toute prove-
nance, fichiers Excel, tables d’un autre fichier Access, fichiers texte délimités ou fichiers
texte de largeur fixe. Les paramètres d’importation peuvent être mémorisés et permettre
ainsi la reproduction de ces importations.
Toutes les caractéristiques de l’importation sont applicables de la même manière pour
créer des attaches avec les mêmes objets sources. Contrairement aux importations, les
attaches offrent une mise à jour constante des données de destination dans Access.
Les bases Access se connectent via ODBC (Open Date Base Connectivity) à des bases de
données d’entreprise telles qu’Oracle, MS-SQL Server, MySQL ou autres.
Problèmes et exercices
3
Chapitre
Les exercices de ce chapitre visent à importer de diverses manières des données externes
pour mettre en place une base de données qui servira pour tous les travaux ultérieurs.
Après les importations effectuées dans les exercices ci-après, ceux des chapitres suivants
exploiteront les données chargées via de nombreuses requêtes.
13. À la quatrième étape, cochez l’option « Choisir ma propre clé primaire » et laissez la
colonne « ID_ELEVE » proposée ; cliquez sur « Suivant ».
14. À la cinquième étape, laissez le nom « ELEVE » pour la future table, ne cochez pas
l’option « Je souhaite que l’assistant… » (nous ferons nous-mêmes l’analyse pro-
posée).
2. Paramétrage de la table
La table est importée. Analysons ses caractéristiques :
1. Cliquez du bouton droit sur la table « ELEVE » et sélectionnez « Mode création ».
2. Le champ « ID_ELEVE » a été créé de type Numérique avec une taille Réel Double :
cette présentation peut être gênante par la suite pour les relations entre les tables. Posi-
tionnez la taille de ce champ à « Entier Long » (on remarquera qu’il n’est plus possible
de modifier le type et de le faire passer en « NuméroAuto »).
3. Mettez une légende correcte et compréhensible au champ « ID_ELEVE » comme « N˚
de l’élève » par exemple.
4. La propriété « Null Interdit » du champ « ID_ELEVE » est positionnée à « Non », ce
qui paraît étonnant puisque la colonne est une colonne primaire. Vous pouvez modifier
cette propriété en « Oui », mais il n’y aura pas d’incidence sur la table.
5. Cliquez immédiatement sur la petite disquette d’enregistrement dans la barre supé-
rieure de l’écran, Access avertit que certaines données peuvent être perdues. Cela pro-
vient du fait que la colonne « ID_ELEVE » est passée de Réel Double à Entier Long ;
aucune donnée ne sera altérée puisque le plus grand ID porte le n˚ 26 : cliquez sur
« Oui ».
6. Le champ « NOM_ELEVE » est positionné à 255 caractères (valeur par défaut),
réduisez-le à 50.
7. Le champ « NOM_ELEVE » n’a pas de légende : indiquez simplement « Nom ».
8. Le champ « NOM_ELEVE » n’est pas obligatoire : modifiez cette option en mettant la
propriété « Null interdit » à « Oui » et la propriété « Chaîne vide autorisée » à « Non ».
9. Les champs « PRENOM_ELEVE » et « ADRESSE1_ELEVE » seront modifiés de la
même manière que le nom.
10. Le champ « ADRESSE2 » peut être vide (« Null interdit » à « Oui »).
11. Le code postal est réduit à 5 caractères, obligatoire.
12. La ville est réduite à 50 caractères, obligatoire.
13. Le pays est réduit à 5 caractères, obligatoire.
14. Le numéro de téléphone est réduit à 10 caractères (effectivement en type Texte), obli-
gatoire.
15. Le format Date/heure du champ « DATENAISSANCE_ELEVE » est correct, mais doit
devenir obligatoire.
16. Le champ « SEXE_ELEVE » peut être réduit à un caractère et doté d’une liste de
choix : cliquez sur l’onglet correspondant. Choisissez « Zone de liste déroulante »
pour la zone « Afficher le contrôle », « Liste valeurs » pour la zone « Origine source »,
« M;Masculin;F;Féminin » pour la zone « Contenu », la valeur « 2 » pour la zone
« Nombre de colonnes », « 1;3 » pour la zone « Largeur des colonnes ».
17. Fermez et validez les messages d’avertissement.
* Solution 1. Importation
Le fichier « NOTE.csv » est un fichier texte, et plus précisément un fichier délimité à
séparateur point-virgule (csv étant l’abréviation de Coma Separated Values). Il est pos-
sible d’ouvrir directement ce fichier avec Excel, mais pour bien en comprendre la
structure, il est préférable de l’ouvrir avec un simple éditeur de texte :
1. Cliquez sur le bouton « Office » en bas d’écran.
2. Cliquez sur « Tous les programmes > Accessoires > Bloc-Notes » : la fenêtre de l’éditeur
NotePad s’ouvre.
3. Cliquez sur « Fichier > Ouvrir ».
4. Dans la fenêtre d’ouverture de fichier, cliquez sur le type « Tous les fichiers » et pointez
le fichier « NOTE.csv » récupéré.
Ce fichier apparaît tel qu’à la figure 3.11.
Figure 3.11
Fichier CSV lu
sous NotePad.
Exercices
Figure 3.12
Table NOTE
3
Chapitre
immédiatement
après importation.
• Énoncé À partir des trois tables qui ont été intégrées à la base « ECOLE_INTERNATIONALE »,
mettez en place toutes les contraintes d’intégrité référentielles possibles. Sachant que
trois matières (ANGLAIS, ALLEMAND, ITALIEN) doivent être considérées comme un
ensemble nommé LANGUES VIVANTES, mettez en place la solution relationnelle.
* Solution La première partie du problème met en application les principes étudiés au chapitre 2.
1. Dans le ruban du menu « Outils de base de données », cliquez sur le bouton
« Relations ».
2. Ajoutez les trois tables en présence.
3. Liez, avec intégrité référentielle, les clés primaires avec leur clé étrangère de sorte
d’obtenir le modèle relationnel de la figure 3.13.
Figure 3.13
Premier modèle
relationnel de la
base ECOLE_
INTERNATIONALE.
Le regroupement des différentes langues en une seule matière « Langues Vivantes » oblige
à la création d’une table « GROUPE » destinée à lister tous les groupes de matières : d’une
part, les matières non regroupées et, d’autre part, les langues vivantes.
En généralisant, on peut imaginer que chaque matière peut être « dégroupée » en plu-
sieurs ; par exemple, l’histoire-géographie pourrait être scindée en histoire, d’une part, et
géographie, d’autre part. Il faut donc créer une table « GROUPE », mais aussi une table
« REGROUPEMENT » pour mettre en place une sorte de tableau d’équivalence.
1. Vous devez créer une nouvelle table nommée « GROUPE », pour cela :
2. Dans le ruban du menu « Créer », cliquez sur « Table ».
Figure 3.14
Second modèle
relationnel de la
base ECOLE_
INTERNATIONALE.
Il reste à remplir les tables « GROUPE » et « REGROUPEMENT » pour obtenir les résultats
de la figure 3.15.
Conservez ces travaux, qui resserviront dans les chapitres suivants.
Exercices
Les requêtes
4
Chapitre
83
Access Livre Page 84 Mercredi, 27. f vrier 2008 7:28 07
Figure 4.1
Fenêtre de
l’assistant requêtes
d’Access.
La syntaxe complète est SELECT CODE_POSTAL.* FROM CODE_POSTAL; qui signifie littéra-
lement : sélectionnez tous les champs dans la table CODE_POSTAL. On notera que la
requête se termine obligatoirement par un point-virgule qui, dans le langage SQL, signale
4
Chapitre
la fin d’instruction.
L’assistant requêtes permet donc de présenter une requête sous au moins trois formes :
• un mode création destiné à rédiger la requête avec un outil graphique ;
• un mode feuille de données présentant les résultats ;
• un mode SQL permettant de rédiger directement ou de voir simplement la requête sous
la forme du langage SQL ; ce dernier mode nous servira ultérieurement pour copier/
coller du code SQL et l’introduire dans du code Visual Basic.
L’accès à ces trois modes est obtenu grâce à la flèche située au-dessous de l’icône Affichage
du ruban. On y accède également grâce aux petites icônes situées en bas à droite de la
fenêtre.
1. Revenez en mode création (flèche sous Affichage et « Mode création », ou bouton
« Mode création » en bas de la fenêtre).
2. Placez la souris au-dessus de la première colonne, de sorte que le pointeur apparaisse
comme une flèche noire vers le bas.
3. Appuyez sur la touche « Sup. » : la colonne est supprimée. L’assistant est prêt pour une
nouvelle requête.
4. Dans la partie supérieure présentant les tables, cliquez sur le mot « CODE » de la table
« CODE_POSTAL » et, sans relâcher la souris, faites glisser cette zone dans la ligne
Champ de la première colonne située dans la partie inférieure de la fenêtre. Le même
résultat est obtenu en double-cliquant sur le mot « CODE » de la table.
5. Faites de même avec le mot « VILLE » en le faisant glisser vers la zone Champ de la
deuxième colonne, ou bien en double-cliquant dessus.
6. Le code SQL associé (obtenu via la flèche sous l’icône Affichage du ruban, ou la petite
icône en bas droite) est SELECT CODE_POSTAL.CODE, CODE_POSTAL.VILLE FROM
CODE_POSTAL; qui pourrait être simplifié dans le cas présent en SELECT CODE, VILLE
FROM CODE_POSTAL;.
7. Le résultat est obtenu en passant en mode feuille de données (via la flèche sous Affichage
ou la première petite icône en bas de la fenêtre). Il est exactement similaire au précédent,
à la différence près que les champs ont été appelés séparément.
L’affichage en mode feuille de données permet, comme pour les tables, de présenter provi-
soirement les données de différentes manières. En cliquant sur la zone de liste déroulante,
accessible par le triangle pointé en bas, situé à droite du nom de colonne, il est possible
d’effectuer des tris et des filtres. Ces opérations sont totalement « accompagnées » par des
choix d’option adaptés au type de colonne (texte, numérique ou date). On peut, par
exemple, ne montrer que les villes commençant par PARIS, ou les codes postaux finissant
par 000 (préfectures). Ces assistants ne mémorisent pas la présentation obtenue. Il ne
s’agit ici que d’une modification temporaire de l’affichage, qui n’affecte en rien la requête
initiale. Les explications qui suivent montrent comment réaliser des tris et des filtres de
plus en plus élaborés, et comment enregistrer les requêtes ainsi obtenues.
Les requêtes 85
Access Livre Page 86 Mercredi, 27. f vrier 2008 7:28 07
Le fichier livré est déjà trié par ordre de code postal, nous voulons à présent le trier par
ville.
1. Repassez en « Mode création » sur la requête précédente afin de pouvoir la modifier
(soit par la flèche sous Affichage du ruban, soit par les icônes en bas de la fenêtre).
Cliquez sur la ligne « Tri » de la colonne VILLE, puis ouvrez la zone de liste déroulante
qui apparaît sur la droite de cette zone.
2. Sélectionnez « Croissant ».
3. Repassez en « Mode feuille de données » pour visualiser le résultat (petite icône en bas
de la fenêtre).
La requête renvoie tous les enregistrements triés par ville. Si l’on consulte la liste à la lettre
P comme Paris, on constate que les codes postaux pour tous les items de la capitale sont à
présent désordonnés La deuxième requête visera donc à trier le fichier par VILLE puis par
CODE.
1. Repassez en « Mode création » pour effectuer une nouvelle modification de la requête.
Placez la souris au-dessus de la colonne VILLE pour faire apparaître la flèche noire
pointée vers le bas.
2. Cliquez sur la colonne « VILLE ».
3. En gardant le clic enfoncé, déplacez la colonne vers la gauche pour l’amener à gauche
de la colonne CODE puis relâchez
4. Sur la ligne Tri, dans la colonne CODE, sélectionnez aussi le « tri croissant ».
5. Affichez les données en sélectionnant le « Mode feuille de données ».
Le tri est désormais correct et s’applique aux villes puis, à l’intérieur d’une même ville, par
code postal. L’assistant requête se lit de gauche à droite et les tris s’effectuent successi-
vement de gauche à droite. En supposant que la liste attendue doive présenter malgré tout
les codes avant les villes, le procédé suivant devra être utilisé :
1. Repassez en « Mode création ». Cliquez sur le champ « VILLE » (pour placer le curseur à
cette colonne).
2. Dans le ruban, cliquez sur « Insérer des colonnes ». Une nouvelle colonne vient se
mettre à gauche.
3. Glissez de nouveau le champ « CODE » dans cette nouvelle colonne, n’y ajoutez pas de
notion de tri.
4. Décochez la zone « Afficher » de la colonne CODE de droite pour obtenir la structure
de la figure 4.2.
Figure 4.2
Requête de tris
successifs avec
réordonnancement
des colonnes.
L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL ORDER BY
VILLE, CODE; où la clause ORDER BY de tri se réalise dans l’ordre précisé. CODE et
VILLE peuvent être éventuellement précédés par le nom de leur table d’appartenance
4
Chapitre
Cette section aborde les requêtes de filtrage. Il est préférable d’annuler les consignes de tri
précédentes, situées dans les colonnes VILLE et CODE en remplaçant « croissant » par
« non trié » grâce à la liste déroulante de la zone tri. Nous désirons maintenant ne consulter
que les items concernant Paris :
1.Dans la zone Critères de la colonne VILLE, saisissez le mot « PARIS » et validez.
2.Des guillemets se positionnent automatiquement pour cerner ce mot.
3.Affichez en « Mode feuille de données ».
4.La requête renvoie 29 enregistrements qui contiennent tous et exactement le seul mot
PARIS.
Cherchons à présent à afficher tous les enregistrements commençant par le mot Paris :
1. Repassez en « Mode création ». Dans la zone critère, remplacez le libellé actuel par
« Comme "PARIS*" ».
2. La requête renvoie cette fois 152 enregistrements dont le libellé de ville commence par
Paris.
L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL WHERE
VILLE LIKE "PARIS*"; 1.
L’astérisque qui suit le mot Paris fonctionne comme un « joker » qui sélectionne toutes les
occurrences possibles après le mot Paris. Le positionnement de l’astérisque en début de
chaîne de caractères renverrait toutes les villes dont le libellé se termine par Paris (30 enre-
gistrements et non 29 car il existe une ville nommée DAMPARIS). Un autre type de joker,
le point d’interrogation, désigne un et un seul caractère qui peut prendre toutes les valeurs
possibles ; ainsi la requête SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE
"P???S*"; renvoie 30 enregistrements car, outre la ville de Paris, la ville de Poses com-
mence par un P et finit aussi par un S tout en comptant 5 caractères.
Nous cherchons maintenant à afficher les enregistrements relatifs à Paris OU à Bordeaux.
On portera une attention particulière à la terminologie : en utilisant le mot « OU », exact,
nous désirons voir tous les codes postaux parisiens et tous les codes postaux bordelais
(addition des deux natures d’items).
1. Repassez en « Mode création ». Dans la première ligne des critères, colonne VILLE,
insérez le mot « PARIS ».
2. Dans la deuxième ligne des critères, même colonne, insérez le mot « BORDEAUX ».
3. La requête renvoie 34 enregistrements.
1. L’approche volontaire et directe du code SQL réalisée ici ne doit pas être appliquée à la lettre à toutes les bases de données. Des différences
syntaxiques importantes sont à déplorer ; sous Oracle, la même requête se terminerait par WHERE VILLE LIKE ‘PARIS%’;
Les requêtes 87
Access Livre Page 88 Mercredi, 27. f vrier 2008 7:28 07
Figure 4.3
Requête cumulant
des critères à
opérateur
arithmétique.
L’équivalent SQL de cette requête s’écrit SELECT CODE, VILLE FROM CODE_POSTAL WHERE
CODE>="75000" AND CODE<"76000"; .
Reprenons la requête ne renvoyant que les enregistrements dont la ville est PARIS (le
libellé "PARIS" dans la zone Critère de la colonne VILLE) : nous rappelons qu’elle renvoie
29 lignes.
Il est possible de ne vouloir afficher que les valeurs distinctes dans les critères demandés :
1. Supprimez la colonne relative au CODE pour ne plus avoir que la colonne VILLE.
Attention
La clause DISTINCT s’applique à toutes les colonnes de la requête ; si vous remettez la colonne
CODE dans la requête, celle-ci renverra alors et de nouveau 29 enregistrements.
Une requête peut intégrer un ou plusieurs paramètres qui seront fournis par l’utilisateur
lors de son lancement.
1. Le cas échéant, supprimez tous les critères ou propriétés antérieurs (la propriété
« DISTINCT » en particulier) et ajoutez éventuellement une colonne CODE en double-
cliquant sur le champ « CODE » de la table.
2. Dans la zone Critère de la colonne VILLE, entrez le libellé suivant, cerné par des
crochets : « [Indiquez une ville pour en connaître le code postal] ».
3. Passez en « Mode feuille de données » : à ce moment, une boîte de dialogue s’ouvre
contenant la question que vous avez paramétrée.
4. Saisissez une ville de votre choix, la requête renverra le ou les enregistrements corres-
pondants à la ville saisie.
Pour éviter de présenter le nom du champ d’où sont extraites les données, souvent peu
compréhensibles, une requête peut renvoyer un en-tête de colonne différent qu’on nom-
mera alias. Cet artifice n’est pas seulement utile au plan « esthétique », il pourra servir
dans la requête SQL ultérieurement ou dans une autre requête en cascade.
Dans la zone champ et la colonne où est indiquée la ville, saisissez le libellé suivant :
« Bureau distributeur : VILLE ».
La partie à gauche des deux points (:) constitue l’alias du champ VILLE présenté à droite
des deux-points ; on notera que l’alias peut comporter des espaces alors que si le nom de
champ avait des espaces, il serait nécessaire de cerner l’expression par des crochets.
La traduction SQL de cette requête s’écrira SELECT VILLE AS [Bureau distributeur],
CODE FROM CODE_POSTAL; où le mot AS désigne l’alias.
Les requêtes 89
Access Livre Page 90 Mercredi, 27. f vrier 2008 7:28 07
Les alias deviennent indispensables lorsque des fonctions sont utilisées. Nous allons
créer une requête dans laquelle apparaîtra une colonne supplémentaire indiquant le
département.
1. Au préalable, supprimez les différents critères précédents et remettez la propriété
Valeurs distinctes à « Non » dans la feuille de propriétés de la requête en mode
création.
2. Dans la première colonne, zone Champ, insérez la formule « Département : Gauche
(CODE ;2) ».
3. Dans les colonnes plus à droite, remettez en place les deux autres champs, CODE et
VILLE.
4. Visualisez la requête en mode feuille de données.
La fonction « GAUCHE() », ici, a été utilisée ; elle extrait les caractères de gauche d’une
chaîne de caractères ; le nombre de caractères à extraire doit être indiqué dans la fonction
après un séparateur point-virgule. L’équivalent SQL donne SELECT Left([CODE],2) AS
Département, CODE, VILLE FROM CODE_POSTAL; le mot-clé LEFT est le même en SQL et
en Visual Basic ; comme presque tous les autres mots-clés, il est francisé pour l’utilisation
d’Access en version française.
Access dispose d’un générateur d’expression qui aide à la mise au point de formules
élaborées :
1. Cliquez dans le Champ d’une colonne vide en mode création.
2. Saisissez « Formule : » (le mot formule suivi de deux points).
3. Cliquez dans le ruban sur l’icône Générateur.
4. Dans le pavé de gauche, développez l’item « Fonctions », puis « Fonctions intégrées ».
5. Vous lisez dans le pavé de droite toutes les fonctions disponibles dans Access comme le
montre la figure 4.4.
Figure 4.4
Générateur
d’expression
d’Access.
On prendra garde au fait que les mots-clés à utiliser sont parfois identiques à ceux d’Excel,
comme la fonction GAUCHE() par exemple. Ils sont quelquefois différents, comme dans
les deux exemples suivants :
• la fonction SI() sous Excel se nomme VRAIFAUX() sous Access ;
• la fonction STXT() sous Excel (extraction de caractères dans une chaîne) se nomme
EXTRACCHAÎNE() sous Access.
4
Chapitre
Toutes les fonctions utilisables ici sont dites scalaires : elles s’appliquent sur tous les enre-
gistrements à afficher dans le résultat de la requête, contrairement aux fonctions agrégats
qui s’appliquent sur des ensembles d’enregistrements et qui sont étudiées ci-après.
Dès qu’il est nécessaire de regrouper des données, soit pour présenter des synthèses, soit
pour effectuer des calculs, l’affichage de la requête en mode création doit comporter des
critères de regroupement :
1. Dans le ruban, cliquez sur l’icône Totaux ∑.
2. Une ligne supplémentaire apparaît dans le pavé inférieur nommée Opération.
3. Toutes les opérations sont considérées par défaut comme Regroupement à l’image de la
figure 4.5.
Figure 4.5
Requête de
regroupement
de données.
Les requêtes 91
Access Livre Page 92 Mercredi, 27. f vrier 2008 7:28 07
Si seuls les bureaux distributeurs du département de l’Ain doivent être décomptés, il suf-
fira d’ajouter le critère "01" dans la colonne Département. La condition « = "01" » ne porte
pas sur chaque item mais sur le regroupement, comme le montre plus explicitement la
traduction SQL SELECT Left([CODE],2) AS Département, Count(CODE_POSTAL.CODE)
FROM CODE_POSTAL GROUP BY Left([CODE],2) HAVING (((Left([CODE],2))="01"));
où la clause HAVING est insérée après le GROUP BY.
Pour faire intervenir une condition sur chaque enregistrement, il faut utiliser l’opération
« Où » (équivalent à l’instruction WHERE dans la syntaxe SQL) dans une colonne nou-
velle, et non plus sur le regroupement. Supposons, par exemple, que le résultat attendu
compte tous les bureaux distributeurs de la ville de Paris, il faudra composer la requête à
l’image de la figure 4.6.
Figure 4.6
Requête de
regroupement de
données avec filtre
scalaire.
Dans le paragraphe précédent, il a été possible de lister les 97 départements par une opé-
ration de regroupement ; en revanche, il n’est pas possible d’obtenir directement le
décompte 97 (en une seule ligne) car il est nécessaire de faire deux opérations successives :
• le regroupement (GROUP BY) ;
• puis le compte (COUNT).
La solution la plus aisée consiste à faire une première requête, puis à en créer une seconde
avec les résultats de la première 1. Procédez de la manière suivante :
1. En mode création, réduisez la première requête à la définition du Département (pas
d’autre colonne).
2. Sélectionnez l’opération de regroupement.
3. Vérifiez le résultat ( renvoi de 97 enregistrements en liste) et enregistrez la requête
sous le nom « Req_Regroupement » 2.
4. Créez une nouvelle requête qui appelle la requête Req_Regroupement. Pour cela,
sélectionnez « Créer » et « Création de requête » dans le ruban, puis dans la fenêtre
« Afficher la table », en sélectionnant l’onglet « Requêtes » et « Req_Regroupement ».
1. Il est aussi possible de créer des sous-requêtes, dans certains cas de figure, que nous n’étudierons pas ici, dans le cadre d’une approche
limitée du langage SQL.
2. Une convention de nom largement répandue veut que les noms des requêtes commencent par le préfixe Req_ ou Rqt_ ou Qry_ pour bien
indiquer qu’il s’agit de requêtes et non pas de tables. Si nous approuvons cette convention, nous nous refusons, en revanche à préfixer les tables
Tbl_ et recommandons de ne pas insérer d’espaces dans les noms d’objets. Ces recommandations cherchent à recouper clarté dans les concepts
et facilité dans la frappe du code.
Figure 4.7
Requête
avec jointure.
Affichée en mode feuille de données, la requête montre six enregistrements, le code étant
présent deux fois (dans la table « ADRESSE » et dans la table « CODE_POSTAL »). La ville
de domicile est désormais correctement renseignée ; il a été établi une jointure entre les
Les requêtes 93
Access Livre Page 94 Mercredi, 27. f vrier 2008 7:28 07
deux tables et Access montre tous les enregistrements de la table « ADRESSE » et tous les
enregistrements correspondants de la table « CODE_POSTAL ».
1. En mode création, cliquez du bouton droit sur la jointure (le trait) qui avait été établie
automatiquement entre les deux tables et sélectionnez « Supprimer » : la requête ren-
voie maintenant 48 024 enregistrements. En procédant ainsi, on réalise un produit
cartésien des deux tables, c’est-à-dire la mise en place de toutes les combinaisons pos-
sibles entre tous les éléments de la première table avec tous les éléments de la seconde.
À moins de circonstances exceptionnelles, ce cas de figure ne se présente jamais. En
revanche, cette manipulation correspond à une erreur trop souvent commise et qu’on
évitera à tout prix. Il est donc très important d’établir des jointures correctes dès que
plusieurs sources de données sont appelées dans la requête. Il peut être créé autant de
jointures que nécessaire, en nombre illimité.
2. Rétablissez la jointure en faisant un glisser/déplacer de la clé primaire CODE vers sa
clé étrangère de la table « ADRESSE », puis cliquez à nouveau du bouton droit sur
cette jointure pour en afficher les propriétés, comme à la figure 4.8.
Figure 4.8
Propriété
d’une jointure.
En sus de l’outil « Requêtes », Access propose un « Assistant requête » qui décompose pas
à pas la mise en place des requêtes. Cet outil est utile mais non indispensable dès que les
notions abordées dans les paragraphes précédents sont bien assimilées ; de fait, il ralentit
singulièrement la mise en place d’une requête. En revanche, le même bouton du ruban
propose aussi de créer des requêtes assez complexes et pourtant fréquemment utilisées :
• les requêtes d’isolement des doublons ;
Pour qu’une requête ajout soit fonctionnelle, elle doit respecter en tous points les contraintes
d’intégrité qui ont été posées lors de la conception de la base. En particulier, l’ajout d’un
enregistrement ne se réalisera que si tous les champs dont la propriété Null interdit est
positionnée à Oui (champs Not Null) sont effectivement servis.
1. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.
2. Fermez immédiatement la fenêtre d’affichage des tables sans sélectionner aucun objet.
3. Dans le ruban, cliquez sur l’icône Ajout symbolisé par une croix verte avec un point
d’exclamation.
4. Dans la boîte de dialogue d’Ajout, citez la table « ADRESSE » comme destination des
ajouts et validez par « OK ».
5. Dans la première colonne, en bas, saisissez l’alias « MON_NOM » suivi de deux points
(:) et de votre nom entre guillemets, puis précisez dans la zone Ajouter à (située en
dessous) le champ NOM grâce à la liste déroulante.
6. Dans la deuxième colonne, saisissez « MON_PRENOM : » et votre prénom entre
guillemets, puis sélectionnez le champ PRENOM dans la zone Ajouter à.
7. Dans la troisième colonne, saisissez « MON_ADRESSE : » et votre adresse entre
guillemets, puis sélectionnez le champ ADRESSE1 dans la zone Ajouter à.
8. Dans la quatrième colonne, saisissez « MON_CP : » et votre code postal entre guillemets
puis sélectionnez le champ CODE dans la zone Ajouter à.
Les requêtes 95
Access Livre Page 96 Mercredi, 27. f vrier 2008 7:28 07
Passez en mode SQL et visualisez le code ; celui-ci devrait être similaire au suivant :
INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE)
SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des
Vinaigriers" AS MON_ADRESSE, "75010" AS MON_CP;
1. Cliquez sur l’icône de point d’exclamation Exécuter.
2. Un message vous avertit que vous allez ajouter une ligne à la table destination, validez
par « OK » 1.
3. Allez consulter la table « ADRESSE » : cette nouvelle ligne a été ajoutée.
On retiendra que les guillemets, s’agissant d’une zone texte, sont obligatoires. Ils sont
facultatifs, en revanche, lorsque l’insertion concerne une valeur numérique dans un
champ du même type. Les dates, enfin, sont automatiquement cernées par Access d’un
signe dièse (#).
Cette première requête ajout a réalisé une insertion à partir de données totalement exter-
nes à la base, mais il est également possible d’insérer des données à partir d’autres tables.
1. Reprenez en mode création la requête ajout qui a été mise en place.
2. Cliquez sur Afficher la table situé dans le ruban.
3. Sélectionnez la table « CODE_POSTAL ».
4. Supprimez la colonne actuelle d’insertion du code postal dans la partie inférieure de
l’écran.
5. Faites un glisser/déplacer du champ CODE vers une nouvelle colonne, puis précisez
dans la zone Ajouter à le champ CODE pour destination.
6. Faites un glisser/déplacer du champ VILLE vers une nouvelle colonne et ne précisez
aucun champ de destination.
7. Dans la zone Critère de la colonne VILLE, insérez le nom d’une ville qui ne compte pas
de doublon 2 : Gex, par exemple, code 01170.
La figure 4.9 présente ce que vous devez voir à l’écran.
Figure 4.9
Insertion d’un
enregistrement à
partir d’une autre
table.
1. Les messages de service tels que celui-ci peuvent être supprimés dans l’application en allant dans le sous-menu Avancé des Options d’Access
(bouton Office) et en décochant Confirmer > Requêtes actions. On peut aussi utiliser la commande Visual Basic DoCmd.SetWarnings False.
2. Si l’insertion concerne une ville représentée plusieurs fois dans la table source, il y aura autant de lignes ajoutées que de lignes sources.
Dans cette requête, on ajoute une ligne d’adresse avec le code postal dont la ville est Gex,
code postal retrouvé grâce à la table des codes postaux. Sa présentation SQL est
4
Chapitre
1. Access ne prend pas en charge la commande TRUNCATE qui, dans beaucoup de bases de données, permet de vider très rapidement le
contenu entier d’une table.
Les requêtes 97
Access Livre Page 98 Mercredi, 27. f vrier 2008 7:28 07
Ces requêtes, qui correspondent à l’instruction SQL UPDATE, réalisent la mise à jour de
tout ou partie d’un ou plusieurs enregistrements. L’assistant requêtes d’Access la propose
sous la forme graphique suivante :
1. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.
2. Sélectionnez la table « ADRESSE » puis fermez.
3. Cliquez sur l’icône Mise à jour dans le ruban, symbolisé par un petit crayon sur une
grille, suivi par un point d’exclamation.
4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la première
colonne.
5. Faites un glisser/déplacer du champ CODE depuis la table « ADRESSE » vers la
seconde colonne.
6. Dans la zone Critères du champ NOM, saisissez « DUPONT » (il s’agit d’un des contacts
de la table « ADRESSE » dont le code postal, avant mise à jour est 01000).
7. Dans la zone Mise à jour du champ CODE, saisissez un code postal quelconque (mais
existant !).
L’assistant requêtes sera donc disposé comme à la figure 4.10.
Figure 4.10
Paramétrage d’une
requête mise à jour.
L’équivalent SQL de cette requête est UPDATE ADRESSE SET CODE = "75010" WHERE
NOM="DUPONT";. S’il existe plusieurs contacts nommés Dupont dans la table ADRESSE,
tous seront dotés, après la mise à jour, du code postal saisi.
Comme pour toutes les requêtes actions, Access informe l’utilisateur du nombre de mises
à jour qu’il effectue lorsqu’il exécute cette requête.
Toute requête action (ajout, suppression, mise à jour) s’inclut dans une transaction. Cette
notion est particulièrement importante lorsque la base de données est partagée par plu-
sieurs utilisateurs. La démarche générale d’une transaction se traduit par les événements
successifs suivants :
• Un utilisateur (numéroté 1) démarre explicitement une transaction (par une commande
qu’on verra plus loin).
utilisateurs ne voient pas les ajouts, mises à jour ou modifications apportés à la base.
• Dans ce même temps, les enregistrements impactés par les actions de l’utilisateur 1 sont
bloqués (LOCK), c’est-à-dire qu’un utilisateur 2 ne peut pas y porter une autre requête
action.
• L’utilisateur 1 clôt sa transaction.
• Les autres utilisateurs voient les nouvelles données et peuvent intervenir.
La notion de transaction est opérationnelle :
• avec les tables d’une base de données active ;
• avec les tables d’une base de données connectée sous ODBC 1.
Elle n’est pas opérationnelle avec les tables Access ou autres objets (feuille Excel, fichier
texte, etc.) attachés à la base active.
Attention
Pour que le mode transactionnel soit utilisable, il faut que la base de données utilise une syntaxe
compatible avec SQL Server : cliquez sur le bouton Office > Options Access > Concepteurs
d’objets et cochez la case Syntaxe compatible SQL Server pour cette base de données. Il faudra
s’assurer ensuite d’annuler ce paramétrage car il comporte de lourds effets sur toutes les syn-
taxes SQL employées dans cette base.
1. À condition que la base de données connectée sous ODBC supporte elle-même la notion de transaction.
Les requêtes 99
Access Livre Page 100 Mercredi, 27. f vrier 2008 7:28 07
10. Ouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez
deux fois sur Affichage à gauche dans le ruban) : elle ne contient apparemment pas
votre enregistrement. Refermez-la.
11. Effacez le texte d’insertion dans la requête en cours et remplacez-le par les mots-clés
« COMMIT TRANSACTION » (avec le point-virgule de fin), et exécutez cette
requête. Si le symbole Exécution n’apparaît plus dans le ruban, cliquez sur le second
onglet « Créer » situé sur la droite.
12. Rouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez
deux fois sur Affichage dans le ruban) : le nouvel enregistrement est bien présent.
Si la commande « ROLLBACK TRANSACTION » avait été utilisée en lieu et place du
« COMMIT TRANSACTION », l’insertion aurait été purement et simplement annulée.
Quelques derniers points essentiels sont à retenir sur cet aspect :
• Access oblige à un BEGIN TRANSACTION explicite, contrairement à d’autres bases.
• La notion de transaction s’applique exclusivement aux commandes DML (Data Mana-
gement Language) comme INSERT, DELETE ou UPDATE, non sur les commandes
DDL (Data Definition Language) qui permettent de créer des objets.
• L’utilisation du mode transactionnel ralentit les procédures.
• La fermeture d’Access effectue un COMMIT implicite.
Attention
N’oubliez pas de remettre les options qui étaient actives avant cette manipulation. Pour cela sup-
primez la requête transactionnelle en cours, si cela n’est pas déjà fait, puis cliquez sur le bouton
Office > Options Access > Concepteurs d’objets et décochez la case Syntaxe compatible SQL
Server pour cette base de données.
Il est toujours aisé de copier un objet comme une table vers le même objet en le renom-
mant : le nouvel objet hérite alors de presque toutes les propriétés de l’original. Cette
manipulation s’opère de la manière suivante :
1. Cliquez du bouton droit sur la table « ADRESSE » dans le volet de navigation.
2. Sélectionnez « Copier ».
3. Cliquez à nouveau du bouton droit et sélectionnez « Coller ».
4. Access propose de créer un objet « Copie de ADRESSE » (qu’on peut nommer diffé-
remment) et suggère, soit la copie de la structure seule, soit celle de la structure et des
données.
4
Chapitre
5. Optez pour une copie complète : deux tables sont désormais disponibles 1.
Cependant, le copier/coller n’a pas réalisé de choix sélectif des données à transmettre :
c’est l’avantage des requêtes création de tables que d’y parvenir :
1. Dans le ruban du menu « Créer », cliquez sur Création de requête.
2. Sélectionnez la table « ADRESSE » dans la fenêtre d’affichage des tables puis refermez-
la.
3. Cliquez dans le ruban sur le bouton « Création de table ».
4. Dans la fenêtre qui s’ouvre, nommez la nouvelle table « NEW_ADRESSE » et validez
par « OK ».
5. Insérez tous les champs de la table « ADRESSE » dans les colonnes du pavé inférieur.
6. Dans la zone Critères de la première colonne, saisissez « <4 » pour obtenir le dessin de
la figure 4.11.
Figure 4.11
Paramétrage d’une
requête création de
table.
7. Cliquez sur « Exécuter » : Access vous avertit que trois enregistrements seront collés
dans une nouvelle table.
8. La nouvelle table, nommée « NEW_ADRESSE », ne contient que les trois enregistrements
correspondant aux ID 1, 2 et 3.
Le mode d’affichage SQL habituel, celui des requêtes Sélection ou Action vues auparavant,
ne supporte pas certaines commandes, et en particulier toutes celles qui relèvent du DDL
(Data Definition Language) telles que CREATE ou ALTER. Les requêtes Définition de don-
nées autorisent, elles, ces commandes.
Il n’est pas possible ici, de détailler la syntaxe de toutes les commandes SQL tant elles sont
nombreuses. Les lecteurs qui auront besoin d’utiliser en direct ces commandes pourront
se reporter à l’aide en ligne et aux ouvrages consacrés au langage SQL (pour Access et
MS-SQL Server en l’occurrence).
1. Si la table source était dotée de contraintes d’intégrité référentielle, ces dernières ne sont pas attribuées au nouvel objet.
Un seul exemple sera utilisé pour montrer quelles sont les possibilités de cet outil. On se
propose de modifier la largeur de la colonne NOM de la table « ADRESSE » en la faisant
passer de 50 à 100 caractères de long :
1. Fermez toutes les éventuelles requêtes et/ou tables ouvertes.
2. Dans le ruban du menu « Créer », cliquez sur le bouton « Création de requête ».
3. Fermez la fenêtre d’affichage des tables sans sélectionner aucune table.
4. Dans le ruban, cliquez sur « Définition de données ».
5. Dans la fenêtre SQL blanche, saisissez la commande SQL suivante : « ALTER TABLE
ADRESSE ALTER COLUMN NOM TEXT(100) NOT NULL » terminée par un point-
virgule, puis exécutez cette requête.
6. Ouvrez la table « ADRESSE » en mode création : le champ NOM est effectivement
élargi, tout en maintenant le type de la colonne en Texte et la propriété Null interdit à
Oui.
Résumé
L’outil Requêtes sert à exploiter les données stockées dans les tables. Les requêtes Sélection
lisent et ordonnent les données suivant de multiples critères de tri et de filtrage. Avec la
notion de jointure, les requêtes Sélection permettent de recroiser les données en prove-
nance de multiples tables ou autres requêtes suivant le modèle relationnel.
Les requêtes Action ajoutent, suppriment ou modifient les données ; elles s’inscrivent dans
le cadre de transactions dans la base.
Access supporte, en direct ou en mode assisté, un grand nombre des commandes du langage
SQL, langage commun des bases de données.
Problèmes et exercices
4
Chapitre
Les exercices suivants sont constitués de questions rapides sur la mise en place de requêtes.
On commencera par des requêtes Sélection destinées à afficher des données ou des synthè-
ses (exercices 1 à 17) puis on fera quelques requêtes Action d’insertion, de mise à jour et de
suppression de données (exercices 18 à 20). Tous concernent la base « ECOLE_INTERNA-
TIONALE » créée dans les exercices du chapitre 3. On s’appliquera à enregistrer chaque
requête sous la forme « Req_4xx » pour pouvoir la réutiliser ultérieurement.
• Énoncé Affichez les noms, prénoms, adresse, code postal, ville et pays des élèves français présentés
par ordre alphabétique.
* Solution Un ordre de tri croissant doit être mis sur la colonne NOM_ELEVE de la table « ELEVE »
et un critère de filtre doit être posé sur la colonne PAYS_ELEVE pour obtenir le résultat de
la figure 4.12.
Pour cela effectuez les actions suivantes :
1. Dans le ruban du menu « Créer », cliquez sur « Création de requête ».
2. Sélectionnez la table « ELEVE » dans la fenêtre d’affichage des tables puis refermez-la.
3. Placez dans chacune des colonnes du tableau les champs « NOM_ELEVE »,
« PRENOM_ELEVE », « ADRESSE1_ELEVE », « CODEPOSTAL_ELEVE », « VILLE_
ELEVE », « PAYS_ELEVE ».
4. Dans la zone Tri de la colonne NOM_ELEVE, choisissez « croissant » dans la liste
déroulante.
5. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez le texte « "FR" ».
6. Enregistrez la requête sous le nom « Req_411 ».
Figure 4.12
Paramétrage
de l’exercice 1.
Exercices
• Énoncé Affichez les noms et prénoms des élèves dont le prénom commence par un A.
Figure 4.13
Paramétrage de
l’exercice 2.
• Énoncé Affichez les seuls noms et prénoms des élèves qui ne sont pas français.
* Solution Le critère de filtre utilise le mot-clé « Pas » ; la colonne PAYS ne devant pas être affichée, la
case Afficher est décochée (voir figure 4.14). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
1. Toutes les syntaxes sont simplifiées pour une meilleure lecture ; les parenthèses inutiles ou les préfixes de tables sont ici supprimés par
rapport à la requête créée par le générateur d’Access. On notera aussi que les guillemets devront être remplacés par des apostrophes ou des
doubles guillemets lorsque ces requêtes seront insérées dans du code Visual Basic.
Figure 4.14
Paramétrage
de l’exercice 3.
• Énoncé Affichez les noms et prénoms des élèves américains, allemands et anglais.
* Solution Le mot ET utilisé dans l’énoncé ne doit pas induire en erreur : un élève n’est pas simulta-
nément de plusieurs nationalités ; aussi c’est bien le critère OU qui doit être utilisé (voir
figure 4.15). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE » et « PAYS_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "USA" ». Puis dans les
zones Ou suivantes, « "D" » et « "UK" ».
Figure 4.15
Paramétrage
de l’exercice 4.
• Énoncé Affichez les noms et prénoms des élèves français nés entre le 1er janvier 1960 et le
Exercices
31 décembre 1969.
* Solution Trois conditions se cumulent et doivent être placées sur la même ligne. La colonne
DATENAISSANCE_ELEVE invoquée deux fois n’est affichée qu’une fois. Les caractères
dièse (#) qui cernent les dates n’ont pas besoin d’être saisis : Access les pose automatiquement
(voir figure 4.16). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE », « PAYS_ELEVE », « DATENAISSANCE_ELEVE », et une nouvelle fois
« DATENAISSANCE_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "FR" ». Dans la zone Cri-
tères de la première colonne DATENAISSANCE_ELEVE, inscrivez « >=01/01/1960 ».
Dans la zone Critères de la seconde colonne DATENAISSANCE_ELEVE, inscrivez
« <=31/12/1969 ».
Figure 4.16
Paramétrage
de l’exercice 5.
• Énoncé Affichez les noms et prénoms des élèves français et américains nés avant le 1er janvier
1960.
* Solution Il convient de répéter la condition d’âge sur les deux lignes pour qu’elle s’applique chaque
fois aux deux populations différentes (voir figure 4.17). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE », « PAYS_ELEVE », « DATENAISSANCE_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "FR" », et dans la zone
Ou « "USA" ». Dans la zone Critères de la colonne DATENAISSANCE_ELEVE, inscri-
vez « <01/01/1960 ». Et inscrivez la même valeur dans la zone « Ou » de cette colonne.
Figure 4.17
Paramétrage
de l’exercice 6.
* Solution Pour répondre à cette question, il serait possible de faire une requête avec regroupe-
ment de données sur la colonne PAYS_ELEVE. Mais cette réponse n’est pas judicieuse :
on pourra avoir à réaliser ultérieurement des requêtes dans lesquelles la notion de
regroupement s’ajoute à la sélection de valeurs distinctes. C’est donc bien la zone
Valeurs distinctes dans la feuille des propriétés de la requête qui doit être positionnée à
Oui.
La requête en code SQL est : SELECT DISTINCT PAYS_ELEVE FROM ELEVE; , beaucoup plus
simple qu’une requête dotée d’un GROUP BY. Pour obtenir ce résultat, effectuez les
actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans la première colonne du tableau le champ PAYS_ELEVE.
3. Dans le ruban, sélectionnez la feuille des propriétés. Positionnez la propriété Valeurs
distinctes à « Oui ».
Figure 4.18
Paramétrage
de l’exercice 8.
* Solution La réponse à cette question induit un regroupement par pays et un comptage sur ce même
critère. Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les deux premières colonnes du tableau le champ « PAYS_ELEVE », et à
nouveau « PAYS _ELEVE ».
3. Cliquez sur le bouton « ∑ » du ruban de création de requête. On notera qu’Access fait
un tri sur la colonne de regroupement sans même que cette option ait été demandée
(voir figure 4.19), puis changer l’opération Regroupement de la deuxième colonne en
Compte grâce à la liste déroulante.
Figure 4.19
Paramétrage
de l’exercice 9.
• Énoncé Affichez les noms des élèves, leurs notes et la matière correspondante.
* Solution Cette question nécessite l’introduction des tables « NOTE » et « MATIERE » (voir figure
4.20). Pour obtenir ce résultat, effectuez les actions suivantes :
du chapitre 2).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « MATIERE » et
« NOTATION ».
3. La requête renvoie 19 760 enregistrements.
Figure 4.20
Paramétrage
de l’exercice 10.
• Énoncé Affichez les noms des élèves, la moyenne de leurs notes et la matière correspondante.
Classez les élèves par ordre alphabétique et par matière.
* Solution Le regroupement s’ajoute ici à la jointure des tables (voir figure 4.21). En première ana-
lyse, les moyennes sont affichées avec un grand nombre de chiffres après la virgule, ce qui
est peu indicatif. Il faut limiter la précision de la moyenne à deux décimales.
1. Repassez en mode création de requête construite à l’exercice précédent.
2. Cliquez sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
3. Modifiez l’Opération de la colonne NOTATION en Moyenne.
4. Double-cliquez du bouton droit sur la colonne NOTATION.
5. Sélectionnez Propriétés.
Exercices
Figure 4.21
Paramétrage
de l’exercice 11.
• Énoncé Affichez les noms des élèves, la moyenne de leurs notes et la matière correspondante.
Classez les élèves par ordre alphabétique et par matière. Les moyennes doivent être
arrondies au point le plus voisin.
* Solution La question comporte un piège. La première tentation consisterait à utiliser une formule
d’arrondi en utilisant la requête de l’exercice 11. Or, cet essai sera infructueux : si la for-
mule d’arrondi est appliquée directement, elle portera sur toutes les notes prises indivi-
duellement et non sur le résultat final. Il s’agit de calculer dans un premier temps la
moyenne par élève, puis de l’arrondir ensuite.
Première méthode
Une première solution, un peu lourde à mettre en œuvre, consiste à récupérer les résultats
de la requête « Req_4111 » et d’y appliquer une formule d’arrondi, comme à la figure 4.22.
1. Fermez toutes les requêtes en cours.
2. Créez une nouvelle requête dont la source sera la « Req_4111 ». Sélectionnez pour cela
l’onglet requête lorsque la fenêtre Afficher la table apparaît après la Création de requête.
Dans la liste choisissez « Req_4111 ».
3. Insérez les deux premières colonnes « NOM_ELEVE » et « NOM_MATIERE ».
4. Dans la troisième colonne, saisissez la formule : MoyenneFinale:Round([MoyenneDe-
NOTATION];0) où MoyenneFinale (en un seul mot) est l’alias de la colonne et Round()
la fonction d’arrondi.
Figure 4.22
Première solution
de l’exercice 12.
Seconde méthode
Il existe une solution plus « esthétique », n’utilisant qu’une seule requête pour faire les
4
Chapitre
Figure 4.23
Seconde solution
de l’exercice 12.
• Énoncé Affichez les noms des élèves et leur moyenne générale. Classez les élèves du plus brillant
au moins bon. On ne veut voir que ceux qui ont la moyenne.
* Solution Ici, la table « MATIERE » n’est plus utile puisqu’il s’agit d’une moyenne toutes matières
confondues (voir figure 4.24). Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir des tables « ELEVE » et « NOTE ».
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE » et « NOTATION ».
3. Cliquer sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
4. Modifiez l’Opération de la colonne NOTATION en Moyenne.
Exercices
Figure 4.24
Paramétrage
de l’exercice 13.
• Énoncé Affichez les noms des élèves et leur moyenne en français. Les élèves de cette nationalité
étant avantagés, ajoutez 2 points à tous ceux de nationalité étrangère.
* Solution La table « MATIERE » est de nouveau nécessaire et donne lieu à un critère de filtre sur la
matière FRANCAIS. Une condition VraiFaux doit être introduite pour solutionner le pro-
blème, insérée dans Expression et non un regroupement ou tout autre calcul intégré (voir
figure 4.25). La formule à insérer dans la dernière colonne se rédige ainsi :
NoteRéévaluée : VraiFaux([PAYS_ELEVE]<>"FR";Round((Moyenne([NOTATION])+2);2);
Round(Moyenne([NOTATION]);2))
Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir des tables « MATIERE », « ELEVE » et « NOTE ».
2. Placez dans les colonnes du tableau les champs « NOM_MATIERE », « NOM_
ELEVE », « PAYS_ELEVE » et « NOTATION ».
3. Cliquer sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
4. Ajoutez dans la colonne MATIERE le Critère « FRANCAIS ».
5. Modifiez l’Opération de la colonne NOTATION en Moyenne.
6. Cliquez du bouton droit sur la colonne NOTATION.
7. Pour la colonne NOTATION, sélectionnez Propriétés, dans la zone Format, précisez
Fixe, puis deux décimales.
8. Changez le champ de la colonne NOTATION en NoteBrute:NOTATION.
9. Dans une nouvelle colonne, indiquez dans la zone Champ la formule NoteRéévaluée
présentée précédemment.
4
Chapitre
Figure 4.25
Paramétrage
de l’exercice 14.
• Énoncé Faites un tableau croisé dynamique des élèves et de leur moyenne par matière. Un tel
tableau présente aux croisements des lignes et des colonnes les valeurs correspondantes.
Dans notre cas, les lignes indiqueront le nom des élèves, les colonnes les matières et cha-
que cellule de ce tableau présentera la note moyenne de chaque élève pour cette matière.
* Solution Cet aspect des requêtes n’a pas été présenté dans le cours. Il est possible, comme dans
Excel, de monter des tableaux croisés pourvu que les données s’y prêtent, ce qui est le cas
ici. Opérez de la manière suivante :
1. Fermez les éventuelles requêtes ouvertes.
2. Créez une nouvelle requête et appelez les tables « ELEVE », « NOTE » et
« MATIERE ».
3. Dans le ruban du menu de création de requête, cliquez sur le bouton « Analyse
croisée ».
4. Dans le damier du pavé inférieur apparaissent deux nouvelles zones, l’une déjà
connue et nommée Opération (pour les regroupements), l’autre nommée Analyse
pour désigner les en-têtes de lignes et de colonnes.
5. Insérez le champ « NOM_ELEVE » dans la première colonne.
6. Dans la zone Analyse de la première colonne, indiquez En-tête de ligne.
7. Insérez le champ « NOM_MATIERE » dans la deuxième colonne.
8. Dans la zone Analyse, indiquez En-tête de colonne.
9. Insérez le champ « NOTATION » dans la troisième colonne.
10. Dans la zone Opération de la troisième colonne, indiquez Moyenne (au lieu de
Regroupement pour les deux colonnes précédentes).
11. Dans la zone Analyse de la troisième colonne, sélectionnez Valeur.
Exercices
12. Affichez le résultat et élargissez les colonnes afin de pouvoir lire les données (au
besoin, précisez dans la propriété de la colonne NOTATION le format Fixe et le nombre
de décimales voulu).
Figure 4.26
Paramétrage d’un
tableau croisé et
résultats.
• Énoncé Présentez le même tableau qu’à la question précédente, mais en utilisant la notion de
Langue vivante et non plus en détaillant Anglais, Allemand et Italien.
* Solution Il suffit de faire intervenir les tables GROUPE et REGROUPEMENT (mises en place dans
l’exercice 4 du chapitre 3) en sus de celles déjà existantes pour obtenir le résultat voulu. La
colonne MATIERE comme en-tête de colonne doit être remplacée par le champ NOM_
GROUPE. Opérez de la manière suivante :
1. À partir de la requête précédente, ajoutez les tables « GROUPE » et « REGROUPE-
MENT » via l’icône Afficher la table du ruban.
2. Insérez une nouvelle colonne « NOM_GROUPE », en première position, avant la
colonne NOM_ELEVE. Pour cela, sélectionnez la colonne « NOM_ELEVE » actuelle
et cliquez sur « Insérer des colonnes » dans le ruban. Dans cette première colonne
ajouter le champ « NOM_GROUPE » de la table « GROUPE » grâce à la liste dérou-
lante. Dans la zone Analyse de cette colonne, sélectionnez En-tête de colonne.
3. Supprimez la colonne « NOM_MATIERE » pour ne conserver que les trois colon-
nes NOM_GROUPE, NOM_ELEVE, NOTATION comme cela est présenté sur la
figure 4.27.
Figure 4.27
Paramétrage
4
Chapitre
de l’exercice 16.
• Énoncé En reprenant l’exercice précédent, la notation doit désormais être corrigée par un coefficient.
Les coefficients sont les suivants :
• Histoire-géographie : 5.
• Langues vivantes : 4.
• Français : 3.
• Physique-chimie : 2.
• Mathématiques : 1.
Présentez les résultats généraux de la classe groupe de matières par groupe de matières en
tenant compte du coefficient et présentez dans le même tableau la note finale.
* Solution L’ajout de la notion de coefficient oblige à une modification des tables car elle n’est insérée
nulle part. Le fait que l’énoncé donne un coefficient aux langues vivantes (et non à chaque
langue séparément) incite à créer la notion au niveau de la table GROUPE et non à celui
de la table MATIERE.
1. Ouvrez la table « GROUPE » en mode création.
2. Ajoutez un champ « COEF_GROUPE », Numérique, Entier. Ne posez pas la consigne
Null interdit car la table ne pourrait pas être enregistrée (les coefficients ne sont pas
saisis).
Exercices
L’utilisation d’un tableau croisé n’est pas possible dans l’immédiat pour au moins deux
raisons : d’une part, le tableau croisé ne fait pas apparaître les résultats généraux (la
moyenne des moyennes) ; d’autre part, les en-têtes de colonnes et de lignes doivent tenir
compte d’une multiplication par un coefficient. Il faut donc procéder par étapes successives :
a. Calculer les moyennes coefficientées par élève et par matière ; en faire une première
requête.
b. Monter un tableau croisé à partir de la requête précédente dans une deuxième requête.
c. Créer une troisième requête, appelant la deuxième et ajoutant une colonne de moyenne
générale.
La première étape comprend la création d’une requête appelant toutes les tables (ELEVE,
NOTE, MATIERE, GROUPE et REGROUPEMENT). Elle a la structure de la figure 4.28,
où un alias MoyenneCoefficientée précède la multiplication de la note par le coefficient
correspondant.
1. La zone champ de la première colonne, contient « NOM_ELEVE » et la zone Opération est
positionnée à Regroupement.
2. La zone champ de la deuxième colonne, contient « NOM_GROUPE » et la zone Opé-
ration est positionnée à Regroupement.
3. La zone champ de la troisième colonne, contient « NOTATION » et la zone Opération
est positionnée à Moyenne.
4. La zone champ de la quatrième colonne, contient l’expression MoyenneCoefficien-
tée: Moyenne([NOTATION]*[COEF_GROUPE]) et la zone Opération est positionnée à
Expression.
Figure 4.28
Première étape
de l’exercice 17
(Requête Req_4117-1).
Il faut sauvegarder cette requête sous le nom « Req_4117-1 » pour pouvoir la réutiliser
tout de suite après.
En effet, la deuxième étape commence par créer une nouvelle requête de type Analyse croisée
(bouton dans le ruban) qui récupère les données agrégées de la requête Req_4117-1.
1. En première colonne, le champ « NOM_ELEVE » est choisi, la zone Analyse est posi-
tionnée à En-tête de lignes, et la zone Opération à Regroupement.
2. En deuxième colonne, le champ « NOM_GROUPE » est choisi, la zone Analyse est
positionnée à En-tête de colonnes, et la zone Opération à Regroupement.
3. En troisième colonne, la moyenne coefficientée est reprise comme valeur (zone
Champ affectée à MoyenneCoefficientée, et zone Analyse affectée à Valeur), avec une
fonction d’agrégat quelconque (Somme, Moyenne ou autres, dans le champ Opéra-
tion) ; elle ne peut pas être une expression (qui ne ferait pas partie d’un agrégat) et ne
peut pas être non plus un regroupement (puisque les deux axes sont déjà utilisés).
Essayez ces différentes possibilités et voyez les réactions d’Access. La fonction Somme
employée ici n’additionne rien puisqu’une seule valeur est déclarée par ligne dans la
requête précédente.
Figure 4.29
Deuxième étape
de l’exercice 17
(Requête Req_4117-2).
La dernière étape a pour but d’améliorer la présentation (les moyennes sont affichées avec
de nombreuses décimales) et d’ajouter la moyenne finale de chaque élève sur 20.
1. Après avoir enregistré la requête précédente et l’avoir fermée, créez-en une nouvelle.
2. Dans la fenêtre d’affichage des tables et requêtes, sélectionnez la requête « Req_4117-2 ».
3. On constate que la liste des champs affichés porte le nom des matières, qui sont devenues
des en-têtes dans le tableau croisé.
4. Cliquez sur le bouton « ∑ » pour passer en mode « Regroupement de données ».
5. Insérez le champ « NOM_ELEVE » dans la première colonne, précédé de l’alias Nom
pour parfaire la présentation.
6. La deuxième colonne contient une expression, et non un regroupement, de la forme :
Littérature: Round(Somme([Français]);2) . L’alias ne doit pas porter le même
nom qu’un champ : c’est la raison pour laquelle nous avons employé le mot Littéra-
ture. La fonction Somme() est présente car une fonction agrégat doit impérativement
être utilisée mais, encore une fois, la fonction ne fait qu’additionner un seul chiffre.
La fonction Round() arrondit le résultat 1.
7. Présentez les 4 autres matières sous la même forme que le Français. On prendra garde
à la présence des parenthèses et des crochets, indispensables. Les formules sont respec-
tivement : Histoire-Géo: Round(Somme([HISTOIRE-GEOGRAPHIE]);2)
Langues: Round(Somme([LANGUES_VIVANTES]);2)
Maths: Round(Somme([MATHEMATIQUES]);2)
Physique: Round(Somme([PHYSIQUE-CHIMIE]);2).
8. La dernière colonne contient une dernière expression pour calculer la moyenne géné-
rale : Moyenne Générale sur 20: Round(((Somme([Français])+Somme([HISTOIRE-
GEOGRAPHIE])+Somme([LANGUES_VIVANTES])+Somme([MATHEMATIQUES])
+Somme([PHYSIQUE- CHIMIE]))/15);2) .
Exercices
1. La présentation des résultats (propriété Format Fixe à 0 décimales) ne fonctionne pas toujours correctement dans ce type de tableau ; il est
donc préférable de forcer le résultat par l’usage d’une fonction dans l’expression.
Note
Le chiffre 15 a été mis ici pour simplifier la somme des coefficients de toutes les matières. Ce pro-
cédé peu orthodoxe sera avantageusement remplacé par une fonction qui va additionner tous
les coefficients de la table GROUPE ; or, nous n’avons pas encore étudié cette fonction de
domaine. La bonne tournure serait SomDom("[COEF_GROUPE]";"GROUPE").
Figure 4.30
Troisième étape
de l’exercice 17
(Requête
Req_4117-3).
* Solution Cet énoncé très court revêt en fait plusieurs difficultés : la matière est exprimée alphabéti-
quement alors que la table NOTATION ne comporte que des IDs, le nom de l’élève est cité
alors que la même table NOTATION ne contient que les numéros des élèves. En outre, un
champ supplémentaire est obligatoire dans la table NOTATION concernant la date
d’attribution de la note. Deux manières de procéder sont possibles :
• soit rédiger une requête ajout après avoir consulté les tables et repéré les ID de la
matière et de l’élève ;
• soit rédiger une requête ajout qui parvient à utiliser les noms contenus dans les champs
adéquats.
Nous utiliserons les deux méthodes qui nous conduiront à découvrir de nouvelles fonc-
tionnalités.
Première méthode
Créez une nouvelle requête de la manière suivante :
1. Appelez la table « NOTE ».
2. Cliquez sur le bouton Ajout du ruban.
3. Dans la fenêtre qui s’ouvre, notifiez que les ajouts se feront dans la table « NOTE ».
4. Faites glisser le champ « ID_ELEVE » dans la première colonne : vous noterez
qu’Access place automatiquement le champ ID_ELEVE dans la zone Ajouter à : la
similitude des noms suffit. Saisissez à la suite du nom de champ le signe « deux-
points » et le chiffre « 1 » (correspondant à l’élève EDEN).
Figure 4.31
Première solution
de l’exercice 18
(Req_421-1).
Seconde méthode
Cette deuxième méthode fait appel à la notion de sous-requête, que nous n’avons pas
encore étudiée, et à l’utilisation d’un subterfuge dû à l’imperfection de l’interpréteur de
requête d’Access.
Il est nécessaire tout d’abord de créer une table « fantôme » qu’on appellera TABLEVIDE,
contenant un et un seul enregistrement :
1. Créez la table avec pour seul champ le « N˚ » établi par défaut.
2. En mode création, nommez-la « TABLEVIDE ».
3. En mode feuille de données, validez une ligne pour obtenir un et un seul enregistrement.
4. Fermez la table.
Reprenons la première requête :
1. La requête Req_421-1 étant fermée, cliquez du bouton droit dessus et sélectionnez
Exercices
« Copier ».
2. Dans le volet de navigation, cliquez du bouton droit et sélectionnez « Coller ».
3. Renommez la nouvelle requête « Req_421-2 » (en lieu et place de Copie de Req_421-1).
4. Ouvrez la nouvelle requête en mode création.
Figure 4.32
Seconde solution
de l’exercice 18
(Req_421-2).
• Énoncé Supprimez la ou les notes qui viennent d’être ajoutées lors de l’exercice précédent.
1. Il est obligatoire d’utiliser ce subterfuge car Access refuse de faire des sous-requêtes si une table au moins n’est pas citée dans le FROM.
2. Une troisième solution consisterait à utiliser la fonction RechDom(), non encore étudiée, et qui n’aurait pas utilisé la notion de sous-
requête, bien utile par ailleurs.
Figure 4.33
Requête
4
Chapitre
suppression.
• Énoncé Modifiez toutes les notes en leur ajoutant 2 points sauf si la note est déjà supérieure ou
égale à 18.
* Solution L’exercice permet de modifier en bloc toutes les notes. La condition posée (sont exclues les
notes supérieures à 18) évite de voir des élèves dotés d’un 21/20, par exemple !
1. Créez une nouvelle requête.
2. Appelez la table « NOTE ».
3. Cliquez sur le bouton Mise à jour du ruban.
4. Faites glisser le champ « NOTATION » dans la première colonne.
5. Dans la zone Mise à jour, en bas d’écran, insérez la formule « [NOTATION]+2 ».
6. Dans la zone critères, saisissez « <18 ».
La syntaxe SQL de cette requête dont la représentation graphique est en figure 4.34 est :
UPDATE NOTE SET NOTATION = NOTATION+2 WHERE NOTATION<18; .
Figure 4.34
Requête mise à jour.
Exercices
Les formulaires
5
Chapitre
123
Access Livre Page 124 Mercredi, 27. f vrier 2008 7:28 07
Figure 5.1
Formulaire initial en
mode Formulaire.
Les différents éléments de ce simple affichage doivent être précisément énumérés afin que
les propriétés de l’objet formulaire soient bien comprises et retrouvées dans le dédale des
options possibles :
• En haut, dans l’onglet, le nom de l’objet (dont l’intitulé peut être modifié par la propriété
Légende) ;
• Au-dessous, une zone bleue, fixe, nommée En-tête de formulaire ;
• Au milieu, une zone blanche nommée Détail ;
• En bas une deuxième et dernière zone fixe nommée Pied de formulaire, qui n’apparaît
pas ici ;
5
Chapitre
• À gauche, doté d’un petit triangle en haut, le Sélecteur, qui correspond à un enregis-
trement ;
• Tout en bas, les boutons de déplacement ;
• Dans le corps du formulaire, deux contrôles, qui sont plus précisément des zones de
texte ; chacune d’entre elles se compose d’une étiquette (qui restera fixe) et de la zone de
texte proprement dite (qui verra défiler le contenu des enregistrements).
Tous ces éléments, affichables ou non, peuvent changer de forme, de couleur et autres
caractéristiques. Cliquez dans le ruban sur le triangle situé sous le bouton Affichage et
passez en mode création 1 : vous observez la constitution même du document tel qu’il
apparaît à la figure 5.2.
Figure 5.2
Formulaire initial en
mode création.
Avec la nouvelle présentation du volet de navigation d’Access 2007, le nom qui est attribué
au formulaire peut être différent de celui qui apparaît dans le volet de navigation et dif-
férent du nom qui apparaît dans l’onglet de la barre supérieure.
Afin de bien distinguer tous les éléments d’une base – requêtes, formulaires et macros – de
nombreux développeurs font précéder les formulaires d’un préfixe Frm_ ou Form_ ou
simplement F_. Cette syntaxe particulière, appliquée aussi avec les bases Access 2003 et
antérieures, s’avère bien utile lorsqu’on se sert de fonctions complexes comme les fonc-
tions de domaine (SomDom, RechDom, qui seront étudiées ultérieurement). C’est la
même convention qui prévaut pour les autres objets Req_ (pour les requêtes) et Mcr_
(pour les macros) : on s’efforcera de raccourcir au maximum le nom des objets et d’éviter
les espaces.
Dans la pratique, une convention de noms bien organisée emploie trois références :
• Le nom du formulaire proprement dit (préfixé par Frm_ par exemple), technique.
• Le nom qui apparaîtra dans le volet de navigation (correctement orthographié et clair
mais suffisamment court).
• Le nom de l’onglet supérieur (correctement orthographié et libre), renseigné par la
propriété Légende de la feuille de propriété du formulaire.
Dès lors, nous ne cherchons pas tout de suite à monter un volet de navigation mais seule-
ment à enregistrer le nouveau formulaire qui vient d’être créé sous un nom conforme à la
convention :
1. Cliquez du bouton droit sur l’onglet « CODE_POSTAL » du formulaire en cours de
création.
2. Sélectionnez « Enregistrer ».
3. À la place de CODE_POSTAL (un nom identique au nom de la table source pourrait
amener à de graves confusions), saisissez « Frm_Codes » 1.
Désormais un nouvel objet apparaît dans le volet de navigation. S’il n’est pas visible, cliquez
sur le triangle supérieur du volet et sélectionnez « Tous les objets par Type d’objets ».
Figure 5.3
Feuille de
propriétés.
En haut à gauche, une zone de liste déroulante fait apparaître tous les objets du formu-
laire, qui portent tous un nom :
• le formulaire lui-même a sa feuille de propriété ;
• il existe deux zones de texte CODE et VILLE ;
• d’autres éléments encore ont leur feuille de propriété : les étiquettes, l’en-tête, etc.
Les onglets sous la zone de liste déroulante montrent, par catégorie, les différentes pro-
priétés car il en existe un grand nombre. Le dernier onglet « Toutes » liste toutes les
propriétés des onglets précédents. Contrairement à un préjugé, l’expérience montre qu’il
est plus rapide de retrouver une propriété par l’onglet « Toutes » qu’en cherchant parmi
les autres.
• L’onglet « Format » liste toutes les propriétés ayant trait à la présentation de l’objet
(taille, couleur, etc.).
1. Par défaut, l’onglet qui apparait dans la barre supérieure porte le nom du formulaire, mais il est toujours possible de nommer différemment
l’onglet en utilisant la propriété Légende du formulaire.
• L’onglet « Données » regroupe les options relatives aux valeurs présentées dans l’objet
(source, droits de modification, etc.).
5
Chapitre
• L’onglet « Événement » contient les liens avec les macros ou le code Visual Basic à
exécuter, à l’occasion d’événements précis (sur clic, avant ou après mise à jour, etc.).
• L’onglet « Autres » rassemble toutes les propriétés non incluses dans les options précé-
dentes.
Dès la création d’un formulaire, l’un des aspects les plus importants à mettre en place
consiste à définir le mode d’affichage des données, soit en mode unique, soit en mode
continu.
1. Ouvrez la feuille des propriétés du formulaire.
2. Choisissez « Formulaire » dans la liste déroulante supérieure.
3. Descendez à la propriété Affichage par défaut.
4. Ouvrez la liste déroulante à droite de cette zone.
5. Sélectionnez « Formulaires continus ».
6. Fermez la feuille des propriétés et repassez en mode formulaire (bouton de gauche en
bas de la fenêtre).
L’affichage des données change (voir figure 5.4) : on lit les six premiers enregistrements
(sur 8 009) de la table et non plus un seul ; les données défilent avec les boutons de dépla-
cement en bas, les touches PgDn/PgUp du clavier ou la barre de défilement vertical à
droite de l’écran.
Figure 5.4
Affichage
du formulaire en
mode continu.
b. il dispose d’une zone de liste déroulante qui montre, par exemple, tous les clients ;
c. il peut soit saisir le nom (la zone de liste affiche au fur et à mesure les données corres-
5
Chapitre
Dans le cas du formulaire des codes postaux, la source des données est, directement, la
table CODE_POSTAL. Cette propriété se vérifie dans la zone Source de la feuille des
propriétés du formulaire.
Ce cas de figure est relativement rare : dans la plupart des cas, la source des données est
précisée différemment et, le plus souvent, résulte d’une requête car plusieurs tables sont
invoquées. La démarche la plus répandue passe par les étapes suivantes :
• création d’une requête qui appelle toutes les données qui seront nécessaires au formu-
laire, enregistrement de la requête ;
• création d’un formulaire dont la source de données est la requête créée précédemment.
Dans la pratique, il pourra donc exister, par exemple :
• une requête nommée Req_saisie_codes ;
• un formulaire nommé Frm_saisie_codes ;
Un formulaire est constitué de contrôles, chacun d’entre eux permettant de visualiser des
informations (contrôles de zones) ou de déclencher des actions (boutons). Tous consti-
tuent autant d’outils à la disposition du programmeur pour mettre en place une interface
homme/machine rigoureusement organisée. Nous étudions ci-après en détail tous les
contrôles utilisables.
Quand un formulaire est ouvert en mode création, la barre de menu supérieure comporte
un onglet supplémentaire « Création » contenant toutes les icônes destinées à bâtir et
modifier le document ; sa partie centrale regroupe les contrôles de formulaire utilisables,
présentés à la figure 5.5.
Figure 5.5
Contrôles du ruban
de création de
formulaire.
• le résultat d’une formule faisant appel à des données externes au formulaire (du type
RechDom) ;
• le résultat d’une formule, de tout type, interne au formulaire.
Une zone de texte est soit liée à un enregistrement, soit indépendante de tout enregistre-
ment, mais elle ne peut pas, sauf formule particulière, être liée à un groupe d’enregistrement.
Voici un exemple d’utilisation d’une zone de texte :
1. Dans le menu « Créer », cliquez sur l’icône Création de formulaire : Access ouvre un
formulaire vierge nommé « Formulaire1 ».
2. Dans la barre d’icônes du menu « Création », cliquez sur Zone de texte.
3. Dessinez un rectangle en haut de page et relâchez la souris : le programme crée en
même temps une étiquette de zone de texte, à gauche, et la zone de texte proprement
dite. Si l’on déplace l’un des deux objets, l’autre « suit » ; mais il est possible de les
manipuler séparément en cliquant et glissant à partir de l’angle supérieur gauche de
l’un des deux objets.
4. Cliquez dans le libellé « Texte0 » de l’étiquette, et remplacez ce libellé par « Ceci est
une zone de texte ». Nécessairement, vous devrez déplacer l’étiquette pour laisser visible
la zone adjacente.
5. Cliquez du bouton droit sur l’étiquette et sélectionnez Propriétés (ou bien cliquez dans
la barre d’icône sur Feuille de propriétés).
6. Vous noterez que le nom de l’étiquette est « Etiquette1 » (attribué automatiquement
par Access), alors que la légende est le texte affiché en mode formulaire ; le cas
échéant, modifiez le nom de l’étiquette pour bien la distinguer des autres objets.
Attention ! Un nom de contrôle dans un formulaire est obligatoirement unique. Une
convention de nom judicieuse consiste à nommer les étiquettes en les préfixant par
« Eti_ » et en désignant ensuite le champ auquel elle se rattache (par exemple Eti_
Code).
7. Cliquez sur la zone de texte proprement dite en conservant la feuille de propriétés
ouverte : le nom du contrôle est « Texte0 » et la source n’est pas renseignée. Dans la
mesure où le formulaire lui-même n’a pas de source de données, aucun champ n’est
disponible. Vous pouvez, provisoirement, insérer la valeur 2 ou le mot « Bonjour »
dans le champ Source contrôle : ces valeurs sont affichées de manière statique dans le
formulaire.
8. Soit avec les boutons de la barre d’icône, soit avec les propriétés de la feuille, vous pou-
vez modifier la police, la taille et la couleur des caractères ; les caractéristiques du fond
de la zone et de ses bordures sont modifiables également. On prendra garde à permet-
tre une lecture correcte de tous les caractères du champ en tenant compte de sa longueur
maximale.
9. Cliquez du bouton droit sur l’onglet « Formulaire1 », en haut, puis sélectionnez
« Enregistrer ».
10. Nommez votre formulaire « Frm_Essais_Contrôles ».
Figure 5.6
Une zone de texte.
La zone de liste déroulante est un élément essentiel de la saisie guidée de l’utilisateur : plus
elle pourra être utilisée, plus le travail de l’opérateur en sera facilité et cadré.
Figure 5.7
Une zone de liste
déroulante ouverte.
Voici la liste des actions pour créer une liste déroulante de sélection des codes postaux
(voir figure 5.7).
1. Dans le formulaire d’essais, fermez le cas échéant, la feuille de propriétés.
2. Dans le ruban, cliquez sur l’icône Zone de liste déroulante, et tracez un rectangle dans
le formulaire.
3. Un assistant de création de zone de liste déroulante s’ouvre, proposant d’abord soit
d’utiliser comme source du contrôle une table ou une requête, soit d’insérer une liste
de valeurs fixe. choisissez la première option de table comme source et cliquez sur
« Suivant ».
4. Pointez la table « CODE_POSTAL » comme source du contrôle dans la deuxième
étape puis cliquez sur « Suivant ».
5. Dans la troisième étape, sélectionnez les deux champs « Code » et « Ville » et placez-
les dans le pavé de droite afin qu’ils apparaissent dans les champs affichés, puis cliquez
sur « Suivant ».
6. Ne demandez pas, dans l’étape suivante, de tri particulier des données : les codes postaux
sont déjà triés; cliquez sur « Suivant ».
7. Access propose, dans la cinquième étape, de cacher la clé de la table (les codes pos-
taux) ; dans le cas présent, cette proposition n’est pas adéquate car les codes postaux
sont indicatifs : décochez cette option.
8. Réglez la largeur des colonnes afin d’adapter la colonne CODE à la largeur constante
de 5 caractères et élargissez la colonne VILLE pour bien lire le libellé des communes.
9. La dernière étape consiste à opter pour une colonne qui servira de valeur de renvoi au
contrôle : sélectionnez la valeur par défaut « CODE » et cliquez sur « Terminer ».
La zone de liste déroulante peut être testée : elle est parfaitement fonctionnelle. Cliquez du
bouton droit sur ce contrôle et consultez la liste des propriétés :
5
Chapitre
• Le nom du contrôle est Modifiable5, nom attribué par défaut : il peut être changé, par
exemple, par Choix_Code.
• La propriété Source est vide, ce qui est normal, alors que la propriété Contenu est :
SELECT [CODE_POSTAL].[CODE], [CODE_POSTAL].[VILLE] FROM CODE_POSTAL; .
Cette requête SQL se vérifie en cliquant sur les trois points à droite de la propriété. Elle
est modifiable par les mêmes moyens.
• La propriété Nombre de colonnes est à deux, correspondant au nombre de colonnes
choisi au moment de la création avec l’aide de l’assistant.
• La propriété Largeurs de colonnes est libellée en centimètres, chaque chiffre étant séparé
du suivant par un point-virgule.
• La propriété Colonne liée est fixée à 1, correspondant à la colonne CODE choisie précé-
demment.
• On notera pour finir que toutes les propriétés du type Événement sont vides : il n’y a pas
d’action programmée sur ce contrôle pour le moment.
Figure 5.8
Une zone de liste à
sélection multiple.
En passant en mode formulaire, vous constatez que la zone de liste est immédiatement
exploitable et affiche tout de suite les données. Les propriétés de cet objet, consultables en
mode création par un clic droit sur l’objet, sont très voisines de la zone de liste déroulante
mise en place précédemment. En revanche, une propriété supplémentaire, en bas de liste,
mérite une attention particulière : la propriété Sélection multiple, fixée par défaut à Aucun :
• cette première option signifie que l’utilisateur ne pourra choisir qu’un seul item de la
liste ;
• si l’option Simple est choisie, l’utilisateur pourra sélectionner plusieurs items (en gardant
le doigt sur Ctrl et en cliquant plusieurs lignes) ;
• si l’option Etendu est choisie, l’utilisateur pourra sélectionner plusieurs items avec les
touches Maj et Ø ou prendre toute la liste avec Ctrl + Ø.
d’actions générées soit sous forme de macros, soit sous forme de code VB (Visual Basic).
Un bouton peut être, sous sa forme standard, un simple carré ou rectangle doté soit d’un
libellé, soit d’une image bitmap. Mais il peut être aussi complètement transparent (une
action est générée, par exemple, par un simple clic sur une zone d’une image superposée)
ou partiellement transparent (seul un texte ou une icône se dégage du fond) ; cette der-
nière option est nouvelle avec Access 2007. La figure 5.9 montre de gauche à droite trois
présentations possibles des boutons :
• La première est dotée des propriétés Image : bitmap, Style fond : Standard.
• La deuxième est dotée des propriétés Image : aucune, Style fond : Standard, Légende :
Fermer formulaire.
• La troisième a les propriétés Image : bitmap, Style fond : Transparent.
Figure 5.9
Diverses
présentations des
boutons de
commande.
Figure 5.10
Formulaire avec
cadre d’objet
dépendant.
1. Plus précisément, la table contient un lien vers un objet stocké sur un disque (et non pas l’objet lui-même).
• la hauteur de chaque ligne est assez importante, conditionnée par l’insertion du champ
PHOTO.
Par un clic du bouton droit sur le champ PHOTO, il peut être sélectionné l’option « Insérer
un objet » qui offrira à l’utilisateur le loisir de pointer une image stockée sur son disque 1 :
1. Cliquez du bouton droit sur le champ « PHOTO » d’un enregistrement quelconque.
2. Sélectionnez « Insérer un objet ».
3. Cliquez sur la case d’option À partir d’un fichier.
4. Pointez un fichier de votre choix : le résultat s’en affiche dans la zone.
1. Dans le cas d’une utilisation en réseau de l’application Access, il faudra naturellement que les fichiers désignés soient accessibles par tous.
2. La valeur contenue dans la colonne de la table sera 0 (si la case n’est pas cochée) ou – 1 (si la case est cochée) : cette notation est spécifique à
Access.
3. Ils peuvent aussi comporter, sous condition, trois états : vide, coché, non coché.
Figure 5.11
Le générateur
d’expression
d’Access.
Le formulaire ouvert est représenté en haut à gauche, et tous les contrôles de ce formulaire
sont listés dans le pavé du milieu.
7. Dans le pavé central, sélectionnez le contrôle MonGroupeOptions.
9. Cliquez « OK ».
10. La propriété Source contrôle devient = [MonGroupeOptions] (le signe égal désignant
une formule est obligatoire).
11. Repassez en affichage formulaire
En cliquant sur les options du groupe d’option créé à l’origine, vous constatez que la
valeur renvoyée dans la zone de texte varie en même temps que les choix dans le groupe
voisin, sans nécessité de rafraîchissement de la grille-écran.
1. On peut ajouter de nouvelles pages avec le bouton du ruban « Insérer une page ».
Figure 5.12
Requête de
décompte
des codes postaux
par département.
Les paramètres étant bien choisis par défaut, on peut passer à l’étape suivante alors
qu’Access ne représente pas l’aperçu du graphique.
5
Chapitre
1. Pour qu’elle soit complètement fonctionnelle, le formulaire doit être enregistré au préalable.
1. Dans un formulaire vierge (ou un existant), en mode création, cliquez sur le bouton
« Contrôle ActiveX ».
2. Sélectionnez le « Contrôle Calendrier 12.0 » puis cliquez « OK ».
3. Un calendrier s’insère, en haut à gauche dans le formulaire ; on peut le déplacer et le
redimensionner.
L’avantage de ce calendrier réside dans le fait que, doté d’une ergonomie complète et
efficace, il renvoie une valeur de date conforme et réutilisable.
Les sous-formulaires
Les sous-formulaires, relativement complexes, constituent un élément essentiel de la palette
des outils d’Access. Fréquemment utilisés, ils s’avèrent bien souvent incontournables car
eux seuls permettent d’afficher des données en relation et stockées dans différentes tables. Il
existe bien un bouton, dans la barre d’icône, permettant de créer de toutes pièces un sous-
formulaire, mais cette méthode nous semble peu efficace et surtout peu pédagogique.
Nous avons vu dans le chapitre sur les modèles relationnels que l’architecture mettant en
relation trois tables, deux tables principales et une table intermédiaire, était fort courante.
La visualisation d’une telle architecture, via un formulaire, passe presque toujours par
l’utilisation d’un sous-formulaire.
Reprenons, pour illustrer cette présentation, l’exemple de la bibliothèque de prêts de
livres, dont le modèle simplifié est décrit à la figure 5.13.
Figure 5.13
Modèle relationnel
d’une bibliothèque
de prêt.
Figure 5.14
Requête
Req_Emprunt pour
sous-formulaire.
6. Dans le menu « Créer », cliquez sur l’icône Plus de Formulaires > Assistant formulaire ;
7. Ouvrez la zone de liste déroulante de l’assistant et désignez la requête Req_Emprunt
comme source des données ;
8. Déplacez, grâce au bouton doté de doubles chevrons, tous les champs dans le pavé de
droite puis cliquez « Suivant » ;
9. Immédiatement, Access reconnaît la structure de la demande et propose un choix
dans la fenêtre représentée à la figure 5.15.
Figure 5.15
Assistant pour la
création de sous-
formulaire.
Par défaut, Access propose de faire un formulaire avec sous-formulaire et demande dans
quel sens présenter les données :
• Si l’option Par ADHERENT est choisie, le formulaire principal permettra de faire défi-
ler les adhérents et de visualiser en dessous et simultanément dans un sous-formulaire
tous les emprunts faits par les adhérents pris individuellement.
• Si l’option Par EXEMPLAIRE est choisie, le formulaire principal permettra de faire
défiler les exemplaires et de visualiser en dessous et simultanément dans un sous-
formulaire tous les emprunts auxquels ils ont donné lieu, un par un.
• Si l’option Par EMPRUNT est choisie, on listera tous les emprunts en visualisant les
emprunteurs et exemplaires concernés.
On voit bien ici la puissance du système, dépendant essentiellement de la qualité du
modèle relationnel créé en amont.
10. Choisissez l’option Par ADHERENT et cliquez sur « Suivant ».
11. À l’étape suivante, choisissez l’option par défaut Feuille de données (pour le sous-
formulaire) et cliquez sur « Suivant ».
12. Choisissez le style de présentation qui vous convient le mieux (par défaut Office) et
cliquez sur « Suivant ».
13. Changez éventuellement le titre du formulaire en « ADHERENT », puis cliquez sur
« Terminer ».
La visualisation obtenue, sous réserve du choix de style de présentation, se présente
comme à la figure 5.16.
Figure 5.16
Formulaire
et sous-formulaire
imbriqué.
Les boutons de déplacements tout à fait en bas permettent de faire défiler les adhérents ;
ceux au-dessus, inclus dans le sous-formulaire, balayent la liste complète des emprunts
faits par l’adhérent indiqué en haut de formulaire.
Figure 5.17
Fonctions intégrées
dans le générateur
d’expressions.
Dans la partie de gauche, le générateur montre d’abord les documents ouverts (et en pre-
mier lieu le formulaire en cours) puis un double-clic sur le signe + des tables montre
toutes les tables disponibles. Il en va de même pour les requêtes, formulaires et états.
Un double-clic sur les fonctions affiche, d’une part, d’éventuelles fonctions (code Visual
Basic) qui pourraient être insérées dans le formulaire en cours et, d’autre part, les Fonc-
tions Intégrées d’Access montrées à la figure 5.17. On trouve ici la liste exhaustive (dans le
pavé de droite) des fonctions reclassées par domaine (pavé du milieu).
1. On notera que cette syntaxe diffère suivant le programme Office : Excel utilise le mot-clé SI() alors qu’Access utilise VRAIFAUX(). Il en est
de même pour la fonction d’extraction de chaîne de caractères (EXTRACCHAINE() dans Access et STXT() dans Excel) et dans bien d’autres
fonctions. Seul le langage Visual Basic, commun aux deux produits, utilise la même syntaxe.
Pour chaque élément pointé grâce au générateur d’expression, toutes les propriétés de
l’objet sont récupérables (et non pas seulement une valeur de renvoi). Si l’on clique sur
CODE_POSTAL dans le pavé de gauche et sur le contrôle CODE dans le pavé du milieu, la
5
Chapitre
liste de droite renvoie, par exemple, la valeur de la propriété Visible. Ainsi, l’affichage d’une
zone peut être conditionné par la visibilité d’une autre : ce n’est qu’une parmi les millions
des fonctionnalités qui peuvent être créées.
Il s’agit maintenant d’afficher en bas du même formulaire des codes postaux le compte des
codes de la table :
• Cliquez sur le bouton « Zone de texte » du ruban et dessinez un rectangle en bas de for-
mulaire, sous la barre nommée Pied de Formulaire : automatiquement, le pied de
formulaire jusqu’à maintenant inexistant est créé.
• Insérez la formule : =Compte([CODE]) dans la propriété Source contrôle de la nouvelle
zone.
Vous constatez qu’Access réalise bien le compte total de tous les codes contenus dans la
table. On aurait pu tout aussi bien insérer cette zone de totalisation dans l’en-tête de for-
mulaire, mais il aurait été mal venu de la placer dans le corps du formulaire, s’agissant
d’un formulaire continu.
1. D’une certaine manière, cette requête équivaut à un SELECT VILLE FROM CODE_POSTAL WHERE CODE = ‘60000’ en langage SQL.
Résumé
Moyen central de visualisation des données, le formulaire peut prendre des formes multiples,
utilisant toute la palette des outils graphiques.
Un formulaire peut être unique ou continu pour présenter les données page par page ou
listées. Il peut gérer les droits des utilisateurs sur les données en acceptant un mode totale-
ment libre ou bien en réservant les opérations à la seule lecture, insertion ou modification.
Toutes ces propriétés sont composables entre elles.
La « boîte à outils » du formulaire inclut de nombreux types de contrôles qui utilisent des
graphismes variés pour présenter les données. Chacun des contrôles est doté d’une feuille
de propriétés destinée à paramétrer l’aspect graphique, la présentation des données et la
réaction du formulaire aux sollicitations de l’utilisateur. Les contrôles Zone de texte et
Etiquette servent essentiellement à présenter des données sous forme de caractères. Les
contrôles Zone de liste et Zone de liste déroulante donnent des choix visuels à l’utilisateur.
Les cases à cocher, cases d’options et boutons bascules sont une autre forme de présentation
des choix.
La source des données peut être précisée pour le formulaire lui-même via une requête ou
une table mais peut ne pas l’être. Les valeurs renvoyées par les différents contrôles seront
directement issues des requêtes source ou bien le résultat de calculs via des fonctions. Ces
dernières peuvent faire appel à la source de données en cours mais aussi à des domaines
étrangers au formulaire ouvert.
1. On verra plus loin que cette syntaxe pose des problèmes d’un autre ordre dans certains cas de figure. Les apostrophes (quotes simples
américaines) peuvent alors être remplacées par des doubles guillemets.
Problèmes et exercices
5
Chapitre
Tous les exercices sont basés sur les données contenues dans la base ECOLE_INTERNA-
TIONALE, ils visent, par degré de complexité croissant, à monter des formulaires utilisant
un bon nombre des outils détaillés dans le cours.
• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans la
table ELEVE ; les champs PAYS_ELEVE et SEXE_ELEVE sont à présenter sous forme de
zones de listes déroulantes, la première en extrayant toutes les nationalités comprises
dans la table, la deuxième en utilisant une simple liste de valeurs. Le formulaire doit être
en lecture seule ; insérez également un bouton pour fermer le formulaire et deux bou-
tons pour faire défiler les enregistrements ; retirez le sélecteur d’enregistrement et les
boutons de déplacements, devenus inutiles.
Figure 5.18
Première
présentation du
premier exercice.
Exercices
Figure 5.19
Deuxième ébauche
du premier exercice
après mise en forme
des zones de texte.
Figure 5.20
Résultat du premier
exercice.
• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans la
table ELEVE et simultanément leur moyenne dans chacune des matières. Le formulaire
montrera également la moyenne générale.
• Créer un formulaire.
• Insérer un sous-formulaire dans le premier.
Figure 5.21
Structure de la
première requête
Req1_Moyennes.
Figure 5.22
Structure de la
deuxième requête
Req2_Moyennes.
Figure 5.23
Établissement du
lien entre formulaire
et sous-formulaire.
Exercices
propriétés Champs Pères et Champs Fils sont bien toutes deux positionnées à ID_
ELEVE.
La présentation des résultats du sous-formulaire en mode feuille de données et non for-
mulaire n’est pas très heureuse : d’une part, on lit le numéro d’enregistrement de l’élève
(ce qui devient inutile dès lorsque le lien formulaire/sous-formulaire est vérifié et fonc-
tionnel) et, d’autre part, l’accès aux zones de listes déroulante des en-têtes de colonnes
renvoie des messages erreurs.
Nous suggérons donc de transformer le sous-formulaire en mode continu et affichage for-
mulaire, tout en faisant disparaître pour l’utilisateur la zone ID_ELEVE. Initialement, le
sous-formulaire a l’aspect représenté à la figure 5.24.
Figure 5.24
Sous-formulaire
avant modifications.
Figure 5.25
Sous-formulaire
après modifications.
Figure 5.26
Formulaire du
deuxième exercice
en mode création.
Exercices
Figure 5.27
Formulaire du
deuxième exercice
en mode formulaire.
• Énoncé Élaborez un formulaire dépourvu de source de données ; une zone de liste déroulante
doit permettre d’afficher tous les élèves et d’en sélectionner un. Au moment du choix de
l’élève, l’utilisateur découvrira en dessous une zone de liste présentant les moyennes
de l’élève.
* Solution Cet exercice a le même objectif, apparemment, que le précédent : montrer la moyenne
d’un élève. Il en diffère pourtant profondément. D’une part, les outils zone de liste dérou-
lante et zone de liste ne sont pas les mêmes que les zones de texte et sous-formulaires uti-
lisés précédemment mais, d’autre part, l’accès aux données s’opère par des voies
totalement nouvelles. Dans l’exercice 2, l’utilisateur « remonte » du serveur de données la
totalité des informations, table des élèves et table des notes : cette manière de faire, parti-
culièrement lourde pour la charge réseau, n’est peut-être pas indispensable. Si l’utilisateur
n’a besoin de connaître les résultats que d’un seul élève, à quoi bon lui livrer la totalité des
données ?
Il sera nécessaire, pour cet exercice, d’utiliser une macro, pour la première fois, mais de
manière très limitée.
5. Insérez une étiquette de titre Consultation des résultats. Pour cela revenez au menu
« Création ».
5
Chapitre
6. Dans le menu « Création », cliquez sur le bouton « Zone de liste déroulante » et dessinez
un rectangle en haut du formulaire.
7. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Je
veux que la liste déroulante recherche les valeurs dans une table ou requête ».
8. À l’étape 2, choisissez la table « ELEVE ».
9. À l’étape 3, sélectionnez les trois champs « ID_ELEVE », « NOM_ELEVE » et
« PRENOM_ELEVE » et insérez-les parmi les champs sélectionnés du pavé de droite.
10. À l’étape 4 choisissez le champ « NOM_ELEVE » pour établir un tri croissant.
11. À l’étape 5, laissez cochée la case colonne clé cachée et adaptez les largeurs de colonnes.
12. À l’étape 6 (dernière), nommez le contrôle ELEVE en lieu et place de NOM_ELEVE.
13. Modifiez la propriété Nom du contrôle par Choix_Eleve (au lieu de Modifiable0). Ce
point est important car ce nom servira ultérieurement.
14. Testez le contrôle : il doit afficher les noms et prénoms de tous les élèves, sans les ID (la
propriété Largeurs de colonnes du contrôle Zone de liste déroulante doit être à
<0cm;3,5cm;2,5cm>). Le formulaire doit avoir l’aspect de la figure 5.28.
Figure 5.28
Formulaire du
troisième exercice
avec la seule zone
de liste déroulante.
Dans les propriétés de cette zone de liste déroulante, on notera les points suivants :
• Le contenu du contrôle est une requête SQL dont le code est SELECT ELEVE.ID_ELEVE,
ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE ORDER BY ELEVE.NOM_ELEVE; .
Exercices
• La propriété Colonne liée est fixée à 1, qui désigne la première colonne, non visible, de
l’ID de l’élève. Quand l’utilisateur choisit un élève, le contrôle prend dès lors la valeur
du numéro de l’élève désigné. Cette propriété nous sera utile.
• La propriété Limiter à liste est positionnée à Oui : l’utilisateur ne peut pas entrer un
nom qui n’existerait pas dans la liste.
• La propriété Source de données est vide ; en d’autres termes, le contrôle n’est lié à
aucune source de données indiquée dans le formulaire.
Figure 5.29
Requête de la zone
de liste du troisième
exercice.
• En revanche, la requête qui détermine le contrôle Moyennes ayant déjà eu lieu, elle n’est
pas relancée.
Il ne manque donc plus qu’à monter un mécanisme pour relancer la requête à la source
des données du contrôle Moyennes chaque fois que la zone de liste déroulante est mise à
jour. Ce mécanisme doit s’associer à la zone de liste déroulante Choix_Eleve.
1. Sélectionnez la propriété Après MAJ du contrôle Choix_Eleve.
2. Cliquez sur le bouton aux trois points de suspension.
3. Choisissez « Générateur de Macros » et validez par « OK ».
4. À la première ligne, ouvrez la zone de liste déroulante et sélectionnez Actualiser.
5. En bas, dans la zone Nom du contrôle, saisissez « Moyennes ».
Le résultat doit être conforme à la figure 5.30.
Figure 5.30
Macro incorporée
du troisième
exercice.
Finition du formulaire
1. La propriété Nombre de colonnes du contrôle Moyennes est fixé à 3.
2. La propriété Largeurs de colonnes du contrôle Moyennes est fixée à
<0cm;3,505cm;0,501cm> 1.
1. Vous aurez peut-être noté que, bien que la requête fixe explicitement le format des chiffres à deux décimales, la zone de liste subséquente ne
tient pas compte de cette propriété. Il s’agit d’une erreur de programmation d’Access : le format des données dans les colonnes de la zone de
liste ne sont pas déterminables. Nous utilisons donc ici la largeur de colonne comme subterfuge pour cacher le grand nombre de décimales des
résultats.
Figure 5.31
Résultat final du
troisième exercice.
Exercices
Les états
6
Chapitre
167
Access Livre Page 168 Mercredi, 27. f vrier 2008 7:28 07
Figure 6.1
Menu de l’aperçu
avant impression.
Les boutons Taille, Portrait, Paysage et Marges sont des raccourcis du bouton Mise en page
qui détaille précisément chacun de ces paramètres.
• Les marges sont exprimées en millimètres. Il est maladroit de chercher à réduire exces-
sivement les marges : outre des messages erreurs systématiques, l’impression est condi-
tionnée de toute façon par les capacités de l’imprimante. Afin de s’adapter à toutes les
imprimantes du marché, il est plus judicieux de ne pas descendre en deçà de 5 mm.
• L’orientation dépendra du format des tableaux à présenter : tous les calculs d’impres-
sion se font sur la base du papier généralement utilisé : en Europe, il s’agit du format A4
alors qu’aux États-Unis le format Lettre US est le standard (réglages à préciser dans les
Paramètres Régionaux du panneau de configuration Windows).
• En vue d’économiser du papier, il est possible de multiplier les colonnes. Dans le cas
présent, le nombre de colonnes est fixé à 1 mais dans la mesure où les seules données à
imprimer occupent peu de place en largeur, ce chiffre peut être monté à 2, réduisant de
moitié le nombre de feuilles nécessaires ! 1.
6
Chapitre
Sans même disposer d’Adobe Acrobat Writer, il est possible, avec la version 2007 d’Access,
d’imprimer vers un fichier PDF. Il est nécessaire toutefois de télécharger un complément
Microsoft en accédant au site www.microsoft.com/downloads/Search.aspx?display-
lang=fr dans la famille des produits Office (voir figure 6.2).
Figure 6.2
Téléchargement
du complément
Microsoft Office
2007.
Nativement, Access peut exporter les impressions vers Word (fichier RTF) ou vers un
fichier XML ou HTML.
1. Fermez l’Aperçu avant impression.
2. Revenez au menu Format de l’état. Dans la partie droite du ruban, Access propose des
mises en forme automatiques comme le montre la figure 6.3.
Figure 6.3
Options de mise en
forme automatique.
1. Un réglage de la largeur des zones à imprimer est à réaliser manuellement suivant des modalités que nous verrons plus loin.
Figure 6.4
Requête paramétrée
des codes postaux
par département.
Rappel : la citation entre crochets dans la zone des critères génère une requête dite para-
métrée qui ouvre une boîte de dialogue destinée à l’utilisateur. Le mot-clé « Comme »
placé avant la citation entre crochets permet de faire intervenir le « joker » « * » pour
montrer tous les départements.
5. Enregistrez la requête sous le nom « Req_Codes_Dpts ».
6. Fermez la requête tout en la laissant en surbrillance dans le volet de navigation.
7. Dans le menu « Créer », cliquez sur l’icône Etat : le message de demande du département
apparaît, appuyez sur la touche *.
8. Le nouveau document est immédiatement généré.
Cette impression n’est pas satisfaisante : on souhaite un état qui s’interrompe à chaque
département, imprime un compte du nombre de bureaux distributeurs et n’imprime pas
la troisième colonne. On veut en outre que, pour chaque département, les enregistrements
soient triés par ordre alphabétique de ville.
Figure 6.5
État en mode
création.
Le dessin général de l’état en mode création ressemble beaucoup à celui des formulaires.
On y retrouve les En-tête et Pied déjà vus, auxquels s’ajoutent ici un En-tête de page et un
Pied de page. Ces deux derniers éléments contiennent les libellés (ou formules ou don-
nées) qui se répètent à chaque page imprimée ; dans le cas présent, les libellés CODE,
VILLE et DEPARTEMENT sont inclus dans l’en-tête de page alors que le pied de page
comprend une formule destinée à la pagination (sous la forme Page X sur Y pages). L’en-
tête d’état, enfin, contient une formule destinée à imprimer la date et l’heure en cours.
1. Cliquez sur le bouton « Regrouper et Trier » du ruban : une fenêtre s’ouvre en bas
d’écran.
2. Cliquez sur le bouton « Ajouter un groupe ».
3. Une nouvelle zone d’en-tête de groupe DEPARTEMENT dans l’état s’est insérée en
dessous de l’en-tête de page.
4. Cliquez sur le champ DEPARTEMENT qui est apparu dans une nouvelle fenêtre en
bas.
5. Dans la fenêtre inférieure, un bandeau jaune est apparu, cliquez sur Plus.
6. Cliquez sur la zone de liste déroulante voisine de Avec un total de CODE.
7. Le type Compter les valeurs sur cette zone CODE est par défaut le bon.
8. Cochez la case Afficher dans le Pied de page de groupe : un pied de page de groupe
apparaît avec une formule de Compte().
9. Cliquez sur le champ DEPARTEMENT dans la zone Détail.
10. Appuyez sur Ctrl + X (pour le couper).
11. Cliquez sur l’en-tête de groupe et utilisez la combinaison Ctrl + V (pour le coller).
12. Ajoutez une étiquette Département dans l’en-tête de groupe (l’étiquette d’origine a
disparu lors du couper-coller).
13. Un « smart tag » ou message d’anomalie (triangle vert en haut à gauche de la zone
d’étiquette) est apparu : cliquez sur le losange jaune et associez l’étiquette à la zone de
texte voisine.
14. Dans le bandeau inférieur, cliquez sur Ajouter un tri.
15. Sélectionnez le champ VILLE pour que les villes soient triées par ordre alphabétique.
La liste globale va donc afficher tous les départements en commençant par 01 pour
finir par 98 mais, à l’intérieur de chaque département, les enregistrements seront triés
par ordre alphabétique de ville.
L’ordonnancement qui vient d’être mis en place n’est nullement le résultat de tris ou de
sous-totalisations dans la requête source des données, mais bien l’effet de la structure de
l’état lui-même. En définitive, il doit avoir la structure présentée à la figure 6.6.
Figure 6.6
État avec
sous-totaux.
Il est possible de créer autant de groupes qu’il existe de champs dans la source de données.
On prendra garde, pourtant, à ne pas multiplier à l’infini cette notion de rupture dans les
impressions.
Toutes les formules, tous les mots-clés utilisés dans les contrôles Zone de texte des formu-
laires restent identiques dans les états.
L’utilisation d’une étiquette comme d’un texte complet permet d’envisager le montage de
publipostages dans Access même, sans autre outil : les coordonnées des destinataires
seraient gérées comme tout autre champ en haut à droite de la page et le texte mis en place
dans autant d’étiquettes qu’il y aurait de paragraphes. Mais cette démarche nous paraît
hasardeuse : il serait impossible d’insérer des champs variables au sein même des textes et
surtout, il serait impossible de gérer les largeurs de zones. Il est infiniment plus efficace de
faire le mailing dans Word en appelant les données stockées dans la base Access. Inverse-
ment, Access s’adapte parfaitement bien à l’impression des documents à structure fixe
comme les factures.
Contrairement aux formulaires, enfin, les enregistrements imprimés dans un état peuvent
être numérotés pour établir des références précises :
1. Dans l’état des codes postaux ci-dessus, en mode création, décalez les champs CODE
et VILLE vers la droite de 2 carreaux (si les zones de texte sont restées solidaires,
l’ensemble des zones se décale simultanément).
2. Dans l’en-tête de page, ajoutez une étiquette N˚ de ligne.
3. Dans le détail, ajoutez une zone de texte vierge et retirez le texte de son étiquette.
4. Dans la feuille de propriétés de la nouvelle zone, entrez la formule « =1 » à la propriété
Source contrôle.
5. Dans la même feuille de propriétés, positionnez la propriété Cumul à Par Groupe (au
lieu de Non).
6
Chapitre
Figure 6.7
Résultat de l’état
« Bottin des codes
postaux » avec
numérotation des
lignes.
Résumé
Access a conçu l’impression des données par la génération d’états dont l’essentiel des
règles est régi de la même manière que les formulaires. La source des données sera, la plu-
part du temps, fournie par une requête spécifique dont on exclura tout tri ou sélection
spécifique ; en effet, Access permet de mettre en place dans les états des ruptures d’édition
(avec ou sans sous-totaux) et des tris qui font du générateur d’états un outil particulière-
ment performant. Inadapté aux mailings, l’état Access correspond très bien, en revanche,
aux besoins des gestionnaires et commerciaux (listings, factures, etc.).
Problèmes et exercices
EXERCICE 1 ÉTAT DES NOTES DES ÉLÈVES
Le seul exercice de ce chapitre porte sur les données contenues dans la base ECOLE_
INTERNATIONALE. Il met en œuvre, simultanément, les connaissances acquises sur les
formulaires et les états.
• Énoncé Mettez en place un formulaire doté d’une zone de liste déroulante proposant tous les élè-
ves ; un clic sur un bouton d’impression dans le même formulaire lancera l’aperçu avant
impression du « carnet de notes » de l’élève choisi avec toutes les moyennes ; il doit appa-
raître, en sus, une moyenne des langues vivantes.
1. On remarquera que l’affichage de la boîte de dialogue en mode création ne peut pas être obtenu avec le bouton haut gauche du ruban de
création ; il est nécessaire de faire un clic droit sur l’objet dans le volet de navigation et de sélectionner « Mode Création ».
Figure 6.8
Boîte de dialogue
6
Chapitre
modale vierge.
Figure 6.9
Requête Req3_
Moyennes de
l’exercice 6-1.
Enregistrez la requête sous le nom « Req3_Moyennes » (si les exercices des chapitres pré-
cédents ont été faits, il existe déjà une requête Req1_Moyennes et une requête Req2_
Moyennes).
Création de l’état
1. Fermez toutes les fenêtres en cours et positionnez la surbrillance du volet de navigation
au-dessus de la requête source Req3_Moyennes.
2. Dans le menu « Créer », cliquez sur l’icône Assistant État.
3. À la première étape, déplacez tous les champs du pavé champs disponibles au pavé
champs sélectionnés.
4. À la deuxième étape, indiquez à Access un niveau de regroupement en cliquant sur la
flèche vers la droite pour insérer le champ ID_ELEVE comme niveau. L’assistant doit
avoir la configuration indiquée à la figure 6.10.
Figure 6.10
Niveaux de
regroupement dans
l’assistant États.
5. Dans la troisième étape, n’indiquez pas d’ordre de tri, mais cliquez sur le bouton
« Options de synthèse ». Cochez la case Moyenne pour demander à programmer une
moyenne générale pour l’élève.
6
Chapitre
6. Dans les deux étapes suivantes, choisissez le style de formulaire qui vous convient le
mieux.
7. Indiquez le titre « Résultats » pour l’état à la dernière étape.
L’effet obtenu n’est pas totalement satisfaisant :
• Le regroupement est correct (ID_ELEVE par ID_ELEVE), mais l’état répète le nom
et le prénom de chacun autant de fois qu’il existe de matières : ceci est dû au fait
que le regroupement s’effectue sur le seul ID et non pas sur le triplet ID-NOM-
PRENOM.
• Les moyennes par matière apparaissent sous la forme ########## car la zone n’est pas
suffisamment large.
• Le libellé « Synthèse pour ID_ELEVE… » n’est pas très heureux.
Procédons aux perfectionnements nécessaires en mode création :
1. Sélectionnez l’ensemble des étiquettes contenues dans l’en-tête de page, puis, dans le
menu « Réorganiser », cliquez sur Supprimer (les étiquettes se désolidarisent des zones
de texte placées dans le Détail).
2. Supprimez toutes les étiquettes de l’en-tête de page en appuyant sur « Sup ».
3. Réduisez la hauteur de la zone En-tête de page afin qu’elle devienne invisible.
4. Déplacez le champ NOM_ELEVE de la zone Détail à la zone En-tête de groupe.
5. Déplacez le champ PRENOM_ELEVE de la zone Détail à la zone En-tête de groupe.
6. Mettez les deux champs précédents en Gras.
7. Déplacez les champs MATIERE et MoyenneDeNOTATION pour les placer en milieu
d’état.
8. Élargissez le champ MoyenneDeNOTATION.
9. Positionnez les propriétés du champ MoyenneDeNOTATION Format et Décimales
respectivement à Fixe et 2.
10. Dans le pied de groupe, supprimez le libellé automatique de synthèse pour ne conserver
que la moyenne générale et son libellé.
11. Modifiez les propriétés du champ de Moyenne générale dont la propriété Source est
=Moyenne([MoyenneDeNOTATION]) : les propriétés Format et Décimales doivent
être respectivement à Fixe et 2.
Exercices
Figure 6.11
Structure de l’état
des résultats après
modifications.
Figure 6.12
La macro doit avoir la structure décrite à la figure 6.12.
6
Chapitre
Macro incorporée
du contrôle OK de
la boîte de dialogue
modale.
Exercices
Les macros
7
Chapitre
181
Access Livre Page 182 Mercredi, 27. f vrier 2008 7:28 07
La première succession d’événements programmés que nous allons écrire consiste à affi-
cher une boîte de message puis ouvrir la table CODE_POSTAL de la base du même nom
et enfin d’exporter cette table vers un nouveau fichier Excel.
1. Dans l’onglet Créer, cliquez sur le triangle placé dans l’icône Macro, à droite, et sélec-
tionnez Macro (les deux autres éléments, que nous verrons plus loin, accèdent directement
à Visual Basic).
2. Une nouvelle fenêtre s’ouvre, similaire à celle de la figure 7.1.
Figure 7.1
Grille de saisie
des macros.
L’ouverture de la zone de liste déroulante de l’action permet de lire une trentaine d’actions
possibles, mais si l’on clique sur le bouton du ruban Afficher toutes les actions, la palette
complète comprend alors 70 types d’actions programmables.
7
Chapitre
La macro qui a été créée dans le paragraphe précédent peut être lancée depuis le volet de
navigation, mais il est fréquent que les macros soient associées à un formulaire et un bouton
donnés.
1. Dans le menu « Créer », cliquez sur l’icône Création de formulaires (une grille vierge
de formulaire apparaît).
2. Cliquez sur l’icône Bouton de commande du ruban et dessinez un carré en bas d’écran.
1. Ce chemin, qui s’apparente à une structure de fichiers Windows Vista, permet de copier les données sur le bureau de l’utilisateur appelé
Utilisateur1 dans un fichier Excel 2007.
2. Certains programmeurs préfixent leurs macros par Mac_xxx.
3. Dans la première étape de l’assistant, sélectionnez l’action Exécuter une macro parmi
les options de la catégorie Divers.
4. Dans la deuxième étape, choisissez la macro Mcr_Visu_Codes.
5. Choisissez l’apparence que vous préférez dans la troisième étape.
6. Nommez le bouton « Visu_codes » dans la quatrième et dernière étape.
7. Testez ce bouton en passant en mode formulaire : les quatre opérations programmées
plus haut se déroulent de la même manière.
Avec Access 2007, il est désormais possible de faire jouer des variables dans les macros, ce
qui élargit considérablement la portée de cet outil par rapport aux versions antérieures qui
en étaient dépourvues. Une variable est une donnée (de type alphanumérique mais non
de type date ou autres) conservée en mémoire jusqu’à ce qu’une commande précise de
macro ne la supprime. Le principe d’Access veut qu’on affecte simplement une valeur à
une variable pour qu’elle soit créée et utilisable.
On se propose ici de créer une macro qui :
• Ouvre une boîte de message pour demander à l’utilisateur un nom de ville.
• Recherche dans la table des codes postaux le code correspondant à la ville demandée.
• Affiche une boîte de message réponse.
Dans la mesure où il existe plusieurs étapes à cette opération (entrée de la demande,
recherche et affichage de la réponse), il est impossible de la réaliser sans faire appel à des
informations stockées quelque part (valeur demandée et valeur de réponse) : le support de
stockage aurait pu être un formulaire ou un état mais, dans le cas présent, toute l’opéra-
tion doit se dérouler sans aucun support sinon la macro elle-même ; dès lors, seules des
variables peuvent répondre à cette attente.
1. Dans le menu « Créer », cliquez sur Macro.
2. Sur la première ligne, choisissez l’action DéfinirVarTemp qui crée une variable et lui
affecte une valeur.
3. Dans les arguments, nommez la variable « VilleRecherche ».
4. Dans les arguments, saisissez en Expression la formule : « BEntrée("De quelle ville
voulez-vous connaître le code postal ?") ». La fonction BEntrée crée une boîte
de dialogue qui permet à l’utilisateur de saisir la valeur de la variable. Le texte entre
guillemets est le texte qui apparaîtra dans la boîte de dialogue.
5. La deuxième ligne utilise la fonction RechDom, déjà étudiée, pour déterminer la
valeur d’une deuxième variable : choisissez l’action DéfinirVarTemp une nouvelle fois
sur cette ligne.
6. Dans les arguments, nommez la variable « CodeTrouve ».
7. Dans les arguments, saisissez en Expression la formule : « RechDom("[CODE]";"CODE_
POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'") ». On prendra
garde à la syntaxe de cette formule relativement complexe et fréquemment retrouvée.
En premier lieu, la formule ne commence pas par le signe égal (=). Les trois parties de
la fonction RechDom sont cernées par des guillemets ; le premier argument désigne la
colonne de la recherche et est cerné par des crochets ; le deuxième argument désigne
la table ciblée et ne nécessite pas de crochets ; le troisième argument, qui désigne les
conditions de la recherche, concatène (signe & ou perluète) plusieurs parties :
7
Chapitre
• le champ VILLE est cité entre crochets et guillemets mais une apostrophe (quote sim-
ple) est insérée en outre avant le dernier guillemet ; cette apostrophe sert à citer la varia-
ble décrite après comme une chaîne de caractère ;
• la variable VilleRecherche qui avait été initialisée dans la ligne précédente est désignée
par le mot-clé VarTemp entre crochets, suivi d’un point d’exclamation et du nom de
variable encore une fois entre crochets ;
• une dernière partie comprend une apostrophe entre deux guillemets pour fermer la
chaîne de caractères ouverte après VILLE. En admettant que la valeur de la variable soit
PARIS, la formule s’écrirait RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='PARIS') .
8. Sur une troisième ligne de macro, sélectionnez l’action BoîteMsg.
9. Parmi les arguments, entrez pour message la formule « ="Le code de " & [Var-
Temp]![VilleRecherche] & " est " & [VarTemp]![CodeTrouve] ». Ici, le message
doit être précédé du signe = pour que la concaténation soit effective (un texte littéral
apparaîtrait si le signe = était omis).
10. Une quatrième et dernière ligne supprime les variables et leur contenu (mesure indis-
pensable pour éviter des problèmes en cas de réutilisation des variables) : insérez
l’action SupprimerToutesVarTemp qui ne comprend aucun argument.
Au total, la macro, qu’on enregistra sous le nom « Mcr_Recherche_Code », aura l’aspect
de la figure 7.2.
Figure 7.2
Macro de recherche
de code postal en
mode création.
Figure 7.3
Première étape
de la macro de
recherche de code
postal.
Étape 2 : une deuxième boîte de dialogue donne la réponse à l’utilisateur, comme indiqué
sur la figure 7.4. On notera que la recherche proprement dite n’a pas donné lieu à un affi-
chage particulier.
Figure 7.4
Deuxième étape
de la macro de
recherche de code
postal.
Dans l’application précédente, le programme ne prévoit pas le cas où la ville entrée dans la
boîte de dialogue initiale n’existe pas. Si par exemple, et à la suite d’une faute d’orthogra-
phe, la ville de PAROS est demandée, à la place de PARIS, le programme répond simple-
ment « Le code de PAROS est » sans plus de commentaire.
Pour éviter ce problème, on peut écrire une macro conditionnelle, qui prévoira cette éven-
tualité.
1. Ouvrez à nouveau, si nécessaire, la macro en mode création.
2. Dans le ruban, cliquez sur le bouton « Conditions » : une colonne Condition apparaît
dans le corps de la macro, à gauche des Actions.
3. Faites un clic droit dans la marge de la troisième ligne et sélectionnez Insérer des
lignes : une ligne blanche se crée en dessous de la deuxième définition de variable.
4. Dans la colonne Condition de la nouvelle ligne, insérez la formule : « EstNull([Var-
Temp]![CodeTrouve]) » qui signifie littéralement « Si la variable CodeTrouve est
vide » (autrement dit : si la recherche n’a pas abouti).
5. Dans la colonne Action de la même ligne, sélectionnez l’action BoîteMsg avec pour
argument Message : « Cette ville n’est pas répertoriée dans la table », pour argument
Type : le point d’exclamation et pour argument Titre : Recherche de code postal.
Cette nouvelle ligne de programme, qui « contourne » la trajectoire directe de la macro
initiale, n’est pas suffisante. Si les modifications se limitent à cette seule ligne, le pro-
gramme va effectivement renvoyer le message erreur si ce dernier s’applique, mais il va
continuer en donnant tout de même une réponse écourtée et inexacte (testez ce cas de
figure). Il faut donc non seulement renvoyer le message erreur mais aussi obliger le pro-
gramme à s’arrêter en cas d’erreur.
6. Insérez une nouvelle ligne en dessous du message erreur.
7. Saisissez trois points dans la colonne Condition de la nouvelle ligne : cette syntaxe
indique à Access que la condition de la ligne précédente continue à s’appliquer.
8. Sélectionnez l’action SupprimerToutesVarTemp.
9. Insérez une nouvelle ligne en dessous.
10. Saisissez trois points dans la colonne Condition.
7.5) :
• Soit la variable est vide et donc le programme renvoie un message erreur, s’arrête et
détruit les variables en cours ;
• Soit la variable n’est pas vide, les trois lignes du milieu ne sont pas exécutées, la réponse
est affichée puis le programme détruit les variables.
Figure 7.5
Macro
conditionnelle.
Les macros peuvent être chaînées entre elles, de manière conditionnelle ou non ; on peut
alors mettre en place des programmes complets, réutilisables en divers endroits de l’appli-
cation.
Afin d’illustrer cette fonctionnalité, nous emploierons de nouveau les macros Mcr_Visu_
Codes et Mcr_Recherche_Code développées précédemment.
1. Dans le menu « Créer », cliquez sur le bouton Macro.
2. Sur la première ligne, définissez une variable nommée « Choix » et dont l’expression
est la formule : BEntrée("Tapez 1 pour visualiser les codes, 2 pour en rechercher un
précis"). Le choix entre l’option 1 et l’option 2 orienteront le programme vers l’une ou
l’autre des deux macros déjà créées.
3. Cliquez sur le bouton Conditions.
4. Sur la deuxième ligne, insérez la condition [VarTemp]![Choix]=1.
5. Sur la même deuxième ligne, sélectionnez l’action ExécuterMacro et citez Mcr_Visu_
Codes dans l’argument du Nom de macro.
6. Sur la troisième ligne, insérez la condition [VarTemp]![Choix]=2.
7. Sélectionnez l’action ExécuterMacro et citez Mcr_Recherche_Code dans l’argument du
Nom de macro 1.
8. Enregistrez la nouvelle macro sous le nom « Mcr_Choix » (voir figure 7.6).
Figure 7.6
Macro appelant
d’autres macros.
1. On notera que l’action ExécuterMacro comporte un argument de répétition. Il est possible, avec cette option, d’insérer une notion de
boucle dans les programmes.
Une procédure particulière est prévue pour gérer les erreurs système qui peuvent interve-
nir dans les macros. Dans le programme de recherche d’un code postal, une erreur inter-
vient à coup sûr (et provisoirement) si le nom de la ville recherchée comporte une
apostrophe. Avant de réparer ce problème, tentez par exemple de rechercher le code postal
de CAP D’AIL (qui se trouve bien dans la liste) avec la macro Mcr_Recherche_Code : le
programme renvoie le message erreur de la figure 7.7.
Figure 7.7
Message erreur dû
à une mauvaise
syntaxe SQL.
Figure 7.8
Macro avec gestion
des erreurs.
Note
En fait, l’erreur est due à une imperfection de la syntaxe de la fonction RechDom() dans la troisième
ligne du programme. La syntaxe actuelle est RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='" &
[VarTemp]![VilleRecherche] & "'"). Dans cette tournure, et pour simplifier les explications, on a
employé des apostrophes pour cerner le nom de la ville recherchée dans la requête SQL. Or, si la
ville recherchée, justement, comprend elle aussi une apostrophe, il s’ensuit forcément une erreur car
SQL ne sait plus où se trouve la chaîne de caractères recherchée. Dans l’absolu, il faut remplacer
chaque apostrophe par un double guillemet ("") pour solutionner le problème. La formule devient
alors RechDom("[CODE]";"CODE_POSTAL";"[VILLE]= """ & [VarTemp]![VilleRecherche] & """").
La procédure de conversion que nous allons étudier s’avère d’une simplicité extrême et
peut être utilisée massivement dans un premier temps, avant que le langage VBA ne soit
complètement assimilé. Dans de nombreux cas, il sera judicieux de passer par cette voie
lorsque des syntaxes seront méconnues ; on gagnera par là un temps précieux.
1. Fermez tous les onglets Access actifs et mettez en surbrillance la macro Mcr_Visu_
Codes (sans la démarrer ou l’ouvrir en mode création !).
2. Cliquez dans le menu sur « Outils de base de données ».
3. Cliquez sur le bouton du ruban « Convertir les macros en Visual Basic ».
4. Le programme de conversion passe par une boîte message proposant d’ajouter une
gestion des erreurs et des commentaires au programme (voir figure 7.9) : conservez
les deux cases à cocher dans leur état et cliquez sur « Convertir ».
Figure 7.9
Options de la
conversion des
macros en Visual
Basic.
5. Immédiatement, le code qui avait été conçu sous forme graphique devient un « texte
pur » ouvert dans la fenêtre bien particulière de Visual Basic. La conversion ne comporte
pas plus de difficultés !
6. Lorsque la boîte message « Conversion terminée » est fermée, l’interface est celle de
Visual Basic : fermez le programme en cliquant sur la croix supérieure droite (ou
Fichier > Fermer et retournez à Microsoft Office Access).
Dans le volet de navigation est apparu un module, nommé « Macro convertie – Mcr_
Visu_Codes ». Ce module nous servira de guide de découverte, mais ne devrait pas être
inséré, en l’état, dans une application. Généralement, on donnera aux modules des noms
plus courts et sans espaces. Un simple clic sur le module provoque tout à la fois le démar-
rage du programme VBA et l’ouverture à la page du module sélectionné. Il est également
possible de cliquer sur l’icône Visual Basic dans le menu « Outils de base de données ».
L’agencement général de Visual Basic est décrit à la figure 7.10. Pour afficher les propriétés
de l’objet, sélectionner le menu « Affichage > Fenêtre Propriétés ».
Figure 7.10.
Fenêtre d’ouverture
de Visual Basic.
La fenêtre n’est plus celle d’Access, mais celle de Microsoft Visual Basic. Un bouton en
haut à gauche permet de retourner à Access, qui reste actif en permanence. Cette interface
est la même pour Access, Excel, Word et tous les produits de la gamme Office.
Dans la partie supérieure gauche de l’écran apparaît une sous-fenêtre des projets ; il peut
exister un certain nombre de projets préchargés qui correspondent à des assistants
(ACWZTOOL) ou compléments spécifiques : généralement, ils ne peuvent pas être
ouverts. En dessous, dans la même zone, se trouvent les éléments du fichier Access ouvert.
Au premier démarrage de VB, vous ne verrez probablement que des modules comme
sous-éléments du fichier, mais rapidement, la structure sera celle montrée sur la figure
7.10 avec :
• des Microsoft Office Access Objets de classe (et des formulaires en dessous) ;
• des modules.
Il est donc possible d’insérer du code :
• soit dans les formulaires, ceux-là même qui ont été étudiés précédemment, et dont le
code se référera à tous les événements pouvant survenir dans ces formulaires ;
• soit dans des modules séparés : le code sera alors appelé par une syntaxe spécifique.
Un double-clic dans l’un de ces éléments permet de le visualiser dans la partie droite de
l’écran.
Dans la partie inférieure gauche sont affichées les propriétés de l’objet actif. Ici, on peut
lire (et modifier le cas échéant) le nom du module.
7
Chapitre
Les deux pavés de gauche (projets et propriétés) peuvent être supprimés de l’affichage ou
remis en place par des options du menu général Affichage.
Le pavé de droite contient le code Visual Basic proprement dit comme il apparaît à la
figure 7.11. Nous allons le détailler.
Figure 7.11
Code Visual Basic
de la macro
convertie « Mcr_
Visu_Codes ».
• La première ligne de code Option Compare Database est une ligne particulière, systé-
matiquement ajoutée dans Access pour indiquer que les options d’ordre de tri seront
ceux sélectionnés dans les paramètres régionaux. Cette partie, terminée par un trait,
pourrait comprendre d’autres options générales 1.
• Les quatre lignes suivantes commencent chacune par une apostrophe (') ; le texte qui se
trouve à droite se colore en vert : il s’agit de commentaires et ces lignes ne seront pas
exécutées par le programme. La conversion de la macro les a générées automatiquement.
• Le texte du module proprement dit commence par le mot-clé Function et se termine
par le mot-clé End Function (ils sont en bleu) ; entre ces deux limites, nous sommes
dans une fonction, soit un ensemble de lignes de code constituant un programme qui
pourra être exécuté.
• Le mot-clé Function est suivi par le nom de fonction Mcr_Visu_Codes() : ce nom est
directement issu de la macro originelle et devrait être modifié ; les parenthèses qui sui-
vent, et qui pourraient contenir des paramètres sont obligatoires. La fonction (Function)
déclarée ici possède des propriétés bien particulières que nous verrons plus loin ; elle
peut être remplacée par une simple procédure (déclarée par les mots-clés Sub et End Sub).
• Le code proprement dit, qui sera exécuté, est écrit en noir.
La première ligne ne contient qu’une simple commande Beep, qui effectue un bip sonore.
La deuxième ligne contient une commande de Boîte de message (MsgBox), suivie de ses
paramètres. On verra bientôt que Visual Basic aide l’utilisateur à rédiger son code et énu-
mère les paramètres à entrer au fur et à mesure de la saisie. Ces paramètres sont séparés
par des virgules ; ici ils comprennent, par ordre, le message affiché dans la boîte elle-
même, le type de boîte de message (vbExclamation) et le titre de la boîte.
1. Option Explicit, par exemple et qu’on recommande, oblige le programmeur à déclarer toutes ses variables.
1. Avec la touche F2 dans Visual Basic ou en cliquant sur Affichage > Explorateur d’objets, on accède à la bibliothèque des objets constituant le
modèle objet VB et grâce auquel on retrouvera tous les outils nécessaires à la rédaction du code.
• S’il survient une erreur dans le programme, le contrôle programme passe donc directe-
ment à l’étiquette de ligne Mcr_Visu_Codes_Err et poursuit en lisant la ligne suivante :
la commande MsgBox Error$ ouvre une boîte de message décrivant l’erreur détectée.
7
Chapitre
• La ligne suivante se sert de la syntaxe Resume pour « oublier » l’erreur et aller vers une
nouvelle étiquette de ligne nommée Mcr_Visu_Codes_Exit.
• Enfin, la ligne de programme Exit, située sous l’étiquette, permet de sortir de la fonc-
tion.
Cette gestion des erreurs peut paraître lourde et complexe, mais s’avère indispensable dans
le code. D’une part, elle est complètement générée sans l’intervention du programmeur
mais elle a, d’autre part, l’immense avantage d’éviter à l’utilisateur de recevoir des messa-
ges incompréhensibles. En admettant que toute la structure de gestion d’erreur soit
supprimée, le message affiché par Access serait celui de la figure 7.12.
Figure 7.12
Message Access en
cas d’absence de
gestion d’erreurs.
Dans ce message, doté d’un numéro d’erreur inutile pour l’utilisateur final, il est possible
de cliquer sur le bouton Débogage et d’accéder directement au code VB. Si une application
complète et achevée doit être livrée à des utilisateurs, un tel message est donc à prohiber
absolument !
Résumé
Les macros d’Access, contrairement à celles d’Excel, s’écrivent en enregistrant des actions
à réaliser, dotées de paramètres. Les manipulations s’effectuent dans un environnement
graphique prévoyant tous les cas de figure possibles. Les macros d’Access 2007 permettent
l’utilisation de variables, qui étendent considérablement leur champ d’action, et autorisent
les conditions et les boucles de programmes.
Toute macro peut être très facilement convertie en code afin d’être réutilisée sous l’envi-
ronnement Visual Basic. Ce dernier, totalement intégré à Access, permet la mise au point
de programmes beaucoup plus élaborés et sera donc préféré, à terme, à l’utilisation des
macros.
Les programmes VBA sont intégrés dans des fonctions (Function) ou des procédures
(Sub). La rédaction du code en est facilitée par l’interface graphique qui propose, au fur et
à mesure de la saisie, l’insertion de tous les mots-clés et paramètres du modèle objet de
VBA. La conversion des macros en code crée automatiquement une gestion des erreurs
qui évite aux utilisateurs d’accéder aux programmes eux-mêmes.
Problèmes et exercices
Les exercices proposent de créer des macros dans la base ECOLE_INTERNATIONALE.
On transformera ensuite ces macros en code Visual Basic sur lequel on fera quelques
ajouts et mises au point.
• Énoncé 1. À partir d’un formulaire vierge, créez une zone de liste (simple) à choix unique, pré-
sentant tous les élèves ; un clic sur l’un des items de la liste doit ouvrir une boîte de
message présentant la moyenne de l’élève.
2. La macro, incorporée dans le formulaire sera ensuite convertie en code VB. On
ajoutera une nouvelle boîte de message interrogative demandant la matière à cal-
culer pour donner finalement la seule moyenne de l’élève désigné dans cette seule
matière.
3. Cette boîte de dialogue rappellera le nom et le prénom de l’étudiant suivi de sa
note.
Figure 7.13
Zone de liste
7
Chapitre
de l’exercice 1.
1. Dans la feuille de propriétés de la zone de liste, modifiez la propriété Nom par Choix_
Eleve au lieu de Liste0.
2. Vérifiez que la propriété Sélection multiple est bien à Aucun (c’est l’option par défaut) :
l’utilisateur ne pourra donc pas « toper » plusieurs élèves simultanément.
3. À la ligne de la propriété SurClic, cliquez sur le bouton aux trois points de suspension
à droite.
4. Sélectionnez Générateur de macro : l’interface des macros s’ouvre.
5. Sélectionnez l’action BoîteMsg.
6. Dans l’argument Message, insérez la formule = MoyDom("[NOTATION]";"NOTE";"ID_
ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]) que nous
allons décomposer :
• La fonction MoyDom() est une fonction de regroupement de domaine qui calcule
une moyenne pour un champ d’une table à préciser dans les paramètres.
• Le premier paramètre est celui du champ NOTATION, cité entre guillemets et crochets.
• Le deuxième paramètre est celui de la table NOTE, citée entre guillemets.
• Le troisième paramètre pose la condition de calcul : l’ID de l’élève sur lequel porte le
calcul doit être celui qui correspond à la valeur prise par le contrôle Zone de liste.
• ID_ELEVE = est cité entre guillemets pour respecter la syntaxe de la fonction.
• La deuxième partie de l’équation, concaténée avec la première par le signe & n’est
pas citée entre guillemets afin qu’Access ne le prenne pas pour une valeur littérale,
mais traduise la valeur.
• La valeur du contrôle de Zone de liste est renvoyée par la formule [Formulai-
res]![Frm_Liste_Eleves]![Choix_Eleve] qui précise respectivement et séparés
Exercices
Figure 7.14
Premier message
renvoyé dans
l’exercice 1.
La macro est incorporée dans le formulaire Frm_Liste_Eleves ; elle n’est donc pas conver-
tissable en l’état en code Visual Basic. Il faut donc l’enregistrer au préalable :
1. Retournez en mode création dans la macro et cliquez sur le bouton Enregistrer Sous.
2. Renommez le libellé proposé par défaut Frm_Liste_Eleves par « Mcr_Liste_Eleves » et
cliquez « OK », puis fermez la fenêtre de la macro : à la propriété SurClic du contrôle de
Zone de liste n’apparaît plus le terme Macro incorporée, mais le terme Mcr_Liste_Eleves.
3. On remarque que la macro a été enregistrée comme telle et apparaît dans le volet de
navigation ; restez sur la propriété SurClic de la zone de liste.
4. À présent, il est possible d’accéder au bouton Convertir les macros de formulaire en
code Visual Basic dans l’onglet Outils de base de données : activez-le.
5. Acceptez la gestion d’erreurs et les commentaires, la macro est immédiatement traduite.
6. La propriété SurClic de la Zone de liste Choix_Eleve n’est plus nommée Mcr_Liste_
Eleves mais Procédure événementielle. Un clic sur le bouton aux trois points de suspension
permet un accès direct à VB.
Désormais, le code est bien implémenté sous le formulaire :
• La seule ligne de programme proprement dit contient le code MsgBox "Moyenne géné-
rale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_Liste_
Eleves!Choix_Eleve), "Fixed"), vbInformation, "RESULTATS" qui correspond très
exactement à ce qui avait été entré sous forme de macro.
• La procédure commence par les mots-clés Private Sub : le mot Private indique que la
procédure qui suit ne sera accessible que dans le module où elle est placée ; on touche
ici à la notion de portée des fonctions et procédures, applicable aussi aux variables. Le
mot Sub (auquel correspond un End Sub en fin de procédure) initialise une procédure
(en lieu et place d’une fonction).
velle boîte de message, saisie cette fois directement dans VB, et deux variables. En effet, le
programme doit demander à l’utilisateur une matière (ANGLAIS ou MATHEMATIQUES
par exemple), retrouver le numéro correspondant à cette matière, tenir compte de
l’élève sélectionné, et donner le résultat correct au moyen d’une formule qui précise la
recherche en fonction du numéro d’élève et du numéro de matière.
On déclare deux variables dans le programme nommées VARLIBMATIERE initialisée
comme une chaîne de caractères et VARNOMATIERE initialisée comme une valeur entière.
1. Au-dessus de la ligne MsgBox existante (mais après le OnError), écrivez : Dim VARLI-
BMATIERE As String. Cette ligne déclare une variable en tant que chaîne de caractères.
2. En dessous, écrivez : Dim VARNOMATIERE As Integer. Cette ligne déclare une variable
en tant que valeur entière.
3. En dessous, saisissez : VARLIBMATIERE = InputBox("Indiquez la matière recher-
chée", "Calcul de moyenne"). Cette ligne, dont la fonction InputBox() est l’équi-
valent de la fonction BEntrée() étudiée dans les macros, ouvre une boîte de message
interrogative et passe à la variable VALIBMATIERE, la valeur saisie par l’utilisateur.
4. La formule suivante, insérée ensuite, permet de retrouver le numéro de la matière
recherchée : VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_
MATIERE=' " & VARLIBMATIERE & " ' ")1. La fonction DLookup(), équivalente en
VB de la fonction RechDom(), recherche le numéro de matière correspondant à la
matière citée en toutes lettres.
5. Insérez une ligne plus bas et provisoirement une ligne MsgBox VARNOMATIERE qui nous
permettra de tester le programme arrivé à ce stade.
Au total, le programme est le suivant (provisoirement).
Private Sub Choix_Eleve_Click()
On Error GoTo Choix_Eleve_Click_Err
Dim VARLIBMATIERE As String
Dim VARNOMATIERE As Integer
VARLIBMATIERE = InputBox("Indiquez la matière recherchée",
➥"Calcul de moyenne")
VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='"
➥& VARLIBMATIERE & "'")
MsgBox VARNOMATIERE
MsgBox "Moyenne générale : " & Format(DAvg("[NOTATION]", "NOTE",
➥_ "ID_ELEVE =" & Forms!Frm_Liste_Eleves!Choix_Eleve),"Fixed"),
➥_vbInformation, "RESULTATS"
Choix_Eleve_Click_Exit:
Exit Sub
Choix_Eleve_Click_Err:
MsgBox Error$
Resume Choix_Eleve_Click_Exit
End Sub
À ce stade, testez le programme : cliquez sur un élève de la liste, une boîte message
Exercices
1. L’enchaînement des guillemets s’écrit avec la même syntaxe que celle étudiée dans le cours concernant les macros. Les apostrophes (quotes
simples américaines), destinées à faire comprendre la démarche du programmeur, doivent être remplacées par des doubles guillemets pour
faire reconnaître les chaînes de caractères contenant elles-mêmes des apostrophes.
VARPRENOM = Me.Choix_Eleve.Column(2)
MsgBox "La moyenne en " & VARLIBMATIERE & " de " & VARPRENOM & " " _
& VARNOM & " est de : " & Format(DAvg("[NOTATION]", "NOTE",
7
Chapitre
Figure 7.15
Dernier message
renvoyé dans
l’exercice 1.
• Énoncé Créez un formulaire listant les numéros, prénoms et noms des élèves. Un bouton doit y
exécuter une macro qui envoie un message électronique à chacun d’entre eux en lui indi-
quant quelle est sa moyenne. On imaginera que l’adresse internet des élèves est systéma-
tiquement de la forme <prénom>.<nom>@pearson.net. Au courrier dont le texte sera
simplement « Votre moyenne générale est de …. », on joindra le détail des notes sous
format Excel. Traduisez ensuite les macros générées en code Visual Basic.
Figure 7.16
Structure de la
première requête
de l’exercice 2.
2. Création du formulaire
Deuxième étape : construire le formulaire à la base de l’envoi des courriers électroniques.
1. Dans le volet de navigation, mettez la requête Req_EnvoiMail en surbrillance (sans
l’ouvrir).
2. Dans le menu « Créer », cliquez sur le bouton « Plusieurs éléments » (qui crée auto-
matiquement un formulaire continu).
3. Enregistrez le formulaire sous le nom « Frm_EnvoiMail ».
4. Modifiez les libellés et formats pour obtenir un résultat sensiblement voisin de la
figure 7.17.
Figure 7.17
Présentation du
formulaire de
l’exercice 2.
Figure 7.18
Structure de la
deuxième requête
de l’exercice 2.
5. Prenez le format Excel désiré dans l’argument Format de sortie, Excel 2003 ou Classeur
Excel (pour Excel 2007).
6. Dans l’argument À , écrivez la formule =[Formulaires]![Frm_EnvoiMail]![PRENOM_
ELEVE] & "." & [Formulaires]![Frm_EnvoiMail]![NOM_ELEVE] & "@pear-
son.net". Cette formule concatène le prénom, le nom et l’adresse de destination du
mail. Les références citées font allusion au premier enregistrement en cours dans le
formulaire ; il faudra plus tard réitérer l’opération pour le deuxième et ainsi de suite,
jusqu’à la fin du fichier.
7. Dans l’argument Objet, une simple mention « Vos résultats »1 suffira.
8. L’argument Texte du message peut être plus élaboré : saisissez la formule ="Bonjour,"
& Car(13) & Car(10) & "Votre moyenne générale est de " & Format(Moy-
Dom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_Envoi-
Mail]![ID_ELEVE]);"Fixe"). Dans cette formule, la détermination de la moyenne
générale est effectuée avec les mêmes paramètres (Format() et MoyDom()) que ceux
du premier exercice. On y a ajouté la formule Car(13) & Car(10) qui génère un saut
de ligne 2. La formule de politesse « Bonjour, » sera donc suivie d’un passage à la ligne
avant le libellé suivant.
9. L’argument Modifier le message, enfin, sera conservé à Oui pour vérifier la qualité des
résultats.
10. Sauvegardez cette macro sous le nom « Mcr_EnvoiMail ».
Pour commencer à tester la macro, il faut que le formulaire Frm_EnvoiMail soit ouvert
et qu’il soit positionné au début de la liste des élèves, il renverra les coordonnées du
premier élève de la liste. L’action EnvoyerObjet de la macro ouvre une session MAPI
Windows (Mail Application Program Interface) qui émule l’outil de messagerie choisi par
défaut (Outlook Express, Outlook ou autres). Le message obtenu est similaire à celui de la
figure 7.19.
Figure 7.19
Mail automatique
envoyé par Access.
Quand la macro sera fonctionnelle, il restera à prévoir le glissement d’un élève au suivant
et l’envoi en chaîne de chacun des mails.
1. Modifiez l’argument Modifier le message de l’action EnvoyerObjet dans la macro
Mcr_EnvoiMail : positionnez-le à Non afin que l’exécution se réalise en bloc 3.
2. Ajoutez une deuxième action AtteindreEnregistrement à la macro Mcr_EnvoiMail.
3. L’argument Type d’Objet est Formulaire.
4. L’argument Nom d’objet est Frm_EnvoiMail.
1. Dans la mesure où il ne s’agit pas d’une formule, le libellé ne nécessite pas de signe égal au début suivi d’une chaîne de caractères entre
guillemets.
2. L’équivalent Visual Basic de Car(13) & Car(10) est vbCrLF (Carriage Return Line Feed) que nous verrons plus loin.
3. Il est recommandé, pour cet exercice, de déconnecter provisoirement la machine de son accès Internet : il sera ainsi plus facile de supprimer
les messages restés dans la Boîte d’envoi (de toute façon, tous les messages seraient signalés avec une adresse invalide).
5.
6.
L’argument Enregistrement est Suivant.
Enregistrez les modifications et fermez cette macro.
7
Chapitre
Attention
Les tests, à partir de cet instant, portent sur les 26 enregistrements de la table et ne peuvent être
interrompus. Le plus souvent, l’envoi automatique de mails depuis Access génère dans l’outil de
messagerie une fenêtre d’alerte prévenant qu’un programme externe tente d’accéder à la messa-
gerie : il est nécessaire alors de modifier les options de la messagerie (Centre de gestion de la
confidentialité dans Outlook par exemple) afin d’autoriser les envois automatiques.
Figure 7.20
Code de la macro
d’envoi groupé.
Exercices
Figure 7.21
Code de la macro
d’envoi d’un mail.
Pour mettre en place d’une boucle de répétition des envois, deux macros ont été nécessaires.
En fait, et dans un code Visual Basic bien monté, il est plus judicieux de réunir ces deux
morceaux de code en un seul sous la tournure suivante :
Function Mcr_EnvoiGroupe()
On Error GoTo Mcr_EnvoiGroupe_Err
Dim i As Integer
For i = 1 To DCount("[ID_ELEVE]", "ELEVE")
DoCmd.SendObject acQuery, "Req_EnvoiNotes",
➥"ExcelWorkbook(*.xlsx)",
➥Forms!Frm_EnvoiMail!PRENOM_ELEVE & "." &
➥Forms!Frm_EnvoiMail!NOM_ELEVE & "@pearson.net",
➥"", "", "Vos résultats" ,
➥"Bonjour," & Chr(13) & Chr(10) & "Votre moyenne générale
➥est de " & Format(DAvg("[NOTATION]",
➥"NOTE", "ID_ELEVE =" & Forms!Frm_EnvoiMail!ID_ELEVE),
➥"Fixed"), False, ""
DoCmd.GoToRecord acForm, "Frm_EnvoiMail", acNext
Next
Mcr_EnvoiGroupe_Exit:
Exit Function
Mcr_EnvoiGroupe_Err:
MsgBox Error$
Resume Mcr_EnvoiGroupe_Exit
End Function
L’expression For i = 1 To DCount("[ID_ELEVE]", "ELEVE") démarre une boucle qui
tournera depuis la valeur 1 jusqu’au nombre total d’élèves de la table. Elle est fermée par
l’expression Next située avant la gestion d’erreurs 1. Entre ces deux lignes, la totalité du
code de la macro Mcr_EnvoiMail peut être récupérée.
1. Il n’est pas possible, ici, d’expliquer longuement le fonctionnement des boucles. Pour plus de détails, se référer aux chapitres sur VBA dans
le livre Excel 2007 du même auteur dans la même collection.
Access
205
Access Livre Page 206 Mercredi, 27. f vrier 2008 7:28 07
Figure 8.1
Requête d’insertion.
On peut ensuite sélectionner le code SQL généré et l’insérer dans un programme Visual
Basic.
3. Cliquez sur le mode d’affichage SQL de la requête et copiez son texte (Ctrl + C).
4. Accédez à Visual Basic au moyen de la combinaison des touches Alt + F11.
5. Dans la fenêtre des projets, cliquez du bouton droit sur Modules et Sélectionnez
« Insertion > module ».
6. Dans la fenêtre des propriétés (si elle n’est pas présente sélectionner Affichage > Fenê-
tre Propriétés ou F4), en bas à gauche, renommez le module Module1 par « Essais ».
7. Entrez le début de code suivant :
Sub Insertion_CodePostal()
DoCmd.RunSQL "
End Sub
1. La syntaxe INSERT INTO CODE_POSTAL ( CODE, VILLE ) VALUES ("99999","MONCLOCHER"); est également valide.
Figure 8.2
Paramétrage des
interfaces chargées
sous Visual Basic
pour Access.
Au lieu d’ouvrir un formulaire affichant les codes postaux, nous allons les charger en
mémoire et les afficher grâce à un programme que nous nous proposons d’écrire. La première
procédure s’appellera Lecture_Recordset().
1. La commande OpenRecordSet() comprend également un paramètres de mode d’ouverture du recordset qui n’a pas été précisé. Si la source
est une table non liée (présente dans la base), par défaut l’ouverture se fait en mode table ; si la source est une requête ou une table liée, par
défaut l’ouverture se fait en mode Dynaset. Il existe deux autres modes d’ouverture (SnapShot ou Instantané et ForwardOnly) qui gèrent le
curseur différemment.
La notion de curseur doit être finement appréhendée car elle est primordiale dans les jeux
d’enregistrements. A priori et en premier lieu, il est quasi indispensable d’insérer un ordre
précis dans la requête à la base d’un jeu d’enregistrements (une clause ORDER BY dans
SQL) : l’ordre des enregistrements est totalement imprévisible dans la table. Il faut donc
en prescrire un afin d’être sûr des résultats escomptés en cas de mises à jour.
Au moment de l’ouverture, le curseur se trouve en début de jeu d’enregistrements 1.
L’enregistrement lu est le premier et la commande rst.MovePrevious (aller à l’enregistre-
ment précédent) génère un message erreur. La commande MoveNext positionne le curseur
à l’enregistrement suivant, la commande MoveLast le positionne immédiatement sur le
dernier.
Ces commandes peuvent être combinées avec les propriétés BOF (Beginning Of File) et EOF
(End Of File) dont il faudra appréhender les subtilités. Lorsque le jeu d’enregistrements
est ouvert, le curseur est positionné sur le premier enregistrement, mais la propriété
rst.BOF est positionnée à FALSE (faux) ; ainsi, dans l’exemple du paragraphe précédent, si
la condition suivante est posée :
If Not rst.BOF Then
1. Mais il n’est pas inutile d’insérer une commande MoveFirst pour s’en assurer dans tous les cas de figure.
rst.MovePrevious
End If
8
Chapitre
Les méthodes FindFirst, FindLast, FindNext, FindPrevious et NoMatch sont les outils
de base des recherches dans un jeu d’enregistrements. On se propose, ici, d’afficher au fur
et à mesure les préfectures qui commencent par ST. Le programme suivant va ouvrir un
jeu d’enregistrements contenant tous les codes postaux puis balayer le recordset en s’arrêtant
chaque fois qu’une occurrence est trouvée.
Sub Recherche_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)
rst.FindFirst "CODE LIKE '*000' AND VILLE LIKE 'ST*'"
While Not rst.NoMatch
MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures commençant par ST"
rst.FindNext "CODE LIKE '*000' AND VILLE LIKE 'ST*'"
Wend
1. Ici, l’ouverture en mode Dynaset (le plus fréquent) a été précisé pour éviter une ouverture en mode table, dont la gestion de curseur est
différente.
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
On prêtera une attention particulière à la tournure de la boucle et son ordonnancement :
• Le RecordSet est ouvert et le curseur se trouve positionné au premier enregistrement.
• Une première ligne de code lance une recherche : le curseur se positionne sur le premier
enregistrement concordant (ST BRIEUC).
• La boucle démarre avec une condition de concordance (Not et NoMatch équivalent à
« Match »). La propriété NoMatch étant positionnée à FALSE, l’expression Not
Nomatch équivaut à TRUE : l’enregistrement en cours s’affiche.
• Une nouvelle recherche est lancée (FindNext).
• Et ainsi de suite jusqu’à la fin du jeu d’enregistrements.
Cette structure est rendue obligatoire par la logique : si la première ligne de code compre-
nant le FindFisrt est supprimée, l’affichage commence par celui du code 01000 de BOURG
EN BRESSE (qui ne répond pas aux critères demandés) et se poursuit par les quatre autres
(respectant les critères).
Dans cet exemple, c’est volontairement que le RecordSet initial contenait tous les enregis-
trements de la table et qu’une recherche sélective y était appliquée. Naturellement, une
autre solution consiste à ne sélectionner dans le jeu d’enregistrements que les enregis-
trements respectant les critères pour, ensuite, les afficher tous. Ci-après le code de cette
seconde formulation, utilisant la propriété EOF :
Sub Affichage_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL +
WHERE CODE LIKE '*000' AND VILLE LIKE 'ST*'")
While Not rst.EOF
MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures+ commençant
➥par ST"
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Jusqu’à présent, les enregistrements d’un RecordSet ont été simplement lus sans aucune
modification. S’il est nécessaire de modifier des données, il faut prendre en compte le fait
que les données sont chargées en mémoire vive et que les modifications ne vont toucher que
ces données en mémoire et non celles qui sont enregistrées sur le disque. Il faut donc
procéder en deux étapes : modifier les données dans le RecordSet puis appliquer ces modi-
fications aux données écrites sur le disque.
Cette problématique touche également la manière dont le jeu d’enregistrements a été
ouvert. En environnement multi-utilisateurs, il faut empêcher un utilisateur de modifier
des données déjà en cours de modification par un autre. On précisera donc le mode
d’ouverture dans l’action OpenRecordSet (paramètre que nous n’avons pas encore étudié)
en indiquant quel type de verrou (lock) est posé sur les données ; trois cas de figure sont
8
Chapitre
envisageables :
• La méthode OpenRecordSet est paramétrée avec le verrou dbReadOnly (valeur VB : 4)
et le jeu d’enregistrements n’est pas modifiable.
• L’ouverture du jeu est opérée avec le type de verrou dbPessimistic (valeur VB : 2) et tou-
tes les données de la base concernées sont verrouillées dès la commande d’ouverture
jusqu’à la commande de fermeture : aucun autre utilisateur ne peut y faire de mises à
jour. C’est l’option par défaut prise par Access si aucun paramètre n’est précisé.
• L’ouverture du jeu est opérée avec le type de verrou dbOptimistic (valeur VB : 3) et les
données concernées ne sont verrouillées que lorsque la première mise à jour (Update) a
été effectuée.
Le programme ci-après ouvre la table CODE_POSTAL en mode ReadOnly (le dernier
paramètre de la méthode OpenRecordSet est à 4), positionne le curseur au niveau du code
75001 et modifie le libellé PARIS par PARIS 1er. La mise à jour éventuelle est conditionnée
par la propriété UpDatable (possibilité de modification) du jeu d’enregistrements.
Sub Modification_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset, , 4)
rst.FindFirst "CODE = '75001' "
If rst.Updatable = True Then
rst.Edit
rst("VILLE") = "PARIS 1er"
rst.Update
Else
MsgBox "La table ne peut pas être mise à jour", , "Contrôle d’accès"
End If
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Comme le paramètre 4 de la cinquième ligne de programme n’ouvre le jeu d’enregistre-
ment qu’en lecture seule, le message erreur programmé constitue le choix logique de la
procédure. Si, en revanche, le paramètre 2 ou 3 (ou aucun) vient en remplacement, le
RecordSet est modifiable (UpDatable) et l’exécution s’opère de la manière suivante :
• la commande rst.Edit copie l’enregistrement en cours dans une mémoire tampon ;
• la ligne rst("VILLE") = "PARIS 1er" affecte la valeur Paris 1er au champ VILLE de
l’enregistrement stocké dans la mémoire tampon.
L’enregistrement sur le disque, à ce stade, n’est donc pas réalisé. C’est la commande
rst.Update de la ligne suivante qui met à jour la table.
(3) L’automation
8
Chapitre
Comme tous les produits de la gamme Office, Access comprend, via VBA, tous les outils
pour pratiquer l’automation, en d’autres termes la manipulation « à distance » d’autres
applications simultanément à Access.
Nous avons déjà étudié, dans le chapitre 3, comment importer des données Excel vers
Access et comment exporter des données Access vers Excel. Dans l’exemple qui suit, nous
allons mettre en œuvre un procédé qui démarre à distance Excel, crée un tableau, insère
des valeurs à partir d’un recordset et referme le fichier Excel. Il s’agit là d’un nouveau pro-
cédé d’exportation qui possède de nombreux avantages car il autorise tous les paramétrages
imaginables.
Avant de commencer cette partie, il est nécessaire de vérifier que la bibliothèque nécessaire
est chargée. Cliquez dans VBA sur « Outils > Références » et cochez, le cas échéant, la
bibliothèque Microsoft Excel 12.0 Object Library comme le montre la figure 8.3.
Figure 8.3
Chargement de la
bibliothèque des
objets Excel.
1. Sheets(1) désigne la première feuille du classeur qu’on aurait aussi pu appeler Sheets ("Préfectures").
xlsx = Nothing.
23. Les trois dernières lignes de programme ferment les références au RecordSet, comme
on l’a déjà vu précédemment.
Au total, le programme s’écrit donc :
Sub Echange_xlsx_accdb()
Dim prog_xlsx As Excel.Application
Dim fic_xlsx As Excel.Workbook
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL WHERE
➥CODE LIKE '*000'")
rst.MoveLast
rst.MoveFirst
fic_xlsx.SaveAs "C:\PREFECTURES.XLSX"
fic_xlsx.Close
prog_xlsx.Quit
Set prog_xlsx = Nothing
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Plusieurs commentaires ne sont pas inutiles pour achever cette approche de l’échange de
données :
• Il existe également une méthode CopyFromRecordSet qui transfère directement des
données selon une procédure sensiblement équivalente à celle qui vient d’être dévelop-
pée. Cette méthode livre « en bloc » les données, et donc de manière un peu hâtive,
alors que le procédé qui vient d’être montré a l’avantage de pouvoir supporter de
multiples paramètres.
• De la même manière que l’échange de données est possible, toutes les opérations de
pilotage à distance (formatage, mise en place de calculs, etc.) sont imaginables.
• La propriété Visible de l’application destination peut être supprimée de sorte que les
opérations se déroulent en tâche de fond et le fichier Excel se constitue à l’insu même de
l’utilisateur.
Résumé
L’utilisation de Visual Basic permet la mise au point de programmes complets, passant par
tous les systèmes d’entrées/sorties (MsgBox(), InputBox()), toutes les gestions de variables
et organisations en boucle (While…Loop, Until…Loop, For…Next) qu’un langage de
programmation fournit classiquement.
VB supporte également l’exécution de commandes SQL programmées (DoCmd.RunSQL)
et non pas seulement lancées via l’interface graphique d’Access. Les mises à jour, inser-
tions ou suppressions de données sont dès lors contrôlées et automatisées dans des procé-
dures dont le programmeur a la totale maîtrise.
Détachée des formulaires, la notion de RecordSet recouvre le chargement en mémoire vive
de données extraites des tables Access et leur manipulation avant recopie éventuelle sur le
disque. Une syntaxe particulière s’y attache, qui prévoit l’utilisation d’un curseur parcourant
les données.
Dans Access, enfin, et comme dans tout programme Office, toutes les fonctionnalités
d’automation permettent au programmeur de piloter à distance d’autres applications ins-
tallées sur la machine client. Ainsi, les échanges Excel/Access, par exemple, peuvent-ils être
gérés depuis Access en utilisant le langage objet qu’est VBA.
Problèmes et exercices
8
Chapitre
• Énoncé On se propose de créer un formulaire qui permettra aux professeurs de noter les élèves
de la base de données ECOLE_INTERNATIONALE. Dans la mesure où il y a plusieurs
matières (donc plusieurs professeurs), le programme sera installé en réseau. En consé-
quence, le formulaire ne sera basé sur aucune source de données ; la démarche de notation
sera la suivante :
• Le professeur ouvre une zone de liste déroulante et choisit sa matière.
• Une zone de liste, en dessous, s’affiche et montre la liste des élèves ayant déjà eu une
note pour cette matière (elle se réactualise à chaque choix de matière).
• Le professeur peut sélectionner un et un seul élève.
• Au moment du choix, s’affichent à l’écran une zone de texte avec la date du jour
(modifiable), une zone de texte rappelant le nom de l’élève choisi (non modifiable),
une zone de texte vide pour entrer la note, un bouton pour valider la note et un bouton
pour annuler l’opération.
Aux différences près de présentation, le formulaire doit avoir la structure de la figure 8.4
au moment de la validation d’une note.
Figure 8.4
Formulaire de
notation des élèves.
Exercices
* Solution L’exercice met en œuvre toutes les connaissances acquises sur les formulaires et y ajoute le
lancement d’une requête SQL. Les assistants seront invalidés ; on utilisera de préfé-
rence le code VBA et non pas les macros.
(présence d’un DISTINCT après le SELECT !), elle est reproduite graphiquement sur la
figure 8.5.
8
Chapitre
Figure 8.5
Requête d’affichage
unique des élèves
de l’exercice 1.
tionnez le générateur de code pour y entrer les commandes suivantes, incluses dans une
procédure nommée Form_Open :
Me.Eleve_encours.Visible = False
Me.Note_encours.Visible = False
Me.Date_encours.Visible = False
vide), ou une valeur Null, ou une chaîne de caractères (auquel cas le programme ren-
verrait un message erreur). La condition If Not IsDate() applique les mêmes règles
au champ date. La troisième vérification vise la validité de la note elle-même.
8
Chapitre
• Énoncé On considère que les élèves natifs d’un pays étranger et qui suivent un cours de langue
dans leur langue maternelle sont avantagés par rapport aux autres. Il convient donc de
créer une procédure automatique pour retirer deux points aux notes déjà données par les
professeurs ; cette procédure fait appel à la notion de RecordSet.
• S’il y a identité entre les deux ID de matières, on applique une soustraction et on écrit
la note pondérée (update).
8
Chapitre
• Le curseur du recordset des élèves étant bien positionné, le pays de celui-ci peut être
récupéré grâce à l’expression rst_eleves.Fields(1).
• La tournure conditionnelle If…ElseIf…EndIf est remplacée par l’emploi de la syntaxe
Select Case, plus adaptée. La première ligne donne une valeur à comparer après
La deuxième formulation de la réponse pourrait donc emprunter une autre voie en imagi-
nant la solution suivante :
• On charge un jeu d’enregistrements contenant tous les élèves.
• Pour chacun des élèves lus, on traduit sa nationalité en code équivalent à un ID matière
et on stocke l’ID de l’élève et son ID matière dans une variable tableau. Une variable
tableau est, comme son nom l’indique, une variable qui peut contenir plusieurs colon-
nes de valeurs pour un même indice. L’indice de cette variable sera l’ID de l’élève et la
seule colonne de la variable tableau contiendra l’ID matière.
• Ce traitement étant terminé, on a en mémoire vive tous les élèves et leurs équivalents
nationalité (avec une vitesse d’accès beaucoup plus rapide que celle d’un recordset).
On peut donc fermer le premier recordset.
• On charge un autre jeu d’enregistrements contenant toutes les notes.
• Pour chacune des notes lues, si l’ID matière du recordset correspond à celui de la
variable tableau, alors on applique une soustraction et on écrit la note pondérée
(update).
• On passe à l’enregistrement suivant du jeu de notes.
• Et ainsi de suite jusqu’à la fin du fichier des notes.
L’avantage de cette deuxième formulation tient surtout au fait que la translation entre les
nationalités alphabétiques et les ID matière numériques n’est opérée qu’une seule fois : le
temps de traitement descend à 0,54 seconde, soit quatre fois moins que dans la procédure
précédente. Le code en est le suivant :
Sub Calcul_VariableTableau()
Dim vardebut As Date
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim vartableau(99, 0) As Integer
Dim i As Integer
vardebut = Timer
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM ELEVE",
➥dbOpenDynaset)
rst.MoveFirst
While Not rst.EOF
i = rst(0).Value
Select Case rst(1).Value
Case "FR", "B"
vartableau(i, 0) = 3
Case "D"
vartableau(i, 0) = 5
Case "UK", "USA", "IR"
vartableau(i, 0) = 6
Case "I"
vartableau(i, 0) = 7
Case Else
vartableau(i, 0) = 0
End Select
rst.MoveNext
Wend
rst.Close
Set rst = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,
➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset)
rst.MoveFirst
While Not rst.EOF
If vartableau(rst(0).Value, 0) = rst(1).Value Then
rst.Edit
rst(3).Value = rst(2).Value - 2
End If
rst.Update
End If
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
Set db = Nothing
MsgBox Format(Timer - vardebut, "Fixed")
End Sub
À la quatrième ligne, la variable tableau est déclarée par la syntaxe Dim vartableau(99,
0) As Integer. Cette variable pourra contenir 100 lignes (99 lignes plus la ligne 0) et une
colonne (la colonne 0). Le programme prend l’indice de ligne pour y stocker l’ID de l’élève
et la seule colonne disponible pour y stocker l’équivalent ID matière.
Un seul RecordSet est ouvert : pendant la première partie du programme, il contient les
ID des élèves et leur nationalité. Une boucle (While Not rst.EOF) fait lire tous les enre-
gistrements ; pour chacun d’eux, la variable tableau est chargée des deux valeurs ID_
ELEVE en indice et équivalent matière en première colonne. La détermination des équiva-
lents matière est effectuée avec la syntaxe Select Case de la même manière que dans la
première solution.
Lorsque toutes les équivalences sont chargées en mémoire dans la variable tableau, le
même RecordSet est repris pour lire toutes les notes. Chaque fois que le numéro de
matière contenu dans la variable tableau coïncide avec l’ID_MATIERE du RecordSet, la
note pondérée est mise à jour.
4. Version SQL
L’énoncé de l’exercice exigeait l’activation d’un ou plusieurs jeux d’enregistrements pour
opérer la pondération des notes des élèves. C’est la raison pour laquelle les deux solutions
proposées se réfèrent à ce procédé. Il existe une troisième solution, ni plus ni moins per-
formante que la deuxième, et qui utilise uniquement SQL pour faire la même opération.
Pour la mettre en œuvre, Vous devez créer une table EQUIVALENCE, dont le contenu est
présenté à la figure 8.6. Cette table ne contient que deux colonnes, reprenant les champs
ID_MATIERE et PAYS_ELEVE, et établissant les équivalences.
Figure 8.6
Table d’équivalence
de l’exercice 2.
Exercices
Dès lors, la requête mise à jour, dont la structure graphique est présentée à la figure 8.7,
permet de faire la même opération en une seule fois. Elle est construite en sélectionnant
dans l’onglet Créer, l’icône Création de requête. Choisissez ensuite les tables NOTE,
ELEVE, EQUIVALENCE et MATIERE, puis dans le ruban, sélectionnez Mise à jour. Par
un glisser/déposer, mettez en relation le champ PAYS_ELEVE des tables ELEVE et EQUI-
VALENCE.
Dans la zone Champ de la première colonne choisissez NOTEPONDEREE de la table
NOTE. Dans la zone Mise à jour inscrivez VraiFaux([NOTATION]<2 ;0 ;[NOTA-
TION]–2).
Figure 8.7
Requête de
l’exercice 2.
Exécutée sous le code Visual Basic suivant, elle demande 0,50 seconde :
Le code SQL de cette requête est :
UPDATE ((EQUIVALENCE INNER JOIN ELEVE ON EQUIVALENCE.PAYS_
ELEVE = ELEVE.PAYS_ELEVE) INNER JOIN MATIERE ON EQUIVALENCE.ID_
MATIERE = MATIERE.ID_MATIERE) INNER JOIN [NOTE] ON (MATIERE.ID_
MATIERE = NOTE.ID_MATIERE) AND (ELEVE.ID_ELEVE = NOTE.ID_ELEVE) SET
[NOTE].NOTEPONDEREE = IIf([NOTATION]<2,0,[NOTATION]–2);
Voici le nouveau programme VB qui effectue ce traitement :
Sub Calcul_ReqSQL()
Dim vardebut As Date
vardebut = Timer
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE ((EQUIVALENCE INNER JOIN ELEVE _ ON EQUIVA-
LENCE.PAYS_ELEVE = ELEVE.PAYS_ELEVE) INNER JOIN MATIERE _ON EQUIVA-
LENCE.ID_MATIERE = MATIERE.ID_MATIERE) INNER JOIN [NOTE] _ON
(MATIERE.ID_MATIERE = NOTE.ID_MATIERE) AND (ELEVE.ID_ELEVE _ = NOTE.ID_
ELEVE) SET [NOTE].NOTEPONDEREE =If([NOTATION] <2,0,[NOTATION]-2);"
MsgBox Format(Timer - vardebut, "Fixed")
DoCmd.SetWarnings True
End Sub
• Énoncé Mettez en place un formulaire présentant la liste des élèves et leur moyenne. Lors d’un
double-clic sur l’un des items de la liste, le programme rédige, à distance, une courte let-
tre sous Word qui annonce le passage à la classe supérieure ou le redoublement suivant
que la moyenne est supérieure ou non à 10.
* Solution Il ne s’agit pas, ici, de faire un mailing à partir de Word en utilisant le fichier d’Access ; au
contraire, l’utilisation de Word est occasionnelle et ne touche qu’un seul élément ; l’utili-
sateur est positionné sur son application Access et n’accède à Word que provisoirement.
Cet exemple peut être appliqué dans un grand nombre de cas de figures.
Attention
Pour réaliser cet exercice, il est nécessaire que la bibliothèque Microsoft Word 12.0 Library soit
chargée dans Outils > Références de Visual Basic Editor. Pour réaliser le chargement de cette
nouvelle bibliothèque, procédez de la même manière que pour celle concernant Excel décrite
dans le paragraphe 3 du cours de ce même chapitre.
Figure 8.8
Requête de
l’exercice 3.
5. À la ligne de propriété Sur double-clic, cliquez sur le bouton aux trois points de sus-
pension puis Générateur de code, et entrez le code suivant :
Private Sub Choix_Eleve_DblClick(Cancel As Integer)
Dim docword As Object
Dim Civilite As String
If Me.Choix_Eleve.Column(8) = "M" Then
Civilite = "Monsieur"
Else
Civilite = "Mademoiselle"
End If
Set docword = CreateObject("Word.Application")
docword.Visible = True
docword.Documents.Add
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(8)
docword.Selection.TypeText Text:="Paris, le "
docword.Selection.TypeText Text:=CStr(Date)
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Civilite & _
" " & Me.Choix_Eleve.Column(1) & _
" " & Me.Choix_Eleve.Column(2)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(3)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(4)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(5) _
& " " & Me.Choix_Eleve.Column(6)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(7)
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(0)
docword.Selection.TypeText Text:=Civilite & ","
docword.Selection.TypeParagraph
", nous avons le regret de vous informer que vous devez redoubler"
Else
docword.Selection.TypeText Text:="Votre moyenne étant de " _
& Format(Me.Choix_Eleve.Column(9), "Fixed") & _
", nous avons le plaisir de vous accepter en classe supérieure"
End If
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:="Veuillez agréer, " & Civilite & _
", l’expression de nos salutations distinguées"
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(8)
docword.Selection.TypeText Text:="La Direction"
Set docword = Nothing
End Sub
Dans ce code, les particularités suivantes sont à souligner :
• La méthode CreateObject a été choisie ici, contrairement à l’exemple présenté dans la
partie théorique de ce chapitre qui faisait appel à la syntaxe Set prog_xlsx = New
Excel.Application. Dans la pratique, les deux tournures ont les mêmes propriétés.
• L’objet Me.Choix_Eleve.Column(numéro de colonne) est systématiquement sélec-
tionné pour récupérer dans Word toutes les coordonnées utiles. On rappelle que la
numérotation commence à 0. La colonne liée, numérotée 0 et contenant l’ID de l’élève
est masquée.
• Les syntaxes faisant allusion au document Word comportent toutes un vocabulaire spé-
cifique à Word qu’il est possible d’approfondir en utilisant les macros de Word et
l’explorateur d’objets. Elles sont toutes préfixées par l’expression docword.Selection
désignant le document en cours et piloté à distance.
Il suffit désormais de passer en mode formulaire pour voir la liste des élèves. Un double-
clic sur l’un d’entre eux génère automatiquement, sous Word, un courrier qui lui est
adressé et qui l’informe de sa note.
Exercices
application
1. Le démarrage
Lorsque tous les éléments sont réunis, tables,
d’une application .................. 236 requêtes, formulaires et états, il devient possible
2. La gestion des utilisateurs ....... 237
3. Le volet de navigation ............ 238 de monter une véritable application à destination
4. La gestion des rubans ............ 239 de futurs utilisateurs. La problématique essentielle,
dès lors, porte sur les points suivants :
l’ergonomie ;
la gestion des utilisateurs ;
la sécurité.
Les aspects ergonomiques ont déjà été largement
abordés dans le montage des formulaires. Il s’agira
donc, dans ce dernier chapitre, d’aborder la partie
concernant leur « pourtour » : le volet de naviga-
tion, la barre de menus et les rubans. La sécurité
concernera essentiellement les précautions à pren-
dre pour éviter que l’utilisateur ne puisse accéder à
certains éléments, soit pour des raisons de confi-
dentialité, soit pour des raisons de prudence.
235
Access Livre Page 236 Mercredi, 27. f vrier 2008 7:28 07
Figure 9.1
Fenêtre de
démarrage.
Paramétrer une application revient à sélectionner ou non chacune des options proposées
dans la fenêtre de démarrage. Une fois sélectionnées, ces options deviennent opérationnelles
après fermeture et ouverture de la base. Voici une description du rôle de chaque option :
• Le titre de l’application indiqué apparaîtra dans la barre supérieure (sans ne plus faire
allusion à Microsoft Access !)
• L’icône choisie pour l’application sera constamment appliquée dans les formulaires et
les barres de menu
• Le formulaire désigné dans la zone Afficher le formulaire s’ouvrira automatiquement au
démarrage. Très souvent, le formulaire choisi sera celui d’identification de l’utilisateur
(comme dans la base Northwind). Il est possible d’intercaler du code dans ce premier
formulaire pour ouvrir d’autres formulaires ou procéder à des opérations spécifiques.
• Les Options de la fenêtre Document ont une grande importance ergonomique : soit
Access ouvrira plusieurs documents avec autant d’onglets (mode Access 2007), soit les
fenêtres se superposeront (mode Access 2003).
• Les touches spéciales (Alt + F11 par exemple) doivent être désactivées si le programmeur
ne veut pas que les utilisateurs accèdent à des parties sensibles de l’application.
9
Chapitre
1. Cette fonctionnalité est elle-même supprimable au moyen de la propriété AllowBypassKey de la base grâce à Visual Basic.
2. La gestion des utilisateurs est encore utilisable pour les fichiers « .mdb » fonctionnant en mode de compatibilité sous Access 2007.
SQL Server gère parfaitement les droits des utilisateurs, table par table, fonctionnalité par
fonctionnalité.
Quant aux menus, il sera excessivement lourd de les faire varier selon la catégorie d’utili-
sateur. On se contentera, le plus souvent de code Visual Basic ou autres macros qui
bloqueront telle ou telle option si les privilèges requis ne sont pas atteints par l’utilisateur
en cours.
On mesure là l’une des limites du programme Access.
Il est envisageable de créer autant de groupes personnalisés que de besoin (maximum 10)
pour s’adapter aux utilisateurs.
9
Chapitre
À l’issue de ces manipulations, la limitation des menus prendra le dessin de la figure 9.2.
Figure 9.2
Volet de navigation
personnalisé.
Ces mises au point réalisées, l’utilisateur peut encore personnaliser « son » volet de navi-
gation. Pour empêcher une telle démarche, le passage par les macros ou la programmation
sera nécessaire. Il suffira de créer la macro Mcr_VerrouillageVolet présentée à la figure
9.3 et, le cas échéant, de la traduire en code Visual Basic (voir chapitre 7).
Figure 9.3
Macro destinée à
verrouiller le volet
de navigation.
La macro (ou le code) sera lancée avec l’application, par exemple sur l’action Sur ouverture
d’un formulaire de démarrage.
5. USysRibbons étant une table système, elle est normalement non visible : pour la faire
apparaître, dans les Options Access, cliquez sur « Base de données active > Options
de navigation et cochez la case Afficher les objets système.
9
Chapitre
Figure 9.4
Code XML inséré
dans la table
USysRibbons.
Figure 9.5
Ruban personnalisé.
Il faut donc ouvrir une nouvelle fois la base de données en gardant le doigt sur la touche
« Maj » (pour avoir le ruban complet), puis affecter le champ RibbonXml de la table
1. On prendra garde à parfaitement orthographier le fichier XML, qui est sensible à la casse (caractères minuscules et majuscules). Toute
erreur renverra un problème au démarrage.
USysRibbons avec le code XML suivant, qui pourra être saisi au préalable dans un éditeur
de texte :
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<tabs>
<tab id="tabMenuGeneral" label="Menu Général">
<group id="grpEnvois" label = "Gestion des courriers">
<button id="btnMail"
label = "Envoi mail"
size = "large"
imageMso = "CreateEmail"
screentip = "Envoi mails moyennes"
supertip = "Envoi mail groupé des moyennes"
onAction = "Mcr_Ouv_EnvoiMail" />
<button id="btnLettre"
label = "Envoi courrier"
size = "large"
imageMso = "EnvelopesAndLabelsDialog"
screentip = "Envoi lettres moyennes"
supertip = "Envoi courrier"
onAction = "Mcr_Ouv_EnvoiLettre" />
</group>
<group id="grpApplication" label = "Application">
<button idMso="FileCloseDatabase" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
La balise <group> crée des pavés dans le ruban : le premier groupe s’appelle grpEnvois et
le second grpApplication. Elle est chaque fois fermée par </group>. Chaque pavé est doté
des attributs id (nom unique) et label (étiquette).
La balise <button> crée des boutons dotés des propriétés suivantes :
• Une identité qui peut être soit personnalisée, c’est-à-dire dotée d’un attribut nommé
(id = « xxx »), soit standard et nommée idMso 1. La fermeture de la base, en bas du
code, en est un exemple.
• Un label, qui s’affichera sur le bouton.
• Une taille, qui peut être normal ou large.
• Une image 2.
• Une bulle d’aide ou screentip.
• Une sous-bulle d’aide (au texte plus long) ou supertip.
• Une propriété onAction, qui lance le code ou la macro nommée dans l’attribut.
La fermeture puis l’ouverture de la base font apparaître le nouveau ruban.
1. Les noms des idMso peuvent être retrouvés dans les options Access, page Personnaliser, en survolant les options des menus.
2. Le choix et les noms des images peuvent être connus de la manière suivante : depuis le « Download Center » de Microsoft, téléchargez
(gratuitement) le 2007 Office System Add-In: Icons Gallery. Après installation, un fichier nommé Excel Office2007IconsGallery.xlsm pourra être
ouvert sous Excel (dans le ruban Développeur d’Excel).
Il existe de nombreuses autres présentations des éléments qui peuvent apparaître dans un
ruban (séparateurs, zones de liste déroulante, menus déroulants) ; il serait trop long de les
énumérer ici.
9
Chapitre
Résumé
Par défaut, le programme Access met à disposition de l’utilisateur tous les éléments d’une
base de données : tables, formulaires et autres. Cette liberté peut être conservée dans le
cadre d’une organisation où l’utilisateur et le programmeur ne font qu’un. Dès que la base
de données est mise à disposition de plusieurs personnes, il devient indispensable de gérer
les accès à tous ces éléments. Cette nécessité naît non seulement d’impératifs d’intégrité
des données, mais également d’un besoin d’ergonomie à destination d’utilisateurs non
avertis.
Access donne la possibilité d’organiser le volet de navigation pour ne plus faire apparaître
que les éléments achevés et protégés du système tout entier, les formulaires en particulier.
D’une certaine manière, il peut donc devenir une forme de menu, à l’image de la barre
horizontale des anciennes versions.
Mais le volet de navigation n’est pas obligatoire et peut être remplacé (ou augmenté) par
une gestion complète des rubans. Dépourvu de concepteur graphique, le gestionnaire de
ruban d’Access 2007 exige l’écriture en code XML d’une arborescence d’onglets (tabs),
de pavés (groups) et de boutons (buttons). Ceux-ci peuvent employer tout ou partie des
éléments standards des menus Access.
Index
Index 245
Access Livre Page 246 Mercredi, 27. f vrier 2008 7:28 07
Index 247
Informatique
Access 2007
Microsoft®
Synthèse ®
de cours
&
exercices
et VBA
corrigés
L'auteur : Ce livre, qui porte sur la dernière version d’Access, présente toutes
Bernard Minot est professeur associé les étapes de la conception de bases de données de taille moyenne.
en informatique à l’université Paris-Est.
Il explique également comment réaliser des interfaces graphiques
Il y enseigne l’utilisation des tableurs,
l’audit informatique et la gestion des de saisie et de visualisation.
bases de données sous Oracle. Il est
également auditeur informatique dans Les premiers chapitres traitent de la modélisation des données, de
le cabinet qu’il dirige. la conception de tables grâce à l’interface graphique d’Access,
et de l’échange de données avec d’autres applications, telles
qu’Excel. Les chapitres suivants présentent les requêtes SQL,
les formulaires et les états, ainsi que les macros et la program-
Dans la même collection :
mation en langage VBA.
• Excel et VBA, B. Minot
• Le langage C, J.-M. Léry Le livre comprend de nombreux exemples et exercices dont les don-
• Le langage C++, M. Vasiliu
nées peuvent être récupérées sur le site www.pearsoneducation.fr.
• Java 5 et 6, R. Chevallier
Les exercices sont tous intégralement corrigés.
• UML 2, deuxième édition, B. Charroux et al
• Création de bases de données, Ce livre s’adresse en premier lieu aux étudiants de premier cycle,
N. Larrousse aux étudiants en IUT et en BTS. Il sera également utile aux PME
• SQL, F. Brouard, C. Soutou
désirant créer leurs propres bases de données.
• LaTeX, J.-C. Charpentier, D. Bitouzé
• Algorithmique, applications en C,
J.-M. Léry
La collection Synthex informatique propose de découvrir les
• Algorithmique en C++, J.-M. Léry
fondements théoriques et les applications pratiques des principales
• Algorithmique en Java 5, J.-M. Léry
• Mathématiques discrètes appliquées à
disciplines de science informatique. À partir d’une synthèse de
l’informatique, R. Haggarty cours rigoureuse et d’exercices aux corrigés détaillés, le lecteur,
• Architecture de l’ordinateur, E. Lazard étudiant ou professionnel, est conduit au cœur de la discipline,
• Systèmes d’exploitation, B. Lamiroy et al et acquiert une compréhension rapide et un raisonnement solide.
• Linux, J.-M. Léry
• Architecture des réseaux, D. Seret, D.
Dromard
• XML, G. Chagnon, F. Nolot
ISBN : 978-2-7440-4014-6
Pearson Education France
47 bis, rue des Vinaigriers
75010 Paris
Tél. : 01 72 74 90 00
Fax : 01 42 05 22 17
www.pearson.fr