Access 2007 Et VBA

253
Informatique Synthèse de cours exercices corrigés & Bernard MINOT Microsoft ® Access 2007 ® Les fonctionnalités pour créer des bases de données performantes Des dizaines d’exemples et d’exercices avec leurs corrigés détaillés Les fichiers sources des exercices disponibles à l’adresse www.pearson.fr et VBA collection Synthex

Transcript of Access 2007 Et VBA

Page 1: Access 2007 Et VBA

I n f o r m a t i q u e

Synthèsede cours

exercicescorrigés

&

Bernard MINOT

Microsoft®Access 2007®

Les fonctionnalités pour créer des basesde données performantes

Des dizaines d’exemples et d’exercicesavec leurs corrigés détaillés

Les fichiers sources des exercices disponibles à l’adresse www.pearson.fr

et VBA

collectionSynthex

Page 2: Access 2007 Et VBA

Informatique

&

Access

®

2007 et VBA

Bernard Minot

université Paris-Est

Avec la relecture de

Jean-Michel Léry

université Paris-Est

collection

Synthex

Synthèsede cours

exercicescorrigés

Access Livre Page I Mercredi, 27. f vrier 2008 7:28 07

Page 3: Access 2007 Et VBA

ISSN : 1768-7616

Tous droits réservés

Composition sous FrameMaker : TyPAO

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 PearsonEducation France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.

Access Livre Page II Mercredi, 27. f vrier 2008 7:28 07

Copyright© 2009 Pearson Education France

ISBN : 978-2-7440-4014-6

Page 4: Access 2007 Et VBA

Sommaire

III

Sommaire

Introduction

1

Chapitre 1 • Les objets d’Access

9

Chapitre 2 • Le modèle relationnel, concevoir une base de données

37

Chapitre 3 • Les différentes formes d’acquisition de données, importer et attacher

65

Chapitre 4 • Les requêtes

83

Chapitre 5 • Les formulaires

123

Chapitre 6 • Les états

167

Chapitre 7 • Les macros

181

Chapitre 8 • Le langage VBA sous Access

205

Chapitre 9 • La finalisation, monter une application

235

Access Livre Page III Mercredi, 27. f vrier 2008 7:28 07

Page 5: Access 2007 Et VBA

Access Livre Page IV Mercredi, 27. f vrier 2008 7:28 07

Page 6: Access 2007 Et VBA

1

Introduction

Introduction

Positionnement d’Access dans la gamme Microsoft

Le positionnement du programme Microsoft Access se révèle singulier à tous les points devue. Dans la gamme Office, en premier lieu, il est considéré comme un peu marginal,beaucoup moins utilisé que Word, Excel et Outlook, et considéré, à tort, comme beaucoupplus complexe. Parmi les produits de la firme de Bill Gates, ensuite, il n’est que le « petitfrère » de SQL Server, une base de données beaucoup plus puissante. Dans le mondedes bases de données, enfin, Access se singularise par une multiplicité des fonctionspeu commune.

Base de données ou produit intermédiaire ?

Access n’est pas qu’une base de données au sens strict du terme, mais un ensemble d’outilspermettant de gérer complètement une base de données, ce qui s’avère très différent.Au-delà des tables et de leur organisation relationnelle (fonction essentielle des bases dedonnées), Access met à disposition un outil permettant de monter des formulaires etde mettre en place une interface graphique avec l’utilisateur ; cet outil ne fait pas partie desfonctions classiques d’une base de données. De la même manière, Access possède un géné-rateur d’états qui offre au programmeur la possibilité de construire des impressions debonne qualité : deuxième exception. Enfin, et comme tous les produits de la gammeOffice, Access fait appel au langage VBA (

Visual Basic for Application

) pour la program-mation. Ces fonctionnalités ne nous permettent plus de placer Access dans la catégorie« base de données » au sens strict. Et pourtant, on ne peut pas classer Access parmi ce qu’ilest convenu d’appeler les ateliers de génie logiciel (AGL) qui offrent, par exemple, desfonctions d’aide à la modélisation plus développées. Produit intermédiaire, donc, Access

Access Livre Page 1 Mercredi, 27. f vrier 2008 7:28 07

Page 7: Access 2007 Et VBA

2

Access

®

2007 et VBA

se positionne au plus près des besoins des PME : ni trop complexe, auquel cas il seraitréservé aux professionnels de l’informatique, ni trop léger et voué alors à un écheccommercial certain.

Un premier pas vers la modélisationet la gestion de tables

Access possède toutes les qualités et toute la solidité d’une bonne base de données rela-tionnelle. Il sert très souvent comme outil de première approche aux étudiants avant qued’autres produits tels Oracle, DB2 ou SQL Server, plus abstraits et plus puissants, nefassent l’objet d’études plus approfondies. L’une des caractéristiques majeures des bases dedonnées, en effet, réside dans la nécessité de connaître quelques aspects théoriques de lamodélisation avant que la structure de la base ne soit mise en place. Le lecteur n’échapperadonc pas, évidemment, à un large chapitre sur les fondements de la théorie relationnellequi gouverne la construction de tout système d’information. On aborde là les notionsélémentaires du métier informatique qui, pris au pied de la lettre et au sens noble, est lascience du traitement de l’information. Toutes les propriétés essentielles des bases de donnéesrelationnelles, les notions de clés primaires et étrangères, l’intégrité référentielle et biend’autres encore sont opérationnelles sur Access et leur connaissance peut être extrapoléesur les autres bases du marché.

Contexte professionnel d’utilisation d’Access

Les informaticiens professionnels ont parfois sur Access une opinion mitigée, regardantavec condescendance l’une des plus petites bases de l’offre actuelle. C’est là une vision bienétroite et dépourvue du contexte dans lequel sont utilisés ces produits. Nul besoin d’êtreun spécialiste du langage SQL pour mettre en place une requête sous Access, nul besoind’embaucher des équipes entières : pour des besoins limités, dans un environnementréduit, Access suffit largement à répondre à la demande de petites entités dans des structu-res économiques à taille humaine. L’assistant à la création de requête, si la structure de labase est adéquate, répond parfaitement à ce niveau de compétence. Il génère des requêtesqui peuvent atteindre une complexité appréciable et donner, dans de courts délais, desrésultats extraits d’assez gros volumes.

Une approche intuitive grâce aux assistants

La création de formulaire est, elle aussi, accompagnée de nombreux assistants. Parexemple, il suffit de dessiner une zone de texte ou une liste déroulante pour obtenirimmédiatement sa création. Là encore, et à condition que la structure soit bien conçue,une approche intuitive peut pallier l’absence de savoir direct. En revanche, il vaudra

Access Livre Page 2 Mercredi, 27. f vrier 2008 7:28 07

Page 8: Access 2007 Et VBA

3

Introduction

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 veuts’en donner la peine, comptera ici beaucoup moins que l’efficacité dans la présentation etle traitement des données.

La programmation en Visual Basic

Le passage à la programmation, enfin, se fera graduellement, avec une escale sur lesmacros. Fondamentalement différentes de celles d’Excel, les macros d’Access sont unesimple mise en place et enregistrement sur interface graphique d’actions préprogram-mées. Elles peuvent être insérées directement dans l’ensemble des autres éléments de labase mais gagnent à être traduites en langage Visual Basic. Dès lors, le programmeurdébutant lit à la fois le déroulement des actions qu’il veut générer et le code VB qui s’yassocie. Le pied à l’étrier, il ne lui reste plus qu’un effort sémantique à faire pour accéder àla programmation proprement dite. C’est tout ce chemin qui sera parcouru dans les lignesqui viennent. Qu’il soit bien clair, toutefois, que l’ouvrage ne prétend pas faire du lecteurun programmeur en 256 pages !

Nouveautés d’Access 2007

Les nouveautés d’Access 2007 par rapport à ses versions antérieures ne sont pas négli-geables. Si les principes fondamentaux de la théorie relationnelle restent constants(comment pourrait-il en être autrement !), les changements sur la forme et le fondsont conséquents.

En premier lieu, mais l’utilisateur ne le verra pas, le moteur de base de données MicrosoftJet des versions 2003 et antérieures a été remplacé par ADE (

Access Data Engine

) ; l’une desconsé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 lesnombreuses implications visuelles que cela entraîne.

À l’image d’Excel et de Word, en effet, Access 2007 se singularise par un changementradical du haut de l’écran. Le ruban, large zone remplie d’icônes, prend la place des sous-menus que l’utilisateur connaissait depuis toujours. Avec la base de données, cette évolu-tion a une double portée, qui nécessitera des adaptations : non seulement l’utilisateurdevra s’habituer à ce nouveau cadre de travail (comme dans les autres produits Office),mais le programmeur Access, quant à lui, devra réécrire toutes les procédures de menus etsous-menus pour mettre à jour les applications déjà développées.

Access Livre Page 3 Mercredi, 27. f vrier 2008 7:28 07

Page 9: Access 2007 Et VBA

4

Access

®

2007 et VBA

Et sur ce point, les concepteurs d’applications Access ne seront pas aidés par le nouveauproduit : alors que la version 2003 était dotée d’un assistant graphique fort commodepour réaliser rapidement des menus complets, le nouvel outil, qui utilise désormais lelangage 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 labase et peut, le cas échéant, devenir une forme de menu général (en plus de la barre demenu et des rubans). L’ergonomie générale des applications développées s’en trouveradonc 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 offrela possibilité d’ouvrir simultanément de nombreux documents et de les présenter sousforme d’onglets supérieurs, un peu à la manière des onglets bas d’Excel. Le graphismegénéral a ainsi été profondément modifié, le plus souvent en mieux : les zones de date, parexemple, 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 sousExcel.

Les assistants à la création d’objets (requêtes, formulaires, états) ont été poussés à tel pointqu’un simple clic suffit désormais à une génération immédiate, sans même d’étapes deconception, 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’utilisationdu produit.

Tout au contraire, Microsoft n’insiste plus sur la mise en ligne sur Internet des projetsAccess, secteur dans lequel d’autres concurrents, notamment du monde libre avec desproduits 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 desynchroniser, 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 lesversions antérieures, limitant par là les velléités de projets inadaptés. À l’inversed’Excel, qui a multiplié par 1 000 le nombre de cellules d’une feuille, Access reste donccontraint 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 construiteune 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 parMicrosoft pour répondre aux questions du néophyte. Quels sont les éléments constituantune base de données ? Comment lie-t-on tous ces éléments entre eux ? À la découverte duvocabulaire se joint une réflexion sur la manière dont se construit un système d’infor-mation.

Access Livre Page 4 Mercredi, 27. f vrier 2008 7:28 07

Page 10: Access 2007 Et VBA

5

Introduction

Fondamentale, la modélisation couvre une bonne partie du deuxième chapitre avec demultiples exemples et un fort accent mis sur la méthode, sans pour autant tomber dansune abstraction excessive. L’expérience montre, en effet, que d’innombrables bases dedonnées sont créées dans les PME (qui constituent, rappelons-le, l’essentiel du tissuéconomique du pays) avec de nombreuses erreurs de conception qui les rendent peuexploitables. Il y a, sur ce point, de réels efforts à fournir pour pouvoir mieux stockerl’information et mieux la faire circuler.

Création et utilisation des tables, des requêtes, des formulaires et des macros formentla suite logique et l’essentiel de l’ouvrage. À chaque fois, la synthèse de cours fait appelà des exemples rapidement fournis, au détriment du discours mandarinal : suffisam-ment simples, ils visent directement le thème du cours sur un mode démonstratif ;suffisamment volumineux, ils montrent en grandeur nature la problématique rencontrée enentreprise.

Reprenant l’objectif ouvertement affiché par Access de RAD (

Rapid Application Develop-ment

), l’exposé est conçu pour permettre des mises au point rapides sur des solutions« légères ». L’informaticien professionnel n’y trouvera donc pas son compte de… com-plexité. On préférera passer plus de temps à réfléchir sur le papier dans le cadre d’unéchange utilisateur/concepteur sur les éléments de base (tables, relations, maquettesd’écrans et d’états), et moins de temps sur le clavier et la souris.

Le chapitre entièrement consacré à VBA se base, initialement, sur la conversion automati-que des macros. Considérant que le lecteur a déjà, au moins, une petite expérience desautres produits de la gamme Office, il aborde le sujet comme si la même approche a déjàété pratiquée avec Excel, par exemple. Cela permet de découvrir des sujets peu étudiésdans les courts ouvrages publiés en la matière, mais qui ouvrent des voies très larges pourdes projets plus ambitieux.

Le dernier chapitre, enfin, décrit rapidement la démarche à adopter pour mettre en placeune application : les changements dans la nouvelle version d’Access n’épargneront doncpas un détour par XML.

Tous les chapitres sont divisés en deux parties à parts égales, les exercices et leur correctionprenant donc une proportion considérable. Chaque exercice reprend une partie du courset l’applique dans un contexte différent, mais de nouvelles manières de procéder sont éga-lement introduites. L’ensemble des exercices porte sur une même base de données mise àdisposition sur le site des éditions Pearson :

www.pearsoneducation.fr

.

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’agitpas d’une encyclopédie inventoriant l’exhaustivité des possibilités offertes : il faudraitpour cela un ouvrage beaucoup plus volumineux, que d’autres ont déjà fait, qui servirait plusde 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 moinsimportants : 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.

Access Livre Page 5 Mercredi, 27. f vrier 2008 7:28 07

Page 11: Access 2007 Et VBA

6

Access

®

2007 et VBA

Dans la partie relative à la programmation en langage Visual Basic, il nous a paru plusimportant d’insister sur l’utilisation du langage SQL

via

VBA et sur la notion de jeud’enregistrements qui ouvre la voie à de nombreux programmes, plutôt que sur la partieboucles ou gestion des entrées/sorties.

À qui s’adresse ce livre

Au premier chef, les étudiants de tous niveaux trouveront ici les bases nécessaires pourdémarrer d’un bon pied la conception et la création d’un petit système d’information. Lapartie relative à la modélisation leur permettra d’éviter les pièges les plus répandus et celleportant sur VBA confortera leur initiation à la programmation. Le reste de l’ouvrage leurdonnera un large panorama des fonctionnalités du produit.

De nombreux professionnels liront aussi ces lignes avec intérêt, et en particulier :

• ceux qui pratiquent déjà Access et profitent de la version 2007 pour approfondir leursconnaissances ;

• ceux qui pratiquent déjà Access et ressentent le besoin d’un appui pour passer à la nouvelleversion, 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 petitesbases de données dans le cadre de leur métier de gestionnaire, dans la plus large acceptiondu terme.

Les suppléments

Les fichiers des exercices et des exemples, au format source « .accdb », sont téléchargeablessur le site de l’éditeur, à l’adresse

www.pearsoneducation.fr

. Le lecteur pourra les mettreen œuvre pour son apprentissage, mais aussi les compléter et se constituer ainsi sa proprebase 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

, ildirige é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’auditinformatique.

Access Livre Page 6 Mercredi, 27. f vrier 2008 7:28 07

Page 12: Access 2007 Et VBA

7

Introduction

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 constantecomplicité.

Access Livre Page 7 Mercredi, 27. f vrier 2008 7:28 07

Page 13: Access 2007 Et VBA

Access Livre Page 8 Mercredi, 27. f vrier 2008 7:28 07

Page 14: Access 2007 Et VBA

9

1

Les objets d’Access

En vue de simplifier la terminologie, on parle géné-riquement de la « base de données Access » pour désigner l’ensemble du logiciel. En fait, Access n’est pas qu’une simple base de données, mais plus exactement un ensemble d’objets beaucoup plus large et dont le cœur est constitué par une base de données. Ce premier chapitre commence par décrire sommairement l’ensemble des objets contenus dans la base, puis aborde l’utilisation du produit en se limitant à la gestion d’une base exis-tante. Il existe, en effet, deux manières d’utiliser le produit : soit manipuler les données contenues dans des objets existants (le contenu), soit créer et modifier la structure elle-même, les objets de la base (le contenant).

1. Les éléments essentiels de la base............................... 10

Problèmes et exercices

1. Créer un client et une commande .................... 25

2. Pratiquer un réassort................ 28

3. Analyser les processus et les états ............................... 31

4. Analyser les données ............... 33

5. Retoucher un formulaire en mode création .................... 35

Chapitre

Access Livre Page 9 Mercredi, 27. f vrier 2008 7:28 07

Page 15: Access 2007 Et VBA

10

Access

®

2007 et VBA

(1)

Les éléments essentiels de la base

Quelle que soit la manière d’aborder la base de données, il est indispensable, en premierlieu, d’identifier chacun des objets qu’elle contient afin d’accéder rapidement à l’outilvoulu. En vue d’énumérer et d’exposer brièvement la nature de chacun d’entre eux, labase exemple de Microsoft « Northwind » est employée ici après avoir été mise en place.

Pour ce faire, démarrez Access (Démarrer > Tous les programmes > Micro-soft Office > Microsoft Office Access 2007). La grille-écran représentée à la figure 1.1apparaît.

• 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 contiendraulté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écemmentutilisées.

La base de données à sélectionner se trouve sous le libellé « Exemple » de la partie de gauchede 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 pardéfaut et cliquer sur Connexion.

Figure 1.1

Démarrage d’Access.

1.

Dans une configuration Microsoft Vista, le fichier est inséré sous C:\Users\

Nom_Utilisateur

\Documents ; dans une configurationMicrosoft XP, il sera sous C:\Documents and Settings\

Nom_Utilisateur

\Mes documents.

Access Livre Page 10 Mercredi, 27. f vrier 2008 7:28 07

Page 16: Access 2007 Et VBA

11

Les objets d’Access

1

Chapitre

L’accueil dans la base de données se visualise comme à la figure 1.2.

1.1 L

A

BARRE

D

OUTILS

D

ACCÈS

RAPIDE

ET

LE

BOUTON

O

FFICE

Comme pour l’ensemble de la gamme Office, la présentation de la partie supérieure del’écran a largement évolué entre la gamme des produits Excel, Word et Access de 2003 etcelle de 2007.

La barre bleue supérieure s’appelle désormais une barre d’outils d’accès rapide et com-porte en standard les raccourcis les plus utilisés : Enregistrer, Annuler ou Répéter Frappe,Imprimer ou Faire un aperçu avant impression. Il est possible d’ajouter à cette barre tousles autres raccourcis de l’application Access.

Chaque option de la barre de menu (Accueil – Créer – Données Externes – Outils de basede Données) ne comporte plus de sous-menus comme dans les versions antérieures, maisouvre ce qu’on appelle un « ruban » dans lequel on trouvera de très nombreuses icônes.Chaque ruban est composé de groupes d’icônes, tel que « Affichages – Presse-papier, etc. »contenant chacun les icônes elles-mêmes.

On lira dans le dernier chapitre comment personnaliser les rubans, soit en les augmentantavec des boutons personnalisés, soit en créant soi-même des menus et rubans complète-ment nouveaux. Avant toute personnalisation, l’exhaustivité des commandes disponiblesest regroupée dans les quatre options du menu général

1

.

Le bouton « Office », en haut à gauche, remplace en partie le menu « Fichier » des appli-cations antérieures. Outre les items classiques « Ouvrir – Fermer – Enregistrer – Quitter », ilcontient les options d’impression, de gestion des propriétés, d’ouverture des fichiersrécents et surtout l’accès aux options d’Access, particulièrement importantes.

Figure 1.2

Principaux éléments de l’organisation d’Access.

1.

Il n’existe pas, comme dans Word ou Excel, d’option de menu supplémentaire et spécifique « Développeur ».

Barre demenu Ruban

Barre d’outilsd’accès rapide

Volet de navigation Formulaire d’accueil

Access Livre Page 11 Mercredi, 27. f vrier 2008 7:28 07

Page 17: Access 2007 Et VBA

12

Access

®

2007 et VBA

1.2 L

E

VOLET

DE

NAVIGATION

La partie gauche de l’écran intègre un volet de navigation qui contient et représente tousles objets de la base, qu’ils soient préexistants ou créés par l’utilisateur. La nature mêmedes objets n’est pas toujours indiquée, la seule distinction étant désormais établie par lelogo de l’objet. Fondamentalement, on retiendra donc les grandes classes suivantes,comme elles se présentent à la figure 1.3.

• 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éesrelationnelle.

• Les requêtes mémorisent des instructions d’interrogation des tables. On parlera dansd’autres bases de données de « Vues ». Une requête peut être lancée à tout momentpour 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 untableur), 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 permettoutes 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 actionsprésélectionnées. Elles peuvent être lancées directement ou bien à partir de boutonscréés dans des formulaires.

• Les modules sont des containers de code Visual Basic. Ils peuvent être écrits directementou 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 lefaire disparaître ; il sera possible de le faire réapparaître à tout moment.

Figure 1.3

Types et logos des objets Access.

Access Livre Page 12 Mercredi, 27. f vrier 2008 7:28 07

Page 18: Access 2007 Et VBA

13

Les objets d’Access

1

Chapitre

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 deconstruire une sorte de menu en utilisant cette partie de l’écran et non plus la barre de menussupé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 afficherles objets voulus. En dessous, « Clients et commandes », « Inventaires et achats » sont degrandes rubriques contenant elles-mêmes les objets Access. Ainsi, l’objet « Les dix premièrescommandes » compris dans la rubrique « Clients et commandes » est une requête, alorsque l’objet immédiatement en dessous est un formulaire. Un double-clic sur l’un de cesobjets 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 classesd’objets Access vues plus haut.

3. Développez les tables en cliquant sur le double chevron tourné vers le bas : vous listezla totalité des tables contenues dans la base (voir figure 1.4).

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 deuxmanières :

• soit en qualité de simple utilisateur grâce aux menus de gauche tels qu’ils ont été conçuspar le programmeur ;

1. Et plus précisément une « catégorie » du volet de navigation comme on le verra plus loin.

Figure 1.4

Visualisation des seules tables dans le volet de navigation.

Access Livre Page 13 Mercredi, 27. f vrier 2008 7:28 07

Page 19: Access 2007 Et VBA

14

Access

®

2007 et VBA

• soit en qualité de développeur, en affichant tous les objets, même ceux qui ne sont pasinclus 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 etformulaires liés par exemple) et d’autres critères encore. Il est inutile, au moins dans unpremier temps, de multiplier les affichages sous peine de se disperser dans différentes voiesd’accès aux objets.

Un clic droit sur la catégorie « Les Comptoirs », en haut à gauche, ouvre une fenêtredé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 denavigation. Les recherches se feront par mot-clé, l’établissement de la liste résultante seréalisant au fur et à mesure de la saisie.

1.3 L

A FENÊTRE PRINCIPALE D’AFFICHAGE

En ouvrant la base de données Northwind, un formulaire d’accueil apparaît automatique-ment dans la fenêtre principale. Il a été conçu pour être le plus ergonomique possible ;avec les menus présentés dans le volet de navigation, il constitue l’environnement généralde l’utilisateur final.

Le fait qu’il s’agisse d’un formulaire est attesté par la présence du logo contenu dansl’onglet supérieur : ce formulaire a pour nom « Interne ». Il se ferme en cliquant sur lacroix placée au même niveau à droite de l’écran ; la fenêtre principale se vide mais il estpossible de retrouver ce formulaire en parcourant les objets dans le volet de navigation eten faisant un double-clic sur l’objet « Interne ».

1. Faites un double-clic dans le volet de navigation sur « Les dix premières commandes »,un deuxième onglet apparaît à droite de « Interne » et vient recouvrir le contenu dumenu d’accueil.

2. Faites un double-clic sur « Liste commandes » : un troisième onglet se surajoute.

3. Faites un double-clic sur « Détail commande » : cette fois une fenêtre s’ouvre au-dessusde l’ensemble, sans incrustation dans la fenêtre des onglets. Il s’agit dans ce cas d’unefenêtre « indépendante ».

4. Fermez la fenêtre « Détail commande » en cliquant sur la croix supérieure droite.

5. Fermez tous les onglets successivement, chacun avec sa croix de fermeture.

Tous ces effets visuels ont été préparés par le programmeur et s’inscrivent dans unedémarche logique d’enchaînement des tâches.

Manipulation d’un formulaire de visualisationFaites un double-clic sur le formulaire « Liste commande ». Si l’on essaie d’effectuer unemodification dans les données qui s’affichent, toute opération sera systématiquementrejetée : les données sont fixes et le formulaire ne s’ouvre qu’en mode visualisation. Seulesles deux actions « Ajouter une nouvelle commande » ou « Afficher la facture », en haut,permettent une interactivité.

Access Livre Page 14 Mercredi, 27. f vrier 2008 7:28 07

Page 20: Access 2007 Et VBA

15Les objets d’Access

1Chapitre

En bas à gauche de l’écran apparaissent les « boutons de déplacement » qui permettent denaviguer rapidement parmi les lignes (ou enregistrements) de la liste résultant d’unerequête. Le libellé « 1 sur 49 » indique que l’utilisateur pointe à ce moment sur le premierenregistrement d’une série de 49. Il est plus rapide d’employer les boutons de déplacementque les flèches directionnelles du clavier. Ces boutons permettent respectivement, et degauche à 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ésentantspré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 programmeurpour simplifier ou guider la tâche de l’utilisateur. Nous apprendrons à les créer dans lesprochains chapitres.

En haut de chaque colonne, chaque nom de champ s’accompagne d’un petit triangle à sadroite, dont l’ouverture donne la possibilité de trier et filtrer la liste suivant de nombreuxcritères (voir figure 1.5).

• Les deux premières lignes proposent de trier par ordre alphabétique : Access sait que lacolonne 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.

Figure 1.5Tris et filtres sur une liste de formulaire.

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 enregistrementscorrespondant aux critères préétablis.

Access Livre Page 15 Mercredi, 27. f vrier 2008 7:28 07

Page 21: Access 2007 Et VBA

16 Access® 2007 et VBA

• Le dernier encart, plus bas, énumère des cases à cocher correspondant aux occurrencestrouvées dans la colonne. Le fait de décocher l’une de ces cases provoque la disparitionde la liste des items cités.

Cette présentation des tris et filtres est exactement similaire à celle des autres produits dela gamme Office 2007. Elle s’adapte à la nature de chaque colonne visée : un clic sur letriangle voisin du champ Date d’expédition propose des critères de filtre très raffinés surla base de dates, alors que celui portant sur les colonnes de chiffres de droite ne sélectionneque des filtres numériques.

Enfin, nous pouvons remarquer que le bouton « Afficher la facture » est un boutoncontextuel qui affiche la facture correspondant exactement à la ligne de commande activeau moment du clic. Là encore, il s’agit d’un mécanisme créé de toutes pièces par leprogrammeur.

Manipulation d’une requête de visualisationAprès avoir fermé le formulaire « Liste des commandes », faites un double-clic dans levolet de navigation sur la première option « Les dix premières commandes » pour ouvrirla requête correspondante.

Comme dans le premier cas de figure, la requête est paramétrée pour ne permettre que lavisualisation et non pas la modification. L’effet graphique obtenu est moins raffiné quedans un formulaire : il ne s’agit que d’un affichage en mode Feuille de Données, en touspoints comparable à un tableau Excel. Le raccourci clavier Ctrl + A, ou un clic droit dansle coin supérieur gauche du tableau, puis un « Coller » permettent de placer l’ensembledes données dans le presse-papiers. Un simple « Coller » dans une feuille Excel nouvelle(ou Word, ou toute autre application graphique) reportera les données copiées dans lenouveau document.

Toutes les commandes de tris et de filtres s’emploient de la même manière qu’avec unformulaire.

Dans le cas précis du formulaire « Les dix premières commandes », le programmeur a crééune requête spécifique qui n’affiche que les dix plus importantes commandes enregistréesdans la base. Il n’est pas possible d’afficher toutes les commandes par cette option. Si cebesoin est impératif, l’utilisateur peut ouvrir une autre requête, plus bas, nommée « Com-mande de produits », qui montre toutes les commandes. À ceci près que, dans ce derniertableau, les commandes se décomposent en lignes éparses (une commande, numérotéecomme telle, comporte plusieurs lignes de commandes) ; de plus, pour chacune des ligneséditées, il n’est indiqué que le prix unitaire et la quantité de produits commandés, non lemontant de la ligne (sa multiplication d’une quantité par un prix). Cette décompositionprovient du caractère relationnel de la base de données sur lequel nous reviendronslonguement.

Manipulation d’un étatDans le volet de navigation, plus bas, il existe un état nommé « Les dix commandes lesplus importantes », correspondant très exactement à la requête évoquée au paragrapheprécédent. Le résultat renvoyé est naturellement le même au plan des données mais trèsdifférent quant à la présentation, beaucoup plus soignée.

1. Cliquez sur le bouton « Office ».

Access Livre Page 16 Mercredi, 27. f vrier 2008 7:28 07

Page 22: Access 2007 Et VBA

17Les objets d’Access

1Chapitre

2. Cliquez sur « Imprimer ».

3. Choisissez « Aperçu avant impression1 ».

Le rendu visuel de l’état permet une impression soignée.

Manipulation directe d’une tableL’ouverture des objets cités plus haut, requêtes, formulaires et états, a été prévue et para-métrée par le programmeur ; elle ne risque donc en aucune manière d’endommager labase de données. De la même manière, il existe des options écrites par le développeur, quenous verrons plus loin, permettant de créer de nouveaux clients, de nouvelles commandeset de nouvelles factures ; en revanche, il ne doit pas être possible, dans une applicationbien écrite, de revenir sur des données déjà entrées. Si le programme Northwind était par-faitement « bouclé », il serait impossible à l’utilisateur de faire les manipulations que nousallons maintenant mettre en œuvre pour découvrir l’univers des bases de données.

1. Dans le volet de navigation, ouvrez les « Catégories » et choisissez « Types d’objet » : laliste fait apparaître les classes d’objets.

2. Développez, le cas échéant, la classe « Tables » (doubles chevrons vers le bas).

3. Double-cliquez sur « Clients ».

La table des clients apparaît telle qu’à la figure 1.6 ; on peut l’élargir en masquant le voletde navigation (doubles chevrons vers la gauche).

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, maisil ne s’agit que d’un artifice dû au fait que les clients ont été entrés dans la base dansl’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 ».

Figure 1.6Table des clients.

Access Livre Page 17 Mercredi, 27. f vrier 2008 7:28 07

Page 23: Access 2007 Et VBA

18 Access® 2007 et VBA

• À l’ouverture, le curseur se positionne sur la cellule la plus en haut à droite : les flèchesdirectionnelles ou le taquet de tabulation du clavier permettent de naviguer dans leschamps 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 latable des clients et celles des commandes : à un client donné correspond 0 ou plusieurscommandes. 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 signemoins rétablit l’affichage d’origine.

Presque toutes les zones de cette table sont modifiables directement, avec tous les dangersque de telles manipulations entraînent. Seule la première colonne de la table, contenant lenumé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 autresocié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 quedeux 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éfinitivementprises en compte que lorsque l’utilisateur passe sur un autre enregistrement ou ferme latable ; 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 pasatteint. 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 lesnuméros de téléphone affichés ont le format international standard, mais il est possiblede 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 tablesource.

• Contrairement à Excel, ou d’autres programmes bureautiques, les modificationsapportées dans les données sont définitivement enregistrées sur le disque dur : il n’estpas 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èredotée de « trombones » et d’un type tout nouveau dans Access 2007. Un double clic surl’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 commesa photo ou le document Word contenant le contrat signé.

Manipulation directe d’une requêteComme on l’a vu, les requêtes mémorisent des interrogations faites aux tables ; plus préci-sément, elles permettent non seulement de faire appel aux données contenues dans lestables, mais aussi de modifier les données source à travers le masque de saisie qu’ellesconstituent dans le même temps.

Access Livre Page 18 Mercredi, 27. f vrier 2008 7:28 07

Page 24: Access 2007 Et VBA

19Les objets d’Access

1Chapitre

1. Dans le volet de navigation, développez la classe « Requêtes ».

2. Double-cliquez sur la première requête nommée « Achats de produits ».

La liste des données qui s’affiche reprend, de manière non exhaustive, des informationsissues 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, larequê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 enmettant en place des méthodes contrôlées d’accès aux données.

Manipulation directe d’un formulaireDans la base Northwind et dans le cadre de son exploitation par des utilisateurs, lesformulaires s’ouvrent normalement à l’occasion d’un clic sur un bouton créé par le pro-grammeur. Souvent, cette ouverture correspond à une démarche bien précise : l’utilisa-teur, par exemple, consulte d’abord la liste générale des clients puis clique sur un boutonpour consulter le détail des commandes en cours émises par celui-ci.

On peut également ouvrir un formulaire en dehors de ce contexte, pour sa mise au pointpar le développeur, par exemple.

1. Dans le volet de navigation, développez la classe « Formulaires ».

2. Faites un double-clic sur le deuxième formulaire nommé « Boîte de dialogue Étatsventes ».

Comme son nom l’indique, ce formulaire n’est pas destiné à afficher des données stockéesdans la base, mais à servir de boîte de dialogue pour que l’utilisateur choisisse des optionsd’édition (voir figure 1.7).

Figure 1.7Formulaire de dialogue.

Access Livre Page 19 Mercredi, 27. f vrier 2008 7:28 07

Page 25: Access 2007 Et VBA

20 Access® 2007 et VBA

Un clic sur le bouton « Imprimer » ou « Aperçu » permet le lancement de procéduresd’impression commandées via une macro ou du code Visual Basic. L’utilisateur doit préa-lablement choisir un type d’état et sa périodicité, qui deviendront autant de paramètres àl’édition.

Il est également possible d’ouvrir directement des formulaires qui ciblent des tables ou desrequêtes de la base. Dans le cas présent, nous ouvrons le formulaire destiné à modifierles clients ou à en créer de nouveaux.

1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ».

2. Double-cliquez sur le formulaire « Détail du client ».

La fenêtre qui apparaît affiche les coordonnées du premier client de la base (voir figure 1.8).

Ici, Access ne liste pas l’ensemble des clients (formulaire dit continu), mais présente lesclients les uns après les autres (formulaire dit unique). Les boutons de déplacement, enbas, permettent non seulement de faire défiler les clients, mais aussi, à droite, d’accéderdirectement à la création d’un nouveau client. Le programmeur a également prévu desboutons « 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 lamême grille-écran.

La saisie des données est régie par des règles identiques à celles qui sont applicables dansles 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 signearobase (@).

Figure 1.8Formulaire d’accès aux données.

Access Livre Page 20 Mercredi, 27. f vrier 2008 7:28 07

Page 26: Access 2007 Et VBA

21Les objets d’Access

1Chapitre

1.4 LA BARRE DE MENUS ET LES RUBANS

Dans la base Northwind, le programmeur a laissé à l’utilisateur le loisir d’accéder à labarre de menu, laquelle peut avoir été masquée par l’option de la barre d’outils d’accèsrapide « Réduire le ruban ». Le cas échéant donc, rétablissez-la en cliquant sur le petittriangle à droite des raccourcis de la barre supérieure et en décochant « Réduire leruban ».

La barre de menu d’Access 2007 ne comporte qu’un petit nombre d’options (quatreen standard) qui font apparaître chacune un ruban différent, particulièrement riche enicônes.

• Le menu « Accueil » regroupe les fonctions principales d’édition (polices de carac-tères par exemple), de traitement des listes (tris et filtres) et de recherche. Onnotera, à gauche, un bouton destiné au mode d’affichage qui sera traité dans leparagraphe suivant.

• Le menu « Créer » comprend les icônes de création de tous les objets de la base.

• Le menu « Données externes » inclut la mise en place de toutes les formes de liaisonsavec toutes les sources de données qu’Access peut établir.

• Le menu « Outils de base de données », enfin, permet l’ouverture de Visual Basic et gèreles « utilitaires » comme la documentation de la base ou l’établissement des relationsentre les tables, par exemple.

D’une manière générale, la manipulation du clic droit sur les objets ou éléments à modi-fier permet, tout comme les icônes, d’accéder à la majeure partie des actions possibles.On choisira donc très souvent le clic droit au détriment des options du menu.

1.5 LES MODES D’AFFICHAGE DES OBJETS D’ACCESS

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. Endouble-cliquant sur un objet, quel qu’il soit, on accède aux objets dans ce mode. Pour leprogrammeur qui dessine les objets (tables, requêtes et autres formulaires), l’affichagepropre à la mise en œuvre doit se faire en mode création. Au cours des manipulations quisuivent, nous passerons alternativement du mode formulaire au mode création, pour endé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 » (notezque dans le ruban du menu « Accueil », l’icône Affichage de droite est grisée et ne peutpas être sélectionnée).

3. Dans la fenêtre contextuelle qui s’ouvre, cliquez sur « Mode création ».

Access Livre Page 21 Mercredi, 27. f vrier 2008 7:28 07

Page 27: Access 2007 Et VBA

22 Access® 2007 et VBA

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 duformulaire (voir figure 1.9).

Chaque carré, chaque bouton présent dans l’objet formule se nomme contrôle. Ils sontmodifiables 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 del’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 programmeurne 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 modeformulaire, le mode tableau croisé dynamique, et d’autres encore.

Vous pouvez constater encore cette distinction fondamentale entre les deux modesd’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.9Exemple de formulaire ouvert en mode création.

Access Livre Page 22 Mercredi, 27. f vrier 2008 7:28 07

Page 28: Access 2007 Et VBA

23Les objets d’Access

1Chapitre

La table « Clients » s’ouvre avec l’apparence de la figure 1.10.

1.6 CONVERSION DES FICHIERS ACCESS DES VERSIONS ANTÉRIEURES

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 dedonné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 enmode compatibilité ; en revanche, une base de données accdb ne peut pas s’ouvrir avecAccess 2003. Il sera préférable, dès que possible, de transformer les anciennes bases aunouveau 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 souhaitezré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 Windowscrée provisoirement un autre fichier, suffixé « .laccdb », destiné à contrôler le partage de labase. Au moment où tous les utilisateurs simultanés d’une base ferment l’application, lesystème supprime automatiquement ce fichier « laccdb ».

Figure 1.10Exemple de table ouverte en mode création.

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 ».

Access Livre Page 23 Mercredi, 27. f vrier 2008 7:28 07

Page 29: Access 2007 Et VBA

24 Access® 2007 et VBA

RésuméLe programme Access génère une base de données, mais aussi un ensemble d’outilspermettant 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 entant 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 normalpour les utilisateurs.

Access Livre Page 24 Mercredi, 27. f vrier 2008 7:28 07

Page 30: Access 2007 Et VBA

25Les objets d’Access

Exercice

s

1Chapitre

Problèmes et exercicesCes premiers exercices ont pour objectif de familiariser le lecteur avec l’environnementd’Access en mode utilisateur final. On insistera sur l’effet des choix du programmeur surle déroulement des actes de l’utilisateur : cette démarche ouvrira la voie aux développementsdes 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 estné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 del’application (tables), d’une part, et les processus modifiant ou augmentant les donnéesstockées, d’autre part. Cette division, toute théorique, est à la base d’une analyse solide del’objet global à concevoir et à mettre en œuvre.

EXERCICE 1 CRÉER UN CLIENT ET UNE COMMANDE

• * Solution 1. Création d’un nouveau client

1. Fermez la base Northwind et ouvrez-la à nouveau pour vous assurer de votre qualitéd’utilisateur (et non de concepteur). Dans le volet de navigation, retournez à lacatégorie « Les Comptoirs » afin de visionner les formulaires et états créés par leconcepteur.

Logiquement, la création d’un nouveau client passe par l’option « Liste des clients » duvolet de navigation : l’utilisateur doit d’abord consulter cette liste afin de vérifier que leclient n’existe pas.

2. Double cliquez sur « Liste des clients » dans le volet de navigation et déroulez la listedes clients déjà existants. Au besoin, vous pourrez cliquer en bas d’écran sur la zone« Rechercher » pour retrouver toute occurrence similaire1.

3. Dans la barre grise supérieure du formulaire, cliquez sur le bouton « Nouveau client ».

• É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é auchoix).

2. Puis, créez une commande sur la base de produits déjà existants et en stock. Vérifiezvotre 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.

Access Livre Page 25 Mercredi, 27. f vrier 2008 7:28 07

Page 31: Access 2007 Et VBA

26 Access® 2007 et VBA

4. Remplissez correctement les zones (ou contrôles) du formulaire pour obtenir unrésultat satisfaisant, à l’image de la figure 1.11.

Le bouton « Enregistrer et nouveau », en haut à droite, permet d’enchaîner la création denouveaux clients. Le bouton « Fermer », tout à fait à droite, suffit pour :

• valider la saisie (donc valider le nouvel enregistrement dans la table « Clients ») ;

• fermer le formulaire.

Immédiatement, le nouveau client apparaît dans la liste des clients. On remarquera que lesnuméros de téléphone saisis à l’image de ceux de la figure 1.11 ne sont pas listés comme lesautres, dotés des préfixes internationaux. On peut en conclure que le concepteur n’a pasmis en place de masque de saisie en vue de formater correctement ces numéros : icicommence l’audit de la conception du programme.

Un clic sur le numéro identificateur du client, en bleu à gauche, permet de réviser la fichedu client et, le cas échéant, de la mettre à jour.

2. Création d’une commande et facturation

De la même manière que l’insertion d’un nouveau client passait par la liste des clients, unenouvelle commande passe par la liste des commandes.

1. Dans le volet de navigation, double-cliquez sur « Liste des commandes » (il est possiblemais non indispensable de fermer la liste des clients).

2. Cliquez dans la barre supérieure grise sur « Ajouter une nouvelle commande » :l’encart supérieur affiche le libellé « Commande n˚ (Nouveau) », sans indiquer encorede numéro précis. L’incrémentation du nouveau numéro se réalisera lorsque laditecommande sera validée et seulement à ce moment.

Figure 1.11Remplissage du formulaire de création d’un nouveau client.

Access Livre Page 26 Mercredi, 27. f vrier 2008 7:28 07

Page 32: Access 2007 Et VBA

27Les objets d’Access

Exercice

s

1Chapitre

3. Ouvrez la liste déroulante des clients en haut à gauche et choisissez le nouveau clientcréé. Les onglets qui apparaissent à ce moment permettent de commencer la saisie dela commande.

4. Dans l’onglet « Détail commande » et la zone de liste déroulante « Produit », choisis-sez le produit « Olive Oil » ; l’huile d’olive a été choisie dans ce premier exemple car ilen existe en stock. Le prix unitaire, enregistré dans la base, s’affiche automatiquement ;saisissez la quantité 2.

5. Cliquez sur le bouton « Ordre d’expédition ». Il semble naturel, puisque le produit esten stock, d’expédier maintenant la marchandise. Or, une boîte de message apparaît,qui prévient l’utilisateur que le produit ne peut pas être envoyé sans avoir été facturéau préalable. On voit, par cet exemple, que le programmeur a conçu le logiciel dans lerespect des choix de procédures jugés indispensables par les commanditaires.

6. Cliquez sur le bouton « Créer une facture » : une deuxième boîte de message refuse devalider la facture sans avoir saisi tous les renseignements nécessaires.

7. En parcourant les trois onglets du bon de commande, saisissez un transporteur, unedate de livraison, un type et une date de paiement. Vérifiez que tous les champs sontremplis (l’adresse de livraison en particulier) pour ne plus générer de messaged’erreur. Dans le cas présent, on peut estimer que les contrôles de saisie sont un peuexcessifs (la zone du département, par exemple, est obligatoire alors qu’il en existe uneautre pour le code postal).

8. Lorsque la saisie est valide, le programme affiche la facture sous forme d’aperçu avantimpression. Un clic droit dans la fenêtre permet d’accéder à une option d’impression.Ce clic permet également de passer en mode création : il s’agit là d’une faiblesse duprogramme dans son état actuel. Fermez la fenêtre.

9. Cliquez de nouveau sur le bouton « Créer une facture » : bien évidemment, cette opé-ration n’est pas autorisée car la facture a déjà été générée. Une boîte de dialoguepropose de l’imprimer et renvoie à l’étape précédente.

10. Cliquez sur « Ordre d’expédition » ; si nécessaire, remplissez les zones obligatoiresjusqu’à ce que l’opération soit valide. Enfin, cliquez sur le bouton « Terminer la com-mande » pour générer le message « La commande est désormais marquée commefermée ».

La pratique de ce petit logiciel de gestion commerciale nous a permis de constater que lamise en œuvre du processus de facturation est beaucoup plus complexe qu’il n’y paraît.

En premier lieu, les différents acteurs doivent être en place et, au moins :

• un client ;

• un fournisseur ;

• un produit ;

• un représentant ;

• un transporteur.

En second lieu, l’événement de la commande (imaginons par exemple l’appel téléphoniquedu client) déclenche une cascade d’actions obligatoirement successives. La commande,prise dans le sens d’un document, va passer par des états successifs, et dans le cas présent,par les états :

• nouveau ;

Access Livre Page 27 Mercredi, 27. f vrier 2008 7:28 07

Page 33: Access 2007 Et VBA

28 Access® 2007 et VBA

• 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 transporteurssont stockés dans des tables différentes.

• Les commandes sont stockées dans d’autres tables qui, nécessairement, seront en relationavec 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éesissues des requêtes.

• Des états, éventuellement à caractère légal comme la facture, matérialisent l’actecommercial en utilisant d’autres requêtes.

• Un programme présente, logiquement et au moment voulu, les formulaires, et contrôleen permanence le respect des procédures.

EXERCICE 2 PRATIQUER UN RÉASSORT

* Solution 1. Réalisation d’une commande client avec un article épuisé

1. Cliquez dans le volet de navigation sur « Liste commande ».

2. Cliquez sur « Ajouter une nouvelle commande ».

3. Choisissez le client créé dans l’exercice 1.

4. Parmi les produits de la zone de liste déroulante, sélectionnez l’article Beer dont laquantité disponible est égale à 0.

5. La saisie d’une quantité commandée de 20 articles provoque l’ouverture d’une fenêtrede message particulière. Le programme a consulté l’inventaire du stock et constatéqu’il était insuffisant pour satisfaire la commande. Malgré tout, il est possible de valider lacommande en l’état (quitte, plus tard à pratiquer un réassort de ce produit).

6. Justement, le logiciel gère ce qu’on appelle le système de contremarque : une com-mande client, quand elle ne peut être satisfaite, génère automatiquement unecommande fournisseur à hauteur des mêmes quantités. C’est la raison pour laquelle lelogiciel ouvre automatiquement une fenêtre « Inventaire insuffisant. Voulez-vouscréer un bon de commande ? ». Il s’agit là d’un bon de commande fournisseur ; les

• Énoncé 1. En utilisant la base Northwind, effectuez une commande client en choisissant unarticle dont le stock est épuisé (prenez l’article Beer). Observez l’effet de cettecommande et tentez de reconstituer le chemin des processus mis en œuvre.

2. Lorsque cette commande est valide, indiquez les actions à effectuer lors de saréception.

Access Livre Page 28 Mercredi, 27. f vrier 2008 7:28 07

Page 34: Access 2007 Et VBA

29Les objets d’Access

Exercice

s

1Chapitre

puristes pourront reprocher au concepteur de n’avoir pas précisé cela dans la fenêtreen question ni dans les encarts supérieurs de chacun des formulaires.

7. Le bon de commande fournisseur qui s’ouvre est déjà numéroté (à la différence duprécédent). Son état initial est « soumise » (en haut à gauche). Le fournisseur est déjàrenseigné. La quantité commandée est identique à celle de la commande client.L’approbation de cette commande n’est ni signée ni datée. Il n’y a pas de date prévuede livraison. Vous pouvez fermer les deux fenêtres des bons de commande Client etFournisseur.

8. Dans le volet de navigation, cliquez sur « Liste bon de commande » dans la catégorie« Inventaire et achats » pour obtenir la liste des commandes fournisseur telle qu’à lafigure 1.12.

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 degénérer.

2. Cliquez sur le bouton « Approuver l’achat » : automatiquement, Access appose la datedu jour dans la zone de date d’approbation et « colle » le nom de l’utilisateur en coursdans la zone « Approuvé par ».

3. Fermez la fenêtre et constatez que la liste n’est pas mise à jour immédiatement : il fautappuyer sur la touche F5 (ou fermer et rouvrir le formulaire) pour rafraîchir la liste.

Figure 1.12Liste des commandes fournisseur en cours.

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 unecommande fournisseur, même lorsque tous les champs sont correctement remplis.

Access Livre Page 29 Mercredi, 27. f vrier 2008 7:28 07

Page 35: Access 2007 Et VBA

30 Access® 2007 et VBA

2. Réception d’une commande fournisseur

Lorsque la commande de 20 bouteilles de bière parvient à l’entreprise, le réceptionnistedoit procéder de la manière suivante :

1. Double-cliquez sur la ligne de commande fournisseur correspondante.

2. Cliquez dans l’onglet « Réception » dans l’inventaire.

3. Cochez la case « Ajouter à l’inventaire » : une fenêtre vous informe que « Le produit aété correctement entré dans l’inventaire »1.

4. Immédiatement après, une deuxième fenêtre s’ouvre : « Voici les commandes conte-nant ce produit en livraison différée. Voulez-vous les remplir maintenant ? » End’autres termes, voulez-vous traiter les commandes clients en attente ? Répondez« Non ». Dans le cas contraire, vous accéderiez à la saisie des livraisons telle que nousl’avons pratiquée à l’exercice précédent.

Le fait qu’il n’existe pas d’état Réceptionné à un bon de commande fournisseur n’est paschoquant : un bon de commande peut comprendre plusieurs articles dont certains ont étéréceptionnés et d’autres non. À la rigueur on pourrait imaginer un état Réceptionnélorsque tous les articles d’un bon sont reçus.

La synthèse des opérations réalisées peut se lire dans l’inventaire, lequel nous conduit auxproduits.

1. Dans le volet de navigation, cliquez sur « Inventaire » dans la catégorie « Inventaire etachats ».

2. La liste de tous les produits et différentes quantités d’inventaire apparaît : il ne s’agitque d’une synthèse, et il n’est pas possible, à ce niveau, de vérifier les mouvements destock.

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 ledroit 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 étaped’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 quiaffiche 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 dela 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 miseen œuvre. Le représentant Cencini, premier de la liste, et sous le nom duquel on se connecte par commodité atous 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 (onconstatera à tout moment que le produit est entré en inventaire), d’autre part, le simple fait de cocher lance une action précise, celle d’ajouterl’article à l’inventaire. Cette double utilisation simultanée du même objet est relativement peu orthodoxe.

Access Livre Page 30 Mercredi, 27. f vrier 2008 7:28 07

Page 36: Access 2007 Et VBA

31Les objets d’Access

Exercice

s

1Chapitre

3. Double-cliquez sur le produit Beer : vous ouvrez la table des produits et ciblez plusprécisément cet article (voir figure 1.13).

Comme on l’a vu plus haut, l’affichage en mode formulaire unique des articles de la tables’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 desachats/commandes ». En cliquant sur ce deuxième onglet, on lit tous les mouvements duproduit en entrée et en sortie. On comprend donc que le même formulaire, au travers dedeux onglets, vise deux domaines bien distincts pour nous maintenant : d’une part, leproduit lui-même, d’autre part, la synthèse des commandes clients/fournisseurs du mêmeproduit.

EXERCICE 3 ANALYSER LES PROCESSUS ET LES ÉTATS

* 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 prendrades schémas de type UML (Unified Modeling Language), tout en gardant une certaineliberté dans le formalisme.

Figure 1.13Fiche produit.

• Énoncé En reprenant les deux exercices précédents, représentez graphiquement les processus etles états mis en place depuis la commande à un fournisseur jusqu’à la facture à un client

Access Livre Page 31 Mercredi, 27. f vrier 2008 7:28 07

Page 37: Access 2007 Et VBA

32 Access® 2007 et VBA

Un diagramme d’activité représente les actions successives, de haut en bas, de gestion desbons 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é parle client est disponible ou non.

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 aumoment où il est informé qu’un article est non disponible et n’est pas obligé de passer auxactions de la partie gauche du schéma. Au contraire, la possibilité de passer au traitementdes 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, lesdoubles cercles, en bas, les points finaux.

Un autre type de représentation appelé « diagramme d’état », plus statique, synthétise lesdiffé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éelimité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 produitlogiciel. 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 desobjectifs à poursuivre.

Figure 1.14Représentation de la gestion des commandes sous forme de diagramme d’activité.

Access Livre Page 32 Mercredi, 27. f vrier 2008 7:28 07

Page 38: Access 2007 Et VBA

33Les objets d’Access

Exercice

s

1Chapitre

EXERCICE 4 ANALYSER LES DONNÉES

* Solution Les données se regroupent dans des tables, comme nous l’avons vu dans la partie théorique dece chapitre. Ici, nous n’abordons volontairement pas les liens entre les tables, mais uniquementleur contenu. Il s’agit de dissocier les domaines de chaque table et de ne pas les mélanger.

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 estincontournable.

• Clients, fournisseurs, transporteurs et employés regroupent des entités bien distinctes quine 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 quilui sert d’identifiant. Par commodité, on parlera d’ID (pour l’IDentity américain).

Figure 1.15Représentation de 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éespar grands ensembles, entrant dans le cadre de l’application.

Figure 1.16Représentation des données essentielles de la base Northwind.

EMPLOYEN° d’employéNomPrénomFonctionRôle

FOURNISSEURN° de fournisseurRaison socialeAdresse

CLIENTN° de clientRaison socialeAdresse

TRANSPORTEURN° de transporteurRaison socialeAdresse

COMMANDECLIENTN° de commandeclientN° de clientN° de produitQuantitéEtat C.Client

COMMANDEFOURNISSEURN° de commandefournisseurN° de fournisseurN° de produitQuantitéEtatC.Fournisseur

PRODUITN° de produitDésignationPrix unitaire

Access Livre Page 33 Mercredi, 27. f vrier 2008 7:28 07

Page 39: Access 2007 Et VBA

34 Access® 2007 et VBA

• Certains libellés, et en particulier les identifiants, se retrouvent dans d’autres tables quedans leur propre univers : le numéro de client dans la commande client, le numéro defournisseur dans la table des commandes fournisseur.

• Il n’existe qu’une seule table « Produit » dont les numéros se retrouvent dans les tablesdes 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 desprocessus.

• Les deux tables des commandes ne comportent pas le prix de la commande ou toutautre information inutile : la quantité commandée suffit puisque l’information du prixunitaire 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 declient 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 declients, fournisseurs et autres éléments dans la base. Une propriété affirmée pour vraieconcernant un élément doit nécessairement rester vraie pour tous les éléments de la mêmeclasse ; 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 cemodèle1 :

1. Cliquez dans la barre de menu sur « Outils de base de données ».

2. Cliquez sur l’icône Relations.

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 aupluriel, 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. Denombreux 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 !

Figure 1.17Modèle relationnel de la base Northwind.

Access Livre Page 34 Mercredi, 27. f vrier 2008 7:28 07

Page 40: Access 2007 Et VBA

35Les objets d’Access

Exercice

s

1Chapitre

EXERCICE 5 RETOUCHER UN FORMULAIRE EN MODE CRÉATION

* Solution Il s’agit de modifier les contrôles de ce formulaire : il est donc impératif de passer en modecréation pour en modifier les propriétés :

1. Dans le volet de navigation, cliquez du bouton droit sur le formulaire « Détails duclient ».

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.

3. Cliquez au-dessus de la zone blanche « Téléphone professionnel » : le contrôle est misen surbrillance.

4. Cliquez du bouton droit au même endroit, puis cliquez sur « Propriétés » (on peutégalement cliquer sur « Feuille des propriétés » dans le ruban du menu Création qui estapparu lors du passage en mode création) : la feuille des propriétés apparaît.

5. Seul l’onglet « Données » est accessible, mais il est préférable d’afficher toutes lesproprié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.

• Énoncé Comme vu précédemment, le formulaire de saisie et de modification d’un nouveauclient dans la base Northwind ne comporte pas de masque de saisie des numéros de télé-phone pour contrôler la validité de leur format. Modifiez cette zone pour la rendre plusconviviale et adaptée. Cet exercice est destiné à familiariser le lecteur avec les basculementssuccessifs du mode utilisateur au mode création.

Figure 1.18Formulaire de saisie des clients en mode création.

Access Livre Page 35 Mercredi, 27. f vrier 2008 7:28 07

Page 41: Access 2007 Et VBA

36 Access® 2007 et VBA

8. Access démarre un Assistant Masque de saisie comme le présente la figure 1.19.

9. Choisissez dans la liste le format « Numéro de téléphone », ou bien « Numéro de télé-phone international » si la base commerciale est destinée à l’international.

10. Passez à l’étape suivante, qui permet de modifier partiellement ou totalement le masquechoisi.

11. Passez à l’étape suivante, qui conditionne le stockage de la donnée entrée avec ou sansson masque.

12. Terminez l’assistant.

13. Testez la modification en repassant en mode formulaire (dans le ruban du menu Création,cliquez sur l’icône Affichage à gauche).

14. Quand les tests sont positifs, appliquez les mêmes modifications aux contrôles « Télé-phone mobile » et « N˚ de télécopie ».

15. Passez alternativement du mode utilisateur au mode création jusqu’à ce que tous lescontrôles soient opérationnels. Cette modification de la base Northwind n’a pasd’incidence sur les fonctionnalités du logiciel.

Figure 1.19Assistant Masque de saisie d’Access.

Access Livre Page 36 Mercredi, 27. f vrier 2008 7:28 07

Page 42: Access 2007 Et VBA

37

2Le modèle relationnel, concevoir une base de données

Les exercices du chapitre précédent ont laissé en-trevoir que l’assemblage des données stockées dans une base nécessitait une organisation parti-culière ; dans la même optique, le montage des objets qui contiennent ces données nécessite une méthode. Nous étudierons donc maintenant la création des tables et la mise en place des relations entre elles. L’aspect théorique, ici, aura au moins autant d’importance que la mani-pulation du logiciel Access.

1. Merise, un outil méthodologique ...................... 38

Problèmes et exercices 1. Créer la base de données

d’une bibliothèque de prêt ....... 53

2. Gérer un organisme de formation ........................... 57

3. Créer la base de données du système télépéage............... 60

Chapitre

Access Livre Page 37 Mercredi, 27. f vrier 2008 7:28 07

Page 43: Access 2007 Et VBA

38 Access® 2007 et VBA

(1) Merise, un outil méthodologique

Merise (Méthode d’Étude et de Réalisation Informatique pour les Systèmes d’Entreprise), estune méthode, à présent ancienne, qui donne un cadre formel au développeur pour mettreen œuvre sa base de données. Merise, au départ, distingue plusieurs niveaux d’abstraction desmodèles et plusieurs types de base de données. Pour l’exposé qui suit, nous ne retiendronsque les deux aspects suivants :

• le modèle physique des données et plus précisément l’organisation des données dans destables ;

• la base de données relationnelle.

Dans la mesure où nous n’aborderons pas la plus grande partie de la méthode Merise, trèsthéorique, nous simplifierons l’approche en conservant les grands principes de base.

1.1 PRINCIPE D’UNICITÉ DE L’INFORMATION

Le premier enseignement fondamental de la méthode touche l’unicité de l’information :toute information ne doit être stockée qu’une et une seule fois dans une base1. Un exem-ple illustrera ce premier point, en réutilisant la base de données Northwind. Celle-cicomprend :

• une table « Client » contenant toutes les coordonnées propres au client (nom, adresse,etc.) ;

• une table « Commande client » comportant tous les bons de commande.

La table « Commande » ne contient ni le nom, ni l’adresse du client, contrairement à touteattente. Pour imprimer le bon de commande, par exemple, il sera nécessaire de chercherles informations nécessaires dans la table « Client » par un lien à définir. La table com-mande client contient le numéro du client, qui, donc, servira de lien. On dit qu’il existeune relation entre la table client et la table commande ; le numéro de client, présent dansles deux tables, matérialise cette relation. Une telle organisation est d’abord économe entermes d’espace disque, mais, surtout, le système de gestion de base de données la gèrecomplètement en interne. Nul besoin de contrôler le rapprochement des occurrences depart et d’autre des deux tables à l’aide de programmes lourds et complexes, le systèmecontrôle en permanence l’intégrité de la base.

Un second exemple, plus matériel encore, illustrera l’utilité d’une organisation en tables.Imaginons que vous ayez à créer un fichier complet de vos relations personnelles. Pourchaque enregistrement, c’est-à-dire chaque parent ou ami, vous voudrez évidemmentcommencer la saisie par la civilité Monsieur, Madame ou Mademoiselle. Si vous vouscontraignez à opérer cette saisie, vous penserez probablement, après une dizaine de lignes,que cette frappe est fastidieuse et répétitive. Dans un premier temps, vous utiliserez unraccourci du type M., Mme, Mlle et plus loin encore vous finirez par écrire 1 (qui signi-fiera Monsieur), 2 (Madame) ou 3 (Mademoiselle), la forme la plus rapide de raccourci.C’est très exactement ce que fait une base de données, au travers de ce qu’un utilisateur

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.

Access Livre Page 38 Mercredi, 27. f vrier 2008 7:28 07

Page 44: Access 2007 Et VBA

39Le modèle relationnel, concevoir une base de données

2Chapitre

verra comme une zone de liste déroulante. Le dessin des deux tables mises en œuvre seracelui de la figure 2.1.

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 lesdonnées elles-mêmes. La table « CIVILITE » de gauche ne contiendra, en définitive, quetrois enregistrements que l’on pourra décrire très exactement comme à la figure 2.2.

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 » ; cedernier ne contiendra pas de données telles que M. ou Madame, mais uniquement leschiffres correspondants de la table « CIVILITE », et dans la pratique les chiffres 1 ou 2 ou3. 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 (delien) 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é dansla 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 dansla 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’estpas obligatoire, mais optionnelle : Access saurait rapprocher deux colonnes ne portantpas 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 danschacune des tables.

Figure 2.1Modèle relationnel simplifié Civilité-Contact.

Figure 2.2Contenu de la table CIVILITE.

Access Livre Page 39 Mercredi, 27. f vrier 2008 7:28 07

Page 45: Access 2007 Et VBA

40 Access® 2007 et VBA

1.2 PRINCIPE D’IDENTIFIANT

À l’intérieur d’une même table, chaque item de l’ensemble (en d’autres termes chaqueenregistrement), doit pouvoir être identifié de manière unique et obligatoire. La réunionde 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é primairedans 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 plusieurschamps ; nous étudierons ce cas plus loin.

La nature de cette clé primaire peut être variée et il n’existe pas d’obligation particulièresur ce point. La plupart du temps, on utilisera un code numérique, le plus simple, et pourlequel Access propose une solution d’incrémentation automatique. Mais une clé primairepeut aussi être constituée de lettres (pensons à la codification à trois lettres de tous lesaéroports du monde : JFK pour l’un des aéroports de New York et CDG pour celui deRoissy) ou bien toute autre organisation. On évitera des clés primaires trop compliquéesou 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 à savalidité dans tous les cas de figure à traiter ultérieurement. Par exemple, il est maladroitd’identifier les villes de France au moyen de leur code postal : un bureau de Poste peutcouvrir plusieurs communes. S’il n’existe pas de besoin particulier d’identifier toutes lescommunes de France, ce choix portera la table à environ 8 000 enregistrements ; dansle cas contraire (et le plus général), il sera plus judicieux d’utiliser les codes Insee descommunes (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 604au maximum.

1.3 ASPECT DE LA PRÉSENTATION UNIFORME DES DONNÉES.

Dès qu’une donnée peut se répéter plusieurs fois sous diverses formes, il devient nécessairede 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 doitcontenir le dernier diplôme obtenu par les étudiants, il est maladroit de créer une simplezone 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 SMention B », et une dernière « Bac S ». Nul doute qu’il ne sera pas possible de faire des

Access Livre Page 40 Mercredi, 27. f vrier 2008 7:28 07

Page 46: Access 2007 Et VBA

41Le modèle relationnel, concevoir une base de données

2Chapitre

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.

1.4 PRINCIPE DE LA RÉDUCTION ÉLÉMENTAIRE

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, unchamp DIPLOMES au pluriel, destiné à recevoir la liste des diplômes déjà obtenus parl’é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 constitueraqu’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 champsDIPLOME1, DIPLOME2, etc., mais on imagine aisément que le procédé est excessivementlimité : un étudiant brillant dépassera nécessairement, tôt ou tard, le nombre de diplômesprévus. De plus, les requêtes qui seront faites pour compter les diplômes par étudiant, parexemple, 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.

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 lefonctionnement dans le point suivant. Notons tout de suite que cette présentation permetaussi d’insérer des informations nouvelles telles que la mention au diplôme ou la dated’obtention.

Figure 2.3Modèle relationnel simplifié Etudiant-Diplôme.

Figure 2.4Modèle relationnel Etudiant_Diplôme.

Access Livre Page 41 Mercredi, 27. f vrier 2008 7:28 07

Page 47: Access 2007 Et VBA

42 Access® 2007 et VBA

1.5 PRINCIPES RELATIONNELS

Les relations entre les tables doivent être conjuguées logiquement avant d’être mises enplace. 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èresuivante :

Un contact porte une et une seule civilité (on ne peut être simultanément Monsieur etMadame) ; une civilité s’applique à plusieurs contacts (le carnet d’adresses peut comporterplusieurs Monsieur et plusieurs Madame).

Un bon de commande client correspond à la commande d’un et un seul client (si un autreclient fait une autre commande, y compris portant sur les mêmes articles, un autre bon decommande 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 quis’est connecté initialement à la base) ; un représentant peut rédiger zéro, un ou plusieursbons de commande fournisseur.

Dans ces trois énoncés, la conjugaison semble naturelle et logique ; elle intègre d’embléeune 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 figurepossibles, 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 à 1Nous 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 lesautres n’aient pas de rôle particulier à jouer dans le système d’information à mettre enplace, il n’y a aucune raison pour ne pas fusionner purement et simplement les deuxfichiers. 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 dansune base bien conçue n’existent pas1.

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 ».

Access Livre Page 42 Mercredi, 27. f vrier 2008 7:28 07

Page 48: Access 2007 Et VBA

43Le modèle relationnel, concevoir une base de données

2Chapitre

Les relations de plusieurs à plusieursLe cas inverse est beaucoup plus fréquent. Imaginons que la base de données à créerconcerne des élèves qui apprennent des langues vivantes au lycée. La conjugaison des relationsserait, 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 unebase de données, et il s’avère obligatoire de développer cette relation plurielle dans lesdeux 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 etdes langues (voir figure 2.5).

Ici, la table « OPTION_LINGUISTIQUE » comporte non seulement sa propre clé pri-maire mais les identifiants des deux tables « LYCEEN » et « LANGUE » : on parle de clésétrangères.

Le contenu effectif des tables sera semblable à celui de la figure 2.6.

Figure 2.5Modèle relationnel Lycéen-Langue.

Figure 2.6Contenu des tables du modèle relationnel Lycéen-Langue.

Access Livre Page 43 Mercredi, 27. f vrier 2008 7:28 07

Page 49: Access 2007 Et VBA

44 Access® 2007 et VBA

On lit dans la table « OPTION_LINGUISTIQUE » les inscriptions suivantes aux langues :

• Bertrand DUPOND, lycéen n˚ 2 est inscrit en Anglais, langue n˚ 1 ;

• Claude MARTIN, lycéen n˚ 3 est inscrit en Anglais, langue n˚ 1 ;

• Bertrand DUPOND, lycéen n˚ 2 est inscrit en Allemand, langue n˚ 2.

En résumé, toute relation de plusieurs à plusieurs doit être décomposée pour ne gérer avecAccess que des relations de un à plusieurs.

C’est d’ailleurs exactement la reprise du cas de figure des clients et des produits. Au départ,il peut être affirmé :

• un client commande un ou plusieurs produits ;

• un produit est commandé par un ou plusieurs clients.

Présentée ainsi, cette relation apparaît comme une relation de plusieurs à plusieurs. Enfait, et dans le modèle Northwind, elle a été décomposée ainsi :

• un client fait une ou plusieurs commandes ;

• une commande relève d’un et un seul client ;

et

• un produit rentre dans une ou plusieurs commandes ;

• une commande (pris dans le sens d’une ligne de commande) concerne un et un seulproduit.

La problématique du tempsIl est toujours nécessaire de réfléchir sur la notion de temps. La conjugaison de la relationdoit être vraie à un instant t et à tous les instants t’, t’’, etc. Si l’évolution dans le temps doitchanger 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 seraplacé à 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é commeun 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, lavaleur 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 aumodèle présenté à la figure 2.7.

Figure 2.7Modèle relationnel Salarié-Convention Collective Nationale.

Access Livre Page 44 Mercredi, 27. f vrier 2008 7:28 07

Page 50: Access 2007 Et VBA

45Le modèle relationnel, concevoir une base de données

2Chapitre

Dans ce modèle, la notion de date d’affectation à un niveau de Convention collectives’insère dans la table intermédiaire « AFFECTATION_CCN ». C’est précisément cettetable qui permettra de faire l’historique de carrière du salarié.

La proposition littérale de relation est la suivante :

• un salarié a une ou plusieurs affectations dans sa carrière ;

• une affectation correspond à un et un seul salarié ;

et

• une affectation vise un et un seul niveau de CCN ;

• les échelons de la CCN peuvent porter sur zéro, une ou plusieurs affectations.

Le cas particulier des relations réflexivesUne table peut comporter des relations avec elle-même. C’est le cas, par exemple, d’unetable des salariés dans laquelle on veut faire intervenir une notion de parenté. Initialement, laproposition de relation peut s’exprimer ainsi :

• un salarié est le parent (frère ou sœur ou autre) de plusieurs salariés ;

• un salarié a pour parents plusieurs salariés ;

Le modèle à générer sera celui de la figure 2.8.

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.

Figure 2.8Modèle relationnel Salarié-Lien de parenté.

1. Les deux relations entre le lien de parenté et la table salarié devront impérativement comporter l’option de suppression en cascade desenregistrements correspondants car, sans cette option, toute suppression de salarié ayant un rapport de parenté avec un autre deviendraitimpossible (voir dans la section de ce même chapitre la notion de suppression en cascade).

Access Livre Page 45 Mercredi, 27. f vrier 2008 7:28 07

Page 51: Access 2007 Et VBA

46 Access® 2007 et VBA

1.6 LA CRÉATION DES TABLES

Cette première approche théorique étant bien assimilée, des cas pratiques peuvent êtreabordés.

Nous allons créer une base « de travail » et y créer des tables et autres objets Access. Vousaurez 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 etplace 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à unenouvelle 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 serontpas 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.

1. Dans la totalité de l’ouvrage, nous utilisons des conventions de noms que nous recommandons : les noms de tables et noms de champs sontentrés en majuscules (non accentués), sans aucun espace. L’absence d’accentuation limite les possibilités d’erreurs, l’absence d’espace évite auprogrammeur 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 ».

Figure 2.9Fenêtre de création de table.

Access Livre Page 46 Mercredi, 27. f vrier 2008 7:28 07

Page 52: Access 2007 Et VBA

47Le modèle relationnel, concevoir une base de données

2Chapitre

La partie supérieure comporte tous les champs de la table pendant que la partie inférieureaffiche les propriétés de chacune des lignes, ligne par ligne, au fur et à mesure et suivant lepositionnement du pointeur du pavé supérieur.

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 auxrecommandations énoncées dans la partie théorique, nous le maintiendrons. Le premierchamp s’appelle par défaut « N˚ » : ce début de libellé peut être conservé et continué parune précision sur le type de numéro ; le champ pourra être nommé « N˚SALARIE », parexemple. 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 ». Lafaute à ne pas commettre, à l’inverse, consiste à nommer le champ « ID » ou « N˚ » sansautre précision. Access accepte ce type de confusion alors que d’autres bases ne l’acceptentpas ; dans tous les cas de figure, cette démarche maladroite exposera ultérieurement à deforts 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 lacré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). Lalégende apparaîtra automatiquement en lieu et place du code « ID_SALARIE » danstous les formulaires et états.

• L’index est positionné à « Oui Sans doublon » : cette disposition est obligatoire pour unchamp 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 dansune démarche logique. Il peut exister un grand nombre de tables dans lesquelles le vocableNOM 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 depréciser de quel nom il s’agit afin que le Dictionnaire des données, c’est-à-dire l’ensembledes noms de champs, ne comporte pas de doublons.

Access propose par défaut (à droite du nom de champ) que le format des données soitde type Texte, ce qui, pour le cas présent, est valide. La longueur par défaut, indiquée enbas, est de 255 caractères, mais peut être réduite (un nom de salarié excédera rarement

Access Livre Page 47 Mercredi, 27. f vrier 2008 7:28 07

Page 53: Access 2007 Et VBA

48 Access® 2007 et VBA

50 caractères). Nous préciserons, à ce stade, quelques autres propriétés du champNOM_SALARIE :

• La légende sera « Nom du salarié », correctement orthographié pour une bonne lisi-bilité ultérieure dans les formulaires.

• La zone Null interdit sera positionnée à « Oui » (quand l’utilisateur crée un nouveausalarié, la zone du nom doit être impérativement remplie, sinon l’enregistrement nesera pas validé).

• La Chaîne vide autorisée sera positionnée à « Non » (l’utilisateur ne peut pas tricher enremplaçant l’absence de nom par une simple chaîne vide).

• La zone Indexé peut éventuellement être positionnée à « Oui avec doublon » (il peut yavoir plusieurs Dupont ou plusieurs Martin, donc les doublons doivent être autorisés).La mise en place d’un index accélérera les recherches sur le nom, si elles sont fréquen-tes ; en revanche, la création d’un index multipliera par deux l’espace disque nécessairepour stocker les données et la saisie de nouveaux enregistrements sera ralentie. Enconséquence, les index ne doivent être mis en place que sur les colonnes sur lesquellessont effectuées de nombreuses recherches et uniquement pour les tables dont le nombre decréations ou mises à jour est faible.

Le troisième champ, nommé PRENOM_SALARIE sera traité de la même manière que leprécédent, de même que le quatrième champ ADRESSE1_SALARIE (longueur de textepoussée à 100 toutefois). Le cinquième champ ADRESSE2_SALARIE, destiné à indiquerun nom de bâtiment ou une précision sur un lieudit ne sera pas obligatoire (zone Nullinterdit positionnée à « Non »).

Le sixième champ, indiquant le code postal et nommé CP_SALARIE, mérite quelquesdéveloppements :

• Contrairement aux apparences, il ne s’agit pas d’une zone numérique : le code postal deBourg-en-Bresse est le 01000, avec un zéro en première position, et non pas 1000. Si lechamp de code postal est formaté en numérique, tous les zéros à gauche ne seront paspris en compte. Il s’agit donc bien d’une zone Texte, qu’on positionnera à 5 caractèresde long (si la base de données n’a pas pour vocation de gérer des codes postaux inter-nationaux).

• Le masque de saisie peut être précisé : cliquez sur les trois petits points à droite de lazone Masque de saisie ; le cas échéant, enregistrez provisoirement la table, et visualisezl’assistant à la création de masque de saisie. Parmi les différentes présentations propo-sées, celle des codes postaux français est énumérée : validez-la.

• Le champ Null interdit peut être positionné à « Non ».

Terminez la saisie des champs de la table de la manière suivante :

• Le champ VILLE_SALARIE est une zone de texte (50 caractères), obligatoire.

• Le champ SALAIRE_BRUT_SALARIE est une zone numérique (réel double), non obli-gatoire.

Access Livre Page 48 Mercredi, 27. f vrier 2008 7:28 07

Page 54: Access 2007 Et VBA

49Le modèle relationnel, concevoir une base de données

2Chapitre

La description des champs, à droite, peut être remplie, aux seules fins de documenterl’application ; la table doit avoir les caractéristiques précisées à la figure 2.10

Dans la mesure où la table a déjà été nommée « SALARIE » antérieurement, il n’est plusutile 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 » (pourConvention 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 à chaquenouvel enregistrement).

Figure 2.10Table SALARIE en fin de création.

Access Livre Page 49 Mercredi, 27. f vrier 2008 7:28 07

Page 55: Access 2007 Et VBA

50 Access® 2007 et VBA

Les deux nouvelles tables auront les caractéristiques de la figure 2.11.

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 defigure 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.

1.7 L’INTÉGRITÉ RÉFÉRENTIELLE

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 », parexemple, à la fois dans la table « SALARIE » et dans la table « AFFECTATION_CCN » quele lecteur a fait le rapprochement, se doutant que les valeurs contenues dans ces champs dela table devaient pouvoir être appariées. Au-delà de cette démarche intellectuelle, il n’y arien dans la base de données, à ce stade, pour contrôler si les appariements des valeursvont effectivement se réaliser.

En d’autres termes, et au stade où se trouve la création de la base, il est possible d’attribuerle coefficient 250 de la Convention Collective au premier salarié venu alors même que cecoefficient n’existe pas dans la table « CCN » ; de la même manière, il est possible de créerune 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 ainsi1 : le contrôle de la saisie des valeursest alors reporté sur le programme informatique d’interface homme/machine qui, enconséquence, s’alourdit considérablement.

Il est infiniment plus efficace d’utiliser les contraintes d’intégrité référentielle que comportetoute base de données relationnelle afin de garantir la cohérence des valeurs contenuesdans 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 lechamp « ID_CIVILITE » qui se trouve simultanément dans les deux tables :

Figure 2.11Tables CCN et AFFECTATION_CCN en fin de création.

1. C’est malheureusement trop souvent le cas, même sur des bases de données plus puissantes qu’Access. Seules des problématiques derépartition des tables dans les environnements client/serveur, ou bien des impératifs de migrations de données peuvent légitimer l’absenced’intégrité référentielle dans la base.

Access Livre Page 50 Mercredi, 27. f vrier 2008 7:28 07

Page 56: Access 2007 Et VBA

51Le modèle relationnel, concevoir une base de données

2Chapitre

• En qualité de clé primaire pour la table « CIVILITE » ;

• En qualité de clé étrangère dans la table « CONTACT ».

Dès lors, il sera impossible d’insérer une valeur différente de 1, ou 2, ou 3 (équivalentes deMonsieur, Madame, Mademoiselle) dans la table « CONTACT », ces trois seules valeursayant été saisies dans la table « CIVILITE ».

La mise en place des contraintes référentielles s’opère avec une option des outils de base dedonnées :

• Dans le menu « Outils de base de données », cliquez sur « Relations ».

• Dans le ruban, cliquez sur le bouton « Relations ».

• Double-cliquez sur les tables « SALARIE », « CCN » et « AFFECTATION_CCN » (oucliquez sur « Ajouter »).

• Cliquez sur l’« ID_SALARIE » de la table « SALARIE » et gardez le clic enfoncé.

• Placez la souris au-dessus de l’« ID_SALARIE » de la table « AFFECTATION_CCN » (lasouris affiche un signe +) et relâchez.

La fenêtre de la figure 2.12 apparaît, permettant de créer les paramètres de la relation.

La contrainte entre les deux tables peut comporter plusieurs niveaux :

• Le seul fait de cliquer immédiatement sur « Créer » (sans avoir coché la case « Appli-quer l’intégrité référentielle ») crée un simple lien entre les deux tables : lorsqu’unerequête appelant ces deux tables sera faite, Access proposera ce lien qui aura été mémo-risé. Mais il n’existe pas d’intégrité référentielle.

• À l’inverse, en cochant l’option « Appliquer l’intégrité référentielle », on établit unerelation forte entre les deux tables : il sera impossible d’ajouter une affectation dans latable « AFFECTATION_CCN » si l’« ID_SALARIE » invoqué n’existe pas dans la table« SALARIE ». Ce contrôle sera permanent.

Une intégrité référentielle étant posée, les deux options en dessous deviennent manipulables.

La première permet de « Mettre à jour en cascade les champs correspondants ». Dans lapratique cela signifie que si la valeur 1 dans le champ ID_SALARIE de la table « SALARIE »est changée par la valeur 10, par exemple, toutes les anciennes valeurs 1 de la table desaffectations seront changées en 101.

Figure 2.12Paramé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.

Access Livre Page 51 Mercredi, 27. f vrier 2008 7:28 07

Page 57: Access 2007 Et VBA

52 Access® 2007 et VBA

La dernière option ouvre la voie à la « Suppression en cascade ». Dans la pratique, celasignifie que si un salarié est supprimé de la table « SALARIE », tous les enregistrements leconcernant seront supprimés de la table « AFFECTATION_CCN ». Naturellement cetteoption est à utiliser avec circonspection.

1. Cochez la case « Appliquer l’intégrité référentielle » et cliquez sur « Créer ».

La fenêtre des relations contient désormais un « fil de liaison » entre les deux « ID_SALARIE ».Le fait d’avoir coché l’intégrité référentielle montre le symbole 1 du côté Un de la relationde Un-à-plusieurs et le symbole ∞ du côté Plusieurs de la relation de Un-à-plusieurs.

2. Procédez de la même manière avec la table « CCN » pour obtenir le résultat de lafigure 2.13 qui présente la contrainte d’intégrité référentielle entre « ID_CCN » de la table« CCN » (clé primaire) et « ID_CCN » de la table « AFFECTATION_CCN » (cléétrangère).

3. Fermer ensuite la fenêtre de mise en relation en appuyant sur le bouton « Fermer » eten validant les modifications.

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èsardu 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 nouvellerè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. Toutesles tables créées comporteront systématiquement un identifiant, tous les champs créés necontiendront que des données élémentaires, non décomposables. Des relations serontimpérativement mises en place entre toutes les tables, en reportant la clé primaire destables principales sur un champ de clé étrangère dans la table à mettre en relation. Toutesles 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’établissementde contraintes d’intégrité référentielle.

Figure 2.13Modèle relationnel Salarié-CCN.

Access Livre Page 52 Mercredi, 27. f vrier 2008 7:28 07

Page 58: Access 2007 Et VBA

53Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

Problèmes et exercicesLes exercices ci-après permettent de mettre en place les fondements d’une base de donnéesdans 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éveloppementlogiciel. 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.

EXERCICE 1 CRÉER LA BASE DE DONNÉES D’UNE BIBLIOTHÈQUE DE PRÊT

* Solution 1. Conception du modèle

Les premières tables qui peuvent être mises sur papier sont :

• une table qu’on appellera « ADHERENT », pour désigner l’emprunteur du livre ;

• une table « LIVRE ».

La conjugaison de la relation, en première analyse, donnerait :

• un adhérent emprunte un ou plusieurs livres (surtout dans le temps) ;

• un livre est emprunté par un ou plusieurs adhérents (successivement, par nécessité).

Cette première énonciation fait apparaître une relation de plusieurs-à-plusieurs qui doitêtre développée en plusieurs relations de un-à-plusieurs. La solution serait :

• un adhérent effectue un ou plusieurs emprunts ;

• un emprunt est fait par un et un seul adhérent ;

et

• un livre donne lieu à plusieurs emprunts ;

• un emprunt concerne un et un seul livre ;

L’insertion de la table intermédiaire « EMPRUNT » solutionnera donc ce premier aspectde la problématique. En première analyse, le schéma relationnel ne devrait donc comporterque les trois tables suivantes :

• une table « ADHERENT » qui contient la clé primaire « ID_ADHERENT » et tous leschamps nécessaires à la fiche de celui-ci (nom, prénom, adresse, etc.) ;

• Énoncé Vous devez concevoir le système d’information d’une petite bibliothèque municipale quiprête des livres.

1. Commencez par porter sur le papier vos premières approches. Pensez à dissocier lagestion 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.

Access Livre Page 53 Mercredi, 27. f vrier 2008 7:28 07

Page 59: Access 2007 Et VBA

54 Access® 2007 et VBA

• 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 leprogramme, 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é del’information : la fiche d’un livre sera remplie deux fois sous deux numéros. Or, unetelle possibilité est quasi certaine : une bibliothèque de prêt, même modeste, risque fortd’acheter au moins trois ou quatre exemplaires des Quatre Mousquetaires d’AlexandreDumas 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), maisdans ce cas, si deux livres identiques sont achetés, le deuxième ISBN sera vu commeun 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ésignernon pas la notion de livre, mais celle du volume qui sera rangé sur une étagère. L’étude dela 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 duvolume (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 fichierbibliographique (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 nonindispensables.

Access Livre Page 54 Mercredi, 27. f vrier 2008 7:28 07

Page 60: Access 2007 Et VBA

55Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

2. Création des tables

La réflexion sur la structure de la base étant achevée, il est possible de passer à la créationphysique.

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 laclé 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 seulementl’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 nouvellefonction.

• 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).

• Créez un champ « ETAT_LIVRE », Numérique, Entier, Null interdit, non indexé.

• Le champ « ETAT_LIVRE » étant actif, cliquez dans le pavé inférieur sur l’onglet Listede choix.

Access Livre Page 55 Mercredi, 27. f vrier 2008 7:28 07

Page 61: Access 2007 Et VBA

56 Access® 2007 et VBA

• Dans « Afficher le contrôle », choisissez « Zone de liste déroulante ».

• Dans « Origine source », choisissez « Liste Valeurs ».

• Dans « Contenu », insérez les valeurs suivantes, séparées par des points-virgules1;"Neuf ";2;"Bon état";3;"Médiocre";4;"A pilonner".

• La colonne liée est la 1 (par défaut).

• Le nombre de colonnes est de 2.

• Dans « En-tête colonne », choisissez « Non ».

• Dans « Largeurs colonnes », insérez les valeurs suivantes, séparées par des points-virgules0;3 (présentation des largeurs en centimètres : la première colonne sera cachée).

• Dans « Lignes affichées », indiquez « 4 ».

• Dans « Limiter à liste », choisissez « Oui ».

• Laissez les autres paramètres à leur valeur par défaut.

Pour éviter de créer une table supplémentaire désignant l’état des livres, le champ« ETAT_LIVRE » a été paramétré pour montrer les quatre valeurs possibles et n’autoriserque l’une des quatre (la zone étant obligatoire). Il est important de comprendre que latable va effectivement stocker les valeurs numériques 1, 2, 3 ou 4 et non les textes« Neuf », « Médiocre » et autres. Il reviendra au développeur d’interpréter cette colonnenumérique au moment de faire des requêtes pour synthétiser, par exemple, l’état généralde la bibliothèque. N’hésitez pas à tester, par la suite, les effets visuels de la saisie d’unevaleur dans ce champ.

On pourrait, de la même manière, faire appel à des zones de liste déroulante pour afficherle contenu d’une table au moment de la saisie d’une autre. Par exemple, la zone « ID_ADHERENT » de la table « EMPRUNT » peut comporter une zone de liste déroulanteappelant la table « ADHERENT » : nous verrons plus loin dans la création des formulairescette faculté de liaison.

3. Mise en place de l’intégrité référentielle

• Ouvrez la fenêtre des relations.

• Ajoutez les tables « ADHERENT », « LIVRE », « EXEMPLAIRE ».

• Par un glisser-déplacer, liez les deux champs « ID_ADHERENT » présents.

• De la même manière, liez les deux champs « ID_LIVRE ».

• Liez enfin les deux champs « ID_EXEMPLAIRE » afin d’obtenir le modèle de la figure 2.14.

Figure 2.14Modèle relationnel d’une bibliothèque de prêt.

Access Livre Page 56 Mercredi, 27. f vrier 2008 7:28 07

Page 62: Access 2007 Et VBA

57Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

EXERCICE 2 GÉRER UN ORGANISME DE FORMATION

* Solution 1. Conception du système

Les données sur le client et ses salariés conduisent à la relation :• Un client a un ou plusieurs salariés ;• Un salarié a un ou plusieurs employeurs (simultanément ou successivement).On peut en effet imaginer que le salarié est à temps partiel chez plusieurs employeurs ouchange d’emploi1. Cette affirmation sera développée en :• un client procède à une ou plusieurs embauches ;• une embauche est faite par un et un seul employeur ;et• une embauche concerne un et un seul salarié ;• un salarié peut avoir plusieurs embauches (dans le temps ou simultanément).Le salarié et la session de formation sont liés par la relation :• un salarié participe à une ou plusieurs sessions ;• une session réunit plusieurs salariés.Qu’on développera en :• un salarié est inscrit à plusieurs sessions ;• une inscription concerne un et un seul salarié ;et• une inscription concerne une et une seule session ;• une session donne lieu à plusieurs inscriptions.

• Énoncé Vous devez concevoir le système d’information d’un organisme de formation. Les clientsde cette société, spécialisée dans la formation informatique, sont tous eux-mêmes dessocié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 portantsur 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 processusopé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 queles cas de multi-employeurs ou de salariés qu’on retrouve dans plusieurs entreprises clientes est trop marginal pour mériter une tableintermé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.

Access Livre Page 57 Mercredi, 27. f vrier 2008 7:28 07

Page 63: Access 2007 Et VBA

58 Access® 2007 et VBA

La table intermédiaire « INSCRIPTION » servira, par exemple, à établir la base des listesd’é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à unesession 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 dansplusieurs salles.

Le dessin global (et réduit à ses seules clés du modèle relationnel) sera celui de la figure 2.15.

2. Création des tables

Créez la table « CLIENT » avec les champs suivants :

• ID_CLIENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null interdit, Indexé avec doublons.

• ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé.

• ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé.

Figure 2.15Première approche du modèle relationnel d’un organisme de formation.

Access Livre Page 58 Mercredi, 27. f vrier 2008 7:28 07

Page 64: Access 2007 Et VBA

59Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé.

• VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé.

Créez la table « SALARIE » avec les champs suivants :

• ID_SALARIE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• NOM_SALARIE, Texte, 50 caractères, Null interdit, Indexé avec doublons.

• PRENOM_SALARIE, Texte, 50 caractères, Null interdit, Non indexé.

Notez qu’il n’est pas utile, à moins d’une demande formelle du commanditaire de l’appli-cation, d’insérer les coordonnées du salarié : l’organisme de formation n’a pas à écrire, parexemple, au salarié. Tous les rapports avec les stagiaires s’effectuent via le client.

Créez la table « EMBAUCHE » avec les champs suivants :

• ID_EMBAUCHE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit,Non indexé.

• ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit,Non indexé.

• DATEDEBUT_EMBAUCHE, Date, Format Abrégé, Null interdit, Non indexé.

• DATEFIN_EMBAUCHE, Date, Format Abrégé, Null autorisé, Non indexé.

Créez la table « INSCRIPTION » avec les champs suivants :

• ID_INSCRIPTION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• ID_SESSION, (clé étrangère de la table SESSION), Numérique, Entier long, Null interdit,Non indexé.

• ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit,Non indexé.

Créez la table « FORMATEUR » avec les champs suivants :

• ID_FORMATEUR, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• NOM_FORMATEUR, Texte, 50 caractères, Null interdit, Indexé avec doublons.

• ADRESSE1_FORMATEUR, Texte, 100 caractères, Null interdit, non indexé.

• ADRESSE2_FORMATEUR, Texte, 100 caractères, Null autorisé, non indexé.

• CP_FORMATEUR, Texte, 5 caractères, Null interdit, non indexé.

• VILLE_FORMATEUR, Texte, 50 caractères, Null interdit, non indexé.

Créez la table « SALLE » avec les champs suivants :

• ID_SALLE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• ETAGE_SALLE, Numérique, Entier, Null interdit, non indexé.

• NUMERO_SALLE, Numérique, Entier, Null interdit, non indexé.

Créez la table « COURS » avec les champs suivants :

• ID_COURS, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

• NOM_COURS, Texte, 50 caractères, Null interdit, non indexé.

• DUREE_COURS, Numérique, Entier, Null interdit, non indexé.

Créez la table « SESSION » avec les champs suivants :

• ID_SESSION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

Access Livre Page 59 Mercredi, 27. f vrier 2008 7:28 07

Page 65: Access 2007 Et VBA

60 Access® 2007 et VBA

• 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é.

EXERCICE 3 CRÉER LA BASE DE DONNÉES DU SYSTÈME TÉLÉPÉAGE

* Solution Bien que relativement simple, le modèle relationnel du système télépéage demande unniveau d’abstraction assez élevé et recèle quelques pièges si ses éléments fondamentaux nesont 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 ungroupement de passages, tous abrités par une grande arche, mais un couloir de péage parlequel ne peut passer qu’un seul véhicule en même temps. Cette distinction revêt la plushaute importance pour arriver à bien conjuguer les relations à mettre en place, en particulierconsidé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.

• Énoncé Imaginez que vous êtes le responsable informatique du système télépéage. Les grandsprincipes : un groupement d’intérêt économique nommé Télépéage réunit toutes lessociétés d’autoroute françaises (Sanef, APRR, Escota, etc.). Chaque société d’autoroutepossè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éecomme à la sortie, de sorte que les voyages sont facturés en fin de mois et en bloc pourtous 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.

Access Livre Page 60 Mercredi, 27. f vrier 2008 7:28 07

Page 66: Access 2007 Et VBA

61Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

La présence de deux types de clients, les particuliers et les entreprises, pourrait induire enerreur et pousser le concepteur à créer deux tables distinctes. Cette dissociation n’est pasnécessaire et compliquerait beaucoup le modèle pour un faible avantage. La seule problé-matique de la fusion des deux types de clientèle concernera les zones obligatoires de lafiche 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 3badges, pour lui-même et ses deux enfants). Le badge apparaît donc comme un élémentindispensable du modèle : ce n’est pas le client qui passe le péage, mais son badge, ce quiest 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 estenvisageable qu’un client rende son badge au système télépéage, pour beaucoup de motifsvalables, et que ce dernier soit mis en location auprès d’un autre et nouveau client. End’autres termes, si le badge est considéré comme une non-valeur et qu’il est jeté aprèsusage, 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 couloirde 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.

Le prix qui sera facturé au client doit être incorporé dans le modèle. Assurément, il nepeut pas être intégré directement dans la table des stations de péage puisqu’il est fonctionnon pas d’une seule station mais du degré de proximité avec une autre station. Il s’agitdonc bien d’une relation réflexive de la table « STATION » avec elle-même.

Access Livre Page 61 Mercredi, 27. f vrier 2008 7:28 07

Page 67: Access 2007 Et VBA

62 Access® 2007 et VBA

• une station de départ correspond à un prix pour joindre une autre station d’arrivée (iln’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 pourl’aller et le retour depuis une station vers une autre. On peut également ajouter une datede 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’onse contentera de jeter les petits carrés des tables, les identifiants et les clés étrangères, et lesrelations. Le brouillon devrait donner un résultat voisin de la figure 2.16.

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 sonten 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èmesde barrières. Sa lecture mensuelle sera à la base de la facturation.

2. Création des tables

Voici la liste des tables avec leurs différents champs.

Table « CLIENT » : • ID_CLIENT, Clé primaire, NuméroAuto, Entier long.

• TYPE_CLIENT, Numérique, Entier, Obligatoire, non indexé, pourvu d’une liste dechoix en forme de zone de liste déroulante et dont la liste des valeurs est 1 pour Entre-prise et 2 pour Particulier (la liste doit être limitée à ces deux seules valeurs, le formatest 1;"Entreprise";2;"Particulier").

• RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null autorisé, non indexé. La zonene peut pas être obligatoire puisque certains clients sont des particuliers. Il faudra doncprévoir des contrôles particuliers dans les formulaires de saisie pour vérifier que l’un

Figure 2.16Première approche du modèle relationnel du système télépéage.

Access Livre Page 62 Mercredi, 27. f vrier 2008 7:28 07

Page 68: Access 2007 Et VBA

63Le modèle relationnel, concevoir une base de données

Exercice

s

2Chapitre

des deux champs « NOM_CLIENT » ou « RAISON_SOCIALE_CLIENT » est effec-tivement rempli.

• NOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé1.

• PRENOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé.

• SIRET_CLIENT (SIRET signifiant Service d’Inscription au Registre des Établissementset constituant l’identifiant de toute société commerciale). Le champ est de type« Texte » avec 15 caractères, le « Null » est autorisé, mais la colonne est « indexée sansdoublon » afin de garantir l’absence de double inscription d’une entreprise. Le champest doté d’un masque de saisie déjà existant, nommé « N˚Siret ».

• NO_INTRACOM_CLIENT : il s’agit du n˚ intracommunautaire, obligatoire pour lafacturation des clients européens non français. Comme le SIRET, la colonne est en« Null autorisé » mais « indexée sans doublon ». Le masque de saisie n’existant pas, ilfaut le créer, il est de la forme « CC 99 000 000 000 » où CC désigne le pays (FR, BE, IT,etc.), 99 est une clé et les 9 chiffres suivants les 9 premiers chiffres du numéro de Siret (ilfaudra prévoir dans le formulaire de saisie un contrôle pour vérifier que les deuxnuméros concordent, ce type de contrôle n’étant pas possible au niveau de la tableelle-même).

Pour créer un nouveau masque de saisie :

1. Le curseur supérieur visant le champ « NO_INTRACOM_CLIENT », cliquez sur lazone « Masque de saisie » et sur le bouton aux trois petits points de la marge de droite.

2. Cliquez sur Modifier la liste.

3. Créez un nouvel enregistrement en cliquant sur le point jaune voisinant les boutonsde déplacement.

4. Dans « Description », indiquez « N˚Intracommunautaire ».

5. Dans « Masque de saisie », saisissez la chaîne de caractères > CC 00 000 000 000 (lesigne supérieur > oblige à une saisie en majuscules, le CC indique qu’il s’agit de carac-tères, les zéros suivants obligent à la saisie de chiffres, les espaces décomposentlogiquement la codification).

6. Dans l’exemple, recopiez la chaîne de caractères « CC 99 000 000 000 ».

7. Fermez la fenêtre et choisissez le nouveau masque (testez-le en saisie pour vérifier saconformité).

• ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé.

• ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé.

• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé.

• VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé.

Table « STATION » : • ID_STATION, Clé primaire, NuméroAuto, Entier Long, Obligatoire, Indexé sansdoublon.

• ID_STE_AUT, (clé étrangère de la table « STE_AUT »), Numérique, Entier long, Nullinterdit, non indexé.

• NOM_STATION, Texte, 50 caractères, Null interdit, non indexé.

1. Un index avec doublon pourrait être posé sur les deux champs « RAISON_SOCIALE_CLIENT » et « NOM_CLIENT » pour améliorer lesrecherches, mais cet index aurait a gérer de nombreuses valeurs « Null », ce qui le rendrait peu performant.

Access Livre Page 63 Mercredi, 27. f vrier 2008 7:28 07

Page 69: Access 2007 Et VBA

64 Access® 2007 et VBA

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 larelation 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, Nullinterdit, non indexé.

• NO_PEAGE, Numérique, Entier, Null interdit, non indexé (pour indiquer le numérodu 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 dela 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, Entierlong, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage dedépart.

• ID_STATION2, (deuxième clé étrangère de la table « STATION »), Numérique, Entierlong, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péaged’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éanmoinsdangereux de pratiquer la création de cette table en effectuant un copier/coller de la tabledes clients. Les noms de champs, en particulier, doivent tous être suffixés « _STE_AUT » etnon plus « _CLIENT ».

Vous terminerez l’exercice en mettant en place toutes les relations grâce au bouton « Relationsdes 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.

Access Livre Page 64 Mercredi, 27. f vrier 2008 7:28 07

Page 70: Access 2007 Et VBA

65

3Les différentes formes d’acquisition de données, importer et attacher

Il existe de multiples manières d’acquérir des don-nées dans Access. On peut les importer complète-ment dans une base déjà existante, mais, au-delà de cette première approche, on peut attacher des sources de données à une base sans avoir à les manipuler dans Access. Ces données acquises, le logiciel offre un puissant assistant pour créer 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.

1. Les importations de données..... 662. Les liaisons de données ............ 71

Problèmes et exercices 1. Importer des données

au format Excel ....................... 75

2. Importer des données au format CSV ........................ 77

3. Importer des données d’une autre base Access........... 79

4. Établir les contraintes référentielles............................ 80

Chapitre

Access Livre Page 65 Mercredi, 27. f vrier 2008 7:28 07

Page 71: Access 2007 Et VBA

66 Access® 2007 et VBA

(1) Les importations de données

Par importation, on entend l’addition de nouvelles données dans une base existante, quideviennent dès lors totalement indépendantes de la source depuis laquelle elles ont étépuisées. Pour les exposés à venir, il est nécessaire de récupérer sur le site de l’éditeur, àl’adresse www.pearsoneducation.fr, les fichiers « Codes_Postaux_France.xlsx » (Excel),« Codes_Postaux_France.accdb » (Access), « Codes_Postaux_France_Séparateurs.txt »(format texte délimité) et « Codes_Postaux_France_Fixe.txt » (format texte fixe).

1.1 LE SIMPLE COPIER-COLLER

Dans la mesure où les produits Microsoft sont intégrés les uns aux autres, la manière laplus 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 vosdocuments 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 quedeux colonnes.

3. Ouvrez la table « CP » en mode Feuille de données en double-cliquant sur le nom de latable.

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 Accesscherche à 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.

Access Livre Page 66 Mercredi, 27. f vrier 2008 7:28 07

Page 72: Access 2007 Et VBA

67Les différentes formes d’acquisition de données, importer et attacher

3Chapitre

• Access cherchera à coller les données dans la mesure du possible : les deux colonnes quiréceptionnent les données sont au format texte et d’une très grande largeur, le collagesera 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 lesenregistrements en erreur.

• Le collage étant réalisé, on remarque que la première ligne, qui contenait dans Excel leslibellés de colonne n’a pas été collée, alors qu’elle aurait pu être importée, puisqueles colonnes destinataires ont un format texte conforme.

Le copier/coller par ajout sera toujours possible, qu’il s’agisse d’une feuille Excel, d’untableau dans Word, d’un fichier texte ou de toute autre source, à condition que les formatssource et destination soient compatibles.

1.2 L’IMPORTATEUR EXCEL

Access dispose d’outils destinés à importer ou lier des données externes.

• Dans le menu « Données externes », cliquez sur l’icône Excel du ruban.

Figure 3.1Ajout des codes postaux dans la table CP.

Access Livre Page 67 Mercredi, 27. f vrier 2008 7:28 07

Page 73: Access 2007 Et VBA

68 Access® 2007 et VBA

Le programme ouvre une fenêtre de dialogue présentée à la figure 3.2.

Cette grille-écran propose :

• Soit d’importer les données dans une nouvelle table.

• Soit d’importer les données dans une table existante (c’est l’équivalent exact du copier/coller par ajout du paragraphe précédent).

• Soit d’établir un lien, comme on le verra plus loin.

Dans un premier temps, nous importerons les données dans une nouvelle table :

1. Cliquez sur le bouton « Parcourir », choisissez le chemin et le nom du fichier à importer(Codes_Postaux_France.xlsx), puis cliquez sur « OK ».

2. L’assistant d’importation ouvre une fenêtre de première étape permettant de choisir lafeuille où se trouvent les données à importer. Le nom de l’onglet deviendra le nomde la table (qu’il sera toujours possible de renommer ultérieurement). Cliquez sur« Suivant ».

3. La deuxième étape demande à l’utilisateur si l’en-tête des colonnes est indiqué sur lapremière ligne Excel : cochez la case puisque c’est effectivement le cas, puis cliquez sur« Suivant ».

4. La troisième étape ouvre la fenêtre présentée à la figure 3.3.

• Les en-têtes de colonnes du fichier Excel ayant été reconnus, ils sont incorporés auxnoms de champ (s’ils n’existaient pas, il serait alors possible de les indiquer dans la zonesupérieure gauche).

• Le type de données est reconnu d’après les caractéristiques Excel, mais il peut êtremodifié.

Figure 3.2Ajout des codes postaux dans la table CP.

Access Livre Page 68 Mercredi, 27. f vrier 2008 7:28 07

Page 74: Access 2007 Et VBA

69Les différentes formes d’acquisition de données, importer et attacher

3Chapitre

• Access adapte le mieux possible le niveau d’index. Toutefois, il ne lit pas la totalité de lacolonne et propose un niveau moyen : ici, l’index sans doublon peut être choisipuisqu’il n’y a pas de doublon.

• La case inférieure droite permet de ne pas importer des colonnes exclues.

L’étape suivante concerne la clé primaire de la table ; par défaut, Access propose d’ajouterune 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 dansla base importatrice : nommez la table « CODE_POSTAL ».

À ce stade, tous les paramètres de l’importation sont en place et il serait possible de cliquersur « Terminer » ; toutefois Access permet d’enregistrer ces paramètres pour reproduirela 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 typed’importation de nouvelles fois.

1.3 L’IMPORTATEUR DE FICHIER TEXTE

Comme Excel, Access peut importer tous types de fichier texte :

• fichier à structure délimitée, dans lequel chaque champ est séparé par un caractèreparticulier, le point-virgule, la virgule ou tout autre ;

• fichier à structure de longueur fixe, dans lequel chaque champ a une position et unelongueur de caractères prédéfinies.

Figure 3.3Étape 3 d’une importation Excel.

Access Livre Page 69 Mercredi, 27. f vrier 2008 7:28 07

Page 75: Access 2007 Et VBA

70 Access® 2007 et VBA

Les fichiers texte délimitéDans le ruban du menu « Données externes », cliquez sur l’icône Fichier texte ; le choix dufichier « Codes_postaux_France_Séparateurs.txt », téléchargé depuis le site de l’éditeur, àl’adresse www.pearsoneducation.fr, provoque l’ouverture de la fenêtre présentée à lafigure 3.4.

Dans le pavé inférieur, la lecture du texte permet de bien identifier la nature du fichier et ladéfinition du séparateur, ici le point-virgule. L’étape qui suit validera le choix du séparateur etla présence des en-têtes de colonnes.

Toutes les étapes suivantes sont identiques à celles qui ont été décrites dans la section 1.2des importations depuis Excel.

Les fichiers texte de longueur fixeLes procédures d’importation d’un fichier texte de longueur fixe ne varient pas des autresà ceci près que le positionnement des champs sera déterminé par un tracé d’enregistrementfourni par le concepteur du fichier source. La détermination des largeurs de champ estréalisée grâce à l’utilisation d’une réglette visible lors de la deuxième étape.

Il est vivement recommandé d’utiliser le bouton « Avancé » de cette étape et de mémoriserles paramètres d’importation. Cette phase étant délicate et longue à mettre en œuvre, il est

Figure 3.4Étape 1 d’une importation de fichier texte délimité.

Access Livre Page 70 Mercredi, 27. f vrier 2008 7:28 07

Page 76: Access 2007 Et VBA

71Les différentes formes d’acquisition de données, importer et attacher

3Chapitre

plus prudent de l’intégrer à l’importation elle-même suivant la démarche montrée à lafigure 3.5.

(2) Les liaisons de données

Contrairement aux importations, qui intègrent définitivement les données dans la baseactive et doivent être reproduites à chaque mise à jour du fichier source, les liaisons dedonnées permettent une mise à jour permanente du résultat affiché dans Access. Enrevanche, sauf en cas de connexion ODBC (Open DataBase Connectivity) ou de liaisonavec une autre base de données, toute modification dans la base active des données sourceest impossible : les données attachées à Access sont en lecture seule.

Les liaisons avec Excel, une autre table Access ou un fichier texte se mettent en place de lamême manière que pour une importation, à la différence près que l’option « Importer lesdonnées » est remplacée par l’option « Lier à la source de données » en créant une « tableattachée ». Pour ce nouveau cas de figure, procédez aux opérations suivantes :

1. Dans le ruban du menu « Données Externes », cliquez sur l’icône Access.

2. Pointez le fichier « Codes_Postaux_France.accdb » et cochez l’option « Lier la sourcede données ».

Figure 3.5Étape 2 d’une importation de fichier texte de longueur fixe et mémorisation des paramètres.

Access Livre Page 71 Mercredi, 27. f vrier 2008 7:28 07

Page 77: Access 2007 Et VBA

72 Access® 2007 et VBA

3. Access propose la liste des tables contenues dans la base ciblée, comme à la figure 3.6.

4. Cliquez sur le bouton « Sélectionner tout » puis sur « OK » : toutes les tables sontattaché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-écranque montre la figure 3.7.

Figure 3.6Choix des tables à lier à la base active.

Figure 3.7Paramétrage de la connexion ODBC.

Access Livre Page 72 Mercredi, 27. f vrier 2008 7:28 07

Page 78: Access 2007 Et VBA

73Les différentes formes d’acquisition de données, importer et attacher

3Chapitre

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é à lafigure 3.8 est donc primordial.

Deux cas de figure peuvent se présenter :

• Soit des procédures de single sign-on ont été mises en place dans l’entreprise : celles-cipermettent de coupler l’identification et l’authentification à la base de données avecl’identification au niveau du login réseau Windows ; la connexion est immédiate sil’utilisateur est déjà reconnu sur le réseau.

• Soit les paramètres de login/mot de passe sont spécifiques à la base ciblée. Dans ce cas,l’administrateur de la base de données doit impérativement vous communiquer cescoordonnées.

Suivant le type de base sur laquelle se fait la liaison, deux grilles-écran proposent éventuel-lement de peaufiner la connexion ; il s’agit surtout des connexions avec SQL Server.

À l’issue de ces opérations, le serveur SQL (ou toute autre base) liste toutes les tables acces-sibles, à l’image de celles présentées à la figure 3.9.

Figure 3.8Paramétrage du login à la base de données.

Figure 3.9Tables, vues et autres objets disponibles sous SQL Server.

Access Livre Page 73 Mercredi, 27. f vrier 2008 7:28 07

Page 79: Access 2007 Et VBA

74 Access® 2007 et VBA

La mise en place de ce type de liaison ouvre la porte à des développements conséquentsdans lesquels les tables, vues et autres objets sont stockés dans une grosse base de donnéescentrale gérant avec précision et sécurité les accès aux informations (contrairement àAccess).

Au total, les différents types de liens sont représentés à la figure 3.10, chacun avec son logoparticulier. Pendant que la simple table affiche le logo classique déjà étudié, chaque liaisonse signale par la présence d’une petite flèche et un dessin particulier.

Pour retrouver l’emplacement des fichiers source (sauf connexion ODBC), cliquez dubouton 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 fichierstexte de largeur fixe. Les paramètres d’importation peuvent être mémorisés et permettreainsi la reproduction de ces importations.

Toutes les caractéristiques de l’importation sont applicables de la même manière pourcréer des attaches avec les mêmes objets sources. Contrairement aux importations, lesattaches 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 dedonnées d’entreprise telles qu’Oracle, MS-SQL Server, MySQL ou autres.

Figure 3.10Logos des liaisons.

Access Livre Page 74 Mercredi, 27. f vrier 2008 7:28 07

Page 80: Access 2007 Et VBA

75Les différentes formes d’acquisition de données, importer et attacher

Exercice

s

3Chapitre

Problèmes et exercicesLes exercices de ce chapitre visent à importer de diverses manières des données externespour 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 suivantsexploiteront les données chargées via de nombreuses requêtes.

EXERCICE 1 IMPORTER DES DONNÉES AU FORMAT EXCEL

* Solution 1. Importation du fichier

Le fichier « ELEVE.xlsx » est un fichier au format Excel 2007. Son importation nécessite lacréation préalable de la future base de données.

1. Démarrez Access.

2. Cliquez sur le bouton « Base de données vide ».

3. En bas à droite, précisez le chemin de création de cette base en cliquant sur l’icône dedossier Windows.

4. En bas à droite, nommez la nouvelle base « ECOLE_INTERNATIONALE.accdb ».

5. Cliquez sur le bouton « Créer ».

6. Pour plus de clarté, fermez la table qui a été créée automatiquement.

7. Dans le ruban du menu « Données externes », cliquez sur Excel.

8. Dans la fenêtre qui s’est ouverte, pointez le fichier « ELEVE.xlsx ».

9. Vérifiez que le bouton, en dessous, concerne bien une importation et non une attachepuis validez par « OK ».

10. Cliquez sur « Suivant » à la première étape d’importation (il n’y a qu’une seule feuilledans le fichier Excel, nommée elle aussi « ELEVE »).

11. À la deuxième étape, cochez la case « Première ligne contient les en-têtes de colonne »,puis « Suivant ».

12. Lorsque tous les paramètres de la troisième étape sont corrects (vérifiez-les colonnepar colonne !), cliquez sur « Suivant ».

13. À la quatrième étape, cochez l’option « Choisir ma propre clé primaire » et laissez lacolonne « ID_ELEVE » proposée ; cliquez sur « Suivant ».

14. À la cinquième étape, laissez le nom « ELEVE » pour la future table, ne cochez pasl’option « Je souhaite que l’assistant… » (nous ferons nous-mêmes l’analyse pro-posée).

• Énoncé 1. Téléchargez le fichier « ELEVE.xlsx » sur le site de l’éditeur, à l’adresse www.pearso-neducation.fr, puis importez-le dans une nouvelle base nommée « ECOLE_INTER-NATIONALE.accdb ».

2. Après importation, mettez au point tous les champs pour une utilisation optimaledes données.

Access Livre Page 75 Mercredi, 27. f vrier 2008 7:28 07

Page 81: Access 2007 Et VBA

76 Access® 2007 et VBA

15. Ne cochez pas l’option de mémorisation de cette importation (elle ne se reproduirapas).

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 possiblede 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 », cequi paraît étonnant puisque la colonne est une colonne primaire. Vous pouvez modifiercette 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 laproprié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 lamê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 doitdevenir obligatoire.

16. Le champ « SEXE_ELEVE » peut être réduit à un caractère et doté d’une liste dechoix : 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.

Access Livre Page 76 Mercredi, 27. f vrier 2008 7:28 07

Page 82: Access 2007 Et VBA

77Les différentes formes d’acquisition de données, importer et attacher

Exercice

s

3Chapitre

EXERCICE 2 IMPORTER DES DONNÉES AU FORMAT CSV

* 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 lastructure, 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’éditeurNotePad s’ouvre.

3. Cliquez sur « Fichier > Ouvrir ».

4. Dans la fenêtre d’ouverture de fichier, cliquez sur le type « Tous les fichiers » et pointezle fichier « NOTE.csv » récupéré.

Ce fichier apparaît tel qu’à la figure 3.11.

• Énoncé 1. Téléchargez le fichier « NOTE.csv » et importez-le dans la base « ECOLE_INTER-NATIONALE.accdb ».

2. Après importation, mettez au point tous les champs pour une utilisation optimaledes données.

Figure 3.11Fichier CSV lu sous NotePad.

Access Livre Page 77 Mercredi, 27. f vrier 2008 7:28 07

Page 83: Access 2007 Et VBA

78 Access® 2007 et VBA

Chaque ligne comprend 4 champs séparés chacun par des points-virgules :

• Le premier champ est le numéro (l’ID) de l’élève.

• Le deuxième champ est le numéro de la matière enseignée.

• Le troisième champ est la note de l’élève.

• Le dernier champ est la date d’attribution de la note.

Fermez le fichier pour pouvoir l’importer :

1. Ouvrez à nouveau, si nécessaire, la base de données « ECOLE_INTERNATIO-NALE.accdb ».

2. Dans le menu « Données externes », cliquez sur « Fichier texte ».

3. Dans la fenêtre d’importation, pointez le fichier « NOTE.csv » et cliquez sur« Ouvrir ».

4. Optez pour une importation et non pas une attache ou l’ajout à une table existante.

5. La première étape de l’importation détecte à juste titre un fichier délimité, cliquez sur« Suivant ».

6. La deuxième étape détecte à juste titre le point-virgule comme séparateur.

7. La troisième étape ne reconnaît pas de noms de champ puisque, par définition, il n’enexiste pas :

Le champ1 doit être renommé « ID_ELEVE », le type de données et l’index sontcorrects.

Cliquez dans le corps des données présentées et dans la deuxième colonne : lechamp2 doit être renommé « ID_MATIERE », le type de données et l’index sontcorrects.

Le champ3 doit être renommé « NOTATION », le type de données doit être modifiéen réel simple (les notes ne sont pas toujours des valeurs entières, même si, ici, iln’existe que des notes arrondies à l’unité).

Le champ4 doit être renommé « DATE_NOTE », le type de données Date/heure estcorrect.

8. Cliquez sur « Suivant ».

9. Dans l’étape suivante, laissez Access ajouter une clé primaire, puis cliquez sur« Suivant ».

10. À la dernière étape, nommez la table « NOTE » (valeur reprise par défaut).

11. N’enregistrez pas les étapes d’importation.

La table importée doit avoir l’apparence de la figure 3.12.

Access Livre Page 78 Mercredi, 27. f vrier 2008 7:28 07

Page 84: Access 2007 Et VBA

79Les différentes formes d’acquisition de données, importer et attacher

Exercice

s

3Chapitre

2. Révision des caractéristiques de la table

• La clé primaire insérée par Access porte le nom « ID » par défaut : renommez-la « ID_NOTE ».

• Déclarez tous les champs en « Null interdit ».

• Insérez des légendes à tous les champs.

• Au moment de la fermeture de la table en mode modification, Access avertit que lesrègles d’intégrité ont été modifiées (les champs ont été déclarés en Null interdit). Il pro-pose de tester les données existantes avec les nouvelles règles : répondez par « Oui »,puisque les nouvelles règles sont conformes.

EXERCICE 3 IMPORTER DES DONNÉES D’UNE AUTRE BASE ACCESS

* Solution La base « ECOLE_INTERNATIONALE » étant ouverte, procédez de la manière suivante :

1. Dans le menu « Données externes », cliquez sur le bouton « Access » du ruban.

2. Dans la fenêtre d’importation, pointez le fichier « MATIERE.accdb » puis « Suivant ».

Figure 3.12Table NOTE immédiatement après importation.

• Énoncé Téléchargez le fichier « MATIERE.accdb » et importez la table de cette base nommée« MATIERE » dans la base « ECOLE_INTERNATIONALE.accdb ».

Après importation, mettez au point tous les champs pour une utilisation optimale desdonnées.

Access Livre Page 79 Mercredi, 27. f vrier 2008 7:28 07

Page 85: Access 2007 Et VBA

80 Access® 2007 et VBA

3. Sélectionnez la table « MATIERE » (la seule), de la base et cliquez « OK ».

4. Ne mémorisez pas les paramètres.

Vous devez vérifier tous les paramètres, mais les caractéristiques de la table sont conformesaux normes qui ont été exposées auparavant.

EXERCICE 4 ÉTABLIR LES CONTRAINTES RÉFÉRENTIELLES

* 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 sorted’obtenir le modèle relationnel de la figure 3.13.

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’unepart, 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, etgé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 ».

• É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 quetrois matières (ANGLAIS, ALLEMAND, ITALIEN) doivent être considérées comme unensemble nommé LANGUES VIVANTES, mettez en place la solution relationnelle.

Figure 3.13Premier modèle relationnel de la base ECOLE_INTERNATIONALE.

Access Livre Page 80 Mercredi, 27. f vrier 2008 7:28 07

Page 86: Access 2007 Et VBA

81Les différentes formes d’acquisition de données, importer et attacher

Exercice

s

3Chapitre

3. Cliquez immédiatement sur le bouton du « Mode modification » : Access demande lenom de la nouvelle table « GROUPE ».

4. La clé primaire sera nommée « ID_GROUPE ».

5. Créez un champ « NOM_GROUPE », type Texte, 50 caractères, obligatoire, nonindexé.

Opérez de même avec la table « REGROUPEMENT », dotée des champs suivants :

• ID_REGROUPEMENT, clé primaire, NuméroAuto, Indexé sans doublon.

• ID GROUPE (clé étrangère), Numérique, Entier long, obligatoire, non indexé.

• ID_MATIERE (clé étrangère), Numérique, Entier long, obligatoire, non indexé.

Établissez les relations avec ces nouvelles tables :

1. Ouvrez à nouveau, le cas échéant, la fenêtre des relations.

2. Cliquez sur le bouton du ruban « Afficher la table ».

3. Ajoutez les tables « GROUPE » et « REGROUPEMENT ».

4. Établissez les contraintes référentielles de sorte d’obtenir le modèle relationnel de lafigure 3.14.

Il reste à remplir les tables « GROUPE » et « REGROUPEMENT » pour obtenir les résultatsde la figure 3.15.

Conservez ces travaux, qui resserviront dans les chapitres suivants.

Figure 3.14Second modèle relationnel de la base ECOLE_INTERNATIONALE.

Access Livre Page 81 Mercredi, 27. f vrier 2008 7:28 07

Page 87: Access 2007 Et VBA

Access Livre Page 82 Mercredi, 27. f vrier 2008 7:28 07

Page 88: Access 2007 Et VBA

83

4Les requêtes

C’est par excès de langage qu’Access nomme « Requête » l’outil qui permet de rédiger et stocker une requête SQL. Une requête est une interrogation d’une ou plusieurs tables ; l’interrogation utilise un langage générique nommé SQL pour Structured Query Language (langage de requête structurée). Outre la lecture des données suivant une grande variété de tris et de filtres (c’est la commande SELECT de SQL), les requêtes permettent l’écriture de données par ajout, modification ou suppression (ce sont les commandes INSERT, UPDATE ou DELETE de SQL).Les premiers exemples de ce chapitre concernent la table « CODE_POSTAL » contenue dans la base « CODES_POSTAUX.accdb », téléchargeable sur le site de l’éditeur, à l’adresse www.pearsonedu-cation.fr. Par la suite, la table « ADRESSE », dans le même fichier Access, sera utilisée.

1. Les requêtes Sélection .............. 842. Les requêtes Insertion,

Suppression et Mise à jour ....... 953. Les requêtes création.............. 100

Problèmes et exercices 1. Affichage par ordre alphabétique .. 1032. Affichage sur critère de prénom ..... 1043. Affichage sur critère excluant un pays 1044. Affichage sur critères multiples ....... 1055. Affichage sur critère de date .......... 1056. Affichage sur critères de date

et de pays ..........................................7. Affichage avec valeurs distinctes .... 1078. Affichage des premiers éléments .... 1079. Affichage avec regroupement

par pays et comptage.................... 10810. Affichage avec jointure.................. 10811. Affichage avec jointure

et regroupement............................ 10912. Appel de requêtes multiples ........... 11013. Affichage de la moyenne générale . 11114. Affichage de la moyenne par matière......................................... 11215. Tableau croisé dynamique ............. 11316. Tableau croisé avec regroupement . 11417. Regroupement et coefficient ........... 11518. Requête Ajout ............................... 11819. Requête Suppression ..................... 12020. Requête Mise à jour ...................... 121

Chapitre

Access Livre Page 83 Mercredi, 27. f vrier 2008 7:28 07

Page 89: Access 2007 Et VBA

84 Access® 2007 et VBA

(1) Les requêtes Sélection

Cette section présente l’assistant de requêtes d’Access et les requêtes de sélection à partirdu fichier des codes postaux.

1. Ouvrez le fichier « CODES_POSTAUX.accdb ».

2. Dans la barre de menu « Créer », cliquez sur l’icône Création de requête, sur la droitedu ruban. Access ouvre une fenêtre dans laquelle apparaissent toutes les tables présentes ;un autre onglet propose aussi d’afficher les requêtes (il est possible, voire indispen-sable parfois, de faire une requête sur une requête).

3. Cliquez sur la table « CODE_POSTAL » puis sur « Ajouter » (un double-clic aboutitau même résultat).

4. Fermez cette fenêtre d’appel des sources.

L’écran, présenté à la figure 4.1, se divise en deux parties :

1. Une partie supérieure qui montre la ou les tables et requêtes appelées

Une partie inférieure présentant un tableau, pour le moment vide, où l’on paramétrera :

• Les champs que l’on veut voir retournés dans la feuille des résultats ;

• Le ou les ordres de tris attendus ;

• Le ou les filtres sur les données.

1. Faites un double-clic sur l’étoile se trouvant au-dessus de la clé primaire « CODE ».

2. Dans le pavé inférieur, première colonne, la zone « Champ » contient le libellé« CODE_POSTAL.* » signifiant « Tous les champs de la table CODE_POSTAL » ; lazone « Table » contient elle aussi le même nom de table.

3. Dans le ruban, cliquez sur Affichage (l’icône apparaît sous forme d’une grille, ce quisignifie affichage sous forme de feuille de données).

4. La nouvelle fenêtre fait apparaître les données dans un état exactement similaire àcelui de la table d’origine.

5. Dans le ruban, cliquez sur le petit triangle situé dans l’icône Affichage puis sur « ModeSQL ».

6. Une feuille blanche présente la requête SQL, écrite dans le langage original SQL.

Figure 4.1Fenêtre de l’assistant requêtes d’Access.

Access Livre Page 84 Mercredi, 27. f vrier 2008 7:28 07

Page 90: Access 2007 Et VBA

85Les requêtes

4Chapitre

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 larequête se termine obligatoirement par un point-virgule qui, dans le langage SQL, signalela 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 sousla 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 Affichagedu ruban. On y accède également grâce aux petites icônes situées en bas à droite de lafenê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 apparaissecomme une flèche noire vers le bas.

3. Appuyez sur la touche « Sup. » : la colonne est supprimée. L’assistant est prêt pour unenouvelle 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 ligneChamp de la première colonne située dans la partie inférieure de la fenêtre. Le mêmeré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 ladeuxiè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 petiteicô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, VILLEFROM CODE_POSTAL;.

7. Le résultat est obtenu en passant en mode feuille de données (via la flèche sous Affichageou 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 possibled’effectuer des tris et des filtres. Ces opérations sont totalement « accompagnées » par deschoix d’option adaptés au type de colonne (texte, numérique ou date). On peut, parexemple, ne montrer que les villes commençant par PARIS, ou les codes postaux finissantpar 000 (préfectures). Ces assistants ne mémorisent pas la présentation obtenue. Il nes’agit ici que d’une modification temporaire de l’affichage, qui n’affecte en rien la requêteinitiale. Les explications qui suivent montrent comment réaliser des tris et des filtres deplus en plus élaborés, et comment enregistrer les requêtes ainsi obtenues.

Access Livre Page 85 Mercredi, 27. f vrier 2008 7:28 07

Page 91: Access 2007 Et VBA

86 Access® 2007 et VBA

1.1 LES TRIS

Le fichier livré est déjà trié par ordre de code postal, nous voulons à présent le trier parville.

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éroulantequi 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 basde la fenêtre).

La requête renvoie tous les enregistrements triés par ville. Si l’on consulte la liste à la lettreP 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 parCODE.

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 noirepointé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 à gauchede 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, parcode 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é toutles 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 semettre à gauche.

3. Glissez de nouveau le champ « CODE » dans cette nouvelle colonne, n’y ajoutez pas denotion de tri.

4. Décochez la zone « Afficher » de la colonne CODE de droite pour obtenir la structurede la figure 4.2.

Figure 4.2Requête de tris successifs avec réordonnancement des colonnes.

Access Livre Page 86 Mercredi, 27. f vrier 2008 7:28 07

Page 92: Access 2007 Et VBA

87Les requêtes

4Chapitre

L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL ORDER BYVILLE, CODE; où la clause ORDER BY de tri se réalise dans l’ordre précisé. CODE etVILLE peuvent être éventuellement précédés par le nom de leur table d’appartenanceCODE_POSTAL avec un point séparateur (par exemple CODE_POSTAL.CODE) si la base dedonnées possède d’autres tables.

1.2 LES FILTRES

Cette section aborde les requêtes de filtrage. Il est préférable d’annuler les consignes de tripré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 consulterque 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 motPARIS.

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 parParis.

L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL WHEREVILLE LIKE "PARIS*"; 1.

L’astérisque qui suit le mot Paris fonctionne comme un « joker » qui sélectionne toutes lesoccurrences possibles après le mot Paris. Le positionnement de l’astérisque en début dechaî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 valeurspossibles ; 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érencessyntaxiques importantes sont à déplorer ; sous Oracle, la même requête se terminerait par WHERE VILLE LIKE ‘PARIS%’;

Access Livre Page 87 Mercredi, 27. f vrier 2008 7:28 07

Page 93: Access 2007 Et VBA

88 Access® 2007 et VBA

D’une manière différente, on peut également choisir la clause « ET » (AND en anglais).Si l’on désire voir toutes les préfectures (les villes dont le code postal finit par 000) etcommençant par le mot « ST », on procédera de la manière suivante :

1. Repassez en « Mode création ». Dans la première ligne des critères, colonne CODE,insérez « Comme "*000" ».

2. Dans la première ligne des critères, colonne VILLE, insérez « Comme "ST*" ».

3. La requête renvoie 4 enregistrements : St-Brieuc, St-Étienne, St-Lo, Strasbourg.

Dans ce nouveau cas de figure, et pour cumuler les conditions, les critères sont disposéssur la même ligne.

On peut exclure des enregistrements par l’instruction « Pas » (NOT en anglais).

1. En « Mode création », tous les critères antérieurs étant effacés, insérez le libellé « PasPARIS » dans le premier critère de la colonne VILLE.

2. Le résultat renvoie tous les enregistrements sauf ceux dont la ville comporte le motPARIS (7 980 lignes).

La commande SQL originale utilise la clause NOT : SELECT CODE FROM CODE_POSTALWHERE ((Not (VILLE)="PARIS"));

Outre le simple rapprochement de caractères, l’assistant requête peut faire jouer denombreux autres opérateurs :

1. En « Mode création », effacez les critères de filtre précédents.

2. Dans la zone Critères de la colonne CODE, insérez le libellé « >=75000 ».

3. La requête renvoie 1 818 enregistrements et plus précisément tous les codes postauxsupérieurs ou égaux à 75000. On notera que l’opération fonctionne alors même que lacolonne est déclarée comme de type texte : Access effectue une conversion implicitedes données pour interpréter la requête.

La requête appelant tous les enregistrements relatifs à la ville de Paris sur la base du codepostal s’écrira comme l’indique la figure 4.3 (101 enregistrements renvoyés).

L’équivalent SQL de cette requête s’écrit SELECT CODE, VILLE FROM CODE_POSTAL WHERECODE>="75000" AND CODE<"76000";.

1.3 LES REQUÊTES À VALEURS DISTINCTES

Reprenons la requête ne renvoyant que les enregistrements dont la ville est PARIS (lelibellé "PARIS" dans la zone Critère de la colonne VILLE) : nous rappelons qu’elle renvoie29 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.

Figure 4.3Requête cumulant des critères à opérateur arithmétique.

Access Livre Page 88 Mercredi, 27. f vrier 2008 7:28 07

Page 94: Access 2007 Et VBA

89Les requêtes

4Chapitre

2. Posez le critère « PARIS » (la requête doit renvoyer à ce moment 29 lignes).

3. En « Mode création », dans le ruban, cliquez sur « Feuille des propriétés de larequête » (ou bien cliquez du bouton droit et sélectionnez « Propriétés »).

4. À la ligne Valeurs distinctes, mettez la propriété « Oui ».

5. La requête ne renvoie plus qu’un seul enregistrement car toutes les valeurs de lacolonne VILLE sont identiques. Il s’agit du mot PARIS.

Cette requête s’écrit simplement SELECT DISTINCT VILLE FROM CODE_POSTAL WHEREVILLE="PARIS";

1.4 LES REQUÊTES PARAMÉTRÉES

Une requête peut intégrer un ou plusieurs paramètres qui seront fournis par l’utilisateurlors 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 descrochets : « [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’ouvrecontenant 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.

1.5 LES ALIAS ET LES FONCTIONS

Pour éviter de présenter le nom du champ d’où sont extraites les données, souvent peucompré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 servirdans 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é à droitedes deux-points ; on notera que l’alias peut comporter des espaces alors que si le nom dechamp 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.

Attention

La clause DISTINCT s’applique à toutes les colonnes de la requête ; si vous remettez la colonneCODE dans la requête, celle-ci renverra alors et de nouveau 29 enregistrements.

Access Livre Page 89 Mercredi, 27. f vrier 2008 7:28 07

Page 95: Access 2007 Et VBA

90 Access® 2007 et VBA

Les alias deviennent indispensables lorsque des fonctions sont utilisées. Nous allonscréer une requête dans laquelle apparaîtra une colonne supplémentaire indiquant ledé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 modecré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 etVILLE.

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’unechaîne de caractères ; le nombre de caractères à extraire doit être indiqué dans la fonctionaprès un séparateur point-virgule. L’équivalent SQL donne SELECT Left([CODE],2) ASDépartement, CODE, VILLE FROM CODE_POSTAL; le mot-clé LEFT est le même en SQL eten Visual Basic ; comme presque tous les autres mots-clés, il est francisé pour l’utilisationd’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 lemontre la figure 4.4.

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 dansles deux exemples suivants :

• la fonction SI() sous Excel se nomme VRAIFAUX() sous Access ;

Figure 4.4Générateur d’expression d’Access.

Access Livre Page 90 Mercredi, 27. f vrier 2008 7:28 07

Page 96: Access 2007 Et VBA

91Les requêtes

4Chapitre

• la fonction STXT() sous Excel (extraction de caractères dans une chaîne) se nommeEXTRACCHAÎNE() sous Access.

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égatsqui s’appliquent sur des ensembles d’enregistrements et qui sont étudiées ci-après.

1.6 LE REGROUPEMENT DE DONNÉES

Dès qu’il est nécessaire de regrouper des données, soit pour présenter des synthèses, soitpour effectuer des calculs, l’affichage de la requête en mode création doit comporter descritè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 lafigure 4.5.

Rédigée comme le présente la figure 4.5, la requête de regroupement renverra le mêmenombre d’enregistrements qu’une requête simple : tous les enregistrements sont distinctset ne peuvent pas être regroupés puisque les codes postaux sont tous différents.

1. Supprimez la colonne CODE et visualisez de nouveau le résultat. La requête ne ren-voie plus que 7 766 enregistrements (au lieu de 8 004) : toutes les lignes contenant lemême mot PARIS, par exemple, ont été regroupées pour ne plus décompter lesdoublons.

2. Supprimez la colonne VILLE, le résultat renvoie les 97 départements français (Outre-Mercompris).

L’équivalent SQL de cette requête sera SELECT Left([CODE],2) AS Département FROMCODE_POSTAL GROUP BY Left([CODE],2); où la clause GROUP BY commande le regrou-pement.

Le nombre de bureaux distributeurs par département sera obtenu de la manière suivante :

1. Dans la première colonne, renseignez la zone Champ par « Département: Gauche([CODE] ;2) ».

2. Choisissez l’opération « Regroupement ».

3. Dans la deuxième colonne, insérez le champ « CODE ».

4. Choisissez l’opération « Compte ».

Le résultat montre que le département de l’Ain compte 90 bureaux distributeurs, l’Aisne78, etc.

Figure 4.5Requête de regroupement de données.

Access Livre Page 91 Mercredi, 27. f vrier 2008 7:28 07

Page 97: Access 2007 Et VBA

92 Access® 2007 et VBA

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 portepas sur chaque item mais sur le regroupement, comme le montre plus explicitement latraduction 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 attenducompte tous les bureaux distributeurs de la ville de Paris, il faudra composer la requête àl’image de la figure 4.6.

Cette fois, l’interprétation SQL de la requête devient SELECT Left([CODE],2) AS Dépar-tement, Count(CODE) FROM CODE_POSTAL WHERE VILLE="PARIS" GROUP BY

Left([CODE],2); où la condition WHERE est appliquée avant d’opérer le regroupementGROUP BY.

1.7 LES REQUÊTES SUCCESSIVES

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 ledé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 secondeavec les résultats de la première1. 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 (pasd’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êtesous 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 ».

Figure 4.6Requête de regroupement de données avec filtre scalaire.

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 approchelimité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 bienindiquer 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 tablesTbl_ et recommandons de ne pas insérer d’espaces dans les noms d’objets. Ces recommandations cherchent à recouper clarté dans les conceptset facilité dans la frappe du code.

Access Livre Page 92 Mercredi, 27. f vrier 2008 7:28 07

Page 98: Access 2007 Et VBA

93Les requêtes

4Chapitre

5. Insérez le champ « Département » en première colonne, en double-cliquant sur cechamp dans la table.

6. En option d’opération, sélectionnez le « Compte ».

7. On obtient le seul enregistrement de décompte final avec la valeur 97.

1.8 LES JOINTURES

La table « ADRESSE » est contenue dans le fichier « Access CODES_POSTAUX.accdb »disponible sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr.

1. Fermez toutes les requêtes et tables en cours.

2. Consultez la table « ADRESSE » en double-cliquant dessus.

Cette table comporte simplement (il est important de le noter) six enregistrements.Curieusement, les codes postaux des six contacts sont bien renseignés, en revanche, ilmanque une colonne pour désigner la ville du domicile. En fait, cette situation est tout àfait normale puisque les noms des villes peuvent être parfaitement connus grâce aux seulscodes postaux et la table de tous les codes français.

Les actions suivantes mettent en place une jointure entre la table « ADRESSE » et la table« CODE_POSTAL », ce qui permet d’afficher le nom de la ville associée au code postalcontenu dans la table « ADRESSE ».

1. Créez une nouvelle requête.

2. Sélectionnez les tables « CODE_POSTAL » et « ADRESSE » dans la fenêtre Afficher latable : vous noterez qu’un « fil de liaison » apparaît automatiquement entre les deuxchamps CODE des deux tables ; c’est uniquement en raison de l’identité des noms dechamp qu’Access établit cette liaison puisqu’aucune relation formelle n’a été poséeentre les deux tables.

3. Insérez, dans la zone Champ de chaque colonne, tous les champs des deux tables pourobtenir le résultat visuel de la figure 4.7.

Affichée en mode feuille de données, la requête montre six enregistrements, le code étantprésent deux fois (dans la table « ADRESSE » et dans la table « CODE_POSTAL »). La villede domicile est désormais correctement renseignée ; il a été établi une jointure entre les

Figure 4.7Requête avec jointure.

Access Livre Page 93 Mercredi, 27. f vrier 2008 7:28 07

Page 99: Access 2007 Et VBA

94 Access® 2007 et VBA

deux tables et Access montre tous les enregistrements de la table « ADRESSE » et tous lesenregistrements correspondants de la table « CODE_POSTAL ».

1. En mode création, cliquez du bouton droit sur la jointure (le trait) qui avait été établieautomatiquement 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 produitcarté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. Enrevanche, 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 queplusieurs sources de données sont appelées dans la requête. Il peut être créé autant dejointures que nécessaire, en nombre illimité.

2. Rétablissez la jointure en faisant un glisser/déplacer de la clé primaire CODE vers saclé étrangère de la table « ADRESSE », puis cliquez à nouveau du bouton droit surcette jointure pour en afficher les propriétés, comme à la figure 4.8.

Access offre la possibilité d’établir des jointures dites droite ou gauche :

• La jointure gauche (cas numéro 2 de la figure 4.8) montre tous les enregistrements de latable des adresses et seulement ceux correspondants dans la table des codes (elle renvoiesix enregistrements puisque tous les codes postaux des adresses sont valides).

• La jointure droite (cas numéro 3 de la figure 4.8) montre tous les enregistrements de latable des codes postaux et seulement ceux correspondants dans la table des adresses(elle renvoie donc les 8 009 enregistrements de la table « CODE_POSTAL »).

La syntaxe SQL utilise alors les clauses LEFT JOIN ou RIGHT JOIN.

1.9 L’ASSISTANT À LA RÉDACTION DE REQUÊTES

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 lesnotions abordées dans les paragraphes précédents sont bien assimilées ; de fait, il ralentitsingulièrement la mise en place d’une requête. En revanche, le même bouton du rubanpropose aussi de créer des requêtes assez complexes et pourtant fréquemment utilisées :

• les requêtes d’isolement des doublons ;

Figure 4.8Propriété d’une jointure.

Access Livre Page 94 Mercredi, 27. f vrier 2008 7:28 07

Page 100: Access 2007 Et VBA

95Les requêtes

4Chapitre

• les requêtes de non-correspondance.

En voici un exemple :

1. Dans le ruban du menu « Créer », cliquez sur l’icône Assistant Requête.

2. Sélectionnez l’assistant Trouver les doublons.

3. Choisissez la table « CODE_POSTAL ».

4. Choisissez la « Ville » comme champ susceptible de contenir des doublons.

5. Dans l’étape suivante, demandez à afficher aussi les codes postaux.

6. Cliquez sur « Terminer ».

La requête renvoie effectivement tous les doublons (489).

(2) Les requêtes Insertion, Suppression et Mise à jour

Toutes les requêtes Sélection ne font que lire la ou les tables et requêtes de la base, sans rienchanger de leur contenu. Les requêtes étudiées ici, au contraire, modifient les données parajout, mise à jour ou suppression. Elles sont indispensables pour manipuler le contenusans l’intervention d’une saisie manuelle et seront intégrées, ultérieurement, dans du codeVisual Basic pour automatiser des procédures.

2.1 LES REQUÊTES AJOUT

Pour qu’une requête ajout soit fonctionnelle, elle doit respecter en tous points les contraintesd’intégrité qui ont été posées lors de la conception de la base. En particulier, l’ajout d’unenregistrement ne se réalisera que si tous les champs dont la propriété Null interdit estpositionné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 pointd’exclamation.

4. Dans la boîte de dialogue d’Ajout, citez la table « ADRESSE » comme destination desajouts 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 endessous) le champ NOM grâce à la liste déroulante.

6. Dans la deuxième colonne, saisissez « MON_PRENOM : » et votre prénom entreguillemets, puis sélectionnez le champ PRENOM dans la zone Ajouter à.

7. Dans la troisième colonne, saisissez « MON_ADRESSE : » et votre adresse entreguillemets, puis sélectionnez le champ ADRESSE1 dans la zone Ajouter à.

8. Dans la quatrième colonne, saisissez « MON_CP : » et votre code postal entre guillemetspuis sélectionnez le champ CODE dans la zone Ajouter à.

Access Livre Page 95 Mercredi, 27. f vrier 2008 7:28 07

Page 101: Access 2007 Et VBA

96 Access® 2007 et VBA

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 desVinaigriers" 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, validezpar « 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 sontfacultatifs, en revanche, lorsque l’insertion concerne une valeur numérique dans unchamp du même type. Les dates, enfin, sont automatiquement cernées par Access d’unsigne 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 del’écran.

5. Faites un glisser/déplacer du champ CODE vers une nouvelle colonne, puis précisezdans la zone Ajouter à le champ CODE pour destination.

6. Faites un glisser/déplacer du champ VILLE vers une nouvelle colonne et ne précisezaucun champ de destination.

7. Dans la zone Critère de la colonne VILLE, insérez le nom d’une ville qui ne compte pasde doublon 2 : Gex, par exemple, code 01170.

La figure 4.9 présente ce que vous devez voir à l’écran.

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.

Figure 4.9Insertion d’un enregistrement à partir d’une autre table.

Access Livre Page 96 Mercredi, 27. f vrier 2008 7:28 07

Page 102: Access 2007 Et VBA

97Les requêtes

4Chapitre

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

INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE)

SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue desVinaigriers" AS MON_ADRESSE, CODE_POSTAL.CODE

FROM CODE_POSTAL

WHERE (((CODE_POSTAL.VILLE)="Gex"));

8. Enregistrez cette requête sous le nom Req_Ajout_Perso car celle-ci nous resserviraultérieurement.

2.2 LES REQUÊTES SUPPRESSION

La requête suppression qui correspond à l’instruction SQL DELETE, réalise la suppressiond’enregistrements. Avec Access, elle se met en œuvre de la manière suivante :

1. Le cas échéant, fermez les requêtes et tables actives.

2. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.

3. Sélectionnez la table « ADRESSE » puis fermez.

4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers lapremière colonne.

5. Cliquez sur l’icône Suppression du ruban, représenté par un X rouge avec un pointd’exclamation (la zone Supprimer s’incrémente automatiquement du mot-clé « Où »).

6. Dans la zone Critères, saisissez votre nom (celui que vous avez inséré dans l’exerciceprécédent).

7. Dans le ruban, cliquez sur le bouton « Exécuter ».

8. Un message de service vous indique que vous allez supprimer un enregistrement ;répondez « Oui ».

Si l’indication de votre nom avait comporté une faute d’orthographe, Access aurait sim-plement dit que vous alliez supprimer 0 enregistrement.

L’équivalent SQL de cette manipulation donne DELETE NOM FROM ADRESSE WHERE

NOM="MINOT";. Tous les opérateurs de comparaison déjà vus (LIKE, par exemple) peuventêtre utilisés pour préciser l’étendue des suppressions désirées.

On prendra garde au fait qu’une requête suppression sans opérateur de comparaisonsupprime tous les enregistrements de la table source (DELETE NOM FROM ADRESSE;) 1.

Rappelons enfin que si une contrainte d’intégrité référentielle avec suppression en cascadea été mise en place au niveau relationnel, la suppression d’un enregistrement dans la tablemère provoque la suppression de tous les enregistrements correspondants dans les tablesfilles.

1. Access ne prend pas en charge la commande TRUNCATE qui, dans beaucoup de bases de données, permet de vider très rapidement lecontenu entier d’une table.

Access Livre Page 97 Mercredi, 27. f vrier 2008 7:28 07

Page 103: Access 2007 Et VBA

98 Access® 2007 et VBA

2.3 LES REQUÊTES MISE À JOUR

Ces requêtes, qui correspondent à l’instruction SQL UPDATE, réalisent la mise à jour detout ou partie d’un ou plusieurs enregistrements. L’assistant requêtes d’Access la proposesous 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 unegrille, suivi par un point d’exclamation.

4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la premièrecolonne.

5. Faites un glisser/déplacer du champ CODE depuis la table « ADRESSE » vers laseconde colonne.

6. Dans la zone Critères du champ NOM, saisissez « DUPONT » (il s’agit d’un des contactsde 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 (maisexistant !).

L’assistant requêtes sera donc disposé comme à la figure 4.10.

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.

2.4 LA NOTION DE TRANSACTION

Toute requête action (ajout, suppression, mise à jour) s’inclut dans une transaction. Cettenotion 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énementssuccessifs suivants :

• Un utilisateur (numéroté 1) démarre explicitement une transaction (par une commandequ’on verra plus loin).

Figure 4.10Paramétrage d’une requête mise à jour.

Access Livre Page 98 Mercredi, 27. f vrier 2008 7:28 07

Page 104: Access 2007 Et VBA

99Les requêtes

4Chapitre

• L’utilisateur 1 procède à une ou plusieurs requêtes action.

• Pendant ce temps, et jusqu’à ce que l’utilisateur 1 ait achevé sa transaction, les autresutilisateurs 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 sontbloqués (LOCK), c’est-à-dire qu’un utilisateur 2 ne peut pas y porter une autre requêteaction.

• 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, fichiertexte, etc.) attachés à la base active.

Procédons à la mise en œuvre de cette notion :

1. Dans le menu « Créer », cliquez sur Création de requête.

2. Fermez immédiatement la fenêtre affichant toutes les sources de données sans sélec-tionner aucun objet.

3. Cliquez dans le ruban sur Définition des données (nous reviendrons plus loin sur cepassage en mode SQL de définition de données).

4. Dans la fenêtre blanche SQL ouverte, saisissez les mots-clés « BEGIN TRANSACTION »suivi par un point-virgule.

5. Cliquez dans le ruban sur le point d’exclamation Exécuter.

6. Il ne se passe apparemment rien : Access a seulement mémorisé que les requêtesactions à venir donnaient lieu à transaction, avec la possibilité de valider ou annulertoutes les commandes générées après le BEGIN TRANSACTION.

7. Rouvrez la requête « Req_Ajout_Perso » en mode SQL et copiez (Ctrl + C) la requête.

8. Retournez dans la requête en cours et collez la commande « INSERT » au complet(Ctrl + V) à la place du BEGIN TRANSACTION.

9. Cliquez sur Exécuter (à partir de l’onglet « Créer « situé à droite) : SQL vous informequ’un enregistrement va être ajouté. Validez cet ajout.

1. À condition que la base de données connectée sous ODBC supporte elle-même la notion de transaction.

Attention

Pour que le mode transactionnel soit utilisable, il faut que la base de données utilise une syntaxecompatible avec SQL Server : cliquez sur le bouton Office > Options Access > Concepteursd’objets et cochez la case Syntaxe compatible SQL Server pour cette base de données. Il faudras’assurer ensuite d’annuler ce paramétrage car il comporte de lourds effets sur toutes les syn-taxes SQL employées dans cette base.

Access Livre Page 99 Mercredi, 27. f vrier 2008 7:28 07

Page 105: Access 2007 Et VBA

100 Access® 2007 et VBA

10. Ouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquezdeux fois sur Affichage à gauche dans le ruban) : elle ne contient apparemment pasvotre 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 cetterequête. Si le symbole Exécution n’apparaît plus dans le ruban, cliquez sur le secondonglet « Créer » situé sur la droite.

12. Rouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquezdeux 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 commandesDDL (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.

(3) Les requêtes création

Les tables et autres objets créés jusqu’à maintenant ont donné lieu à des interventions« manuelles ». Ces dernières peuvent être automatisées, soit par une option spécifique decréation de table, soit directement avec la palette complète du langage SQL.

3.1 LES REQUÊTES CRÉATION DE TABLE

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. Cettemanipulation 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 ».

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 boutonOffice > Options Access > Concepteurs d’objets et décochez la case Syntaxe compatible SQLServer pour cette base de données.

Access Livre Page 100 Mercredi, 27. f vrier 2008 7:28 07

Page 106: Access 2007 Et VBA

101Les requêtes

4Chapitre

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 desdonnées.

5. Optez pour une copie complète : deux tables sont désormais disponibles1.

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 validezpar « 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 dela figure 4.11.

7. Cliquez sur « Exécuter » : Access vous avertit que trois enregistrements seront collésdans une nouvelle table.

8. La nouvelle table, nommée « NEW_ADRESSE », ne contient que les trois enregistrementscorrespondant aux ID 1, 2 et 3.

3.2 LES REQUÊTES DÉFINITION DE DONNÉES

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 sontnombreuses. Les lecteurs qui auront besoin d’utiliser en direct ces commandes pourrontse reporter à l’aide en ligne et aux ouvrages consacrés au langage SQL (pour Access etMS-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.

Figure 4.11Paramétrage d’une requête création de table.

Access Livre Page 101 Mercredi, 27. f vrier 2008 7:28 07

Page 107: Access 2007 Et VBA

102 Access® 2007 et VBA

Un seul exemple sera utilisé pour montrer quelles sont les possibilités de cet outil. On sepropose de modifier la largeur de la colonne NOM de la table « ADRESSE » en la faisantpasser 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 TABLEADRESSE 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électionlisent et ordonnent les données suivant de multiples critères de tri et de filtrage. Avec lanotion 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 dansle cadre de transactions dans la base.

Access supporte, en direct ou en mode assisté, un grand nombre des commandes du langageSQL, langage commun des bases de données.

Access Livre Page 102 Mercredi, 27. f vrier 2008 7:28 07

Page 108: Access 2007 Et VBA

103Les requêtes

Exercice

s

4Chapitre

Problèmes et exercicesLes 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 desuppression 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 chaquerequête sous la forme « Req_4xx » pour pouvoir la réutiliser ultérieurement.

EXERCICE 1 AFFICHAGE 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 dela 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 listedé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 ».

• Énoncé Affichez les noms, prénoms, adresse, code postal, ville et pays des élèves français présentéspar ordre alphabétique.

Figure 4.12Paramétrage de l’exercice 1.

Access Livre Page 103 Mercredi, 27. f vrier 2008 7:28 07

Page 109: Access 2007 Et VBA

104 Access® 2007 et VBA

La requête SQL est la suivante :

SELECT NOM_ELEVE, PRENOM_ELEVE, ADRESSE1_ELEVE, CODEPOSTAL_ELEVE, VILLE_ELEVE, PAYS_ELEVE

FROM ELEVE

WHERE PAYS_ELEVE="FR"

ORDER BY NOM_ELEVE;1

où la clause WHERE précise le filtre et la clause ORDER BY précise le tri.

EXERCICE 2 AFFICHAGE SUR CRITÈRE DE PRÉNOM

* Solution Le critère de filtre utilisera le mot-clé « Comme » (LIKE en anglais) et le caractère « * »(voir figure 4.13).

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 ».

4. Dans la zone Critères de la colonne PRENOM_ELEVE, inscrivez « Comme "A*" ».

5. Enregistrez la requête sous le nom « Req_412 ».

EXERCICE 3 AFFICHAGE SUR CRITÈRE EXCLUANT UN PAYS

* Solution Le critère de filtre utilise le mot-clé « Pas » ; la colonne PAYS ne devant pas être affichée, lacase 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 parrapport à 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 desdoubles guillemets lorsque ces requêtes seront insérées dans du code Visual Basic.

• Énoncé Affichez les noms et prénoms des élèves dont le prénom commence par un A.

Figure 4.13Paramétrage de l’exercice 2.

• Énoncé Affichez les seuls noms et prénoms des élèves qui ne sont pas français.

Access Livre Page 104 Mercredi, 27. f vrier 2008 7:28 07

Page 110: Access 2007 Et VBA

105Les requêtes

Exercice

s

4Chapitre

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 « Pas "FR" ». Décochez lacase Afficher.

EXERCICE 4 AFFICHAGE SUR CRITÈRES MULTIPLES

* 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é (voirfigure 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 leszones Ou suivantes, « "D" » et « "UK" ».

EXERCICE 5 AFFICHAGE SUR CRITÈRE DE DATE

Figure 4.14Paramétrage de l’exercice 3.

• Énoncé Affichez les noms et prénoms des élèves américains, allemands et anglais.

Figure 4.15Paramé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 le31 décembre 1969.

Access Livre Page 105 Mercredi, 27. f vrier 2008 7:28 07

Page 111: Access 2007 Et VBA

106 Access® 2007 et VBA

* Solution Trois conditions se cumulent et doivent être placées sur la même ligne. La colonneDATENAISSANCE_ELEVE invoquée deux fois n’est affichée qu’une fois. Les caractèresdiè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 ».

EXERCICE 6 AFFICHAGE SUR CRITÈRES DE DATE ET DE PAYS

* Solution Il convient de répéter la condition d’âge sur les deux lignes pour qu’elle s’applique chaquefois 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 zoneOu « "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.16Paramé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 janvier1960.

Figure 4.17Paramétrage de l’exercice 6.

Access Livre Page 106 Mercredi, 27. f vrier 2008 7:28 07

Page 112: Access 2007 Et VBA

107Les requêtes

Exercice

s

4Chapitre

EXERCICE 7 AFFICHAGE AVEC VALEURS DISTINCTES

* 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 deregroupement s’ajoute à la sélection de valeurs distinctes. C’est donc bien la zoneValeurs 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 plussimple qu’une requête dotée d’un GROUP BY. Pour obtenir ce résultat, effectuez lesactions 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é Valeursdistinctes à « Oui ».

EXERCICE 8 AFFICHAGE DES PREMIERS ÉLÉMENTS

* Solution 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 les champs « NOM_ELEVE », et« PRENOM_ELEVE ».

3. Dans le ruban de création de requête, cliquez sur l’icône Renvoyer et sélectionnez lavaleur « 5 ». Il ne s’agit pas forcément des ID de 1 à 5, mais des 5 premiers enregistre-ments qu’Access affichera. Cette option est destinée à n’afficher qu’un aperçu desdonnées lorsque la table comprend un très grand nombre d’enregistrements.

La traduction SQL de cette requête donne : SELECT TOP 5 ID_ELEVE, NOM_ELEVE,

PRENOM_ELEVE FROM ELEVE;.

• Énoncé Citez tous les pays représentés dans l’école.

• Énoncé Affichez les ID, noms et prénoms des 5 premiers élèves.

Access Livre Page 107 Mercredi, 27. f vrier 2008 7:28 07

Page 113: Access 2007 Et VBA

108 Access® 2007 et VBA

La figure 4.18 présente les paramètres de cette requête.

EXERCICE 9 AFFICHAGE AVEC REGROUPEMENT PAR PAYS ET COMPTAGE

* Solution La réponse à cette question induit un regroupement par pays et un comptage sur ce mêmecritè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 faitun 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 enCompte grâce à la liste déroulante.

EXERCICE 10 AFFICHAGE AVEC JOINTURE

* Solution Cette question nécessite l’introduction des tables « NOTE » et « MATIERE » (voir figure4.20). Pour obtenir ce résultat, effectuez les actions suivantes :

Figure 4.18Paramétrage de l’exercice 8.

p

• Énoncé Combien y a-t-il d’élève par pays représenté ?

Figure 4.19Paramétrage de l’exercice 9.

• Énoncé Affichez les noms des élèves, leurs notes et la matière correspondante.

Access Livre Page 108 Mercredi, 27. f vrier 2008 7:28 07

Page 114: Access 2007 Et VBA

109Les requêtes

Exercice

s

4Chapitre

1. Créez la requête à partir des tables « ELEVE », « NOTE » et « MATIERE ». On constateque les relations entre les trois tables apparaissent automatiquement (puisque qu’ellessont établies définitivement dans le modèle relationnel mis en place à la fin des exercicesdu chapitre 2).

2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « MATIERE » et« NOTATION ».

3. La requête renvoie 19 760 enregistrements.

EXERCICE 11 AFFICHAGE AVEC JOINTURE ET REGROUPEMENT

* 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 quiest 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îtrel’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.

6. Dans la zone Format, précisez Fixe.

7. Dans la zone Nombre de décimales, précisez 2.

Figure 4.20Paramé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.

Access Livre Page 109 Mercredi, 27. f vrier 2008 7:28 07

Page 115: Access 2007 Et VBA

110 Access® 2007 et VBA

8. Enregistrez la requête sous le nom « Req_4111 ».

EXERCICE 12 APPEL DE REQUÊTES MULTIPLES

* Solution La question comporte un piège. La première tentation consisterait à utiliser une formuled’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 lamoyenne 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ésultatsde 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 celal’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.21Paramé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 êtrearrondies au point le plus voisin.

Figure 4.22Première solution de l’exercice 12.

Access Livre Page 110 Mercredi, 27. f vrier 2008 7:28 07

Page 116: Access 2007 Et VBA

111Les requêtes

Exercice

s

4Chapitre

Seconde méthode

Il existe une solution plus « esthétique », n’utilisant qu’une seule requête pour faire lesdeux opérations simultanément et dans le bon ordre :

1. Reprenez la requête « Req_4111 ».

2. Dans la colonne NOTATION, utilisez l’Opération Expression (et non plus Moyenne).

3. Dans la zone Champ, à la place de NOTATION, entrez l’expression : MoyenneFinale:Round(Moyenne([NOTATION]);0) où l’on voit bien que la moyenne est calculée avantde l’arrondir.

La figure 4.23 présente l’état de la requête en création.

EXERCICE 13 AFFICHAGE DE LA MOYENNE GÉNÉRALE

* Solution Ici, la table « MATIERE » n’est plus utile puisqu’il s’agit d’une moyenne toutes matièresconfondues (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îtrel’opération regroupement.

4. Modifiez l’Opération de la colonne NOTATION en Moyenne.

5. Ajoutez dans la colonne NOTATION le critère « >=10 ».

6. Cliquez du bouton droit sur la colonne NOTATION.

7. Sélectionnez Propriétés.

8. Dans la zone Format, précisez Fixe.

Figure 4.23Seconde solution de l’exercice 12.

• Énoncé Affichez les noms des élèves et leur moyenne générale. Classez les élèves du plus brillantau moins bon. On ne veut voir que ceux qui ont la moyenne.

Access Livre Page 111 Mercredi, 27. f vrier 2008 7:28 07

Page 117: Access 2007 Et VBA

112 Access® 2007 et VBA

9. Dans la zone Nombre de décimales, précisez 2.

EXERCICE 14 AFFICHAGE DE LA MOYENNE PAR MATIÈRE

* Solution La table « MATIERE » est de nouveau nécessaire et donne lieu à un critère de filtre sur lamatiè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é (voirfigure 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îtrel’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écisezFixe, puis deux décimales.

8. Changez le champ de la colonne NOTATION en NoteBrute:NOTATION.

Figure 4.24Paramé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.

Access Livre Page 112 Mercredi, 27. f vrier 2008 7:28 07

Page 118: Access 2007 Et VBA

113Les requêtes

Exercice

s

4Chapitre

9. Dans une nouvelle colonne, indiquez dans la zone Champ la formule NoteRéévaluéeprésentée précédemment.

10. Modifiez le champ Opération de cette colonne en Expression.

EXERCICE 15 TABLEAU CROISÉ DYNAMIQUE

* Solution Cet aspect des requêtes n’a pas été présenté dans le cours. Il est possible, comme dansExcel, de monter des tableaux croisés pourvu que les données s’y prêtent, ce qui est le casici. 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 « Analysecroisé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 Analysepour 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 deRegroupement pour les deux colonnes précédentes).

11. Dans la zone Analyse de la troisième colonne, sélectionnez Valeur.

12. Affichez le résultat et élargissez les colonnes afin de pouvoir lire les données (aubesoin, précisez dans la propriété de la colonne NOTATION le format Fixe et le nombrede décimales voulu).

Figure 4.25Paramétrage de l’exercice 14.

• Énoncé Faites un tableau croisé dynamique des élèves et de leur moyenne par matière. Un teltableau 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.

Access Livre Page 113 Mercredi, 27. f vrier 2008 7:28 07

Page 119: Access 2007 Et VBA

114 Access® 2007 et VBA

Le paramétrage décrit et le résultat obtenu sont présentés sur la figure 4.26.

EXERCICE 16 TABLEAU CROISÉ AVEC REGROUPEMENT

* Solution Il suffit de faire intervenir les tables GROUPE et REGROUPEMENT (mises en place dansl’exercice 4 du chapitre 3) en sus de celles déjà existantes pour obtenir le résultat voulu. Lacolonne 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 lacolonne NOM_ELEVE. Pour cela, sélectionnez la colonne « NOM_ELEVE » actuelleet cliquez sur « Insérer des colonnes » dans le ruban. Dans cette première colonneajouter 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 lafigure 4.27.

Figure 4.26Paramé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 deLangue vivante et non plus en détaillant Anglais, Allemand et Italien.

Access Livre Page 114 Mercredi, 27. f vrier 2008 7:28 07

Page 120: Access 2007 Et VBA

115Les requêtes

Exercice

s

4Chapitre

EXERCICE 17 REGROUPEMENT ET COEFFICIENT

* Solution L’ajout de la notion de coefficient oblige à une modification des tables car elle n’est inséréenulle part. Le fait que l’énoncé donne un coefficient aux langues vivantes (et non à chaquelangue séparément) incite à créer la notion au niveau de la table GROUPE et non à celuide 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 consigneNull interdit car la table ne pourrait pas être enregistrée (les coefficients ne sont passaisis).

3. Repassez en mode feuille de données et saisissez les coefficients indiqués.

4. Repassez en mode création et mettez la propriété Null interdit à Oui.

5. Refermez la table.

Figure 4.27Paramétrage 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 entenant compte du coefficient et présentez dans le même tableau la note finale.

Access Livre Page 115 Mercredi, 27. f vrier 2008 7:28 07

Page 121: Access 2007 Et VBA

116 Access® 2007 et VBA

L’utilisation d’un tableau croisé n’est pas possible dans l’immédiat pour au moins deuxraisons : d’une part, le tableau croisé ne fait pas apparaître les résultats généraux (lamoyenne des moyennes) ; d’autre part, les en-têtes de colonnes et de lignes doivent tenircompte 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èrerequê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 moyennegé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 coefficientcorrespondant.

1. La zone champ de la première colonne, contient « NOM_ELEVE » et la zone Opération estpositionné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érationest 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.

Il faut sauvegarder cette requête sous le nom « Req_4117-1 » pour pouvoir la réutilisertout 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 estpositionné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 (zoneChamp affectée à MoyenneCoefficientée, et zone Analyse affectée à Valeur), avec unefonction 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 nepeut 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 Sommeemployée ici n’additionne rien puisqu’une seule valeur est déclarée par ligne dans larequête précédente.

Figure 4.28Première étape de l’exercice 17 (Requête Req_4117-1).

Access Livre Page 116 Mercredi, 27. f vrier 2008 7:28 07

Page 122: Access 2007 Et VBA

117Les requêtes

Exercice

s

4Chapitre

La structure de la deuxième requête, qu’on enregistrera sous le nom « Req_4117-2 », estprésentée à la figure 4.29.

La dernière étape a pour but d’améliorer la présentation (les moyennes sont affichées avecde 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 devenuesdes 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 Nompour 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êmenom 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ésultat1.

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).

Figure 4.29Deuxième étape de l’exercice 17 (Requête Req_4117-2).

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 estdonc préférable de forcer le résultat par l’usage d’une fonction dans l’expression.

Access Livre Page 117 Mercredi, 27. f vrier 2008 7:28 07

Page 123: Access 2007 Et VBA

118 Access® 2007 et VBA

La structure de la dernière requête est présentée à la figure 4.30.

EXERCICE 18 REQUÊTE AJOUT

* 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, unchamp supplémentaire est obligatoire dans la table NOTATION concernant la dated’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 lamatière et de l’élève ;

• soit rédiger une requête ajout qui parvient à utiliser les noms contenus dans les champsadé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 noterezqu’Access place automatiquement le champ ID_ELEVE dans la zone Ajouter à : lasimilitude des noms suffit. Saisissez à la suite du nom de champ le signe « deux-points » et le chiffre « 1 » (correspondant à l’élève EDEN).

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 tousles coefficients de la table GROUPE ; or, nous n’avons pas encore étudié cette fonction dedomaine. La bonne tournure serait SomDom("[COEF_GROUPE]";"GROUPE").

Figure 4.30Troisième étape de l’exercice 17 (Requête Req_4117-3).

• Énoncé Ajoutez la note de 14 en mathématiques à Martin EDEN.

Access Livre Page 118 Mercredi, 27. f vrier 2008 7:28 07

Page 124: Access 2007 Et VBA

119Les requêtes

Exercice

s

4Chapitre

5. Faites glisser le champ « ID_MATIERE » en deuxième colonne. Ajoutez à la suite dunom de champ le signe « deux-points » et le chiffre « 2 » (correspondant à la matièreMathématiques).

6. Faites glisser le champ « NOTATION » en troisième colonne, ajoutez à la suite du nomde champ le signe « deux-points » et le chiffre « 14 ».

7. Faites glisser le champ « DATE_NOTE » en quatrième colonne, ajoutez à la suite dunom de champ le signe « deux-points » et la formule « Date() ». Cette formule (suiviepar des parenthèses) est une fonction Access qui renvoie la date du jour.

8. Cliquez sur le bouton « Exécuter » : vous constatez avec effroi que le programme vaajouter des dizaines de milliers de lignes, ce qui n’est pas du tout votre intention !

9. Annulez cette commande qui provient du fait que tous les enregistrements de la table« NOTE » sont comptés pour l’insertion.

10. Retirez la table « NOTE » du pavé supérieur en appuyant sur la touche « Sup. » du clavieraprès avoir cliqué dans la table.

11. Cliquez de nouveau sur « Exécuter » : cette fois, une seule ligne sera insérée. Acceptezl’opération.

12. Enregistrez cette requête sous le nom « Req_421-1 ».

Le code SQL de cette requête est : INSERT INTO [NOTE] (ID_ELEVE, ID_MATIERE, NOTA-TION, DATE_NOTE ) SELECT 1 AS ID_ELEVE, 2 AS ID_MATIERE, 14 AS NOTATION,

Date() AS DATE_NOTE;

La figure 4.31 présente les paramètres de cette requête.

Seconde méthode

Cette deuxième méthode fait appel à la notion de sous-requête, que nous n’avons pasencore étudiée, et à l’utilisation d’un subterfuge dû à l’imperfection de l’interpréteur derequê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« 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.31Première solution de l’exercice 18 (Req_421-1).

Access Livre Page 119 Mercredi, 27. f vrier 2008 7:28 07

Page 125: Access 2007 Et VBA

120 Access® 2007 et VBA

5. Ajoutez la table « TABLEVIDE »1 grâce à l’icône Afficher la table du ruban.

6. À la place de la valeur 1, positionnée après l’alias de la première colonne ID_ELEVE,insérez le texte suivant entre parenthèses, correspondant à une requête pour retrouverl’ID de l’élève à partir de son nom : (SELECT ID_ELEVE FROM ELEVE WHERE NOM_ELEVE = "EDEN").

7. À la place de la valeur 2, positionnée après l’alias de la deuxième colonne, insérez letexte suivant entre parenthèses (SELECT ID_MATIERE FROM MATIERE WHERE NOM_MATIERE = "MATHEMATIQUES")

La requête, fonctionnelle, possède la structure de la figure 4.322, son exécution affecte lanote 14 à l’élève EDEN en Mathématiques.

EXERCICE 19 REQUÊTE SUPPRESSION

* Solution 1. Créez une nouvelle requête.

2. Appelez la table « NOTE ».

3. Cliquez dans le ruban sur l’icône Suppression.

4. Faites glisser les quatre champs « ID_ELEVE », « ID_MATIERE », « NOTATION » et« DATE_NOTE » dans les colonnes du pavé inférieur.

5. Insérez dans la zone Critères les mêmes que ceux de l’exercice précédent, soit respec-tivement « 1 », « 2 », « 14 » et « Date() », pour obtenir le dessin de la figure 4.33.

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.32Seconde 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.

Access Livre Page 120 Mercredi, 27. f vrier 2008 7:28 07

Page 126: Access 2007 Et VBA

121Les requêtes

Exercice

s

4Chapitre

EXERCICE 20 REQUÊTE MISE À JOUR

* Solution L’exercice permet de modifier en bloc toutes les notes. La condition posée (sont exclues lesnotes 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.33Requête suppression.

• Énoncé Modifiez toutes les notes en leur ajoutant 2 points sauf si la note est déjà supérieure ouégale à 18.

Figure 4.34Requête mise à jour.

Access Livre Page 121 Mercredi, 27. f vrier 2008 7:28 07

Page 127: Access 2007 Et VBA

Access Livre Page 122 Mercredi, 27. f vrier 2008 7:28 07

Page 128: Access 2007 Et VBA

123

5Les formulaires

Le formulaire constitue l’outil graphique essentiel pour la présentation des données stockées dans les tables, leur modification ou l’insertion de nouvelles données. Ce chapitre présente en premier lieu les grands principes de fonctionnement des formu-laires, puis étudie tous les outils mis à disposition du programmeur pour manipuler les données, quel que soit leur genre. L’objectif final consiste à construire ex nihilo une interface complète homme/machine permettant à un utilisateur de manipuler ses données dans un contexte ergo-nomique et sécurisé.

1. Les grands principes de fonctionnement ................. 124

2. La manipulation des outils ..... 131

Problèmes et exercices 1. Formulaire unique d’affichage

des élèves ............................. 151

2. Formulaire et sous-formulaire des élèves et de leurs moyennes 155

3. Formulaire avec zone de liste et réactualisation ................... 160

Chapitre

Access Livre Page 123 Mercredi, 27. f vrier 2008 7:28 07

Page 129: Access 2007 Et VBA

124 Access® 2007 et VBA

(1) Les grands principes de fonctionnement

Avec Access 2007, la mise en œuvre d’un formulaire est devenue d’une extrême simplicité.Nous commencerons par définir les éléments principaux constitutifs du « paysage » de cesdocuments à partir de la base CODES_POSTAUX de la partie théorique du chapitreprécédent.

1. Ouvrez la base « CODES_POSTAUX » et sélectionnez la table « CODE_POSTAL »,sans pour autant l’ouvrir.

2. Dans la barre de menu « Créer », cliquez sur l’icône Formulaire (et non pas création deformulaire que nous utiliserons plus tard). Un formulaire est déjà créé, tel que montréà la figure 5.1, et il se visualise immédiatement en mode formulaire, par opposition aumode création grâce auquel on le modifie. Sa présentation, tout à fait correcte, estsusceptible d’amélioration.

D’une manière générale, il est préférable d’ouvrir les documents créés automatiquement,et non démarrer d’un formulaire totalement vierge à partir du bouton du ruban Créationde formulaire.

Les différents éléments de ce simple affichage doivent être précisément énumérés afin queles propriétés de l’objet formulaire soient bien comprises et retrouvées dans le dédale desoptions 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 ;

Figure 5.1Formulaire initial en mode Formulaire.

Access Livre Page 124 Mercredi, 27. f vrier 2008 7:28 07

Page 130: Access 2007 Et VBA

125Les formulaires

5Chapitre

• En bas une deuxième et dernière zone fixe nommée Pied de formulaire, qui n’apparaîtpas ici ;

• À 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 detexte ; chacune d’entre elles se compose d’une étiquette (qui restera fixe) et de la zone detexte proprement dite (qui verra défiler le contenu des enregistrements).

Tous ces éléments, affichables ou non, peuvent changer de forme, de couleur et autrescaractéristiques. Cliquez dans le ruban sur le triangle situé sous le bouton Affichage etpassez en mode création1 : vous observez la constitution même du document tel qu’ilapparaît à la figure 5.2.

1.1 CONVENTIONS DE NOMS

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 – denombreux développeurs font précéder les formulaires d’un préfixe Frm_ ou Form_ ousimplement F_. Cette syntaxe particulière, appliquée aussi avec les bases Access 2003 etanté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 lamê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’éviterles 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 clairmais suffisamment court).

• Le nom de l’onglet supérieur (correctement orthographié et libre), renseigné par lapropriété Légende de la feuille de propriété du formulaire.

1. On peut aussi faire un clic droit dans le document et sélectionner Création.

Figure 5.2Formulaire initial en mode création.

Access Livre Page 125 Mercredi, 27. f vrier 2008 7:28 07

Page 131: Access 2007 Et VBA

126 Access® 2007 et VBA

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 à laconvention :

1. Cliquez du bouton droit sur l’onglet « CODE_POSTAL » du formulaire en cours decréation.

2. Sélectionnez « Enregistrer ».

3. À la place de CODE_POSTAL (un nom identique au nom de la table source pourraitamener à 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, cliquezsur le triangle supérieur du volet et sélectionnez « Tous les objets par Type d’objets ».

1.2 LES FEUILLES DE PROPRIÉTÉS

Ouvrez à nouveau le formulaire en mode création (sélection du formulaire dans le voletde navigation, clic-droit, puis Mode création), cliquez du bouton droit dans le corps dudocument (partie bleue en dessous de Pied de formulaire) et sélectionnez « Propriétés ». Lafeuille de propriété apparaît telle qu’à la figure 5.3, qui montre toutes les propriétés de tousles objets contenus dans le formulaire.

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 lespropriétés des onglets précédents. Contrairement à un préjugé, l’expérience montre qu’ilest plus rapide de retrouver une propriété par l’onglet « Toutes » qu’en cherchant parmiles 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éremmentl’onglet en utilisant la propriété Légende du formulaire.

Figure 5.3Feuille de propriétés.

Access Livre Page 126 Mercredi, 27. f vrier 2008 7:28 07

Page 132: Access 2007 Et VBA

127Les formulaires

5Chapitre

• L’onglet « Données » regroupe les options relatives aux valeurs présentées dans l’objet(source, droits de modification, etc.).

• 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.

1.3 FORMULAIRE UNIQUE OU CONTINU

Dès la création d’un formulaire, l’un des aspects les plus importants à mettre en placeconsiste à définir le mode d’affichage des données, soit en mode unique, soit en modecontinu.

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 enbas 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.4Affichage du formulaire en mode continu.

Access Livre Page 127 Mercredi, 27. f vrier 2008 7:28 07

Page 133: Access 2007 Et VBA

128 Access® 2007 et VBA

Au seul plan ergonomique, certaines règles doivent être respectées :

• si un enregistrement comporte de très nombreuses colonnes, il est toujours souhaitabled’afficher les données en formulaire unique : le grand nombre de contrôles rend lalecture difficile en mode continu ;

• en cas de formulaire servant à entrer de nouvelles données, le mode unique est préférableau continu ;

• inversement, si le formulaire est destiné à un balayage visuel permanent et à des mani-pulations de lecture/modification, le continu est à recommander.

Au plan technique, le choix induit les conséquences suivantes :

• un formulaire en mode unique n’a pas nécessairement besoin d’en-tête et de pied puis-que tous les éléments sont inclus dans la même fenêtre (y compris un titre de fenêtre etdes zones de renseignements divers) ;

• un formulaire en mode continu implique toujours la présence d’un en-tête dans lequelon insérera un titre et des en-têtes de colonnes (celles qui apparaissent dans le corps) ;le pied de formulaire sert souvent à afficher des totaux.

Outre les modes continu et unique, un formulaire peut s’afficher :

• en mode feuille de données, auquel cas il ressemble à s’y méprendre à la présentationd’une table ;

• en mode double affichage : cette nouvelle présentation est particulière à Access 2007.Elle montre les données en deux fenêtres : l’une en formulaire et l’autre en feuille dedonnées ;

• en mode tableau ou graphique croisé dynamique ; on réservera ces présentations auxdonnées qui s’y prêtent : sauf de rares cas, il ne s’agit que de formulaires en lectureseule.

1.4 FORMULAIRE D’AJOUT OU DE MODIFICATION

Dans le cadre de l’utilisation de formulaires pour contrôler la saisie ou la modification desdonnées par les futurs utilisateurs, il est vivement recommandé de spécifier des formulairesdifférents pour la lecture, la création et la modification de données (sans parler dessuppressions, à traiter souvent à part).

La saisie de nouvelles données donne lieu, dans la plupart des cas, à la mise en place derègles de gestion dans le formulaire pour contrôler au plus près la qualité des entrées.Deux exemples pour illustrer ce propos :

• À la saisie d’un Relevé d’Identité Bancaire, il existe toujours un petit programme associéqui vérifie le numéro de clé du RIB.

• À la saisie d’un nouveau client, il existe souvent des procédures pour vérifier que leclient n’existe pas déjà.

La présence de nombreuses règles de gestion pousse toujours un peu plus le programmeurvers la solution d’une séparation entre le formulaire Ajout de données et le formulaired’affichage des données existantes. Pour citer un cas concret, la démarche fréquemmentutilisée sera la suivante :

a. l’utilisateur se trouve dans un formulaire de consultation ;

Access Livre Page 128 Mercredi, 27. f vrier 2008 7:28 07

Page 134: Access 2007 Et VBA

129Les formulaires

5Chapitre

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-pondant aux caractères saisis), soit faire défiler la zone de liste ;

d. s’il ne trouve pas le client, il saisit son nom et valide ;

e. le programme ouvre une boîte message « Le client n’existe pas. Voulez-vous lecréer ? » ;

f. en répondant « Oui », l’utilisateur passe (sans le savoir parfois) d’un formulaire deconsultation à un formulaire de création.

Ces différents cas de figure se mettent en place dans la feuille de propriétés du formulaire,et plus précisément dans l’onglet « Données » :

• La propriété du formulaire Entrée données, positionnée par défaut à Non, permet àl’utilisateur soit de consulter, soit d’entrer des données. Si elle est positionnée à Oui, leformulaire ne peut plus servir qu’à l’insertion.

• La propriété du formulaire Ajout autorisé, positionnée par défaut à Oui, permet à l’uti-lisateur d’insérer de nouvelle données. Positionnée à Non, le formulaire ne peut plusservir qu’à la lecture ou la modification.

• La propriété du formulaire Suppression autorisée, qui est par défaut à Oui, peut êtreinversée.

• La propriété du formulaire Modification autorisée, qui est par défaut à Oui, peut êtreinversée.

L’ensemble de ces propriétés permet de réaliser toutes les combinaisons possibles, depuisla position la plus souple, celle par défaut, jusqu’à la plus rigide, avec par exemple, un seuldroit de lecture uniquement, sans insertion, ni modification, ni suppression.

Une bonne démarche du concepteur consiste donc, dès le début du projet, à dissocier tousles formulaires entre ceux qui permettent de créer des données (et/ou en supprimer) etceux qui permettent de les visualiser (et/ou modifier). Dès la création du formulaire, lespremières propriétés définies concerneront le mode d’affichage (continu/unique) et lemode de saisie (combinaison des propriétés listées ci-dessus).

1.5 LES SOURCES DE DONNÉES

Dans le cas du formulaire des codes postaux, la source des données est, directement, latable CODE_POSTAL. Cette propriété se vérifie dans la zone Source de la feuille despropriétés du formulaire.

Ce cas de figure est relativement rare : dans la plupart des cas, la source des données estprécisée différemment et, le plus souvent, résulte d’une requête car plusieurs tables sontinvoqué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 ;

Access Livre Page 129 Mercredi, 27. f vrier 2008 7:28 07

Page 135: Access 2007 Et VBA

130 Access® 2007 et VBA

• une requête nommée Req_modif_codes ;

• un formulaire nommé Frm_modif_codes.

Bien que cet agencement soit le plus répandu, il ne manque pas de poser des problèmes àdes niveaux informatiques d’un autre ordre :

• si la requête appelle de nombreuses données et que la base Access est utilisée en envi-ronnement réseau multi-utilisateurs, la « remontée » des données depuis le serveur versle poste utilisateur va représenter un encombrement réseau non négligeable :

• le nombre d’enregistrements bloqués en raison de leur manipulation par un premierutilisateur risque de poser des problèmes d’ergonomie et de temps de réponse.

Comme on le verra plus loin, il est tout à fait possible de ne pas citer de source de donnéesau niveau du formulaire, et de faire des appels « ciblés » à la base de données pour afficherau moment le plus opportun l’information la plus précise.

1. Ouvrez le formulaire « Frm_codes » en mode création.

2. Affichez la feuille de propriétés du formulaire.

3. Dans l’onglet « Toutes », cliquez sur la première zone nommée Source.

4. À droite de la fenêtre apparaissent une zone de liste déroulante et un carré muni detrois petits points.

La zone de liste déroulante ouverte montre toutes les sources de données directement dis-ponibles, tables et requêtes. Si l’une d’entre elles est choisie, c’est l’ensemble des donnéesde cette source qui sera renvoyé à l’utilisateur.

Un clic sur la zone voisine démarre le générateur de requêtes et ouvre une fenêtre d’aver-tissement.

1. Répondez « Oui » à la création d’une requête.

2. L’écran qui s’ouvre est très exactement celui des requêtes étudiées au chapitre 4.

3. Insérez les champs « CODE » et « VILLE » dans la requête.

4. Posez le critère « Comme "01*" » dans la colonne CODE (le formulaire ne présenteraplus que les villes du département de l’Ain).

5. Fermez la fenêtre de la requête et validez l’enregistrement de la requête SQL.

La propriété Source du formulaire n’est plus CODE_POSTAL (la totalité de la table descodes), mais la requête : SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE Like"01*";. Cette requête limitative réduit notablement le nombre de données à traiter. Passezen mode formulaire pour voir le résultat.

En résumé, la propriété Source du formulaire varie entre :

• une table.

• une requête enregistrée comme telle.

• une requête insérée dans le formulaire dans sa propriété Source.

• ou bien rien du tout (les données seront appelées plus tard).

Access Livre Page 130 Mercredi, 27. f vrier 2008 7:28 07

Page 136: Access 2007 Et VBA

131Les formulaires

5Chapitre

(2) La manipulation des outils

Un formulaire est constitué de contrôles, chacun d’entre eux permettant de visualiser desinformations (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 interfacehomme/machine rigoureusement organisée. Nous étudions ci-après en détail tous lescontrôles utilisables.

2.1 LES CONTRÔLES DE FORMULAIRE

Quand un formulaire est ouvert en mode création, la barre de menu supérieure comporteun onglet supplémentaire « Création » contenant toutes les icônes destinées à bâtir etmodifier le document ; sa partie centrale regroupe les contrôles de formulaire utilisables,présentés à la figure 5.5.

Les contrôles de zones

Les contrôles zones de texte

Comme son nom l’indique, une zone de texte édite des caractères : ceux-ci peuvent défi-ler, le cas échéant, si la longueur du texte excède celle de la zone. Si l’autorisation y estaccordée, les zones de texte permettent l’affichage, la modification ou la suppression.Elles peuvent recevoir des caractères émis depuis le presse-papier (le résultat d’un coller)ou bien faire l’objet d’un copier pour rééditer les données ailleurs.

Au plan de la présentation, les caractères peuvent être réglés comme dans un traitement detexte (police, taille, gras, etc.). Toutefois, pour des raisons évidentes de confort graphique,il est déconseillé de faire varier ces coordonnées d’une zone à une autre, d’un formulaire àun autre. Il s’avère préférable de régler ces paramètres par défaut au début d’un nouveauprojet et de s’y tenir pour l’ensemble du logiciel créé. Dans les options d’Access (boutonOffice) :

• la page Feuille de données paramètre les valeurs par défaut pour la présentation desfeuilles ;

• la page Concepteur d’objets paramètre les valeurs par défaut dans la création des tables,requêtes et formulaires.

La source des données qui vont s’afficher peut être :

• un champ parmi ceux qui sont renvoyés par la table ou la requête à la source du formu-laire ;

Figure 5.5Contrôles du ruban de création de formulaire.

Access Livre Page 131 Mercredi, 27. f vrier 2008 7:28 07

Page 137: Access 2007 Et VBA

132 Access® 2007 et VBA

• le résultat d’une formule faisant appel à des données externes au formulaire (du typeRechDom) ;

• 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 unformulaire 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 enmême temps une étiquette de zone de texte, à gauche, et la zone de texte proprementdite. Si l’on déplace l’un des deux objets, l’autre « suit » ; mais il est possible de lesmanipuler séparément en cliquant et glissant à partir de l’angle supérieur gauche del’un des deux objets.

4. Cliquez dans le libellé « Texte0 » de l’étiquette, et remplacez ce libellé par « Ceci estune zone de texte ». Nécessairement, vous devrez déplacer l’étiquette pour laisser visiblela zone adjacente.

5. Cliquez du bouton droit sur l’étiquette et sélectionnez Propriétés (ou bien cliquez dansla barre d’icône sur Feuille de propriétés).

6. Vous noterez que le nom de l’étiquette est « Etiquette1 » (attribué automatiquementpar 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. Uneconvention 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ésouverte : le nom du contrôle est « Texte0 » et la source n’est pas renseignée. Dans lamesure où le formulaire lui-même n’a pas de source de données, aucun champ n’estdisponible. 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 leformulaire.

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 fondde 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 longueurmaximale.

9. Cliquez du bouton droit sur l’onglet « Formulaire1 », en haut, puis sélectionnez« Enregistrer ».

10. Nommez votre formulaire « Frm_Essais_Contrôles ».

Access Livre Page 132 Mercredi, 27. f vrier 2008 7:28 07

Page 138: Access 2007 Et VBA

133Les formulaires

5Chapitre

Un exemple de zone de texte est présenté à la figure 5.6.

Les contrôles étiquettes

Les étiquettes ne peuvent pas invoquer une source de données, ce sont de simples libellésqui serviront pour les titres, en-tête de colonnes et autres zones de texte fixe.

1. Dans le même formulaire d’essais, cliquez sur l’icône Etiquette et dessinez un rectangletout en haut de page.

2. Saisissez l’intitulé « Titre du formulaire » directement dans le rectangle.

Vous noterez qu’Access insère un message d’alerte à gauche : si l’on clique sur l’icônejaune, Access informe que cette étiquette n’est liée à aucun contrôle (ce type de messageest nouveau avec Access 2007) : ce message n’a rien d’étonnant puisque l’étiquette esteffectivement isolée !

Les contrôles de zones de liste déroulante

Il ne faut pas confondre zone de liste (simple) qu’on verra plus loin et zone de liste dérou-lante telle qu’elle est présentée à la figure 5.7. Cette dernière est d’abord destinée à contraindrel’utilisateur à faire un choix unique. Le principe en est le suivant :

• lorsque la zone de liste déroulante est utilisée, elle est au départ vide de tout libellé ;

• l’utilisateur peut ouvrir la liste déroulante grâce au petit triangle situé à droite et sélec-tionner une valeur parmi une liste provenant soit d’une liste de valeurs entrées par leprogrammeur, soit d’une requête. Le choix ne peut être qu’unique. Le contrôle zone deliste déroulante prend alors la valeur de l’occurrence choisie ;

• mais l’utilisateur peut aussi saisir un texte dans la zone à gauche du triangle : au fur et àmesure de sa frappe, la fenêtre qui s’est ouverte présente toutes les occurrences qui serapprochent au mieux du texte entré. Encore une fois, le choix ne peut être qu’uniqueparmi les items renvoyés par une liste de valeurs ou une requête.

• le contrôle peut être programmé pour n’accepter qu’une des occurrences de la liste (lapropriété du contrôle Limiter à liste est positionnée à Oui) ou bien accepter une valeurnouvelle (la même propriété est à Non) et dans ce cas, le programmeur prévoit une pro-cédure afin de poursuivre le traitement : enregistrement du nouvel item dans une table,simple poursuite avec avertissement, etc.

Une zone de liste déroulante peut comporter plusieurs colonnes et s’ouvrir sur un nombred’items paramétrable ; certaines des colonnes peuvent être cachées (une colonne d’identi-fiant en particulier) et le programmeur peut citer la colonne dont la valeur pourra êtrestockée pour un usage ultérieur.

Figure 5.6Une zone de texte.

Access Livre Page 133 Mercredi, 27. f vrier 2008 7:28 07

Page 139: Access 2007 Et VBA

134 Access® 2007 et VBA

La zone de liste déroulante est un élément essentiel de la saisie guidée de l’utilisateur : pluselle pourra être utilisée, plus le travail de l’opérateur en sera facilité et cadré.

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 dansle formulaire.

3. Un assistant de création de zone de liste déroulante s’ouvre, proposant d’abord soitd’utiliser comme source du contrôle une table ou une requête, soit d’insérer une listede 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 cliquezsur « Suivant ».

6. Ne demandez pas, dans l’étape suivante, de tri particulier des données : les codes postauxsont 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 postauxsont indicatifs : décochez cette option.

8. Réglez la largeur des colonnes afin d’adapter la colonne CODE à la largeur constantede 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 aucontrôle : sélectionnez la valeur par défaut « CODE » et cliquez sur « Terminer ».

Figure 5.7Une zone de liste déroulante ouverte.

Access Livre Page 134 Mercredi, 27. f vrier 2008 7:28 07

Page 140: Access 2007 Et VBA

135Les formulaires

5Chapitre

La zone de liste déroulante peut être testée : elle est parfaitement fonctionnelle. Cliquez dubouton droit sur ce contrôle et consultez la liste des propriétés :

• Le nom du contrôle est Modifiable5, nom attribué par défaut : il peut être changé, parexemple, 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é. Elleest modifiable par les mêmes moyens.

• La propriété Nombre de colonnes est à deux, correspondant au nombre de colonneschoisi 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 pasd’action programmée sur ce contrôle pour le moment.

Les contrôles de zones de liste

La démarche d’utilisation d’une zone de liste diffère de celle d’une liste déroulante. Dèsl’affichage du formulaire, à moins qu’une mise à jour ne soit nécessaire, la zone de liste estdéjà servie d’enregistrements en provenance d’une liste de valeurs ou d’une requête ; iln’existe pas de triangle ouvrant la liste.

• Une ou des actions se déclenchent lors d’un clic ou un double-clic sur un élément de la liste.

• Le choix de plusieurs items dans la liste est possible, dès lors que le programmeur l’aautorisé (propriété : Sélection multiple).

La zone de liste servira donc en priorité pour lancer des actions qui reprennent commeparamètres les items choisis dans la liste. Un exemple illustrera cette utilisation : imagi-nons que l’utilisateur ait à regrouper plusieurs bons de commandes pour lancer la factura-tion correspondante. Si la liste des bons de commandes en attente de facturation estprésentée dans une zone de liste, l’utilisateur sélectionnera les bons adéquats et lancera unprogramme qui fera le regroupement demandé.

Voici la mise en œuvre d’une zone de liste à sélection multiple :

1. Fermez, le cas échéant, la feuille de propriétés ouverte.

2. Le formulaire d’essais étant ouvert en mode création, cliquez dans le ruban sur l’icôneZone de liste et dessinez un large rectangle.

3. Un nouvel assistant, destiné aux Zones de listes, s’ouvre : choisissez encore une foisune table comme source des données (propriété Contenu du futur contrôle) et cliquezsur « Suivant ».

4. Sélectionnez la table « CODE_POSTAL ».

5. Déplacez les deux champs « CODE » et « VILLE » dans le pavé de droite pour qu’ilssoient affichés.

Access Livre Page 135 Mercredi, 27. f vrier 2008 7:28 07

Page 141: Access 2007 Et VBA

136 Access® 2007 et VBA

6. N’utilisez pas de fonction de tri particulière.

7. Décochez l’option de non-affichage de la clé, comme dans l’exemple précédent, etréglez les largeurs de colonnes.

8. Retenez le champ Code comme colonne liée et cliquez sur « Terminer ».

Le résultat s’affiche comme l’exemple de la figure 5.8.

En passant en mode formulaire, vous constatez que la zone de liste est immédiatementexploitable et affiche tout de suite les données. Les propriétés de cet objet, consultables enmode création par un clic droit sur l’objet, sont très voisines de la zone de liste déroulantemise 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 laliste ;

• si l’option Simple est choisie, l’utilisateur pourra sélectionner plusieurs items (en gardantle doigt sur Ctrl et en cliquant plusieurs lignes) ;

• si l’option Etendu est choisie, l’utilisateur pourra sélectionner plusieurs items avec lestouches Maj et Ø ou prendre toute la liste avec Ctrl + Ø.

Les contrôles de traits et rectangles

Ces deux outils permettent de dessiner des formes dans les formulaires. Quasi inutilesdans les formulaires continus (la propriété Diviseur d’enregistrements crée déjà un traitapproprié), ils seront employés avec modération dans les formulaires uniques. En effet,une trop grande surcharge de l’écran induit souvent une gêne visuelle de l’utilisateur.

1. Dans le ruban, cliquez sur le bouton « Rectangle ».

2. Dessinez un rectangle qui englobe les deux zones de listes précédemment faites.

3. Consultez, en mode formulaire, l’effet rendu.

4. Repassez en mode création et cliquez sur l’objet « Rectangle ».

5. Dans le ruban, à droite des boutons de création de contrôles, cliquez sur le bouton« Epaisseur de ligne » et choisissez un trait plus épais.

6. En dessous, cliquez sur le bouton « Couleur du trait » et coloriez-le en rouge, parexemple.

7. Vérifiez son aspect visuel.

Figure 5.8Une zone de liste à sélection multiple.

Access Livre Page 136 Mercredi, 27. f vrier 2008 7:28 07

Page 142: Access 2007 Et VBA

137Les formulaires

5Chapitre

Les contrôles de déclenchement d’actionLe contrôle « Bouton de commande » sert exclusivement au déclenchementd’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’unlibellé, soit d’une image bitmap. Mais il peut être aussi complètement transparent (uneaction 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 troispré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.

1. Dans le formulaire d’essais, fermez le cas échéant, la feuille de propriétés.

2. Cliquez sur l’icône Bouton et dessinez un carré en bas à droite d’écran.

3. L’assistant Bouton de commande d’Access affiche une étape 1 qui aide le program-meur à atteindre son objectif : ici, nous allons créer un bouton destiné à fermer leformulaire.

4. Dans le pavé de gauche des Catégories, choisissez « Opérations sur formulaire ».

5. Dans le pavé de droite des Actions, choisissez « Fermer un formulaire ».

6. Cliquez sur « Suivant ».

7. Dans la deuxième étape, conservez les options par défaut d’un bouton qui est sousforme d’image avec « Sortir par la portière » et cliquez sur « Suivant ».

8. À la place du nom donné d’office par Access, mettez un nom explicite, « Sortie » parexemple, et cliquez sur « Terminer ».

9. Le bouton est bien créé en bas du formulaire et il peut être testé.

10. Faites un clic droit sur ce bouton et sélectionnez « Propriétés ».

11. Atteignez la propriété SurClic (pour cela faites défiler un peu l’ascenseur) : elle estdotée du libellé Macro incorporée.

12. Cliquez sur le carré, à droite, doté de trois points : vous accédez à une macro dontnous verrons la signification plus loin. L’assistant Bouton de commande a non seu-lement créé le bouton proprement dit, mais généré la macro de fermeture duformulaire.

En lieu et place d’une macro incorporée, il serait possible d’écrire directement du codeVisual Basic pour effectuer la même opération. Cette nouvelle manière de travailler seraprivilégiée lorsque l’expérience sera acquise : le code Visual Basic s’exécute plus vite et plusfacilement que les macros.

Figure 5.9Diverses présentations des boutons de commande.

Access Livre Page 137 Mercredi, 27. f vrier 2008 7:28 07

Page 143: Access 2007 Et VBA

138 Access® 2007 et VBA

Les autres contrôlesLes contrôles cadres d’objet dépendants

Le bouton Cadre d’objet dépendant permet de créer des zones dans lesquelles seront insé-rés des objets dépendants d’enregistrements, tel que le montre la figure 5.10. L’exemple leplus répandu est celui de la photo dans un fichier de personnes : le formulaire affiche enmême temps les coordonnées du contact et la photo de la personne correspondante. Cettephoto est stockée dans un champ OLE (Object Linking and Embedding)1. Mais plus géné-ralement, l’objet dépendant peut être non seulement une image bitmap (ou autresformats) mais aussi une grille Excel, un document Adobe Acrobat ou tout autre.

Ouvrez la table « ADRESSE » de la base de données « CODES_POSTAUX_FRANCE » ;vous constatez qu’il existe un champ nommé PHOTO. Nous allons monter un nouveauformulaire, de type continu, basé sur une requête qui va lier les tables ADRESSE etCODE_POSTAL.

Créons tout d’abord la requête nécessaire :

1. Cliquez sur le menu « Créer » et l’icône Création de requête.

2. Ajoutez les deux tables « ADRESSE » et « CODE_POSTAL » (on notera que leschamps CODE sont déjà liés par une relation).

3. Insérez tous les champs des deux tables dans les colonnes de destination (choisissez-les séparément plutôt que d’utiliser le caractère générique *).

4. Affichez les résultats pour tester la requête : vous constatez que le champ VILLE s’affichebien en regard de tous les codes postaux.

5. Enregistrez la requête sous le nom « Req_Annuaire ».

Fermez tous les objets ouverts et laissez en surbrillance la requête Req_Annuaire dans levolet de navigation (sans pour autant l’ouvrir) ; nous créons maintenant le formulairecontinu en utilisant l’assistant.

1. Dans le menu « Créer », cliquez sur le bouton « Plusieurs éléments » parmi les boutonsde formulaires.

2. Le formulaire est créé immédiatement.

3. Enregistrez le nouveau formulaire sous le nom « Frm_Annuaire » (et non pas Req_Annuaire comme Access l’a désigné par défaut).

Cette nouvelle grille-écran mérite quelques commentaires :

• les noms des colonnes présentées ne sont pas ceux des champs, mais ceux des légendesqui y ont été ajoutées ;

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).

Figure 5.10Formulaire avec cadre d’objet dépendant.

Access Livre Page 138 Mercredi, 27. f vrier 2008 7:28 07

Page 144: Access 2007 Et VBA

139Les formulaires

5Chapitre

• la largeur de chaque colonne n’étant pas parfaitement adaptée, il est nécessaire demanipuler la barre de défilement horizontale (en bas) pour visualiser l’ensemble desdonnées d’une ligne ;

• la hauteur de chaque ligne est assez importante, conditionnée par l’insertion du champPHOTO.

Par un clic du bouton droit sur le champ PHOTO, il peut être sélectionné l’option « Insérerun objet » qui offrira à l’utilisateur le loisir de pointer une image stockée sur son disque1 :

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.

Les contrôles cases à cocher

Dans la plupart des cas, les cases à cocher sont liées à des champs de tables du type Oui/Non (booléen), mais elles peuvent également servir pour des programmes plus élaborés etindépendants d’une table2. De forme carrée, ils ne peuvent admettre que deux états, cochéou non coché3.

Dans le formulaire Frm_Annuaire qui a été créé dans le paragraphe précédent, il existeune colonne « Membre le la famille » correspondant au champ nommé FAMILLE de typebooléen dans la table ADRESSE ; la création automatique du formulaire a généré une caseà cocher pour ce champ.

1. Ouvrez le formulaire « Frm_Annuaire » en mode création.

2. Faites un clic droit sur le contrôle « FAMILLE ».

3. Dans la feuille des propriétés, notez que la propriété Triple état est positionnée à Non(par défaut) ; on pourra aussi regretter que la case à cocher ne puisse pas être réglée enhauteur et largeur.

Les contrôles cases d’options et les groupes d’options

Il est rare qu’une case d’option, ronde par opposition à la case à cocher carrée, s’emploieisolément : généralement, plusieurs cases d’options sont regroupées dans un grouped’options. Dans ce cas, chaque case d’option est exclusive des autres : si l’utilisateur cliquesur une case, les autres deviennent blanches. Le groupe d’options peut être lié à un champde table pour renvoyer une et une seule valeur parmi toutes celles des cases d’optionsprésentées à l’écran.

Reprenons le formulaire Frm_Essais_Contrôles pour créer trois cases d’options dans ungroupe :

1. En mode création, cliquez sur le bouton « Groupe d’options » du ruban (et non passur case d’options).

2. Dessinez un rectangle dans le formulaire.

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é.

Access Livre Page 139 Mercredi, 27. f vrier 2008 7:28 07

Page 145: Access 2007 Et VBA

140 Access® 2007 et VBA

3. L’assistant de création de Groupe d’options s’ouvre pour vous permettre de générerautant d’options que nécessaire : saisissez trois noms d’étiquettes d’option tels que« Choix1 », « Choix2 », « Choix3 » puis cliquez sur « Suivant ».

4. La deuxième étape permet de créer, le cas échéant, une option cochée par défaut.

5. La troisième étape donne la possibilité de renvoyer des valeurs (ou formules) corres-pondant à chacune des options. Laissez les valeurs proposées.

6. La quatrième étape offre la latitude de prendre case à cocher ou case d’option ou bou-ton bascule pour remplir le groupe d’options. Généralement ce sont les casesd’options qui sont choisies.

7. Renseignez, dans la dernière étape, le nom du cadre avec le libellé, par exemple, « Faitesvotre choix ».

8. Lors des tests, il sera possible de vérifier que chacun des choix est bien exclusif desautres.

La vérification de la valeur renvoyée par le groupe d’option nous permettra d’aller plusloin dans l’utilisation des contrôles créés jusqu’à maintenant :

1. Passez, le cas échéant, en mode création sur le formulaire Frm_Essais_Contrôles.

2. Affichez la feuille des propriétés du groupe d’option.

3. Le nom du groupe d’options a été fixé par défaut par Access à Cadre30 (ou un autrenuméro d’ordre) : modifiez-le par « MonGroupeOptions ».

4. Fermez la feuille des propriétés.

5. Cliquez sur le bouton « Zone de texte » et dessinez un nouveau contrôle voisin dugroupe d’options.

6. Dans la feuille de propriétés de cette zone de texte, positionnez-vous sur la propriétéSource contrôle et cliquez à droite sur le bouton aux points de suspension : Accessouvre une fenêtre de générateur d’expression représenté à la figure 5.11.

Le formulaire ouvert est représenté en haut à gauche, et tous les contrôles de ce formulairesont listés dans le pavé du milieu.

7. Dans le pavé central, sélectionnez le contrôle MonGroupeOptions.

Figure 5.11Le générateur d’expression d’Access.

Access Livre Page 140 Mercredi, 27. f vrier 2008 7:28 07

Page 146: Access 2007 Et VBA

141Les formulaires

5Chapitre

8. Double-cliquez dans le pavé de droite sur l’option <Valeur> : la formule [MonGroupeOp-tions] (entre crochets) s’insère automatiquement.

9. Cliquez « OK ».

10. La propriété Source contrôle devient = [MonGroupeOptions] (le signe égal désignantune formule est obligatoire).

11. Repassez en affichage formulaire

En cliquant sur les options du groupe d’option créé à l’origine, vous constatez que lavaleur renvoyée dans la zone de texte varie en même temps que les choix dans le groupevoisin, sans nécessité de rafraîchissement de la grille-écran.

Les contrôles onglet

Les contrôles onglet sont difficilement utilisables avec des formulaire continus mais sontparticulièrement bien adaptés aux formulaires de type unique lorsqu’il existe un grandnombre de données relatives à un seul enregistrement. Dans ce cas, il est judicieux dedécomposer les données en grandes catégories destinées à nommer les onglets.

Nous profiterons de l’utilisation des onglets pour découvrir de nouvelles manières decréer un formulaire :

1. Fermez tous les objets éventuellement ouverts.

2. Dans le menu « Créer », cliquez sur le bouton « Création de formulaire » (pour obtenirun formulaire vierge).

3. Cliquez dans le ruban sur Feuille de propriétés.

4. Ouvrez la zone de liste déroulante Source (flèche vers le bas) et sélectionnez la requêteReq_Annuaire : désormais le formulaire est basé sur les données renvoyées par larequête.

5. Cliquez sur le bouton « Contrôle Onglet » et dessinez un large rectangle qui couvretoute la surface disponible.

6. Deux onglets ont été créés d’emblée, nommés Page1 et Page21 ; cliquez sur le premieronglet, puis en utilisant la propriété Nom, changez son nom en Coordonnées et changezle second en Autres.

7. Fermez la feuille des propriétés et activez l’onglet « Coordonnées ».

8. Cliquez dans le ruban sur le bouton « Ajouter des champs existants » : la liste de tousles champs rendus disponibles par la requête apparaît.

9. À l’aide de la touche Ctrl, sélectionnez simultanément les champs NOM, PRENOM,ADRESSE1, ADRESSE2, CODE, VILLE.

10. Glissez ces 6 champs dans l’onglet actif (la disposition initiale est à parfaire).

11. Cliquez sur l’onglet « Autres » et reproduisez la même opération pour insérer leschamps PHOTO, FAMILLE et PJ.

12. Enregistrez ce nouveau formulaire « Frm_AnnuaireAOnglet ».

Le formulaire est prêt pour une visualisation : les deux onglets dissocient coordonnées etautres champs pour un même enregistrement. Le déplacement d’un enregistrement à unautre est assuré par les boutons de déplacement, en bas à gauche.

1. On peut ajouter de nouvelles pages avec le bouton du ruban « Insérer une page ».

Access Livre Page 141 Mercredi, 27. f vrier 2008 7:28 07

Page 147: Access 2007 Et VBA

142 Access® 2007 et VBA

Les contrôles d’objet graphique

À l’image d’Excel, Access permet de réaliser très aisément des graphiques. Afin d’illus-trer ces capacités, nous tenterons de représenter graphiquement le nombre de codespostaux par départements avec la même base de données.

Au départ, il est nécessaire de réaliser une requête qui calcule ce décompte :

1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».

2. Ajoutez la seule table « CODE_POSTAL ».

3. Dans la première colonne insérez l’expression : DPT : Gauche([CODE] ; 2).

4. Cliquez sur le bouton « ∑ Totaux » du ruban.

5. Sélectionnez l’opération Regroupement pour la première colonne.

6. Insérez le champ « CODE » dans la deuxième colonne et choisissez l’opération Compte.

7. Enregistrez la requête sous le nom « Req_Décompte_Codes ».

La requête, dont le code SQL est le suivant : SELECT Left([CODE],2) AS DPT,

Count(CODE_POSTAL.CODE) AS CompteDeCODE FROM CODE_POSTAL GROUP BY

Left([CODE],2); a la structure décrite sur la figure 5.12.

1. Créez un formulaire vierge en cliquant sur « Création de formulaire » dans le menu« Créer ».

2. Cliquez sur le bouton « Insérer un graphique » dans le menu « Création ».

3. Dessinez un rectangle le plus large possible (le nombre de départements étant élevé).

4. L’assistant graphique demande, dans son étape 1, la source des données : sélectionnezla requête « Req_Décompte_Codes ».

5. Dans la deuxième étape, déplacez les deux champs disponibles dans le pavé de droitepuis cliquez sur « Suivant ».

6. Choisissez le type de graphique en haut à gauche (histogramme non empilé), puiscliquez sur « Suivant ».

7. La quatrième étape1 permet de préciser les trois paramètres des données à poser surl’axe horizontal (ici les numéros de départements), des différentes séries (il n’y aqu’une série à représenter) et des données (le nombre de bureaux distributeurs).

Figure 5.12Requête de décompte des codes postaux par département.

1. Peu claire, il faut bien l’admettre…

Access Livre Page 142 Mercredi, 27. f vrier 2008 7:28 07

Page 148: Access 2007 Et VBA

143Les formulaires

5Chapitre

Les paramètres étant bien choisis par défaut, on peut passer à l’étape suivante alorsqu’Access ne représente pas l’aperçu du graphique.

8. Renseignez le titre du tableau « Répartition des bureaux de poste » et optez pourl’absence de légende puis cliquez sur « Terminer ».

9. Dans un premier temps, Access ne représente pas le graphique : il faut passer en modeformulaire pour le consulter.

10. L’aspect graphique peut ne pas convenir à l’utilisateur : cliquez du bouton droit en« Mode création » et sélectionnez « Objet graphique > Ouvrir ».

11. Le programme Microsoft Graph s’ouvre, commun à tous les produits de la gammeOffice. Il permet de modifier la forme du graphique.

Les contrôles Cadre d’objet indépendant et Image

Ces deux types de contrôles ont des fonctions qui se chevauchent : le Cadre d’objet indé-pendant permet d’insérer dans un formulaire toutes sortes d’objets (y compris les images)alors que le contrôle Image ne peut insérer que des objets de type image. Comme son noml’indique, l’objet indépendant n’est pas lié à un enregistrement de table, mais uniquementà un fichier externe. La création des objets de ce type se rapproche beaucoup des objetsdépendants, déjà étudiés.

Les contrôles de liens hypertexte

Une zone de lien hypertexte peut être insérée dans un formulaire grâce à ce contrôle, maisle lien est indépendant de toute donnée de la base ; il renvoie directement à toute source dedonnée, Web ou locale. On rappelle ici qu’il est possible de créer dans une table deschamps de type Lien Hypertexte. Quand le champ est affiché (en mode table, requête ouformulaire), un simple clic sur le lien permet d’accéder aux données référencées. Unexemple pour illustrer cette fonctionnalité : le fichier ADRESSE pourrait contenir unchamp SITE_WEB de type Lien Hypertexte qui permettrait d’accéder directement au siteweb personnel de chaque personne citée.

Les contrôles Pièces jointes

La notion de pièce jointe est nouvelle avec Access 2007. Elle se rapproche beaucoup de lanotion bien connue dans les services de messagerie. Dans le formulaire Frm_Annuai-reAOnglet, une zone de pièce jointe a déjà été créée1.

1. Ouvrez à nouveau, si nécessaire, le formulaire en mode formulaire.

2. Un seul clic sur la zone de la pièce jointe fait apparaître, au-dessus, une série de troisicônes dont le trombone. Un clic sur ce dernier permet d’ajouter ou de consulter despièces jointes, relatives à l’enregistrement en cours.

À n’en pas douter, cette nouvelle fonctionnalité est vouée à un franc succès pour l’avenir.

Les contrôles ActiveX

Les contrôles ActiveX sont des « utilitaires » complémentaires qui permettent de trèsnombreux développements à l’intérieur même d’une application complète. Un bon nom-bre d’entre eux nécessite l’insertion de code Visual Basic pour commander les paramètresdu contrôle, code que nous n’avons pas encore étudié. On se limitera donc à illustrer lespossibilités de ces contrôles en utilisant le très classique contrôle calendrier.

1. Pour qu’elle soit complètement fonctionnelle, le formulaire doit être enregistré au préalable.

Access Livre Page 143 Mercredi, 27. f vrier 2008 7:28 07

Page 149: Access 2007 Et VBA

144 Access® 2007 et VBA

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 leredimensionner.

L’avantage de ce calendrier réside dans le fait que, doté d’une ergonomie complète etefficace, 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 palettedes outils d’Access. Fréquemment utilisés, ils s’avèrent bien souvent incontournables careux seuls permettent d’afficher des données en relation et stockées dans différentes tables. Ilexiste 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 enrelation 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 parl’utilisation d’un sous-formulaire.

Reprenons, pour illustrer cette présentation, l’exemple de la bibliothèque de prêts delivres, dont le modèle simplifié est décrit à la figure 5.13.

Dans le programme de gestion de la bibliothèque, il s’avérera indispensable de monter unformulaire qui montre, adhérent par adhérent, tous les emprunts réalisés ou bien,exemplaire par exemplaire, tous les emprunts en cours. Soit la vision s’opère à partir dela table de gauche sur la table intermédiaire, soit à partir de la table de droite vers la mêmetable centrale.

Access gère très bien cette architecture en intégrant, dans l’assistant à la création de formu-laire, un système détectant les organisations de ce type. Aussi, alors même que la conceptionmanuelle de sous-formulaires est assez ardue, sa mise en place par le système automatisés’effectue en quelques minutes pourvu que le modèle relationnel soit conforme auxnormes merisiennes.

1. Reprenez le premier exercice du chapitre 2 ou recréez les trois tables désignéesdans la figure 5.13 ; en fait seuls les champs ID_ADHERENT, NOM_ADHERENT,ID_EMPRUNT, ID_EXEMPLAIRE, ISBN_LIVRE, DATE_EMPRUNT, RETOUR_EMPRUNT seront utiles.

2. Renseignez trois noms d’adhérents dans la table « ADHERENT » : « Dupont »,« Durand » et « Martin » par exemple (les ID sont numérotés 1, 2, 3 automatiquement).

Figure 5.13Modèle relationnel d’une bibliothèque de prêt.

Access Livre Page 144 Mercredi, 27. f vrier 2008 7:28 07

Page 150: Access 2007 Et VBA

145Les formulaires

5Chapitre

3. Renseignez cinq ISBN fictifs dans la table « EXEMPLAIRE » : « A », « B », « C », « D »,« E » (les ID sont numérotés 1, 2, 3, 4, 5 automatiquement).

4. Renseignez une dizaine d’enregistrements dans la table « EMPRUNT » : la colonneID_EXEMPLAIRE comprendra des valeurs 1, 2, 3, 4, 5 (il y aura donc nécessairementdes doublons), la colonne ID_ADHERENT comprendra des valeurs 1, 2, 3 et lescolonnes de dates pourront contenir n’importe quelle valeur de date.

5. Enregistrez une requête qui appelle tous les champs des trois tables (sélectionnezl’étoile de chaque table) et nommée « Req_Emprunt », représentée à la figure 5.14.

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_Empruntcomme source des données ;

8. Déplacez, grâce au bouton doté de doubles chevrons, tous les champs dans le pavé dedroite puis cliquez « Suivant » ;

9. Immédiatement, Access reconnaît la structure de la demande et propose un choixdans la fenêtre représentée à la figure 5.15.

Figure 5.14Requête Req_Emprunt pour sous-formulaire.

Figure 5.15Assistant pour la création de sous-formulaire.

Access Livre Page 145 Mercredi, 27. f vrier 2008 7:28 07

Page 151: Access 2007 Et VBA

146 Access® 2007 et VBA

Par défaut, Access propose de faire un formulaire avec sous-formulaire et demande dansquel 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-formulairetous les emprunts faits par les adhérents pris individuellement.

• Si l’option Par EXEMPLAIRE est choisie, le formulaire principal permettra de fairedé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 lesemprunteurs et exemplaires concernés.

On voit bien ici la puissance du système, dépendant essentiellement de la qualité dumodè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) etcliquez 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ésentecomme à la figure 5.16.

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 empruntsfaits par l’adhérent indiqué en haut de formulaire.

Figure 5.16Formulaire et sous-formulaire imbriqué.

Access Livre Page 146 Mercredi, 27. f vrier 2008 7:28 07

Page 152: Access 2007 Et VBA

147Les formulaires

5Chapitre

2.2 LES CALCULS ET LES AUTRES FONCTIONS DANS UN FORMULAIRE

Utilisation de fonctions traitant les données source du formulaireLes contrôles Zone de texte supportent toutes les fonctions déjà vues dans l’utilisation dulangage SQL et d’autres encore. Deux voies s’offrent donc au développeur pour la mise aupoint des formulaires :

• soit les calculs et présentations de données sont réalisés dans les requêtes à la source duformulaire ;

• soit la requête à la source du formulaire ne livre que des données brutes et les calculs etprésentations sont faits dans le formulaire lui-même.

Un exemple réutilisant la table des codes postaux illustrera ce choix :

1. Fermez tous les onglets ouverts et mettez la table « CODE_POSTAL » en surbrillance(sans l’ouvrir).

2. Dans le menu « Créer », cliquez sur l’icône Formulaire : le programme crée un formu-laire de type unique (un enregistrement par page).

3. En mode création, modifiez le type de formulaire : dans la feuille de propriétés du for-mulaire, mettez la propriété Affichage par défaut à Formulaires Continus (au lieu deFormulaire Unique).

4. Nous voulons insérer une zone de texte affichant le seul numéro de département : tou-jours en mode création, fermez la fenêtre des propriétés, cliquez sur le bouton « Zonede texte » et dessinez un rectangle à droite du code (dans la zone bleue de droite).

5. Renommez l’étiquette du nouveau Contrôle Département.

6. Dans la feuille de propriétés du nouveau contrôle, renommez la zone de texte Dépar-tement au lieu de Texte4.

7. Repérez le nom du contrôle contenant la valeur du code postal et situé dans la feuillede propriété du contrôle : ce nom est CODE (celui hérité de la table).

8. Dans la feuille de propriétés du nouveau contrôle (sélectionnez Département dans laliste déroulante de la fenêtre de propriété), entrez la formule : =Gauche([CODE];2)dans la propriété Source Contrôle.

En mode formulaire, vous constatez que le nouveau contrôle à droite affiche bien lenuméro du département, soit les deux caractères de gauche du contrôle CODE affiché àcôté. Dans le cas présent, le formulaire utilise la valeur du contrôle CODE pour calculer lavaleur du contrôle Département. On aurait pu tout aussi bien créer une requête commesource de ce formulaire et créer dans la requête une colonne contenant la même formulequi aurait été appelée directement.

Les formules peuvent être beaucoup plus élaborées ; on se propose maintenant de créerune nouvelle zone de texte qui affiche le mot PREFECTURE si c’est le cas, ou bien rien.

1. Créez une nouvelle zone de texte en dessous de Département en mode création.

Access Livre Page 147 Mercredi, 27. f vrier 2008 7:28 07

Page 153: Access 2007 Et VBA

148 Access® 2007 et VBA

2. Insérez la formule : =VraiFaux(Droite([CODE];3)="000";"PREFECTURE";"") dansle nouveau contrôle1.

3. Testez ce contrôle.

Il faut lire cette fonction, littéralement, de la manière suivante : si les trois derniers carac-tères du code postal sont la chaîne 000, alors afficher le mot « PREFECTURE », sinon nerien afficher.

On retiendra les points suivants concernant la syntaxe :

• Le mot CODE est cerné de crochets pour indiquer un champ ou un contrôle de formu-laire : il n’est pas indispensable de les saisir si le nom du champ est bien en un seul mot,Access se charge d’ajouter les crochets.

• Les chaînes de caractères sont cernées par des guillemets ; un double guillemet consécutiféquivaut à une chaîne vide.

• Les arguments de la fonction sont séparés par des points-virgules ; ici, la structure de lasyntaxe est VraiFaux(<condition> ;<alors> ;<sinon>).

D’une manière plus générale, le générateur d’expression d’Access, présenté à la figure 5.17et déjà abordé plus haut, est souvent utile. Ce générateur s’obtient en cliquant sur les troispetits points à droite de Source contrôle dans la feuille des propriétés.

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 montretoutes 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 VisualBasic) 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 lepavé 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 estde même pour la fonction d’extraction de chaîne de caractères (EXTRACCHAINE() dans Access et STXT() dans Excel) et dans bien d’autresfonctions. Seul le langage Visual Basic, commun aux deux produits, utilise la même syntaxe.

Figure 5.17Fonctions intégrées dans le générateur d’expressions.

Access Livre Page 148 Mercredi, 27. f vrier 2008 7:28 07

Page 154: Access 2007 Et VBA

149Les formulaires

5Chapitre

Pour chaque élément pointé grâce au générateur d’expression, toutes les propriétés del’objet sont récupérables (et non pas seulement une valeur de renvoi). Si l’on clique surCODE_POSTAL dans le pavé de gauche et sur le contrôle CODE dans le pavé du milieu, laliste de droite renvoie, par exemple, la valeur de la propriété Visible. Ainsi, l’affichage d’unezone peut être conditionné par la visibilité d’une autre : ce n’est qu’une parmi les millionsdes fonctionnalités qui peuvent être créées.

Il s’agit maintenant d’afficher en bas du même formulaire des codes postaux le compte descodes 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 deformulaire jusqu’à maintenant inexistant est créé.

• Insérez la formule : =Compte([CODE]) dans la propriété Source contrôle de la nouvellezone.

Vous constatez qu’Access réalise bien le compte total de tous les codes contenus dans latable. 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’agissantd’un formulaire continu.

Utilisation des fonctions de domaineDans les exemples précédents, les fonctions et opérations réalisées ne concernaient que leformulaire en cours. Les fonctions de domaine ajoutent deux avantages majeurs : pouvoirfaire appel à des données étrangères aux documents en cours et insérer des conditions deprise en compte.

Les principales fonctions de domaine disponibles sont détaillées ci-après.

La fonction RechDom() (DLookUp() en américain) permet de retrouver une valeur dansune table sur la base de condition. Dans un premier exemple, nous cherchons à retrouverdirectement le nom de la ville dont le code postal est 60000, cette table n’étant pas ouverte,ni aucun formulaire associé.

1. Ouvrez un formulaire vierge en cliquant sur le bouton « Création de formulaire » (leformulaire est vierge de tout contrôle et sans données source).

2. Créez une zone de texte.

3. Affectez à la propriété Source contrôle de la nouvelle zone la valeur :=RechDom("[VILLE]";"CODE_POSTAL";"[CODE]='60000'")1.

4. Repassez en mode formulaire, le contrôle affiche effectivement la ville de Beauvais.

La syntaxe très particulière de cette fonction nécessite des explications :

• La structure globale de la fonction est RechDom(<Nom du champ recherché> ;<tablesource> ;<condition>).

• Chaque argument est cité entre guillemets.

• Le champ VILLE est cerné par des crochets pour désigner un nom de champ ; l’utilisa-tion des crochets est indispensable car Access ne « traduit » pas les noms de champscités entre guillemets (il les interprète comme des chaînes de caractères).

1. D’une certaine manière, cette requête équivaut à un SELECT VILLE FROM CODE_POSTAL WHERE CODE = ‘60000’ en langage SQL.

Access Livre Page 149 Mercredi, 27. f vrier 2008 7:28 07

Page 155: Access 2007 Et VBA

150 Access® 2007 et VBA

• La table CODE_POSTAL est citée entre guillemets, mais sans crochets.

• La condition est citée entre guillemets avec le nom de champ CODE cité entre crochets.

• La valeur 60000 est citée entre apostrophes car le champ CODE n’est pas numériquemais alphabétique. Les apostrophes en lieu et place des guillemets sont indispensables1.

La fonction CompteDom() compte les arguments cités en permettant éventuellementd’insérer des conditions.

1. Créez une nouvelle zone de texte.

2. Affectez à la propriété Source contrôle de la nouvelle zone la valeur : =Cpte-Dom("[CODE]";"CODE_POSTAL"). En mode formulaire, la zone renvoie le chiffre 8 009correspondant au nombre de codes postaux stockés dans la table ; dans ce premier casde figure, la fonction ne comprend pas de condition.

3. Modifiez la formule en insérant une condition pour décompter le nombre de codespostaux dont la ville est Paris. La formule devient : =CpteDom("[CODE]";"CODE_POS-TAL";"[VILLE]='PARIS'"). En mode formulaire, on lit la valeur 29.

Une autre fonction largement utilisée est SomDom() qui additionne des valeurs conte-nues dans des champs numériques et dont la syntaxe est similaire à celle de CpteDom().Les autres fonctions de domaines sont répertoriées dans le générateur de fonctions sous lacatégorie Regroup.Domaine.

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 oulisté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 desgraphismes variés pour présenter les données. Chacun des contrôles est doté d’une feuillede propriétés destinée à paramétrer l’aspect graphique, la présentation des données et laréaction du formulaire aux sollicitations de l’utilisateur. Les contrôles Zone de texte etEtiquette servent essentiellement à présenter des données sous forme de caractères. Lescontrô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ésentationdes choix.

La source des données peut être précisée pour le formulaire lui-même via une requête ouune table mais peut ne pas l’être. Les valeurs renvoyées par les différents contrôles serontdirectement issues des requêtes source ou bien le résultat de calculs via des fonctions. Cesderniè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 simplesaméricaines) peuvent alors être remplacées par des doubles guillemets.

Access Livre Page 150 Mercredi, 27. f vrier 2008 7:28 07

Page 156: Access 2007 Et VBA

151Les formulaires

Exercice

s

5Chapitre

Problèmes et exercicesEXERCICE 1 FORMULAIRE UNIQUE D’AFFICHAGE DES ÉLÈVES

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 utilisantun bon nombre des outils détaillés dans le cours.

* Solution Création de la requête source et génération automatique du formulaire

Comme on l’a vu dans le cours, il est préférable de créer au préalable une requête plutôtque d’utiliser directement la table comme source de données du formulaire.

1. Dans le menu « Créer », cliquez sur l’icône Création de requête.

2. Ajoutez la table « ELEVE ».

3. Sélectionnez tous les champs de la table (de préférence sans utiliser le caractère géné-rique * ; il suffit de double-cliquer sur chaque champ, successivement, pour que celui-ci s’insère à la suite du précédent).

4. Enregistrez la requête sous le nom « Req_élève ».

5. Dans le volet de navigation, sans l’ouvrir, mettez la requête en surbrillance.

6. Dans le menu « Créer », cliquer sur l’icône Formulaire.

7. Au premier jet, le formulaire se présente comme à la figure 5.18.

• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans latable ELEVE ; les champs PAYS_ELEVE et SEXE_ELEVE sont à présenter sous forme dezones de listes déroulantes, la première en extrayant toutes les nationalités comprisesdans la table, la deuxième en utilisant une simple liste de valeurs. Le formulaire doit êtreen 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 lesboutons de déplacements, devenus inutiles.

Figure 5.18Première présentation du premier exercice.

Access Livre Page 151 Mercredi, 27. f vrier 2008 7:28 07

Page 157: Access 2007 Et VBA

152 Access® 2007 et VBA

Mise en forme du formulaire généré automatiquement

Les défauts de présentation sont nombreux sur cette première mouture :

• Le titre du formulaire et le nom de l’onglet ne sont pas valides : ils sont hérités de larequête source des données.

• Les étiquettes portent des noms techniques et non des libellés compréhensibles ; ceci estdû au fait que les légendes n’étaient pas toutes servies dans la table initiale : il faudra lescorriger.

• La largeur des zones et la disposition générale ne sont pas bien adaptées.

• La zone PAYS_ELEVE est du type Zone de texte et non Zone de liste déroulante commedemandé.

• La zone SEXE_ELEVE est déjà du type Zone de liste déroulante comme demandé dansl’énoncé : ceci est dû au fait qu’une liste de valeurs existait déjà dans la table source. Elleest donc correcte.

• Les boutons demandés ne sont pas présents.

• À gauche, le sélecteur d’enregistrements est inutile (s’agissant d’un formulaire de typeunique).

• En bas, les boutons de déplacements doivent être retirés.

• En bas, la barre de défilement horizontale est inutile.

• Le formulaire est en mode lecture/écriture.

Résolvons tous ces problèmes.

• Nom de l’objet, de l’onglet et du volet de navigation.

1. Enregistrez le formulaire sous le nom Frm_élève : ceci est le nom technique de l’objet

2. Afin d’avoir un nom d’onglet supérieur correct, dans la feuille de propriétés du for-mulaire, servez la propriété Légende avec un libellé clair, du type Visualisation desélèves.

3. Afin de préparer le volet de navigation à la création d’un menu complet, renommezl’objet Frm_élève par Visualisation Elèves (le libellé est plus court pour permettre unelecture complète dans la bande étroite du volet) : faites un clic droit sur l’objet dans levolet de navigation et sélectionnez Renommer.

• Titre du formulaire.

1. En mode création, cliquez sur l’icône Feuille de propriétés.

2. Servez la propriété Légende de la zone de texte du titre par le libellé Visualisation desélèves (à la place de Req_élève). Gardez la même police, mais passez sa taille à 28 etmettez-la en gras.

• Libellé des étiquettes.

1. Cliquez directement sur les étiquettes de zones de texte en mode création et modifieztous les libellés. On insérera des items clairs et courts comme Nom, Prénom, Adresse,Code postal et Ville.

2. L’étiquette ADRESSE2, pour la deuxième ligne d’adresse, ne sert à rien. Cliquez direc-tement sur cette étiquette, supprimez tous les caractères : Access fait disparaître

Access Livre Page 152 Mercredi, 27. f vrier 2008 7:28 07

Page 158: Access 2007 Et VBA

153Les formulaires

Exercice

s

5Chapitre

automatiquement sa bordure. Le code postal et la ville peuvent être alignés en mêmetemps : supprimez l’étiquette du code postal.

• Disposition des étiquettes.

1. Si vous tentez de modifier, par exemple, les largeurs des zones de texte, vous remar-querez que cette modification entraîne le changement de largeur de toutes les zones dela colonne. Ceci est dû au fait que le formulaire a été généré automatiquement et que,par défaut, Access a assigné un mode tabulaire à l’ensemble.

2. Appuyez sur Ctrl + A, puis dans l’onglet Réorganiser (qui n’apparaît qu’en mode créa-tion du formulaire en partie haute du ruban), cliquez sur l’icône Supprimer : les zonesde texte deviennent indépendantes les unes des autres.

3. Vous remarquerez qu’avec la souris vous pouvez sélectionner plusieurs zones simulta-nément et les manipuler toutes ensemble pour les re-disposer.

4. Pour déplacer les zones de texte, les flèches directionnelles seront plus précises etmoins difficiles d’emploi que la souris. Les combinaisons de touches Maj + Ø, Maj +≠,Maj + ¨, Maj + Æ règlent la hauteur et la largeur des zones.

5. Servez-vous du quadrillage pour aligner parfaitement les zones : si vous souhaitez unehaute précision dans la disposition, vous pouvez définir les propriétés Gauche, Haut,Hauteur, Largeur des zones de texte en centimètres avec décimales dans la feuille depropriétés.

Au final, et en simplifiant au maximum la présentation, on doit parvenir à une ébauchesimilaire à celle de la figure 5.19.

Création de la zone de liste déroulante des nationalités

Il serait possible de créer de toutes pièces la zone de liste déroulante demandée, mais Accesspermet aussi de transformer un contrôle d’un type à un autre :

1. En mode création, faites un clic droit sur le contrôle PAYS_ELEVE puis sélectionnez« Remplacer Par > Zone de liste déroulante ».

2. La zone de liste déroulante est effective mais non paramétrée : elle n’affiche aucuneliste. Dans la propriété Contenu du contrôle (et non pas Source du contrôle), cliquezsur le bouton à points de suspension.

3. Affichez la table « ELEVE » et refermez la fenêtre des sources disponibles.

4. Insérez le champ « PAYS_ELEVE » dans la première colonne du bas.

5. Cliquez sur Feuille de propriétés dans le ruban (feuille de la requête et non du formu-laire).

Figure 5.19Deuxième ébauche du premier exercice après mise en forme des zones de texte.

Access Livre Page 153 Mercredi, 27. f vrier 2008 7:28 07

Page 159: Access 2007 Et VBA

154 Access® 2007 et VBA

6. Positionnez la propriété Valeurs distinctes à Oui.

7. Refermez la feuille de propriétés ; la requête doit afficher dix enregistrements seule-ment et son code SQL doit être SELECT DISTINCT ELEVE.PAYS_ELEVE FROM ELEVE;(on affiche tous les pays contenus dans la table ELEVE, mais une seule fois).

8. Fermez la fenêtre de la requête et répondez « Oui » au message d’enregistrement.

9. La zone de liste déroulante est fonctionnelle.

Mode lecture seule du formulaire

1. En mode création, cliquez sur l’icône Feuille de propriétés.

2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire.

3. Positionnez les propriétés Entrée données, Ajout autorisé, Suppression autorisée, Modi-fication autorisée à Non : le formulaire est entièrement « bridé ».

Bouton de commande de sortie du formulaire

1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande.

2. Dessinez un carré en bas à droite, de la taille d’un pavé du quadrillage.

3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Opéra-tions sur formulaires > Fermer un formulaire ».

4. Laissez les options par défaut de la deuxième étape.

5. Nommez le bouton « Fermer » à la troisième étape (ne laissez pas le libellé automati-que car le nom du bouton pourra être utilisé ultérieurement en code Visual Basic),puis cliquez sur « Terminer ».

Boutons de commande de défilement du formulaire

1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande.

2. Dessinez un carré en bas, de la taille d’un pavé du quadrillage.

3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Dépla-cements entre enregistrements > Enregistrement suivant ».

4. Laissez les options par défaut de la deuxième étape.

5. Nommez le bouton « Suivant » à la troisième étape.

6. Refaites la même opération mais en prenant à la première étape les options « Dépla-cements entre enregistrements > Enregistrement précédent ».

7. Testez les trois boutons de commande. Très normalement, Access renvoie un messageerreur lorsque l’utilisateur clique sur « Suivant » alors qu’on a atteint la fin de fichierou qu’il clique sur « Précédent » lorsque le pointeur est en début de fichier.

Suppression du sélecteur d’enregistrement, des boutons de déplacements système etdes barres de défilement

1. En mode création, cliquez sur l’icône Feuille de propriétés.

Access Livre Page 154 Mercredi, 27. f vrier 2008 7:28 07

Page 160: Access 2007 Et VBA

155Les formulaires

Exercice

s

5Chapitre

2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire.

3. Positionnez la propriété Afficher le sélecteur à Non.

4. Positionnez la propriété Boutons de déplacement à Non.

5. Positionnez la propriété Barres de défilement à Aucune.

Finalement, le formulaire a l’aspect de la figure 5.20, la zone de liste déroulante étantouverte.

EXERCICE 2 FORMULAIRE ET SOUS-FORMULAIRE DES ÉLÈVES ET DE LEURS MOYENNES

* Solution Assurément, cette problématique évoque immédiatement le besoin d’associer un formu-laire principal, affichant l’identité de l’élève, et un sous-formulaire affichant les moyennescorrespondantes. Le procédé de construction automatique vu dans le cours ne pourramalheureusement pas s’appliquer car la notion de regroupement et de moyenne appliquéeà la table NOTE empêche Access de repérer la structure en sous-formulaire. Il nous fautdonc :

• Créer une requête source de données du formulaire.

• Créer une requête source de données du sous-formulaire.

• Créer un formulaire.

• Insérer un sous-formulaire dans le premier.

Figure 5.20Résultat du premier exercice.

• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans latable ELEVE et simultanément leur moyenne dans chacune des matières. Le formulairemontrera également la moyenne générale.

Access Livre Page 155 Mercredi, 27. f vrier 2008 7:28 07

Page 161: Access 2007 Et VBA

156 Access® 2007 et VBA

Création des requêtes

1. La première requête, nommée « Req1_Moyennes », contient le code SQL SELECTELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE; (les seulsnuméro, nom et prénom des élèves suffisent). Elle a la structure de la figure 5.21.

2. La deuxième requête, nommée « Req2_Moyennes », contient le code SQL SELECT

NOTE.ID_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNO-

TATION FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_MATIERE = NOTE.ID_

MATIERE GROUP BY NOTE.ID_ELEVE, MATIERE.NOM_MATIERE;. Elle a la structure de lafigure 5.22.

Figure 5.21Structure de la première requête Req1_Moyennes.

Figure 5.22Structure de la deuxième requête Req2_Moyennes.

Access Livre Page 156 Mercredi, 27. f vrier 2008 7:28 07

Page 162: Access 2007 Et VBA

157Les formulaires

Exercice

s

5Chapitre

Mise en œuvre du formulaire principal

1. Dans le volet de navigation, mettez la requête Req1_Moyennes en surbrillance.

2. Dans le ruban du menu « Créer », cliquez sur l’icône Formulaire.

3. Le formulaire est immédiatement créé en mode unique avec une large place vers le baspour insérer le sous-formulaire.

4. Enregistrez le formulaire sous le nom « Frm_Moyennes ».

Mise en œuvre du sous-formulaire

1. En mode création, positionnez la souris en bas du corps du formulaire, juste au-des-sus de la barre libellée Pied de formulaire afin d’obtenir un pointeur en forme de flècheNord-Sud. Tirez vers le bas en vue d’agrandir le corps du formulaire.

2. Dans le ruban du menu « Créer », cliquez sur l’icône Sous-formulaire/Sous-état.

3. Dessinez un large rectangle dans la partie vide du corps de formulaire.

4. L’assistant sous-formulaire propose, dans une première étape, les deux différentstypes de sources de données, requêtes/tables ou formulaires : gardez l’option derequêtes prise par défaut.

5. Dans la deuxième étape, sélectionnez la requête Req2_Moyennes et déplacez les troischamps disponibles dans le pavé des champs sélectionnés.

6. La troisième étape, représentée à la figure 5.23, consiste à établir le lien entre formu-laire principal et sous-formulaire. Le texte affiché en bas est le plus clair : il proposed’établir le lien sur le champ ID_ELEVE, ce qui est exact ; nous le vérifierons plus tard.Cette étape est essentielle dans ce travail : sans elle, les affichages seraient fantaisistes etdifficilement vérifiables. Validez en cliquant sur « Suivant ».

7. Dans la dernière étape, renommez le sous-formulaire « Frm_Moyennes1 ».

8. Testez le formulaire : en faisant défiler les élèves, les moyennes par matière varient.

9. Vérifiez la relation entre les deux documents : dans le formulaire principal, cliquezsur Feuille de propriétés, sélectionnez le sous-formulaire Frm_Moyennes1 : les

Figure 5.23Établissement du lien entre formulaire et sous-formulaire.

Access Livre Page 157 Mercredi, 27. f vrier 2008 7:28 07

Page 163: Access 2007 Et VBA

158 Access® 2007 et VBA

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 colonnesrenvoie 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, lesous-formulaire a l’aspect représenté à la figure 5.24.

1. Positionnez la propriété Affichage par défaut du formulaire à Formulaires continus (à laplace de Feuille de données).

2. Sélectionnez les trois contrôles (CTRL + A) et désolidarisez-les en cliquant sur« Supprimer » dans le menu « Réorganiser ».

3. Sélectionnez le seul contrôle ID_ELEVE et positionnez sa propriété Visible à Non.

4. Réduisez la taille du contrôle ID_ELEVE afin qu’il prenne le moins de place possibleen haut à gauche du formulaire.

5. Modifiez la propriété Couleur fond de l’en-tête de formulaire, si elle est noire, pourqu’elle devienne blanche. Pour ce faire, cliquez sur le bouton à points de suspensionde la propriété et choisissez la couleur désirée.

6. Dans l’en-tête de formulaire, insérez deux nouvelles étiquettes Matière et Moyenne.

7. Dans le corps de formulaire, modifiez la propriété Format du contrôle MoyenneDe-NOTATION par Fixe (au lieu d’aucune propriété).

8. Modifiez la propriété Décimales du contrôle Moyenne DeNOTATION en sélection-nant 2 (au lieu d’aucune propriété) : la moyenne sera correctement présentée et nonplus avec un trop grand nombre de décimales.

9. Modifiez la propriété Aligner le texte du contrôle MoyenneDeNOTATION en sélec-tionnant Droite (au lieu de Gauche).

10. Modifiez la propriété Afficher sélecteur du formulaire Frm_Moyennes1 en sélectionnantNon.

Figure 5.24Sous-formulaire avant modifications.

Access Livre Page 158 Mercredi, 27. f vrier 2008 7:28 07

Page 164: Access 2007 Et VBA

159Les formulaires

Exercice

s

5Chapitre

11. Modifiez la propriété Boutons de déplacements par Non.

12. Modifiez la propriété Barres de défilement par Aucune.

13. Insérez dans le Pied de formulaire une nouvelle zone de texte.

14. Modifiez l’étiquette par Moyenne générale.

15. Modifiez la propriété Source de données du nouveau contrôle par la formule :=Moyenne([MoyenneDeNOTATION]).

16. Modifiez les propriétés Format, Décimales, Aligner le texte et Epaisseur police respec-tivement par Fixe, 2, Droite et Gras.

17. Enregistrez le formulaire après ces modifications, afin qu’il ait l’aspect décrit à lafigure 5.25.

Déplacez et redimensionnez les zones de texte et le sous-formulaire afin de disposerl’ensemble de manière claire et harmonieuse. Les résultats, en mode création et en modeformulaire apparaissent aux figures 5.26 et 5.27.

Figure 5.25Sous-formulaire après modifications.

Figure 5.26Formulaire du deuxième exercice en mode création.

Access Livre Page 159 Mercredi, 27. f vrier 2008 7:28 07

Page 165: Access 2007 Et VBA

160 Access® 2007 et VBA

EXERCICE 3 FORMULAIRE AVEC ZONE DE LISTE ET RÉACTUALISATION

* Solution Cet exercice a le même objectif, apparemment, que le précédent : montrer la moyenned’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 voiestotalement nouvelles. Dans l’exercice 2, l’utilisateur « remonte » du serveur de données latotalité 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’utilisateurn’a besoin de connaître les résultats que d’un seul élève, à quoi bon lui livrer la totalité desdonnées ?

Il sera nécessaire, pour cet exercice, d’utiliser une macro, pour la première fois, mais demanière très limitée.

Création du formulaire et de la zone de liste déroulante

1. Fermez toutes les fenêtres éventuellement ouvertes.

2. Dans le menu « Créer », cliquez sur « Création de formulaire » (on obtient une grillevierge, le formulaire étant dépourvu de toute source de données).

3. Enregistrez le formulaire sous le nom « Frm_Moyennes2 » avec pour légende Consul-tation des résultats.

4. Dans le menu « Réorganiser », cliquez sur l’icône du ruban tout à fait à droite en basAfficher/masquer En-tête/Pied de formulaire.

Figure 5.27Formulaire du deuxième exercice en mode formulaire.

• Énoncé Élaborez un formulaire dépourvu de source de données ; une zone de liste déroulantedoit permettre d’afficher tous les élèves et d’en sélectionner un. Au moment du choix del’élève, l’utilisateur découvrira en dessous une zone de liste présentant les moyennesde l’élève.

Access Livre Page 160 Mercredi, 27. f vrier 2008 7:28 07

Page 166: Access 2007 Et VBA

161Les formulaires

Exercice

s

5Chapitre

5. Insérez une étiquette de titre Consultation des résultats. Pour cela revenez au menu« Création ».

6. Dans le menu « Création », cliquez sur le bouton « Zone de liste déroulante » et dessinezun rectangle en haut du formulaire.

7. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Jeveux 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). Cepoint 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 (laproprié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.

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; .À l’ouverture du formulaire, en conséquence, l’utilisateur ne génère aucune requête (nidonc de trafic réseau) ; à l’ouverture de la zone de liste déroulante, il lance une requêtequi vise non pas la totalité de la table ELEVE, mais les seules données dont il a besoin.Il réduit par là le trafic réseau généré.

Figure 5.28Formulaire du troisième exercice avec la seule zone de liste déroulante.

Access Livre Page 161 Mercredi, 27. f vrier 2008 7:28 07

Page 167: Access 2007 Et VBA

162 Access® 2007 et VBA

• La propriété Colonne liée est fixée à 1, qui désigne la première colonne, non visible, del’ID de l’élève. Quand l’utilisateur choisit un élève, le contrôle prend dès lors la valeurdu 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 unnom 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.

Création de la zone de liste

La zone de liste doit faire apparaître les moyennes des élèves : nous savons déjà commentcréer une requête propre à effectuer ce calcul ; en revanche, il sera nécessaire, ici, d’ajouterune condition pour faire en sorte que les moyennes affichées correspondent à l’élève choisidans la zone de liste déroulante supérieure.

1. En mode création, cliquez dans le ruban du menu « Création » sur le bouton « Zone deliste » puis dessinez un large rectangle sous la zone de liste déroulante déjà mise en place.

2. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Jeveux que la liste déroulante recherche les valeurs dans une table ou requête ».

3. À l’étape 2, choisissez la table « NOTE » comme source des données : nous savons fortbien que cette table fournit l’intégralité des notes et non les moyennes, nous corrigeronsce point ultérieurement.

4. À l’étape 3, pointez les champs « ID_ELEVE », « ID_MATIERE » et « NOTATION », puisinsérez-les dans le pavé des champs sélectionnés. Nous savons qu’il manque ici lelibellé de la matière (qui se trouve dans une autre table), nous corrigerons ce pointultérieurement.

5. Négligez l’étape suivante qui permet de préciser d’éventuels tris.

6. À l’étape 5, maintenez la colonne clé cachée et les largeurs de colonnes définies pardéfaut.

7. Nommez à l’étape 6 l’étiquette du contrôle « Moyennes » puis cliquez sur « Terminer ».

8. Dans la feuille de propriété du contrôle qui vient d’être créé, modifiez la propriétéNom par Moyennes (et non Liste5).

À ce stade d’avancement, le formulaire peut être visualisé ; on y constate que les deuxcontrôles sont fonctionnels, mais totalement indépendants l’un de l’autre : le premiermontre tous les élèves mais un choix dans la liste n’a aucun effet particulier ; le secondmontre la liste intégrale de toutes les notes, tous élèves confondus.

1. Dans la feuille de propriétés du contrôle Moyennes, accédez à la requête de la propriétéContenu en cliquant sur le bouton aux trois points de suspension.

2. Ajoutez tout d’abord la table « MATIERE » manquante, grâce à l’icône Afficher table.

3. Supprimez la colonne « ID_MATIERE » inutile, ainsi que la colonne « ID_NOTE ».

4. Ajoutez le champ « NOM_MATIERE » avant la colonne NOTATION.

5. Cliquez sur le bouton « ∑ Totaux » pour faire apparaître la notion d’opérationdans la requête et modifier l’Opération de la colonne NOTATION en Moyenne. Sion veut produire des moyennes avec un arrondi à la deuxième décimale, on peutaffecter la zone Opération avec la valeur Expression (à la place de moyenne) et mettre

Access Livre Page 162 Mercredi, 27. f vrier 2008 7:28 07

Page 168: Access 2007 Et VBA

163Les formulaires

Exercice

s

5Chapitre

l’expression suivante dans la zone Champ : « MoyenneDeNOTATION:Round-((Moyenne(NOTE.NOTATION));2) ».

6. Faites un clic droit sur la colonne NOTATION et sélectionnez Propriétés : la propriétéFormat de la colonne doit être mise à Fixe et la propriété Décimales à 2.

7. Testez la requête : elle doit renvoyer toutes les moyennes, élève par élève, ventilées parmatières.

8. Dans la ligne Critères de la colonne ID_ELEVE, insérez la formule : [Formulai-res]![Frm_Moyennes2]![Choix_Eleve]. Cette formule permet de préciser dans larequête la valeur de l’ID_ELEVE dont on veut afficher les moyennes. Elle est compo-sée de trois parties séparées par des points d’exclamation et de la forme : [Formulai-res]![Nom_du_formulaire]![Nom_du_contrôle].

9. Le code SQL de la requête doit être, au final, SELECT NOTE.ID_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN

[NOTE] ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE GROUP BY NOTE.ID_ELEVE,

MATIERE.NOM_MATIERE HAVING (((NOTE.ID_ELEVE)=[Formulaires]![Frm_

Moyennes2]![Choix_Eleve]));.

La structure graphique doit être similaire à la figure 5.29. La requête ainsi générée parl’interface peut être sauvegardée et fermée pour revenir au formulaire.

Nouveau point sur le fonctionnement général du formulaire : apparemment le résultat estcorrect au premier affichage (si un élève était au préalable sélectionné). Malheureusement,le choix d’un autre élève ne provoque aucun changement dans la zone Moyennes en des-sous. Pire, si le formulaire est fermé puis réouvert, le choix d’un élève laisse la zoneMoyennes complètement vierge !

Cette imperfection provient du déroulement des faits suivants :

• À l’ouverture du formulaire, le contrôle Choix_Eleve ne comporte pas de valeur (aucunélève n’est sélectionné).

• Simultanément, la requête du contrôle Moyennes est lancée : elle ne renvoie aucunenregistrement puisque la référence au contrôle Choix_Eleve est vide.

• Au moment du choix d’un élève, la valeur du contrôle Choix_Eleve devient valide.

Figure 5.29Requête de la zone de liste du troisième exercice.

Access Livre Page 163 Mercredi, 27. f vrier 2008 7:28 07

Page 169: Access 2007 Et VBA

164 Access® 2007 et VBA

• En revanche, la requête qui détermine le contrôle Moyennes ayant déjà eu lieu, elle n’estpas relancée.

Il ne manque donc plus qu’à monter un mécanisme pour relancer la requête à la sourcedes 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.

6. Fermez et enregistrez la macro.

7. Testez le formulaire après l’avoir fermé puis réouvert : au départ, les deux contrôlesdoivent être vierges ; lors du choix d’un élève, les moyennes apparaissent.

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.

Figure 5.30Macro incorporée du troisième exercice.

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 netient 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 deliste ne sont pas déterminables. Nous utilisons donc ici la largeur de colonne comme subterfuge pour cacher le grand nombre de décimales desrésultats.

Access Livre Page 164 Mercredi, 27. f vrier 2008 7:28 07

Page 170: Access 2007 Et VBA

165Les formulaires

Exercice

s

5Chapitre

3. La propriété Largeur du contrôle Moyennes est fixée à 4 cm.

La grille finale aura un aspect similaire à celui représenté à la figure 5.31.

Figure 5.31Résultat final du troisième exercice.

Access Livre Page 165 Mercredi, 27. f vrier 2008 7:28 07

Page 171: Access 2007 Et VBA

Access Livre Page 166 Mercredi, 27. f vrier 2008 7:28 07

Page 172: Access 2007 Et VBA

167

6Les états

Il est toujours possible d’imprimer des formulaires. Mais là n’est pas leur destination première. Les formulaires sont conçus pour la visualisation des données, non leur impression. Access dispose pour ce type d’édition d’une option spécifique, dotée d’outils particuliers, les états. Le program-meur ne doit pas négliger cet aspect fondamental des états imprimés lors de la mise en œuvre d’une application : même si la dématérialisation des documents devient de plus en plus courante, les impressions conservent une force probante.

1. Fonctionnement automatisé .... 1682. Conception d’états, notion

de regroupement ................... 170

Problèmes et exercices 1. État des notes des élèves ........ 174

Chapitre

Access Livre Page 167 Mercredi, 27. f vrier 2008 7:28 07

Page 173: Access 2007 Et VBA

168 Access® 2007 et VBA

(1) Fonctionnement automatisé

À l’image des formulaires, les états utilisent les mêmes sources de données : tables directesou requêtes. Comme pour les formulaires, il sera préférable de monter des requêtes spéci-fiques à chaque état plutôt que d’utiliser les tables directement. En revanche, et à l’inversedes formulaires, un état nécessite impérativement des données dès l’ouverture de l’état : iln’est pas possible de faire intervenir des contrôles tels que les zones de liste.

Pour un premier essai, nous utiliserons les automatismes d’Access afin de tester les fonction-nalités du programme :

1. Ouvrez la base de données des « Codes Postaux ».

2. Dans le volet de navigation, mettez la table « CODE_POSTAL » en surbrillance.

3. Dans le menu « Créer », cliquez sur l’icône Etat.

4. Le programme construit un état.

Le document est présenté avec les standards de toute impression : en haut à droite appa-raissent la date et l’heure de l’impression. Il est visualisable comme un formulaire, maisnon pas comme une impression.

1. Cliquez sur le triangle en bas de l’icône Affichage.

2. Sélectionnez l’option Aperçu avant impression.

3. Le document apparaît tel qu’il sera imprimé, avec le montage des pages prévu (Accessne calcule pas immédiatement le nombre de pages à imprimer, ici 217).

4. Chaque page reprend l’intitulé des colonnes afin de rendre l’état compréhensible,quelle que soit la page.

5. La visualisation se fait sur une page et une seule : l’aperçu est donc différent de celui deWord ou Excel, qui regroupent l’état en un seul document.

6. Une nouvelle barre d’icône supérieure permet de régler les paramètres d’impression(voir figure 6.1).

Les boutons Taille, Portrait, Paysage et Marges sont des raccourcis du bouton Mise en pagequi 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 lesimprimantes 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 A4alors qu’aux États-Unis le format Lettre US est le standard (réglages à préciser dans lesParamètres Régionaux du panneau de configuration Windows).

• En vue d’économiser du papier, il est possible de multiplier les colonnes. Dans le casprésent, le nombre de colonnes est fixé à 1 mais dans la mesure où les seules données à

Figure 6.1Menu de l’aperçu avant impression.

Access Livre Page 168 Mercredi, 27. f vrier 2008 7:28 07

Page 174: Access 2007 Et VBA

169Les états

6Chapitre

imprimer occupent peu de place en largeur, ce chiffre peut être monté à 2, réduisant demoitié le nombre de feuilles nécessaires !1.

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émentMicrosoft en accédant au site www.microsoft.com/downloads/Search.aspx?display-lang=fr dans la famille des produits Office (voir figure 6.2).

Nativement, Access peut exporter les impressions vers Word (fichier RTF) ou vers unfichier 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 desmises en forme automatiques comme le montre la figure 6.3.

La mise en forme automatique peut être accompagnée de mises en forme conditionnelles,particulièrement utiles dans certains cas :

1. Cliquez sur le bouton « Mise en forme conditionnelle ».

2. Dans le pavé Condition 1 de la mise en forme conditionnelle, cliquez dans la zone deliste déroulante et sélectionnez Expression.

3. Dans la zone de l’expression insérez la formule : Droite([CODE];3)="000".

4. Cliquez sur le bouton « Gras » et la police de caractère coloriée en rouge, par exemple.

Grâce à cette mise en forme, toutes les préfectures seront imprimées en rouge et en grasalors que les autres bureaux distributeurs resteront en police normale.

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.2Téléchargement du complément Microsoft Office 2007.

Figure 6.3Options de mise en forme automatique.

Access Livre Page 169 Mercredi, 27. f vrier 2008 7:28 07

Page 175: Access 2007 Et VBA

170 Access® 2007 et VBA

(2) Conception d’états, notion de regroupement

Comme pour les formulaires, et à moins de particularités, il est plus rapide de générerautomatiquement un état et de le modifier que de partir d’une matrice vierge. Afin d’illus-trer la fonction de regroupement et d’étudier la conception des états, nous envisageronsd’imprimer un document qui fournit la liste des bureaux distributeurs, département pardépartement.

Commençons par créer la requête à la source de l’état :

1. Créez une requête appelant la table « CODES_POSTAUX ».

2. Insérez les champs « CODE » et « VILLE ».

3. Ajoutez une troisième colonne nommée « DEPARTEMENT » dont la formule estGauche([CODE];2).

4. Ajoutez le critère suivant à la colonne DEPARTEMENT : « Comme[Indiquez unnuméro de département ou tapez *] ».

La requête, dont le code SQL est SELECT CODES_POSTAUX.CODE, CODES_POSTAUX.VILLE,Left([CODE],2) AS DEPARTEMENT FROM CODES_POSTAUX WHERE (((Left([CODE],2))

Like [Indiquez un numéro de département ou tapez *])); aura la structure graphi-que de la figure 6.4.

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 » « * » pourmontrer 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épartementapparaî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 à chaquedépartement, imprime un compte du nombre de bureaux distributeurs et n’imprime pasla troisième colonne. On veut en outre que, pour chaque département, les enregistrementssoient triés par ordre alphabétique de ville.

Figure 6.4Requête paramétrée des codes postaux par département.

Access Livre Page 170 Mercredi, 27. f vrier 2008 7:28 07

Page 176: Access 2007 Et VBA

171Les états

6Chapitre

9. Cliquez sur l’icône Affichage en haut à gauche et sélectionnez le « Mode Création » ; ledocument apparaît tel qu’à la figure 6.5.

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 unPied 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 pagecomprend 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 basd’é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 endessous de l’en-tête de page.

4. Cliquez sur le champ DEPARTEMENT qui est apparu dans une nouvelle fenêtre enbas.

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 groupeapparaî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 adisparu lors du couper-coller).

13. Un « smart tag » ou message d’anomalie (triangle vert en haut à gauche de la zoned’étiquette) est apparu : cliquez sur le losange jaune et associez l’étiquette à la zone detexte voisine.

14. Dans le bandeau inférieur, cliquez sur Ajouter un tri.

Figure 6.5État en mode création.

Access Livre Page 171 Mercredi, 27. f vrier 2008 7:28 07

Page 177: Access 2007 Et VBA

172 Access® 2007 et VBA

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 pourfinir par 98 mais, à l’intérieur de chaque département, les enregistrements seront triéspar ordre alphabétique de ville.

L’ordonnancement qui vient d’être mis en place n’est nullement le résultat de tris ou desous-totalisations dans la requête source des données, mais bien l’effet de la structure del’état lui-même. En définitive, il doit avoir la structure présentée à la figure 6.6.

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 lesimpressions.

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 depublipostages dans Access même, sans autre outil : les coordonnées des destinatairesseraient gérées comme tout autre champ en haut à droite de la page et le texte mis en placedans autant d’étiquettes qu’il y aurait de paragraphes. Mais cette démarche nous paraîthasardeuse : il serait impossible d’insérer des champs variables au sein même des textes etsurtout, il serait impossible de gérer les largeurs de zones. Il est infiniment plus efficace defaire 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 fixecomme 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 CODEet 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.

Figure 6.6État avec sous-totaux.

Access Livre Page 172 Mercredi, 27. f vrier 2008 7:28 07

Page 178: Access 2007 Et VBA

173Les états

6Chapitre

5. Dans la même feuille de propriétés, positionnez la propriété Cumul à Par Groupe (aulieu de Non).

Le résultat final de l’état doit correspondre à celui de la figure 6.7.

RésuméAccess a conçu l’impression des données par la génération d’états dont l’essentiel desrè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électionspé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.).

Figure 6.7Résultat de l’état « Bottin des codes postaux » avec numérotation des lignes.

Access Livre Page 173 Mercredi, 27. f vrier 2008 7:28 07

Page 179: Access 2007 Et VBA

174 Access® 2007 et VBA

Problèmes et exercicesEXERCICE 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 lesformulaires et les états.

* Solution Le formulaire demandé est un classique de la programmation : il s’agit d’une fenêtre deparamètres d’impression qui s’ouvre uniquement au moment d’une demande d’édition ;on parle de boîte de dialogue modale. La notion de filtre sur état servira à afficher l’élèvesélectionné dans la zone de liste déroulante

Création de la boîte de dialogue modale

1. Dans le menu « Créer », cliquez sur l’icône Plus de formulaires.

2. Sélectionnez Boîte de dialogue modale : un formulaire vierge est créé. En le passant enmode formulaire, on constate qu’il s’agit d’une fenêtre dépourvue de boutons dedimension en haut à droite (sauf la croix de fermeture) et que deux boutons d’actionssont déjà insérés en bas (OK et annuler). Les propriétés Fen Modale et Fen indépen-dante du formulaire sont positionnées à Oui, contrairement aux formulaires habituelsoù ces deux propriétés sont positionnées à Non. La fenêtre a l’aspect présenté à lafigure 6.8.

3. Enregistrez la boîte de dialogue modale sous le nom « Frm_Choix_Eleve » et rensei-gnez la propriété Légende du formulaire par « Choix d’un élève », libellé qui apparaîtradans la barre bleue supérieure du formulaire 1.

4. Insérez une zone de liste déroulante dans le formulaire.

5. À l’étape 1, conservez l’option par défaut de source des données (table).

6. À l’étape 2, choisissez la table « ELEVE ».

• É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 avantimpression 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 decré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 ».

Access Livre Page 174 Mercredi, 27. f vrier 2008 7:28 07

Page 180: Access 2007 Et VBA

175Les états

Exercice

s

6Chapitre

7. À l’étape 3, faites glisser les trois champs « ID_ELEVE », « NOM_ELEVE »,« PRENOM_ELEVE » dans le pavé des champs sélectionnés.

8. Ne vous arrêtez pas à l’étape 4 de la mise en place de tris.

9. Conservez la colonne clé cachée à l’étape 5.

10. Nommez l’étiquette de la zone de liste déroulante « Choix d’un élève » à la dernièreétape.

11. En mode création, nommez le contrôle de Zone de liste déroulante « Choix_eleve »dans les propriétés (ce point est important car le nom du contrôle sera nécessaire parla suite).

Création de la requête à la source de l’état

La requête qui appelle les informations nécessaires à l’état est conçue pour renvoyer toutesles données (alors qu’un seul élève donnera lieu à impression) et dépourvue de tout tri :ces opérations se feront en aval.

1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».

2. Affichez les tables « ELEVE », « MATIERE » et « NOTE ».

3. Insérez les champs « ID_ELEVE », « NOM_ELEVE », « PRENOM_ELEVE »,« NOM_MATIERE », « NOTATION ».

4. Cliquez sur le bouton « ∑ Totaux ».

5. Conservez l’opération Regroupement pour tous les champs de la requête sauf pourNOTATION où la fonction Moyenne doit être sélectionnée.

6. La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE,

ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS Moyen-

neDeNOTATION FROM MATIERE INNER JOIN (ELEVE INNER JOIN [NOTE] ON

ELEVE.ID_ELEVE = NOTE.ID_ELEVE) ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE

Figure 6.8Boîte de dialogue modale vierge.

Access Livre Page 175 Mercredi, 27. f vrier 2008 7:28 07

Page 181: Access 2007 Et VBA

176 Access® 2007 et VBA

GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE,

MATIERE.NOM_MATIERE;, doit avoir la structure présentée à la figure 6.9.

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 navigationau-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 laflèche vers la droite pour insérer le champ ID_ELEVE comme niveau. L’assistant doitavoir la configuration indiquée à la figure 6.10.

Figure 6.9Requête Req3_Moyennes de l’exercice 6-1.

Figure 6.10Niveaux de regroupement dans l’assistant États.

Access Livre Page 176 Mercredi, 27. f vrier 2008 7:28 07

Page 182: Access 2007 Et VBA

177Les états

Exercice

s

6Chapitre

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 unemoyenne générale pour l’élève.

6. Dans les deux étapes suivantes, choisissez le style de formulaire qui vous convient lemieux.

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 nomet le prénom de chacun autant de fois qu’il existe de matières : ceci est dû au faitque 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 passuffisamment 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 lemenu « Réorganiser », cliquez sur Supprimer (les étiquettes se désolidarisent des zonesde 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 milieud’état.

8. Élargissez le champ MoyenneDeNOTATION.

9. Positionnez les propriétés du champ MoyenneDeNOTATION Format et Décimalesrespectivement à Fixe et 2.

10. Dans le pied de groupe, supprimez le libellé automatique de synthèse pour ne conserverque 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.

Access Livre Page 177 Mercredi, 27. f vrier 2008 7:28 07

Page 183: Access 2007 Et VBA

178 Access® 2007 et VBA

L’état des résultats doit avoir la structure décrite à la figure 6.11.

Mise en place du passage du formulaire à l’état et du filtre

La boîte de dialogue modale et l’état étant prêts, il ne reste plus qu’à lier les deux élémentsen insérant dans le même temps la notion de filtre.

1. Ouvrez la boîte de dialogue modale « Frm_Choix_Eleve » en mode création (clic dubouton droit dans le volet de navigation sur l’élément et sélection du « ModeCréation »).

2. Ouvrez la feuille de propriété du contrôle Bouton de commande nommé OK.

3. Sélectionnez la propriété SurClic (qui contient déjà une macro incorporée) et cliquezsur le bouton aux trois points de suspension.

4. La macro ne contient qu’une ligne avec le mot-clé « Fermer » pour action : nous allonsinsérer une ligne avant cette action.

5. Faites un clic droit à gauche de la première ligne et sélectionnez Insérer des lignes : uneligne blanche se positionne au-dessus de l’action Fermer.

6. Ouvrez la zone de liste déroulante dans la colonne Action et sélectionnez OuvrirEtat.

7. Dans la zone inférieure de l’écran, précisez le nom de l’état Résultats en le pointantdans la zone de liste déroulante Nom de l’état.

8. Toujours en bas d’écran, insérez la condition WHERE suivante : [ID_ELEVE]=[For-mulaires]![Frm_Choix_Eleve]![Choix_Eleve]. Dans cette expression, le premierID_ELEVE entre crochets renvoie à celui de l’état pendant que la partie droite del’équation utilise une structure déjà étudiée au chapitre précédent : le mot-clé For-mulaires entre crochets désigne la collection d’objets de ce type, [Frm_Choix_Eleve] désigne le formulaire ciblé (la boîte de dialogue modale) et [Choix_Eleve]désigne le contrôle.

9. Précisez les propriétés de l’action Fermer de la deuxième ligne : le type d’objet à ren-seigner en bas d’écran est un Formulaire et le nom de l’objet est Frm_Choix_Eleve.

Figure 6.11Structure de l’état des résultats après modifications.

Access Livre Page 178 Mercredi, 27. f vrier 2008 7:28 07

Page 184: Access 2007 Et VBA

179Les états

Exercice

s

6Chapitre

La macro doit avoir la structure décrite à la figure 6.12.

10. Fermez la macro et enregistrez les modifications.

11. Testez le programme : à l’ouverture de la boîte de dialogue modale, sélectionnez unélève et cliquez sur « OK », l’état s’ouvre automatiquement et n’affiche que l’élèvesélectionné : l’impression peut être lancée. Remarque : la boîte de dialogue se fermeautomatiquement, dès que le paramètre de choix de l’élève a été renvoyé à l’état.

Figure 6.12Macro incorporée du contrôle OK de la boîte de dialogue modale.

Access Livre Page 179 Mercredi, 27. f vrier 2008 7:28 07

Page 185: Access 2007 Et VBA

Access Livre Page 180 Mercredi, 27. f vrier 2008 7:28 07

Page 186: Access 2007 Et VBA

181

7Les macros

Déjà abordées rapidement, les macros d’Access permettent l’automatisation d’actions successives, éventuellement sous condition. Fondamentalement différentes de celles d’Excel, les macros Access n’enregistrent pas les gestes faits par l’utilisateur, mais doivent au contraire être « composées » par l’entrée d’actions et la mise en place de paramètres à ces actions. Les macros Access ne sont pas traduites immédiatement en langage Visual Basic : il faut mettre en œuvre un utilitaire spécifique pour effectuer cette traduction. Les macros n’en restent pas moins un excellent moyen de passer graduel-lement d’une automatisation partielle à une utilisation du code de programmation.

1. Mise en œuvre des macros..... 1822. Le passage des macros

à Visual Basic........................ 189

Problèmes et exercices 1. Macro insérée dans une zone

de liste.................................. 194

2. Macro d’envoi de messages électroniques ......................... 199

Chapitre

Access Livre Page 181 Mercredi, 27. f vrier 2008 7:28 07

Page 187: Access 2007 Et VBA

182 Access® 2007 et VBA

(1) Mise en œuvre des macros

Les quelques macros qui ont été vues dans les chapitres précédents, uniquement destinéesà parachever un exercice particulier, ont été chaque fois incorporées dans le formulaire oul’état, plus précisément sous la propriété de l’événement à partir duquel elles étaient lancées.

À présent, notre étude va porter sur la conception de macros enregistrées comme telles etnon incorporées.

1.1 CRÉATION DE MACRO

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 nomet 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.

Commentaire de la grille de saisie :

• En haut d’écran, un ruban dont on étudiera le détail dans les pages qui viennent.

• Dans le corps du document, une liste de lignes pouvant contenir des Actions qui sedérouleront successivement.

• En bas, et synchronisés avec la ligne active, les arguments de l’action sélectionnée.Ces arguments varient suivant le type d’action choisi.

• Dans la partie de droite, chaque action peut recevoir un commentaire : nous ne sau-rions que trop recommander la saisie de textes permettant de documenter l’applicationen cours d’élaboration.

Figure 7.1Grille de saisie des macros.

Access Livre Page 182 Mercredi, 27. f vrier 2008 7:28 07

Page 188: Access 2007 Et VBA

183Les macros

7Chapitre

L’ouverture de la zone de liste déroulante de l’action permet de lire une trentaine d’actionspossibles, mais si l’on clique sur le bouton du ruban Afficher toutes les actions, la palettecomplète comprend alors 70 types d’actions programmables.

1. À la première ligne, sélectionnez l’action BoîteMsg.

2. Dans la partie inférieure de l’écran, renseignez le message par « La table des codes pos-taux va s’ouvrir » ; conservez la propriété Bip à Oui ; choisissez le Type comme Pointd’exclamation ; indiquez le Titre : « Ma première macro ».

3. À la deuxième ligne, sélectionnez l’action OuvrirTable.

4. Parmi les arguments, sélectionnez la table « CODE_POSTAL » comme Nom de latable.

5. Précisez l’argument Affichage en Feuille de données et l’argument Mode données enLecture seule.

6. Sur une troisième ligne, insérez l’action TransférerFeuilleCalcul.

7. L’argument Type de transfert doit être positionné à Exportation (au lieu de Importationpar défaut).

8. L’argument Type de feuille de calcul doit être positionné à Excel Workbook (pour uneexportation vers un fichier Excel 2007).

9. Le nom de la table à exporter est « CODE_POSTAL » (on remarquera qu’Access nepropose pas de zone de liste déroulante).

10. Le chemin complet et le nom du fichier doivent tous être indiqués pour une exporta-tion valide ; on entrera un chemin du type C:\Users\Utilisateur1\Desktop\CODE_POSTAL.XLSX1.

11. Les deux derniers arguments de l’action TransférerFeuilleCalcul peuvent être laissés enl’état.

12. Sur une quatrième et dernière ligne insérez une nouvelle BoîteMsg avec pour Message,« Le fichier a été exporté vers Excel », pour Type, Aucun et Titre, Ma première macro.

13. Fermez la macro et enregistrez-la sous le nom « Mcr_Visu_Codes »2.

Testez votre macro, apparue dans le volet de navigation : la boîte de message s’ouvre puis,après un clic sur OK, laisse la place à la table en mode feuille de données et lecture seule.L’exportation se réalise sans même qu’aucun effet visuel n’en découle et le message de bonenvoi s’affiche pour terminer.

1.2 ASSOCIATION D’UNE MACRO À UN BOUTON

La macro qui a été créée dans le paragraphe précédent peut être lancée depuis le volet denavigation, mais il est fréquent que les macros soient associées à un formulaire et un boutondonnés.

1. Dans le menu « Créer », cliquez sur l’icône Création de formulaires (une grille viergede 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.

Access Livre Page 183 Mercredi, 27. f vrier 2008 7:28 07

Page 189: Access 2007 Et VBA

184 Access® 2007 et VBA

3. Dans la première étape de l’assistant, sélectionnez l’action Exécuter une macro parmiles 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éesplus haut se déroulent de la même manière.

1.3 UTILISATION DE VARIABLES DANS LES MACROS

Avec Access 2007, il est désormais possible de faire jouer des variables dans les macros, cequi élargit considérablement la portée de cet outil par rapport aux versions antérieures quien étaient dépourvues. Une variable est une donnée (de type alphanumérique mais nonde type date ou autres) conservée en mémoire jusqu’à ce qu’une commande précise demacro 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 à desinformations stockées quelque part (valeur demandée et valeur de réponse) : le support destockage 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 desvariables 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 luiaffecte une valeur.

3. Dans les arguments, nommez la variable « VilleRecherche ».

4. Dans les arguments, saisissez en Expression la formule : « BEntrée("De quelle villevoulez-vous connaître le code postal ?") ». La fonction BEntrée crée une boîtede dialogue qui permet à l’utilisateur de saisir la valeur de la variable. Le texte entreguillemets 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 lavaleur d’une deuxième variable : choisissez l’action DéfinirVarTemp une nouvelle foissur 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 prendragarde à 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 dela fonction RechDom sont cernées par des guillemets ; le premier argument désigne lacolonne de la recherche et est cerné par des crochets ; le deuxième argument désigne

Access Livre Page 184 Mercredi, 27. f vrier 2008 7:28 07

Page 190: Access 2007 Et VBA

185Les macros

7Chapitre

la table ciblée et ne nécessite pas de crochets ; le troisième argument, qui désigne lesconditions de la recherche, concatène (signe & ou perluète) plusieurs parties :

• 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éepar le mot-clé VarTemp entre crochets, suivi d’un point d’exclamation et du nom devariable encore une fois entre crochets ;

• une dernière partie comprend une apostrophe entre deux guillemets pour fermer lachaîne de caractères ouverte après VILLE. En admettant que la valeur de la variable soitPARIS, 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 messagedoit être précédé du signe = pour que la concaténation soit effective (un texte littéralapparaî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érezl’action SupprimerToutesVarTemp qui ne comprend aucun argument.

Au total, la macro, qu’on enregistra sous le nom « Mcr_Recherche_Code », aura l’aspectde la figure 7.2.

L’exécution de la macro provoque le scénario suivant :

Étape 1 : une boîte de dialogue demande à l’utilisateur de nommer la ville dont le codepostal est recherché, comme il apparaît à la figure 7.3.

Figure 7.2Macro de recherche de code postal en mode création.

Figure 7.3Première étape de la macro de recherche de code postal.

Access Livre Page 185 Mercredi, 27. f vrier 2008 7:28 07

Page 191: Access 2007 Et VBA

186 Access® 2007 et VBA

É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.

1.4 LES MACROS CONDITIONNELLES

Dans l’application précédente, le programme ne prévoit pas le cas où la ville entrée dans laboî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îtdans 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 deslignes : 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 estvide » (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 pourargument Message : « Cette ville n’est pas répertoriée dans la table », pour argumentType : le point d’exclamation et pour argument Titre : Recherche de code postal.

Cette nouvelle ligne de programme, qui « contourne » la trajectoire directe de la macroinitiale, 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 vacontinuer en donnant tout de même une réponse écourtée et inexacte (testez ce cas defigure). 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 syntaxeindique à 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.

Figure 7.4Deuxième étape de la macro de recherche de code postal.

Access Livre Page 186 Mercredi, 27. f vrier 2008 7:28 07

Page 192: Access 2007 Et VBA

187Les macros

7Chapitre

11. Sélectionnez l’action ArrêtMacro dans la colonne Action.

Dans cette nouvelle rédaction, la macro implique bien deux voies possibles (voir figure7.5) :

• Soit la variable est vide et donc le programme renvoie un message erreur, s’arrête etdé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éponseest affichée puis le programme détruit les variables.

1.5 LES ENCHAÎNEMENTS DE MACROS

Les macros peuvent être chaînées entre elles, de manière conditionnelle ou non ; on peutalors 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’expressionest la formule : BEntrée("Tapez 1 pour visualiser les codes, 2 pour en rechercher unprécis"). Le choix entre l’option 1 et l’option 2 orienteront le programme vers l’une oul’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 duNom de macro1.

8. Enregistrez la nouvelle macro sous le nom « Mcr_Choix » (voir figure 7.6).

Figure 7.5Macro conditionnelle.

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 deboucle dans les programmes.

Figure 7.6Macro appelant d’autres macros.

Access Livre Page 187 Mercredi, 27. f vrier 2008 7:28 07

Page 193: Access 2007 Et VBA

188 Access® 2007 et VBA

1.6 LA GESTION DES ERREURS DANS LES MACROS

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 uneapostrophe. Avant de réparer ce problème, tentez par exemple de rechercher le code postalde CAP D’AIL (qui se trouve bien dans la liste) avec la macro Mcr_Recherche_Code : leprogramme renvoie le message erreur de la figure 7.7.

Afin d’éviter l’affichage de ce message, incompréhensible pour l’utilisateur, nous modifions lamacro Mcr_Recherche_Code de la manière suivante :

1. Ouvrez la macro en mode création.

2. Cliquez dans le ruban sur le bouton Noms de macro : le corps de la macro comptedésormais 5 colonnes.

3. Insérez une nouvelle première ligne.

4. Sélectionnez l’action SurErreur avec pour argument Atteindre : Nom Macro et pourargument Nom de Macro : Gestion_Erreurs. On notera que ce nom de macro ne res-pecte pas le suffixe habituel « Mcr_ » donné jusqu’à maintenant. En effet, ce nom demacro restera complètement interne à la macro en cours et ne donnera pas lieu à enre-gistrement en tant que tel. L’action SurErreur a été volontairement posée en début deprogramme pour intercepter toutes les erreurs qui suivront.

5. En bas de macro (9e ligne), saisissez « Gestion_Erreurs » dans la première colonne desNoms de macro.

6. Dans la colonne Action, sélectionnez BoîteMsg avec pour argument Message : « Lenom de la ville ne doit pas comporter d’apostrophe ». La macro a, au final, les pro-priétés indiquées à la figure 7.8.

Figure 7.7Message erreur dû à une mauvaise syntaxe SQL.

Figure 7.8Macro avec gestion des erreurs.

Access Livre Page 188 Mercredi, 27. f vrier 2008 7:28 07

Page 194: Access 2007 Et VBA

189Les macros

7Chapitre

Le programme, désormais, intercepte l’erreur avant qu’elle ne renvoie le message de lafigure 7.7 et « détourne » le programme vers la gestion d’erreurs située en bas.

(2) Le passage des macros à Visual Basic

Avant d’étudier les rudiments de Visual Basic, nous abordons ici un moyen très convivialde glisser du monde des macros à la programmation VBA proprement dite. Access estdoté, en effet, d’un utilitaire qui permet de traduire les macros dans le langage commun àtoutes les applications Office, Visual Basic pour Applications.

2.1 LA CONVERSION DES MACROS EN VISUAL BASIC

La procédure de conversion que nous allons étudier s’avère d’une simplicité extrême etpeut être utilisée massivement dans un premier temps, avant que le langage VBA ne soitcomplètement assimilé. Dans de nombreux cas, il sera judicieux de passer par cette voielorsque 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 unegestion des erreurs et des commentaires au programme (voir figure 7.9) : conservezles deux cases à cocher dans leur état et cliquez sur « Convertir ».

5. Immédiatement, le code qui avait été conçu sous forme graphique devient un « textepur » ouvert dans la fenêtre bien particulière de Visual Basic. La conversion ne comportepas plus de difficultés !

Note

En fait, l’erreur est due à une imperfection de la syntaxe de la fonction RechDom() dans la troisièmeligne du programme. La syntaxe actuelle est RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='" &[VarTemp]![VilleRecherche] & "'"). Dans cette tournure, et pour simplifier les explications, on aemployé des apostrophes pour cerner le nom de la ville recherchée dans la requête SQL. Or, si laville recherchée, justement, comprend elle aussi une apostrophe, il s’ensuit forcément une erreur carSQL ne sait plus où se trouve la chaîne de caractères recherchée. Dans l’absolu, il faut remplacerchaque apostrophe par un double guillemet ("") pour solutionner le problème. La formule devientalors RechDom("[CODE]";"CODE_POSTAL";"[VILLE]= """ & [VarTemp]![VilleRecherche] & """").

Figure 7.9Options de la conversion des macros en Visual Basic.

Access Livre Page 189 Mercredi, 27. f vrier 2008 7:28 07

Page 195: Access 2007 Et VBA

190 Access® 2007 et VBA

6. Lorsque la boîte message « Conversion terminée » est fermée, l’interface est celle deVisual Basic : fermez le programme en cliquant sur la croix supérieure droite (ouFichier > Fermer et retournez à Microsoft Office Access).

2.2 LA PRÉSENTATION DU PROGRAMME VISUAL BASIC

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 êtreinséré, en l’état, dans une application. Généralement, on donnera aux modules des nomsplus 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 égalementpossible 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ésde l’objet, sélectionner le menu « Affichage > Fenêtre Propriétés ».

La fenêtre n’est plus celle d’Access, mais celle de Microsoft Visual Basic. Un bouton enhaut à gauche permet de retourner à Access, qui reste actif en permanence. Cette interfaceest 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 peutexister 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 êtreouverts. 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 commesous-éléments du fichier, mais rapidement, la structure sera celle montrée sur la figure7.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 lecode 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 del’écran.

Figure 7.10.Fenêtre d’ouverture de Visual Basic.

Access Livre Page 190 Mercredi, 27. f vrier 2008 7:28 07

Page 196: Access 2007 Et VBA

191Les macros

7Chapitre

Dans la partie inférieure gauche sont affichées les propriétés de l’objet actif. Ici, on peutlire (et modifier le cas échéant) le nom du module.

Les deux pavés de gauche (projets et propriétés) peuvent être supprimés de l’affichage ouremis 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 à lafigure 7.11. Nous allons le détailler.

• 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 serontceux sélectionnés dans les paramètres régionaux. Cette partie, terminée par un trait,pourrait comprendre d’autres options générales1.

• Les quatre lignes suivantes commencent chacune par une apostrophe (') ; le texte qui setrouve à droite se colore en vert : il s’agit de commentaires et ces lignes ne seront pasexé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 terminepar le mot-clé End Function (ils sont en bleu) ; entre ces deux limites, nous sommesdans une fonction, soit un ensemble de lignes de code constituant un programme quipourra être exécuté.

• Le mot-clé Function est suivi par le nom de fonction Mcr_Visu_Codes() : ce nom estdirectement 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 ; ellepeut ê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 sesparamè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éspar 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.

Figure 7.11Code Visual Basic de la macro convertie « Mcr_Visu_Codes ».

1. Option Explicit, par exemple et qu’on recommande, oblige le programmeur à déclarer toutes ses variables.

Access Livre Page 191 Mercredi, 27. f vrier 2008 7:28 07

Page 197: Access 2007 Et VBA

192 Access® 2007 et VBA

Le texte de la troisième ligne se retrouve souvent en programmation :

• L’expression DoCmd lance une commande Access. Cette expression ne peut pas être utili-sée seule : elle est toujours suivie d’un point et d’un autre objet membre de la classeDoCmd1.

• Dans le cas présent, DoCmd est suivi de l’objet OpenTable (ouvrir la table). De la mêmemanière, on pourra manipuler d’autres éléments Access avec l’action OpenForm (ouvrirun formulaire) ou OpenReport (ouvrir un état).

• Le premier argument de la commande, entre guillemets, est le nom de la table à ouvrir(pas de virgule entre la commande et le nom de table).

• Le deuxième argument est la manière d’ouvrir la table, acViewNormal signifiant modefeuille de données, par opposition à acViewDesign (mode création).

• Le dernier argument précise une ouverture en lecture seule (acReadOnly au lieu deacEdit).

Pour bien vérifier que tous ces arguments sont directement modifiables dans le code,procédez de la manière suivante :

1. Dans la fonction étudiée, cliquez dans le texte tout de suite après l’expression Open-Table.

2. Appuyez sur la touche BackSpace (marche arrière) pour faire disparaître l’expressionjusque et y compris le point séparateur.

3. Tapez de nouveau un seul point : vous voyez que Visual Basic vous propose tous lesobjets possibles par ordre alphabétique (AddMenu, ApplyFilter…).

4. Redescendez jusqu’à l’expression OpenTable, sélectionnez-la et utilisez la touche detabulation, l’expression est reprise dans le texte.

5. Procédez de la même manière en supprimant l’argument acViewNormal et la virgulequi le précède puis retapez la virgule : VB propose plusieurs modes de visualisation(acViewLayout, acViewNormal, etc.).

6. Enfin, faites de la même manière pour le dernier argument acReadOnly.

Il est clair, dès lors, que la frappe directe de code VB n’est pas aussi ardue que les non-initiés se l’imaginent. Un bon moyen de démarrer consiste, justement, à générer du code enutilisant les macros, à le réviser et à l’augmenter. Grâce à cette démarche, on ira graduellementvers une rédaction directe du code.

La fonction créée comprend, comme on l’a prévu au moment de la conversion de lamacro, une gestion des erreurs. Cette structure demande une explication particulière.

• La première ligne de programme comporte le code On Error GoTo Mcr_Visu_Codes_Err ; placé au tout début, ce code prévoit l’hypothèse d’une erreur. Dans cette éventua-lité, le pointeur de programme sera renvoyé au label Mcr_Visu_Codes_Err à la dixièmeligne et sautera la totalité des lignes entre celle qui a provoqué l’erreur et ce qu’on appel-lera la récupération de l’erreur. Le mot-clé GoTo constitue un branchement sur uneétiquette de ligne.

• L’étiquette de ligne est signalée par le mot-clé employé dans le renvoi GoTo suivi dusigne deux-points (:).

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 lemodèle objet VB et grâce auquel on retrouvera tous les outils nécessaires à la rédaction du code.

Access Livre Page 192 Mercredi, 27. f vrier 2008 7:28 07

Page 198: Access 2007 Et VBA

193Les macros

7Chapitre

• 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.

• La ligne suivante se sert de la syntaxe Resume pour « oublier » l’erreur et aller vers unenouvelle é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 dansle code. D’une part, elle est complètement générée sans l’intervention du programmeurmais 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 soitsupprimée, le message affiché par Access serait celui de la figure 7.12.

Dans ce message, doté d’un numéro d’erreur inutile pour l’utilisateur final, il est possiblede cliquer sur le bouton Débogage et d’accéder directement au code VB. Si une applicationcomplète et achevée doit être livrée à des utilisateurs, un tel message est donc à prohiberabsolument !

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 environnementgraphique prévoyant tous les cas de figure possibles. Les macros d’Access 2007 permettentl’utilisation de variables, qui étendent considérablement leur champ d’action, et autorisentles 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 pointde programmes beaucoup plus élaborés et sera donc préféré, à terme, à l’utilisation desmacros.

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 deVBA. La conversion des macros en code crée automatiquement une gestion des erreursqui évite aux utilisateurs d’accéder aux programmes eux-mêmes.

Figure 7.12Message Access en cas d’absence de gestion d’erreurs.

Access Livre Page 193 Mercredi, 27. f vrier 2008 7:28 07

Page 199: Access 2007 Et VBA

194 Access® 2007 et VBA

Problèmes et exercicesLes 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 quelquesajouts et mises au point.

EXERCICE 1 MACRO INSÉRÉE DANS UNE ZONE DE LISTE

* Solution 1. Création du formulaire, de la macro et génération du code VB

L’exercice reprend tous les éléments déjà vus dans les chapitres précédents :

1. Dans le menu « Créer », cliquez sur Création de formulaires (pour obtenir un formu-laire vierge).

2. Cliquez sur le bouton Zone de liste (Contrôle de formulaire).

3. Dessinez un large rectangle dans le corps du formulaire.

4. À l’étape 1 de l’assistant Zone de liste, conservez l’option par défaut de recherche dansune table.

5. À l’étape 2, sélectionnez la table « ELEVE ».

6. À l’étape 3, insérez les trois champs « ID_ELEVE », « NOM_ELEVE » et « PRENOM_ELEVE » dans le pavé des champs sélectionnés.

7. Sautez l’étape 4 des tris à ajouter.

8. Conservez les options par défaut de l’étape 5 (colonne clé cachée).

9. Dans la dernière étape, nommez l’étiquette « Liste des élèves ».

10. Enregistrez votre formulaire sous le nom « Frm_Liste_Eleves ».

Vous devez obtenir un résultat similaire à la figure 7.13.

• É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 demessage présentant la moyenne de l’élève.

2. La macro, incorporée dans le formulaire sera ensuite convertie en code VB. Onajoutera 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 seulematière.

3. Cette boîte de dialogue rappellera le nom et le prénom de l’étudiant suivi de sanote.

Access Livre Page 194 Mercredi, 27. f vrier 2008 7:28 07

Page 200: Access 2007 Et VBA

195Les macros

Exercice

s

7Chapitre

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 nousallons décomposer :

• La fonction MoyDom() est une fonction de regroupement de domaine qui calculeune 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 lecalcul 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’estpas 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éspar des points d’exclamation le type de source (formulaire), le nom du documentsource et le nom du contrôle source.

7. Modifiez l’argument Bip par Non.

8. Pour l’argument Type, choisissez Information.

Figure 7.13Zone de liste de l’exercice 1.

Access Livre Page 195 Mercredi, 27. f vrier 2008 7:28 07

Page 201: Access 2007 Et VBA

196 Access® 2007 et VBA

9. Pour l’argument Titre, entrez RESULTATS.

10. Fermez les fenêtres de la macro pour réaliser les tests.

11. Testez votre macro : la boîte message doit afficher un simple chiffre, doté de beaucoupde décimales.

12. On améliorera donc le résultat final en utilisant la formule suivante : ="Moyennegénérale : " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formu-

laires]![Frm_Liste_Eleves]![Choix_Eleve]);"Fixe") (voir figure 7.14).

• Le libellé Moyenne générale a été ajouté en début de formule, cité entre guillemets.

• La fonction Format() a servi à calculer un arrondi à deux chiffres après la décimale ; ici,elle est de la forme Format(<expression> ; "Fixe").

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 » etcliquez « OK », puis fermez la fenêtre de la macro : à la propriété SurClic du contrôle deZone 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 denavigation ; 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 encode 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 suspensionpermet 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èsexactement à 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 laprocédure qui suit ne sera accessible que dans le module où elle est placée ; on toucheici à la notion de portée des fonctions et procédures, applicable aussi aux variables. Lemot Sub (auquel correspond un End Sub en fin de procédure) initialise une procédure(en lieu et place d’une fonction).

Figure 7.14Premier message renvoyé dans l’exercice 1.

Access Livre Page 196 Mercredi, 27. f vrier 2008 7:28 07

Page 202: Access 2007 Et VBA

197Les macros

Exercice

s

7Chapitre

2. Création de la boîte de message demandant la matière

Pour réaliser la deuxième partie de l’exercice, il faut à présent mettre en œuvre une nou-velle boîte de message, saisie cette fois directement dans VB, et deux variables. En effet, leprogramme doit demander à l’utilisateur une matière (ANGLAIS ou MATHEMATIQUESpar exemple), retrouver le numéro correspondant à cette matière, tenir compte del’élève sélectionné, et donner le résultat correct au moyen d’une formule qui précise larecherche 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éecomme 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 variableen 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 messageinterrogative 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èrerecherchée : VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_

MATIERE=' " & VARLIBMATIERE & " ' ")1. La fonction DLookup(), équivalente enVB de la fonction RechDom(), recherche le numéro de matière correspondant à lamatière citée en toutes lettres.

5. Insérez une ligne plus bas et provisoirement une ligne MsgBox VARNOMATIERE qui nouspermettra 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 messagedemande la matière recherchée ; si vous choisissez MATHEMATIQUES, par exemple, leprogramme renvoie la réponse 2 ; la moyenne calculée ensuite est inexacte puisqu’il s’agit

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 (quotessimples américaines), destinées à faire comprendre la démarche du programmeur, doivent être remplacées par des doubles guillemets pourfaire reconnaître les chaînes de caractères contenant elles-mêmes des apostrophes.

Access Livre Page 197 Mercredi, 27. f vrier 2008 7:28 07

Page 203: Access 2007 Et VBA

198 Access® 2007 et VBA

encore de la moyenne générale. Si cette partie fonctionne correctement, vous pouvezpoursuivre le travail.

1. Supprimez le MsgBox renvoyant le numéro de matière, devenu inutile.

2. Modifiez la formule de résultat final de la manière suivante : MsgBox "Moyenne géné-rale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_

Liste_Eleves!Choix_Eleve & " AND ID_MATIERE = " & VARNOMATIERE), "Fixed"),

vbInformation, "RESULTATS".

On a ajouté une deuxième condition dans la fonction DAvg(), qui concatène l’opérateurAND et pose la deuxième équation ID_MATIERE = VARNOMATIERE.

3. Présentation du nom et du prénom dans la boîte de dialogue

Afin de parachever cet exercice et approfondir les propriétés des Zones de liste, il faut amé-liorer la qualité du renvoi de valeur de la dernière boîte de message.

Le nom et le prénom de l’élève sélectionnés ne sont pas intégrés, pour le moment, dans leprogramme ; seul le numéro de l’élève est récupéré parce que la colonne liée de la Zone deliste renvoie la valeur de ce numéro au moment du clic ; c’est la valeur de Forms!Frm_Liste_Eleves!Choix_Eleve. La fonction Column() de VB va nous permettre de récupérernom et prénom de l’élève.

1. En haut de programme, déclarez deux nouvelles variables de chaînes de caractères DimVARNOM as String, Dim VARPRENOM as String.

2. En bas de programme (avant le MsgBox final), insérez le code VARNOM = Me.Choix_Eleve.Column(1).

3. Juste en dessous, saisissez MsgBox VARNOM et testez le programme : la boîte de messagerenvoie effectivement le nom de l’élève.

L’expression utilisée nécessite plusieurs explications :

• Pour la première fois, on emploie l’objet Me. Me, suivi d’un point et d’autres objetsdépendants, désigne le formulaire en cours : on aurait pu écrire Forms!Frm_Liste_Eleves mais cette formule est beaucoup moins rapide d’accès dans le programme et…plus longue à saisir !

• Me.Choix_Eleve désigne la zone de liste nommée Choix_Eleve dans le formulaire en cours.

• Me.Choix_Eleve.Column désigne une colonne dans la zone de liste citée du formulaire encours. Cette expression nécessite un paramètre de numéro de colonne entre parenthèses.

• La numérotation des colonnes commence à 0. Dans la zone de liste présente, la colonne0 est celle de l’ID_ELEVE, la colonne n˚ 1 est celle de NOM_ELEVE et la colonne n˚ 2celle de PRENOM_ELEVE.

Le programme final devient :

Private Sub Choix_Eleve_Click()

On Error GoTo Choix_Eleve_Click_Err

Dim VARLIBMATIERE As String

Dim VARNOMATIERE As Integer

Dim VARNOM As String

Dim VARPRENOM As String

VARLIBMATIERE = InputBox("Indiquez la matière recherchée", _

"Calcul de moyenne")

VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" _

& VARLIBMATIERE & "'")

VARNOM = Me.Choix_Eleve.Column(1)

Access Livre Page 198 Mercredi, 27. f vrier 2008 7:28 07

Page 204: Access 2007 Et VBA

199Les macros

Exercice

s

7Chapitre

VARPRENOM = Me.Choix_Eleve.Column(2)

MsgBox "La moyenne en " & VARLIBMATIERE & " de " & VARPRENOM & " " _

& VARNOM & " est de : " & Format(DAvg("[NOTATION]", "NOTE",

➥_ "ID_ELEVE =" & Forms!Frm_Liste_Eleves!Choix_Eleve & _

" AND ID_MATIERE = " & VARNOMATIERE), "Fixed"), vbInformation,_

"RESULTATS"

Choix_Eleve_Click_Exit:

Exit Sub

Choix_Eleve_Click_Err:

MsgBox Error$

Resume Choix_Eleve_Click_Exit

End Sub

La boîte de message s’apparente au libellé de la figure 7.15.

EXERCICE 2 MACRO D’ENVOI DE MESSAGES ÉLECTRONIQUES

* Solution 1. Création de la requête à la source du formulaire

La première démarche consiste à créer une requête qui appelle les quatre champs nécessai-res ID_ELEVE, PRENOM_ELEVE, NOM_ELEVE et la moyenne générale de chacund’entre eux ; cette requête servira à l’incrémentation du formulaire à partir duquel seralancée la macro.

1. Dans le menu « Créer », cliquez sur « Création de requête ».

2. Insérez les tables « ELEVE » et « NOTE ».

3. Placez les champs « ID_ELEVE », « PRENOM_ELEVE », « NOM_ELEVE »,« NOTATION » parmi les champs sélectionnés.

4. Cliquez sur le bouton « ∑ Totaux ».

5. Conservez l’opération de regroupement aux trois premiers champs et sélectionnezl’opération Moyenne pour le champ NOTATION.

6. Enregistrez la requête sous le nom « Req_EnvoiMail ».

La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE,

ELEVE.PRENOM_ELEVE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM ELEVE INNER

Figure 7.15Dernier 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 yexé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 serasimplement « Votre moyenne générale est de …. », on joindra le détail des notes sousformat Excel. Traduisez ensuite les macros générées en code Visual Basic.

Access Livre Page 199 Mercredi, 27. f vrier 2008 7:28 07

Page 205: Access 2007 Et VBA

200 Access® 2007 et VBA

JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE GROUP BY ELEVE.ID_ELEVE,

ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE; doit avoir la structure graphique de la figure 7.16.

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 (sansl’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 lafigure 7.17.

Figure 7.16Structure de la première requête de l’exercice 2.

Figure 7.17Présentation du formulaire de l’exercice 2.

Access Livre Page 200 Mercredi, 27. f vrier 2008 7:28 07

Page 206: Access 2007 Et VBA

201Les macros

Exercice

s

7Chapitre

3. Création de la requête de calcul des notes par élève

Troisième étape : créer la requête qui générera le « carnet de notes » de chaque élève, car-net envoyé sous format Excel.

1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».

2. Sélectionnez les tables « NOTE » et « MATIERE ».

3. Insérez les champs « ID_ELEVE », « NOM_MATIERE », « NOTATION », « DATE_NOTE » parmi les champs sélectionnés.

4. Indiquez un ordre croissant à la colonne MATIERE.

5. Insérez le critère suivant dans la colonne ID_ELEVE : [Formulaires]![Frm_Envoi-Mail]![ID_ELEVE]. Ce critère réservera les résultats de la requête au seul élève actifdans le formulaire d’envoi.

6. Enregistrez la requête sous le nom « Req_EnvoiNotes ».

La requête, dont le code SQL est SELECT NOTE.ID_ELEVE, MATIERE.NOM_MATIERE,

NOTE.NOTATION, NOTE.DATE_NOTE FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_

MATIERE = NOTE.ID_MATIERE WHERE (((NOTE.ID_ELEVE)=[Formulaires]![Frm_

EnvoiMail]![ID_ELEVE])) ORDER BY MATIERE.NOM_MATIERE; doit avoir la structuregraphique de la figure 7.18.

4. Création de l’envoi des courriers

Quatrième étape : créer la macro d’envoi des courriers.

1. Dans le menu « Créer », cliquez sur « Macro ».

2. Sélectionnez l’action EnvoyerObjet.

3. Sélectionnez Requête pour le premier argument de TypeObjet de l’action Envoyer-Objet.

4. Choisissez Req_EnvoiNotes dans la liste des requêtes disponibles dans l’argument Nomd’objet.

5. Prenez le format Excel désiré dans l’argument Format de sortie, Excel 2003 ou ClasseurExcel (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

Figure 7.18Structure de la deuxième requête de l’exercice 2.

Access Livre Page 201 Mercredi, 27. f vrier 2008 7:28 07

Page 207: Access 2007 Et VBA

202 Access® 2007 et VBA

mail. Les références citées font allusion au premier enregistrement en cours dans leformulaire ; 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 moyennegénérale est effectuée avec les mêmes paramètres (Format() et MoyDom()) que ceuxdu premier exercice. On y a ajouté la formule Car(13) & Car(10) qui génère un sautde ligne2. La formule de politesse « Bonjour, » sera donc suivie d’un passage à la ligneavant le libellé suivant.

9. L’argument Modifier le message, enfin, sera conservé à Oui pour vérifier la qualité desrésultats.

10. Sauvegardez cette macro sous le nom « Mcr_EnvoiMail ».

Pour commencer à tester la macro, il faut que le formulaire Frm_EnvoiMail soit ouvertet qu’il soit positionné au début de la liste des élèves, il renverra les coordonnées dupremier élève de la liste. L’action EnvoyerObjet de la macro ouvre une session MAPIWindows (Mail Application Program Interface) qui émule l’outil de messagerie choisi pardéfaut (Outlook Express, Outlook ou autres). Le message obtenu est similaire à celui de lafigure 7.19.

Quand la macro sera fonctionnelle, il restera à prévoir le glissement d’un élève au suivantet l’envoi en chaîne de chacun des mails.

1. Modifiez l’argument Modifier le message de l’action EnvoyerObjet dans la macroMcr_EnvoiMail : positionnez-le à Non afin que l’exécution se réalise en bloc3.

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 entreguillemets.

2. L’équivalent Visual Basic de Car(13) & Car(10) est vbCrLF (Carriage Return Line Feed) que nous verrons plus loin.

Figure 7.19Mail automatique envoyé par Access.

3. Il est recommandé, pour cet exercice, de déconnecter provisoirement la machine de son accès Internet : il sera ainsi plus facile de supprimerles messages restés dans la Boîte d’envoi (de toute façon, tous les messages seraient signalés avec une adresse invalide).

Access Livre Page 202 Mercredi, 27. f vrier 2008 7:28 07

Page 208: Access 2007 Et VBA

203Les macros

Exercice

s

7Chapitre

5. L’argument Enregistrement est Suivant.

6. Enregistrez les modifications et fermez cette macro.

7. Dans le menu « Créer », cliquez sur le bouton « Macro ».

8. Dans la nouvelle macro ouverte, sélectionnez l’action ExécuterMacro.

9. L’argument Nom de macro doit être Mcr_EnvoiMail.

10. L’argument Nombre de répétitions est la formule =CpteDom("[ID_

ELEVE]";"ELEVE")-1, qui compte le nombre d’élèves de la table et retire 1 (le premierenregistrement déjà traité).

11. Enregistrez la macro sous le nom « Mcr_EnvoiGroupe ».

12. Ouvrez, si nécessaire, le formulaire Frm_EnvoiMail en mode création.

13. Dans l’en-tête de formulaire, insérez un bouton de commande.

14. À l’étape 1 de l’assistant Bouton de commande, choisissez Divers dans le pavé desCatégories et Exécuter une macro dans le pavé des Actions.

15. Sélectionnez la macro Mcr_EnvoiGroupe dans la deuxième étape.

16. Choisissez l’option Texte dans la troisième étape, avec pour libellé Lancer un envoigroupé.

17. Nommez le bouton « Envoi » dans la dernière étape.

La traduction en code Visual basic de la macro Mcr_EnvoiGroupe donne le résultat affichéà la figure 7.20.

Attention

Les tests, à partir de cet instant, portent sur les 26 enregistrements de la table et ne peuvent êtreinterrompus. Le plus souvent, l’envoi automatique de mails depuis Access génère dans l’outil demessagerie 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 laconfidentialité dans Outlook par exemple) afin d’autoriser les envois automatiques.

Figure 7.20Code de la macro d’envoi groupé.

Access Livre Page 203 Mercredi, 27. f vrier 2008 7:28 07

Page 209: Access 2007 Et VBA

204 Access® 2007 et VBA

La traduction en code Visual basic de la macro Mcr_EnvoiMail donne le résultat affiché àla figure 7.21.

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 deuxmorceaux 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 quitournera depuis la valeur 1 jusqu’au nombre total d’élèves de la table. Elle est fermée parl’expression Next située avant la gestion d’erreurs1. Entre ces deux lignes, la totalité ducode de la macro Mcr_EnvoiMail peut être récupérée.

Figure 7.21Code de la macro d’envoi d’un mail.

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 dansle livre Excel 2007 du même auteur dans la même collection.

Access Livre Page 204 Mercredi, 27. f vrier 2008 7:28 07

Page 210: Access 2007 Et VBA

205

8Le langage VBA sous Access

L’utilisation du code VBA donne à Access des per-formances et des capacités très supérieures à celles qui sont disponibles sous l’interface graphique, tant dans l’affichage des données que dans leur traitement. Ce chapitre présente l’exécutionde requêtes SQL écrites avec le programme VBA, puis une méthode pour charger des données en mémoire afin de les traiter sans même les afficher. Enfin, nous étudierons les rudiments de l’automa-tion, permettant d’exécuter des applications Office depuis Access.

1. Le lancement de requêtes SQL sous VBA ............................... 206

2. L’utilisation de la notion de RecordSet......................... 208

3. L’automation ......................... 215

Problèmes et exercices 1. Un programme de notation .... 219

2. Travail sur jeu d’enregistrements .................. 224

3. Une automation Access/Word........................ 231

Chapitre

Access Livre Page 205 Mercredi, 27. f vrier 2008 7:28 07

Page 211: Access 2007 Et VBA

206 Access® 2007 et VBA

(1) Le lancement de requêtes SQL sous VBA

La commande DoCmd.RunSQL de VBA exécute une requête SQL écrite dans le langage quenous avons étudié en même temps que les requêtes elles-mêmes. Cette commande estrarement utile quand il s’agit de requêtes Sélection (utilisant le mot-clé SELECT du lan-gage SQL), mais elle devient très efficace lorsqu’il s’agit d’exécuter des requêtes SQL tellesque INSERT, UPDATE ou DELETE. Voici un exemple d’action de cette commande pourinsérer puis supprimer un enregistrement de la table CODES_POSTAUX. Les premièresactions génèrent le code SQL de la requête à partir de l’interface graphique d’ACCESS.

1. Ouvrez la base de données « CODES_POSTAUX ».

2. Créez une nouvelle requête d’insertion (Créer, puis Création de requête, ne sélection-ner aucune table, puis choisir Ajout dans le ruban et sélectionner la table CODES_POSTAUX) pour ajouter un enregistrement à la table CODES_POSTAUX dont lecode est 99999 et la ville MONCLOCHER ; la requête, dont le code SQL est INSERTINTO CODE_POSTAL ( CODE, VILLE ) SELECT "99999" AS CODE, "MONCLOCHER" AS

VILLE; se retrouve dans la structure graphique de la figure 8.1. La table CODE_POS-TAL n’est pas présente dans la fenêtre supérieure (afin d’éviter une insertion d’autantde lignes que n’en compte la table elle-même)1.

On peut ensuite sélectionner le code SQL généré et l’insérer dans un programme VisualBasic.

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

Figure 8.1Requête d’insertion.

1. La syntaxe INSERT INTO CODE_POSTAL ( CODE, VILLE ) VALUES ("99999","MONCLOCHER"); est également valide.

Access Livre Page 206 Mercredi, 27. f vrier 2008 7:28 07

Page 212: Access 2007 Et VBA

207Le langage VBA sous Access

8Chapitre

La structure de la procédure Insertion_CodePostal() est en place. Il faut maintenantmodifier son contenu pour y écrire le code de la requête SQL précédemment copiée.

8. Collez (Ctrl + V) le texte du presse-papier entre les guillemets de la commandeRunSQL.

9. Doublez les guillemets qui cernent déjà les chaînes 99999 et MONCLOCHER.

10. Veillez à ce que la chaîne SQL tout entière soit également entre guillemets de sorted’obtenir le code suivant :

Sub Insertion_CodePostal()

DoCmd.RunSQL "INSERT INTO CODE_POSTAL ( CODE, VILLE ) _

SELECT ""99999"" AS CODE, ""MONCLOCHER"" AS VILLE;"

End Sub

11. Exécutez le code en appuyant sur F5 (ou en cliquant sur le triangle vert de la barred’icônes, ou en sélectionnant l’option de menu Exécution > Exécuter Sub/User-Form).

12. Access renvoie un message d’avertissement, prévenant qu’un enregistrement va êtreajouté : validez-le.

13. Si le code est réexécuté une seconde fois, Access donnera le même message d’avertis-sement, mais refusera dans une deuxième fenêtre de réaliser l’insertion en raison del’existence d’un doublon parmi les codes postaux.

Afin de supprimer cet enregistrement fantaisiste, nous allons créer une nouvelle procé-dure Visual Basic faisant appel à un procédé voisin. Il est possible, dès lors que la syntaxeSQL est bien assimilée, d’écrire directement le code suivant, à la suite de la procédureprécédente :

Sub Suppression_CodePostal()

Dim strSQL As String

strSQL = "DELETE FROM CODE_POSTAL WHERE CODE = ""99999"""

DoCmd.RunSQL strSQL

End Sub

Dans cette deuxième présentation, la démarche met en œuvre une variable de type chaînede caractères. On affecte à la variable strSQL (pour String SQL) le texte de la requête SQL,puis on cite la variable après la commande RunSQL. Cette présentation est particulière-ment utile lorsque la requête contient de nombreux paramètres (on peut alors activer lemode débogage pour vérifier la valeur des variables) et lorsqu’elle est longue (on découpealors en autant de variables qu’il existe, par exemple, de lignes de requête : une variablepour la ligne INSERT, une pour la ligne FROM, une pour la ligne WHERE, etc.).

Ce code est particulièrement intéressant car il permet au programmeur de ne pas obliga-toirement afficher des données pour procéder à des manipulations sur la base. Cette orga-nisation s’adapte surtout aux environnements client/serveur, dans lesquels il n’est pastoujours nécessaire (et même déconseillé) de charger des masses de données importantessur le poste client. On peut imaginer, par exemple, un simple formulaire dépourvu detoute source de données natives, qui charge le minimum d’informations indispensables àl’utilisateur, procède à tous les contrôles de forme et génère une seule commande de miseà jour (Insert, Update, Delete). Ce processus s’avère évidemment très lointain de la démar-che conventionnelle d’Access où tout formulaire charge toutes les données de plusieurs tablesgérées en monoposte.

Access Livre Page 207 Mercredi, 27. f vrier 2008 7:28 07

Page 213: Access 2007 Et VBA

208 Access® 2007 et VBA

(2) L’utilisation de la notion de RecordSet

Lorsqu’un formulaire est ouvert avec une source de données (propriété RecordSource duformulaire), il charge dans le même temps un jeu d’enregistrements, RecordSet en améri-cain. Le jeu d’enregistrements se constitue des enregistrements chargés, avec leur ordon-nancement et leurs colonnes, provenant d’une table ou d’une requête. Ils sont « montés »en mémoire afin de les afficher plus rapidement.

Ce chargement en mémoire s’effectue également via l’interface de programmation nom-mée DAO (Data Access Objects). Dès lors, le programmeur peut « jouer » avec ces enregis-trements, les afficher ou les mettre à jour comme il l’entend, sans qu’aucune interfacehomme/machine n’intervienne.

On a adjoint à DAO, depuis sa création, une autre interface, ADO (ActiveX Data Objects).Les deux interfaces de programmation sont dotées chacune d’objets RecordSet dont lamanipulation diffère légèrement. On déclarera donc un RecordSet en précisant toujoursl’interface utilisée.

De plus, DAO et ADO ne sont pas nécessairement chargés sur la machine, il est nécessairede s’en assurer en faisant les vérifications suivantes :

1. Accédez à Visual Basic en utilisant la combinaison des touches Alt + F11.

2. Dans le menu général, cliquez sur « Outils > Références ».

3. Cochez les options (si elles ne le sont pas déjà) Microsoft Office 12.0 Access Data EngineLibrary (DAO) et Microsoft ActiveX Data Objects 6.0 Library (ADO) comme le montrela figure 8.2.

2.1 CHARGEMENT DES RECORDSET

Au lieu d’ouvrir un formulaire affichant les codes postaux, nous allons les charger enmémoire et les afficher grâce à un programme que nous nous proposons d’écrire. La premièreprocédure s’appellera Lecture_Recordset().

Figure 8.2Paramétrage des interfaces chargées sous Visual Basic pour Access.

Access Livre Page 208 Mercredi, 27. f vrier 2008 7:28 07

Page 214: Access 2007 Et VBA

209Le langage VBA sous Access

8Chapitre

1. Saisissez le code suivant dans un module Visual Basic : Sub Lecture_RecordSet() ;VB insère automatiquement un End Sub avant lequel sera saisi le code.

2. Entrez la déclaration Dim db as DAO.Database ; cette ligne déclare une variablenommée db de type objet, l’objet étant une base de données connectée sous l’interfaceDAO.

3. Entrez la déclaration Dim rst as DAO.RecordSet ; cette ligne déclare une variablenommée rst de type objet, l’objet étant un jeu d’enregistrements. Ces deux lignes dedéclarations sont obligatoires (contrairement aux autres variables VB qui sont le plussouvent facultatives).

4. Saisissez Set db = Application.CurrentDb ; le mot-clé SET attribue une référenced’objet à la variable qui avait été déclarée auparavant. Ici, db fera référence désormaisà la base de données courante de l’application en cours (en l’occurrence la base AccessCODES_POSTAUX).

5. Entrez Set rst = db.OpenRecordSet("CODE_POSTAL") : la variable rst fera réfé-rence au jeu d’enregistrements constitué par la table CODE_POSTAL. On notera quela table est citée entre guillemets ; on aurait tout aussi bien pu citer entre guillemetsune requête SQL SELECT tout entière ou bien une variable string contenant le textede la requête. Le mot-clé OpenRecordSet ouvre le jeu d’enregistrements, c’est-à-direqu’il le charge en mémoire vive1.

6. Saisissez le code suivant, qui permettra un affichage en boucle jusqu’à ce que l’utilisateurne l’interrompe.

Dim i as integer

i = 1

Do While i = 1

i = MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _

"Visualisation du RecordSet")

rst.MoveNext

Loop

Rst.Close

Set rst = Nothing

Set db = Nothing

La valeur 1 est tout d’abord attribuée à la variable i.

La ligne suivante démarre une boucle qui réitérera les lignes suivantes (jusqu’au Loop),jusqu’à ce que la valeur i ne soit plus égale à 1.

La variable variable i, à la troisième ligne, prend la valeur renvoyée par une boîte de mes-sage dotée de deux boutons : OK et Annuler. Si l’utilisateur clique sur OK, la valeur ren-voyée par la boîte de message à i est 1 ; si l’utilisateur clique sur Annuler, la boîte renvoie lavaleur 2 et le programme sort de la boucle.

Le contenu de la boîte (prompt) est constitué des deux colonnes de la table CODE_POS-TAL, exprimées volontairement de manières différentes :

• L’expression rst.Fields(0).value renvoie la valeur du premier champ de la table.Attention ! la numérotation commence à 0 et non à 1. rst fait référence au RecordSet,Fields désigne le champ et Value sa propriété de contenu.

1. La commande OpenRecordSet() comprend également un paramètres de mode d’ouverture du recordset qui n’a pas été précisé. Si la sourceest 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, pardéfaut l’ouverture se fait en mode Dynaset. Il existe deux autres modes d’ouverture (SnapShot ou Instantané et ForwardOnly) qui gèrent lecurseur différemment.

Access Livre Page 209 Mercredi, 27. f vrier 2008 7:28 07

Page 215: Access 2007 Et VBA

210 Access® 2007 et VBA

• L’expression rst("VILLE") désigne directement le contenu du champ VILLE pourl’enregistrement en cours. Les deux notations sont équivalentes, mais la première serachoisie de préférence si l’indice de colonne (ici 0) est précisé avec des variables.

• L’expression rst.MoveNext, enfin, déplace le curseur d’une position vers l’avant, notionque nous verrons dans le paragraphe suivant.

• La commande rst.Close ferme le jeu d’enregistrements. Elle est indispensable dans uncode bien écrit, de même que l’annulation des références des deux lignes suivantes (Setrst = Nothing et Set db = Nothing).

Le code écrit donne globalement la rédaction suivante :

Sub Lecture_RecordSet()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Dim i As Integer

Set db = Application.CurrentDb

Set rst = db.OpenRecordset("CODE_POSTAL")

i = 1

Do While i = 1

i= MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _

"Visualisation du RecordSet")

rst.MoveNext

Loop

Rst.Close

Set rst = Nothing

Set db = Nothing

End Sub

Lors de l’exécution, on verra s’afficher successivement tous les codes postaux et les villesassociées jusqu’à ce que l’utilisateur clique sur Annuler.

2.2 DÉCOMPTE DES ENREGISTREMENTS DANS UN RECORDSET ET DÉPLACEMENTS

La notion de curseur doit être finement appréhendée car elle est primordiale dans les jeuxd’enregistrements. A priori et en premier lieu, il est quasi indispensable d’insérer un ordreprécis dans la requête à la base d’un jeu d’enregistrements (une clause ORDER BY dansSQL) : l’ordre des enregistrements est totalement imprévisible dans la table. Il faut doncen 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’enregistrements1.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 ledernier.

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’enregistrementsest 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, sila 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.

Access Livre Page 210 Mercredi, 27. f vrier 2008 7:28 07

Page 216: Access 2007 Et VBA

211Le langage VBA sous Access

8Chapitre

rst.MovePrevious

End If

Le programme renverra assurément une erreur.

De la même manière, lorsque le curseur arrive sur le dernier enregistrement, la propriétéEOF est positionnée à FALSE et ce n’est qu’après une commande MoveNext que la pro-priété passera à TRUE (vrai), trop tard pour éviter un message erreur. Ces propriétés neseront donc utilisées qu’à bon escient, par exemple dans le cadre du décompte des enre-gistrements d’un jeu.

Au moment où un RecordSet est chargé, le système, en effet, ne connaît pas le nombred’enregistrements qu’il contient : la propriété RecordCount n’est pas opérationnelle. Il estnécessaire de balayer tous les enregistrements du jeu pour en connaître la taille. Ci-après,un exemple de code qui compare deux décomptes d’enregistrements avant et aprèsbalayage du jeu1 :

Sub Decompte_RecordSet()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Set db = Application.CurrentDb

Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)

MsgBox "Décompte avant balayage : " & rst.RecordCount, , "Décompte 1"

If Not rst.EOF Then

rst.MoveLast

End If

MsgBox "Décompte après balayage : " & rst.RecordCount, , "Décompte 2"

rst.Close

Set rst = Nothing

Set db = Nothing

End Sub

La première boîte de message, avant balayage, ne décompte qu’un seul enregistrementalors que la seconde en compte 8 009.

2.3 RECHERCHE DES ENREGISTREMENTS DANS UN RECORDSET

Les méthodes FindFirst, FindLast, FindNext, FindPrevious et NoMatch sont les outilsde base des recherches dans un jeu d’enregistrements. On se propose, ici, d’afficher au furet à mesure les préfectures qui commencent par ST. Le programme suivant va ouvrir unjeu d’enregistrements contenant tous les codes postaux puis balayer le recordset en s’arrêtantchaque 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 estdifférente.

Access Livre Page 211 Mercredi, 27. f vrier 2008 7:28 07

Page 217: Access 2007 Et VBA

212 Access® 2007 et VBA

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 premierenregistrement 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 NotNomatch é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 BOURGEN 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, uneautre 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 cetteseconde 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

2.4 MODIFICATION DES ENREGISTREMENTS D’UN RECORDSET

Jusqu’à présent, les enregistrements d’un RecordSet ont été simplement lus sans aucunemodification. S’il est nécessaire de modifier des données, il faut prendre en compte le faitque les données sont chargées en mémoire vive et que les modifications ne vont toucher queces données en mémoire et non celles qui sont enregistrées sur le disque. Il faut doncprocé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

Access Livre Page 212 Mercredi, 27. f vrier 2008 7:28 07

Page 218: Access 2007 Et VBA

213Le langage VBA sous Access

8Chapitre

des données déjà en cours de modification par un autre. On précisera donc le moded’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 sontenvisageables :

• 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’ouverturejusqu’à 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 lesdonné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 dernierparamètre de la méthode OpenRecordSet est à 4), positionne le curseur au niveau du code75001 et modifie le libellé PARIS par PARIS 1er. La mise à jour éventuelle est conditionnéepar 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 laprocédure. Si, en revanche, le paramètre 2 ou 3 (ou aucun) vient en remplacement, leRecordSet 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 del’enregistrement stocké dans la mémoire tampon.

L’enregistrement sur le disque, à ce stade, n’est donc pas réalisé. C’est la commanderst.Update de la ligne suivante qui met à jour la table.

2.5 AJOUT ET SUPPRESSION D’ENREGISTREMENTS

L’ajout d’enregistrements respecte une syntaxe voisine de la modification. On prendragarde au fait que le contrôle de valeur des données s’opère de la même manière que si

Access Livre Page 213 Mercredi, 27. f vrier 2008 7:28 07

Page 219: Access 2007 Et VBA

214 Access® 2007 et VBA

l’insertion était faite manuellement, à la différence près que le programme s’interrompt encas d’insertion non valide. Dans l’exemple suivant, on cherchera à insérer un code 123456qui ne respecte pas la longueur maximum de code postal, ce qui occasionnera une erreurd’exécution.

Sub Insertion_RecordSet()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Set db = Application.CurrentDb

Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)

rst.AddNew

rst("Code") = "123456"

rst("VILLE") = "VILLE-ERREUR"

rst.Update

rst.Close

Set rst = Nothing

Set db = Nothing

End Sub

Quand le code est exécuté pas à pas (F8), on peut vérifier que l’interruption du pro-gramme intervient non pas au moment du rst.Update final, mais dès la lignerst("Code") = "123456" : le contrôle est réalisé dès l’affectation de la valeur à lamémoire tampon car le RecordSet contient déjà les caractéristiques des champs dela table.

En revanche, il est clair que le programme ne peut pas contrôler immédiatement l’exis-tence de doublons : si le code postal à insérer existe déjà dans la table source, la procéduresera interrompue au moment du rst.Update et non avant. De la même manière, il nepeut pas exister de contrôle sur la valeur de clés étrangères : si une valeur de clé étrangèreinexistante dans la table mère est insérée dans une table liée par une contrainte d’intégritéréférentielle, le message erreur n’interviendra qu’au moment du rst.Update. Plus grave:s’il n’existe pas de contrainte d’intégrité référentielle, une insertion erronée aura lieu.

La suppression d’enregistrements via un RecordSet, enfin, est relativement peu employée.Il est plus cohérent et plus direct d’exécuter sous VB une requête SQL comportant la syn-taxe DELETE. On trouvera, ci-après, un exemple dans lequel sont supprimés tous les enre-gistrements dans lesquels la ville commence par XYZ.

Sub Suppression_RecordSet()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Set db = Application.CurrentDb

Set rst = db.OpenRecordset("SELECT * FROM CODE_POSTAL WHERE VILLE LIKE 'XYZ*'")

While Not rst.EOF

rst.Delete

rst.MoveNext

Wend

rst.Close

Set rst = Nothing

Set db = Nothing

End Sub

Le programme, évidemment, n’effectuera aucune suppression car il n’existe aucune villerépondant au critère précisé. On notera surtout qu’ici la commande rst.Update est inter-dite : la suppression est immédiate.

Access Livre Page 214 Mercredi, 27. f vrier 2008 7:28 07

Page 220: Access 2007 Et VBA

215Le langage VBA sous Access

8Chapitre

(3) L’automation

Comme tous les produits de la gamme Office, Access comprend, via VBA, tous les outilspour pratiquer l’automation, en d’autres termes la manipulation « à distance » d’autresapplications simultanément à Access.

Nous avons déjà étudié, dans le chapitre 3, comment importer des données Excel versAccess et comment exporter des données Access vers Excel. Dans l’exemple qui suit, nousallons mettre en œuvre un procédé qui démarre à distance Excel, crée un tableau, insèredes 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étragesimaginables.

Avant de commencer cette partie, il est nécessaire de vérifier que la bibliothèque nécessaireest chargée. Cliquez dans VBA sur « Outils > Références » et cochez, le cas échéant, labibliothèque Microsoft Excel 12.0 Object Library comme le montre la figure 8.3.

Décomposons le programme d’échange Access/Excel ligne par ligne.

1. Dans un module déjà créé, créez une procédure : Sub Echange_xlsx_accdb().

2. Entrez la déclaration Dim prog_xlsx As Excel.Application : cette déclaration pré-pare un objet application Excel. Il ne s’agit que d’une simple déclaration dont les effetsimmédiats sont nuls.

3. Entrez la déclaration Dim fic_xlsx As Excel.Workbook : cette déclaration prépareun objet fichier Excel. Il ne s’agira pas du fichier lui-même, mais d’une référence àl’objet.

4. Entrez les déclarations déjà connues, aptes à gérer un jeu d’enregistrements, Dim dbas DAO.Database et Dim rst As DAO.Recordset.

5. Une dernière déclaration Dim i as Integer définit un compteur.

6. La ligne Set db = Application.CurrentDb affecte pour référence à l’objet db la basede données active.

Figure 8.3Chargement de la bibliothèque des objets Excel.

Access Livre Page 215 Mercredi, 27. f vrier 2008 7:28 07

Page 221: Access 2007 Et VBA

216 Access® 2007 et VBA

7. La ligne Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTALWHERE CODE LIKE '*000' ") crée un jeu d’enregistrements contenant les codespostaux et villes de toutes les préfectures.

8. L’ouverture du jeu d’enregistrements est suivi des deux commandes rst.MoveLast etrst.MoveFirst. Ces dernières sont destinées à balayer le jeu et assurer que sondécompte sera exact.

9. La onzième ligne de programme démarre à distance Excel : Set prog_xlsx = NewExcel.Application. L’objet étant déclaré au préalable, cette commande équivautexactement aux gestes de l’utilisateur qui cliquerait sur Démarrer > Program-mes > Microsoft Excel.

10. La ligne suivante rend l’application visible prog_xlsx.Visible = True. En effet, lors-que la ligne précédente est exécutée, une session Excel démarre (on peut le vérifier enconsultant les processus en cours dans le Gestionnaire des tâches Windows), mais toutce qui va suivre pourrait être exécuté en tâche de fond, sans visualisation graphique.

11. Set fic_xlsx = prog_xlsx.Workbooks.Add. équivaut à la manipulationFichier > Nouveau dans Excel. À partir de cet instant, l’application Excel est « pilotéeà distance » : tous les objets seront référencés à partir du « préfixe » fic_xlsx pour désignercet objet et non pas un autre fichier ouvert simultanément par exemple.

12. La commande fic_xlsx.Sheets(1).Name = "Préfectures" donne au premieronglet du classeur Excel le nouveau nom de « Préfectures » en lieu et place de Feuil1,créé par défaut. La syntaxe Sheets(1).Name = « xxxx », bien connue des program-meurs sous Excel, est simplement préfixée par la référence à l’objet créé dans le mêmeprogramme.

13. Les commandes fic_xlsx.Sheets(1).Range("A1").Value = "CODE" et fic_

xlsx.Sheets.Range("B1").Value = "PREFECTURE" attribuent aux cellules A1 et B1les noms des colonnes. Ici l’objet Range d’Excel qui désigne une cellule a été utilisé.Remarque : la notation doit comprendre la référence au classeur, puis celle de lafeuille 1, puis celle de la cellule, et enfin les coordonnées cartésiennes de la cellule.

14. La ligne For i = 2 To rst.RecordCount démarre une boucle avec pour valeur de i lechiffre 2 correspondant à la deuxième ligne du tableau Excel (la première est occupéepar les noms de colonnes). Les lignes de commandes suivantes, et jusqu’à la ligneNext, seront réitérées autant de fois qu’il y a d’enregistrements dans le RecordSet.

15. fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE") attribue à la ligne i dutableur la valeur du champ CODE dans l’enregistrement en cours. Ici, on a choisi lasyntaxe Cells(x,y) d’Excel et non celle de Range() car la référence numérique se conjugueavec la variable i.

16. fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE") fait la même opérationavec la deuxième colonne.

17. Le curseur est avancé d’une position par la commande suivante rst.MoveNext.

18. La 21e ligne de programme ne comprend qu’un simple Next qui ferme la boucleouverte au point 14.

19. Le fichier Excel est enregistré automatiquement par la commande fic_xlsx.SaveAs"C:\PREFECTURES.XLSX" qui est copié ici à la racine du disque dur.

20. Le fichier Excel (et non l’application) est fermé par la commande fic_xlsx.Close.

1. Sheets(1) désigne la première feuille du classeur qu’on aurait aussi pu appeler Sheets ("Préfectures").

Access Livre Page 216 Mercredi, 27. f vrier 2008 7:28 07

Page 222: Access 2007 Et VBA

217Le langage VBA sous Access

8Chapitre

21. L’application Excel est fermée par la commande prog_xlsx.Quit.

22. La référence à l’objet Excel est supprimée par la commande Set prog_

xlsx = Nothing.

23. Les trois dernières lignes de programme ferment les références au RecordSet, commeon 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

Set prog_xlsx = New Excel.Application

prog_xlsx.Visible = True

Set fic_xlsx = prog_xlsx.Workbooks.Add

fic_xlsx.Sheets(1).Name = "Préfectures"

fic_xlsx.Sheets(1).Range("A1").Value = "CODE"

fic_xlsx.Sheets(1).Range("B1").Value = "PREFECTURE"

For i = 2 To rst.RecordCount

fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE")

fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE")

rst.MoveNext

Next

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 dedonnées :

• Il existe également une méthode CopyFromRecordSet qui transfère directement desdonné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 demultiples paramètres.

• De la même manière que l’échange de données est possible, toutes les opérations depilotage à 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 lesopérations se déroulent en tâche de fond et le fichier Excel se constitue à l’insu même del’utilisateur.

Access Livre Page 217 Mercredi, 27. f vrier 2008 7:28 07

Page 223: Access 2007 Et VBA

218 Access® 2007 et VBA

RésuméL’utilisation de Visual Basic permet la mise au point de programmes complets, passant partous les systèmes d’entrées/sorties (MsgBox(), InputBox()), toutes les gestions de variableset organisations en boucle (While…Loop, Until…Loop, For…Next) qu’un langage deprogrammation 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 vivede données extraites des tables Access et leur manipulation avant recopie éventuelle sur ledisque. Une syntaxe particulière s’y attache, qui prévoit l’utilisation d’un curseur parcourantles données.

Dans Access, enfin, et comme dans tout programme Office, toutes les fonctionnalitésd’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 êtregérés depuis Access en utilisant le langage objet qu’est VBA.

Access Livre Page 218 Mercredi, 27. f vrier 2008 7:28 07

Page 224: Access 2007 Et VBA

219Le langage VBA sous Access

Exercice

s

8Chapitre

Problèmes et exercicesEXERCICE 1 UN PROGRAMME DE NOTATION

• Énoncé On se propose de créer un formulaire qui permettra aux professeurs de noter les élèvesde la base de données ECOLE_INTERNATIONALE. Dans la mesure où il y a plusieursmatiè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 notationsera 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 unenote 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 boutonpour annuler l’opération.

Aux différences près de présentation, le formulaire doit avoir la structure de la figure 8.4au moment de la validation d’une note.

Figure 8.4Formulaire de notation des élèves.

Access Livre Page 219 Mercredi, 27. f vrier 2008 7:28 07

Page 225: Access 2007 Et VBA

220 Access® 2007 et VBA

* Solution L’exercice met en œuvre toutes les connaissances acquises sur les formulaires et y ajoute lelancement d’une requête SQL. Les assistants seront invalidés ; on utilisera de préfé-rence le code VBA et non pas les macros.

1. Dessin des deux contrôles d’affichage des matières et des élèves

1. Dans le menu « Créer », cliquez sur « Création de formulaires ».

2. Enregistrez tout de suite le formulaire sous le nom « Frm_InsertionNotes ».

3. Dans le ruban du menu Création, décochez le bouton de l’icône (forme de baguettemagique) Utiliser les assistants contrôles.

4. Dans le ruban du menu Création, cliquez sur le bouton « Zone de liste déroulante » etdessinez un rectangle en haut de formulaire. Si les assistants ont été invalidés, la zoneest immédiatement créée avec des valeurs par défaut ; dans le cas contraire, cliquez surAnnuler pour obtenir le même résultat.

5. Les propriétés de la zone de liste déroulante sont directement entrées comme suit :

Nom du contrôle : Choix_Matiere (au lieu de Modifiable0).

Nombre de colonnes : 2.

Largeur colonnes : 0;5.

Contenu : SELECT MATIERE.ID_MATIERE, MATIERE.NOM_MATIERE FROM MATIERE

ORDER BY MATIERE.NOM_MATIERE;.

Toutes les autres propriétés sont a priori correctes (non compris la présentation).

6. Dans le menu Création, cliquez sur le bouton « Zone de liste » et dessinez un largerectangle en dessous du premier contrôle.

7. Les propriétés de la zone de liste sont directement entrées comme suit :

Nom du contrôle : Choix_Eleve (au lieu de Liste2).

Nombre de colonnes : 3.

Largeur colonnes : 0;3;3.

Contenu : SELECT DISTINCT ELEVE.ID_ELEVE, ELEVE.PRENOM_ELEVE, ELEVE.NOM_ELEVE, NOTE.ID_MATIERE FROM ELEVE INNER JOIN [NOTE] ON ELEVE.ID_

ELEVE = NOTE.ID_ELEVE WHERE (((NOTE.ID_MATIERE)=[Formulaires]![Frm_

InsertionNotes]![Choix_Matiere])) ORDER BY ELEVE.NOM_ELEVE;.

Toutes les autres propriétés sont a priori correctes (non compris la présentation).

8. Revenez à la zone de liste déroulante et cliquez sur le bouton aux trois points de sus-pension à droite de la propriété Après MAJ.

9. Sélectionnez Générateur de code (et non plus générateur de macro).

10. VB a créé une procédure Choix_Matiere_AfterUpdate(). Ajoutez-y la simple lignede code Me.Choix_Matiere.Requery où Me désigne le formulaire en cours et Choix_Matiere le contrôle de zone de liste. La méthode Requery relance la requête ducontenu de la zone et actualise les résultats.

Enregistrez et testez dès maintenant votre formulaire qui doit déjà fonctionner pour lesdeux contrôles créés. La requête du contenu de la zone de liste étant un peu complexe

Access Livre Page 220 Mercredi, 27. f vrier 2008 7:28 07

Page 226: Access 2007 Et VBA

221Le langage VBA sous Access

Exercice

s

8Chapitre

(présence d’un DISTINCT après le SELECT !), elle est reproduite graphiquement sur lafigure 8.5.

2. Dessin des contrôles de la séquence de saisie des notes

1. Cliquez sur le bouton « Zone de texte » et dessinez un nouveau contrôle dans la partiedroite du formulaire. Ce contrôle est destiné à afficher le nom de l’élève en cours denotation. Nommez-le « Eleve_encours ». La valeur de cette zone et sa visibilité serontgérées plus loin grâce à du code VBA.

2. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à entrer la notede l’élève. Nommez-le « Note_encours », donnez-lui un Format fixe et un nombre dedécimales de 2. Cette zone sera un contrôle de saisie pour l’utilisateur.

3. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à afficher (etéventuellement modifier) la date du jour. Le nom du contrôle est « Date_encours » ; lavaleur par défaut de la zone est =Date().

4. Cliquez sur le bouton « Bouton de commande » et dessinez ce contrôle dans le formu-laire en bas à droite. Renommez la légende et le nom du contrôle par « Validation »(deux modifications). Sous ce bouton se trouvera le code Visual Basic qui lance lacommande SQL d’insertion de la note.

5. Cliquez à nouveau sur le bouton « Bouton de commande » et dessinez ce contrôledans le formulaire en bas à droite. Renommez la légende et le nom du contrôle par« Annulation » (deux modifications).

3. Création du code Visual Basic

À l’ouverture du formulaire, les boutons et zones de texte de saisie des notes doivent êtreinvisibles :

Dans la feuille de propriétés du formulaire lui-même (et non pas d’un autre contrôle),cliquez sur le bouton aux trois points de suspension de la propriété Sur Ouverture et sélec-tionnez le générateur de code pour y entrer les commandes suivantes, incluses dans uneprocédure nommée Form_Open :

Me.Eleve_encours.Visible = False

Me.Note_encours.Visible = False

Me.Date_encours.Visible = False

Figure 8.5Requête d’affichage unique des élèves de l’exercice 1.

Access Livre Page 221 Mercredi, 27. f vrier 2008 7:28 07

Page 227: Access 2007 Et VBA

222 Access® 2007 et VBA

Lors du clic sur un élève, les événements suivants doivent survenir :

• les contrôles relatifs à la saisie doivent devenir visibles ;

• le nom de l’élève choisi doit apparaître dans le champ correspondant.

En conséquence :

1. Dans la feuille de propriétés du contrôle Choix_Eleve, entrez le code suivant dans lapropriété SurClic :

Me.Eleve_encours.Visible = True

Me.Note_encours.Visible = True

Me.Date_encours.Visible = True

Me.Eleve_encours.Value = Me.Choix_Eleve.Column(2)

Me.Date_encours.Value = Date

Le code entré précédemment pourra avantageusement être copié/collé en inversantsimplement les valeurs booléennes des propriétés. Grâce au code de la quatrièmeligne, le contrôle Eleve_encours prend la valeur du nom de l’élève et le contrôleDate_encours prend la valeur de la date en cours. On notera que lors de l’ouverture,la propriété de valeur par défaut de ce contrôle est fixée à la date en cours mais que parla suite, il est nécessaire de le repositionner.

Lors du clic sur le bouton de validation, les événements suivants doivent survenir :

• vérifications de la validité de la saisie ;

• insertion de la note dans la table adéquate ;

• disparition des contrôles de la saisie.

Le code inséré sous la procédure Validation_Click() (propriété SurClic du bouton Vali-dation) est le suivant :

If Not IsNumeric(Me.Note_encours) Then

MsgBox "Vous devez entrer une note valide", , "Contrôle de saisie"

Exit Sub

End If

If Not IsDate(Me.Date_encours) Then

MsgBox "La date doit être renseignée", , "Contrôle de saisie"

Exit Sub

End If

If Me.Note_encours < 0 Or Me.Note_encours > 20 Then

MsgBox "La note doit être comprise entre 0 et 20", , "Contrôle de saisie"

Exit Sub

End If

DoCmd.SetWarnings False

DoCmd.RunSQL "INSERT INTO [NOTE] (ID_ELEVE,ID_MATIERE,NOTATION,

➥DATE_NOTE) SELECT " & Me.Choix_Eleve & "," & Me.Choix_Matiere & ",

➥" & Replace(Me.Note_encours, ",", ".") & ",#" & Me.Date_encours & "#;"

Me.Eleve_encours.Visible = False

Me.Note_encours.Visible = False

Me.Note_encours = ""

Me.Date_encours.Visible = False

Me.Date_encours.Value = Date

DoCmd.SetWarnings True

Ce code mérite les commentaires suivants :

• Les vérifications de validité couvrent le minimum envisageable : la condition If NotIsNumeric() assure que l’insertion SQL ne comprendra pas un champ vide (chaîne

Access Livre Page 222 Mercredi, 27. f vrier 2008 7:28 07

Page 228: Access 2007 Et VBA

223Le langage VBA sous Access

Exercice

s

8Chapitre

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èglesau champ date. La troisième vérification vise la validité de la note elle-même.

• La commande DoCmd.SetWarnings False évite que le programme n’affiche le message« Vous allez insérer un enregistrement » ; elle est annulée en fin de procédure.

• La chaîne de caractères de la commande SQL étant très longue, elle est libellée sur plu-sieurs lignes mais vous devrez la saisir sur une seule ligne. D’une manière plus générale,on peut insérer des signes soulignés (underscore) en fin de ligne pour permettre unchangement de ligne sans que Visual Basic n’interprète la ligne suivante comme unenouvelle commande ; mais cette règle n’est pas valide lorsque le texte coupé est une chaînelittérale entre guillemets.

• Les expressions Me.Choix_Eleve et Me.Choix_Matiere renvoient des valeurs numéri-ques (les ID) ; en conséquence, il est inutile de les cerner par des apostrophes ou desdoubles guillemets.

• La note entrée dans le contrôle Note_encours peut comporter des décimales ; or, le lan-gage SQL exige que les valeurs numériques soient présentées au format anglo-saxonavec le point comme séparateur de décimales. C’est la raison pour laquelle la fonctionReplace est utilisée, qui remplace toutes les virgules par des points dans la chaîne decaractères désignée.

• La date, dans SQL, doit être cernée par des signes dièse (#).

• Les trois contrôles relatifs à la saisie redeviennent invisibles après la validation de lanote ; le contrôle de date reprend la valeur du jour en cours et le contrôle de note prendla valeur d’une chaîne vide. Cette précaution assure que l’élève suivant « n’hérite pas »de la note du précédent.

Le code inséré sous la procédure Annulation_Click() (propriété SurClic du bouton Annu-lation) reprend la fin du code entré pour la validation, soit :

Me.Eleve_encours.Visible = False

Me.Note_encours.Visible = False

Me.Note_encours = ""

Me.Date_encours.Visible = False

Me.Date_encours.Value = Date

Le bouton de sortie de formulaire pourra être réalisé avec l’assistant de bouton de com-mande (plus rapide) :

1. Le formulaire étant en mode création, cliquez sur l’icône Utiliser les assistants contrôle(représentée par une baguette magique).

2. Cliquez sur l’icône Bouton.

3. Dessinez un carré en bas à droite.

4. Dans la première étape de l’assistant, choisissez les options « Opérations sur formu-laires » et « Fermer un formulaire ».

5. Cliquez directement sur Terminer.

L’aspect général du formulaire (sélecteur d’enregistrements, boutons de déplacements,barres de défilement, etc.) ne sera pas négligé.

Access Livre Page 223 Mercredi, 27. f vrier 2008 7:28 07

Page 229: Access 2007 Et VBA

224 Access® 2007 et VBA

EXERCICE 2 TRAVAIL SUR JEU D’ENREGISTREMENTS

* Solution 1. Modification de la structure de la table

En premier lieu, ce travail sur les notes nécessite une modification de structure de la tabledes notes. En effet, la nouvelle procédure modifiera certaines notes, sélectivement : si, parerreur, elle est appliquée deux fois sur la même série, le handicap des élèves concernés nesera plus de deux points, mais de quatre ! Il faut donc insérer un champ NOTEPONDEREE quistockera la note réévaluée alors que la colonne des notes initiales restera vierge de toutemodification.

1. Insérez manuellement un champ NOTEPONDEREE dans la table NOTE.

2. Reprenez les caractéristiques du champ NOTATION pour en déterminer les propriétés.

3. Créez un nouveau module dans le projet ECOLE_INTERNATIONALE en effectuant un clicdroit sur les modules dans Visual Basic Editor puis Insertion. L’accès à Visual Basic estobtenu par Alt-F11 ou Outils de base de données > Visual Basic.

4. Nommez le module « Pondération ».

Il existe, comme toujours en informatique, un grand nombre de solutions au problèmeposé. Nous en indiquerons deux, faisant appel à des procédés différents et se distinguantsurtout par la vitesse d’exécution. La première méthode met simultanément en œuvredeux jeux d’enregistrements (ce qui renforcera les notions acquises dans le cours ) ; laseconde comporte la notion nouvelle de variable tableau. Nous verrons alors que la secondeméthode « tourne » à peu près quatre fois plus vite que la première.

2. Version avec deux jeux d’enregistrements

Le problème le plus immédiat de cet énoncé réside dans le fait que la nationalité des élèvesest indiquée dans la table ELEVE par des caractères alphabétiques alors que les matièressont identifiées par des ID numériques ; de plus, plusieurs pays pratiquent la même langue(UK et USA par exemple). Il faut donc constituer, d’une manière ou d’une autre un« tableau d’équivalence » pour envisager ensuite la pondération automatique.

La première idée, ici, consiste à procéder de la manière suivante :

• On charge un jeu d’enregistrements contenant toutes les notes.

• On charge un jeu d’enregistrements contenant les ID et les pays des élèves (les autreschamps sont inutiles).

• On vient lire le premier enregistrement des notes et d’abord l’ID de l’élève.

• Dans le jeu des élèves, on recherche la nationalité.

• On traduit dans une simple énumération de cas les nationalités en ID de matière.

• On compare l’ID matière de l’enregistrement en cours avec celui obtenu après la traductionde la ligne précédente.

• Énoncé On considère que les élèves natifs d’un pays étranger et qui suivent un cours de languedans leur langue maternelle sont avantagés par rapport aux autres. Il convient donc decréer une procédure automatique pour retirer deux points aux notes déjà données par lesprofesseurs ; cette procédure fait appel à la notion de RecordSet.

Access Livre Page 224 Mercredi, 27. f vrier 2008 7:28 07

Page 230: Access 2007 Et VBA

225Le langage VBA sous Access

Exercice

s

8Chapitre

• S’il y a identité entre les deux ID de matières, on applique une soustraction et on écritla 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.

La partie déclarative comprend les alinéas suivants :

Sub Calcul_DeuxRecordSets()

Dim vardebut As Date

Dim db As DAO.Database

Dim rst_eleves As DAO.Recordset

Dim rst_notes As DAO.Recordset

Dim varmatiere As Integer

vardebut = Timer

Set db = Application.CurrentDb

Set rst_eleves = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM

➥ELEVE", dbOpenDynaset)

Set rst_notes = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,

➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset)

rst_notes.MoveFirst

La variable vardebut déclarée comme une date entre dans le calcul du temps de réalisa-tion du programme tout entier. Un peu plus bas, la ligne vardebut = Timer attribue à lavariable le nombre de secondes écoulées depuis le jour en cours à 00:00h.

Il est déclaré deux jeux d’enregistrements : rst_eleves et rst_notes ; le premier contientles ID des élèves et leur pays, le second contient les quatre seules colonnes de la table NOTEqui seront utiles : ID_ELEVE, ID_MATIERE, NOTATION et NOTEPONDEREE.

Le début de la boucle de lecture de toutes les notes s’écrit ainsi :

While Not rst_notes.EOF

rst_eleves.FindFirst "ID_ELEVE =" & rst_notes(0)

Select Case rst_eleves.Fields(1)

Case "FR", "B"

varmatiere = 3

Case "D"

varmatiere = 5

Case "UK", "USA", "IR"

varmatiere = 6

Case "I"

varmatiere = 7

Case Else

varmatiere = 0

End Select

Chaque fois que sera lu un nouvel enregistrement :

• La méthode FindFirst fait avancer le curseur du recordset des élèves jusqu’à la ligne oùse trouve l’ID de l’élève qui a été noté. L’expression rst_notes(0) fait référence à lapremière colonne de l’enregistrement en cours, qui contient l’ID_ELEVE.

• Le curseur du recordset des élèves étant bien positionné, le pays de celui-ci peut êtrerécupéré grâce à l’expression rst_eleves.Fields(1).

• La tournure conditionnelle If…ElseIf…EndIf est remplacée par l’emploi de la syntaxeSelect Case, plus adaptée. La première ligne donne une valeur à comparer après

Access Livre Page 225 Mercredi, 27. f vrier 2008 7:28 07

Page 231: Access 2007 Et VBA

226 Access® 2007 et VBA

l’expression Select Case ; chaque valeur de comparaison est précédée d’un simpleCase et l’énumération s’achève avec un End Select.

• Les cas de figure regroupent les pays à la langue identique (France et Belgique, parexemple). Pour chacun d’entre eux, la variable varmatiere prend une valeur numériquecorrespondant à la table MATIERE.

À l’issue de ces lignes, le programme connaît l’ID de l’élève étudié pour un enregistrementde la table des notes et sa langue d’origine, traduite en code matière.

Le traitement de la note s’opère alors grâce aux lignes suivantes :

If varmatiere = rst_notes(1) Then

rst_notes.Edit

If rst_notes(2).Value < 2 Then

rst_notes(3).Value = 0

Else

rst_notes(3).Value = rst_notes(2).Value - 2

End If

rst_notes.Update

End If

rst_eleves.MoveFirst

rst_notes.MoveNext

Wend

Si la matière dans la table des notes coïncide avec la nationalité de l’élève, alors il est néces-saire de passer en mode modification (rst_notes.Edit). Deux cas de figure se présen-tent : soit la note est inférieure à deux et la note pondérée sera égale à 0 (il n’est pas prévud’avoir une note négative !), soit elle est supérieure et peut donc se voir pondérée. C’est lacondition posée par la formulation If rst_notes(2).Value < 2 dont la référence rst_notes(2) correspond à la note actuelle non pondérée.

La commande rst_notes.update lance la mise à jour de la colonne rst_notes(3) qui corres-pond à la note pondérée ; elle n’a lieu que lorsque les conditions précédentes sont réunies.

La commande rst_eleves.MoveFirst oblige le curseur du jeu élèves à retourner en débutde fichier (pour qu’un prochain rst_eleves.FindFirst puisse balayer la totalité desenregistrements).

La commande rst_notes.MoveNext fait passer le programme à l’enregistrement suivantdu jeu notes avant que le mot-clé Wend ferme la boucle.

Le programme s’écrit enfin ainsi pour fermer l’ensemble des objets :

rst_notes.Close

rst_eleves.Close

Set rst_notes = Nothing

Set rst_eleves = Nothing

Set db = Nothing

MsgBox Format(Timer - vardebut, "Fixed")

End Sub

En entier, le programme est le suivant :

Sub Calcul_DeuxRecordSets()Dim vardebut As DateDim db As DAO.DatabaseDim rst_eleves As DAO.RecordsetDim rst_notes As DAO.RecordsetDim varmatiere As Integervardebut = Timer

Set db = Application.CurrentDb

Access Livre Page 226 Mercredi, 27. f vrier 2008 7:28 07

Page 232: Access 2007 Et VBA

227Le langage VBA sous Access

Exercice

s

8Chapitre

Set rst_eleves = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM

➥ELEVE", dbOpenDynaset)

Set rst_notes = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,

➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE] ", dbOpenDynaset)

rst_notes.MoveFirst

While Not rst_notes.EOF

rst_eleves.FindFirst "ID_ELEVE =" & rst_notes(0)

Select Case rst_eleves.Fields(1)

Case "FR", "B"

varmatiere = 3

Case "D"

varmatiere = 5

Case "UK", "USA", "IR"

varmatiere = 6

Case "I"

varmatiere = 7

Case Else

varmatiere = 0

End Select

If varmatiere = rst_notes(1) Then

rst_notes.Edit

If rst_notes(2).Value < 2 Then

rst_notes(3).Value = 0

Else

rst_notes(3).Value = rst_notes(2).Value - 2

End If

rst_notes.Update

End If

rst_eleves.MoveFirst

rst_notes.MoveNext

Wend

rst_notes.Close

rst_eleves.Close

Set rst_notes = Nothing

Set rst_eleves = Nothing

Set db = Nothing

MsgBox Format(Timer - vardebut, "Fixed")

End Sub

Comme l’indique la boîte de message finale, et avec une machine courante du marché, leprogramme demande 2,10 secondes pour lire et traiter les 19 000 enregistrements de latable NOTATION. Si ce traitement peut paraître rapide à certains, il s’avère pourtant rela-tivement lent : si le fichier contient non pas des milliers mais des millions d’enregistrements,il pourra être considéré comme non performant.

Le problème provient du fait que, pour chacun des enregistrements de la table des notes,le curseur du recordset des élèves reparcourt toute ou partie de la table des élèves et rééva-lue à chaque fois le pays d’origine alphabétique en code ID matière. Il y a, dans cette partiedu programme, une grande économie de temps processeur à gagner.

3. Version avec un tableau

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èreet on stocke l’ID de l’élève et son ID matière dans une variable tableau. Une variable

Access Livre Page 227 Mercredi, 27. f vrier 2008 7:28 07

Page 233: Access 2007 Et VBA

228 Access® 2007 et VBA

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 laseule 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 équivalentsnationalité (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 lavariable 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 lesnationalités alphabétiques et les ID matière numériques n’est opérée qu’une seule fois : letemps de traitement descend à 0,54 seconde, soit quatre fois moins que dans la procédurepré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

Access Livre Page 228 Mercredi, 27. f vrier 2008 7:28 07

Page 234: Access 2007 Et VBA

229Le langage VBA sous Access

Exercice

s

8Chapitre

If rst(2).Value < 2 Then

rst(3).Value = 0

Else

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 unecolonne (la colonne 0). Le programme prend l’indice de ligne pour y stocker l’ID de l’élèveet 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 lesID 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 lapremière solution.

Lorsque toutes les équivalences sont chargées en mémoire dans la variable tableau, lemême RecordSet est repris pour lire toutes les notes. Chaque fois que le numéro dematière contenu dans la variable tableau coïncide avec l’ID_MATIERE du RecordSet, lanote pondérée est mise à jour.

4. Version SQL

L’énoncé de l’exercice exigeait l’activation d’un ou plusieurs jeux d’enregistrements pouropérer la pondération des notes des élèves. C’est la raison pour laquelle les deux solutionsproposé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 estprésenté à la figure 8.6. Cette table ne contient que deux colonnes, reprenant les champsID_MATIERE et PAYS_ELEVE, et établissant les équivalences.

Figure 8.6Table d’équivalence de l’exercice 2.

Access Livre Page 229 Mercredi, 27. f vrier 2008 7:28 07

Page 235: Access 2007 Et VBA

230 Access® 2007 et VBA

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électionnantdans 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. Parun 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 tableNOTE. Dans la zone Mise à jour inscrivez VraiFaux([NOTATION]<2 ;0 ;[NOTA-TION]–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

Figure 8.7Requête de l’exercice 2.

Access Livre Page 230 Mercredi, 27. f vrier 2008 7:28 07

Page 236: Access 2007 Et VBA

231Le langage VBA sous Access

Exercice

s

8Chapitre

EXERCICE 3 UNE AUTOMATION ACCESS/WORD

* Solution Il ne s’agit pas, ici, de faire un mailing à partir de Word en utilisant le fichier d’Access ; aucontraire, 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.

1. Dans le menu « Créer », cliquez sur « Création de formulaires ».

2. Enregistrez tout de suite le nouvel élément sous le nom « Frm_EnvoiLettre ».

3. Les assistants de création de contrôles étant désactivés, dessinez une zone de liste dansle formulaire vierge.

4. Les propriétés de la zone de liste à modifier sont les suivantes :

• Nom : « Choix_Eleve » ( à la place de Liste0).

• Nombre colonnes : « 10 ».

• Largeurs colonnes : « 0 cm;3 cm;3 cm;5 cm;5 cm;2 cm;3 cm;1 cm;1 cm;1,5 cm ».

• Largeur : « 24,5 cm ».

• Hauteur : « 10 cm ».

• Contenu : SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE,

ELEVE.ADRESSE1_ELEVE, ELEVE.ADRESSE2_ELEVE, ELEVE.CODEPOSTAL_ELEVE,

ELEVE.VILLE_ELEVE, ELEVE.PAYS_ELEVE, ELEVE.SEXE_ELEVE, Avg(NOTE.NOTA-

TION) AS MoyenneDeNOTATION

FROM ELEVE INNER JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE

GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE ELEVE.

ADRESSE1_ELEVE, ELEVE.ADRESSE2_ELEVE, ELEVE.CODEPOSTAL_ELEVE, ELEVE.VILLE_

ELEVE, ELEVE.PAYS_ELEVE, ELEVE.SEXE_ELEVE;

• Énoncé Mettez en place un formulaire présentant la liste des élèves et leur moyenne. Lors d’undouble-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 suivantque la moyenne est supérieure ou non à 10.

Attention

Pour réaliser cet exercice, il est nécessaire que la bibliothèque Microsoft Word 12.0 Library soitchargée dans Outils > Références de Visual Basic Editor. Pour réaliser le chargement de cettenouvelle bibliothèque, procédez de la même manière que pour celle concernant Excel décritedans le paragraphe 3 du cours de ce même chapitre.

Access Livre Page 231 Mercredi, 27. f vrier 2008 7:28 07

Page 237: Access 2007 Et VBA

232 Access® 2007 et VBA

La requête, dotée d’un regroupement (GROUP BY), est présentée graphiquement à lafigure 8.8.

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

Figure 8.8Requête de l’exercice 3.

Access Livre Page 232 Mercredi, 27. f vrier 2008 7:28 07

Page 238: Access 2007 Et VBA

233Le langage VBA sous Access

Exercice

s

8Chapitre

If Me.Choix_Eleve.Column(9) < 10 Then

docword.Selection.TypeText Text:="Votre moyenne étant de " _

& Format(Me.Choix_Eleve.Column(9), "Fixed") & _

", 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 lapartie théorique de ce chapitre qui faisait appel à la syntaxe Set prog_xlsx = NewExcel.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 lanumérotation commence à 0. La colonne liée, numérotée 0 et contenant l’ID de l’élèveest 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 etl’explorateur d’objets. Elles sont toutes préfixées par l’expression docword.Selectiondé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 estadressé et qui l’informe de sa note.

Access Livre Page 233 Mercredi, 27. f vrier 2008 7:28 07

Page 239: Access 2007 Et VBA

Access Livre Page 234 Mercredi, 27. f vrier 2008 7:28 07

Page 240: Access 2007 Et VBA

235

9La finalisation, monter une application

Lorsque tous les éléments sont réunis, tables, requêtes, formulaires et états, il devient possible de monter une véritable application à destination 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.

1. Le démarrage d’une application .................. 236

2. La gestion des utilisateurs ....... 2373. Le volet de navigation ............ 2384. La gestion des rubans ............ 239

Chapitre

Access Livre Page 235 Mercredi, 27. f vrier 2008 7:28 07

Page 241: Access 2007 Et VBA

236 Access® 2007 et VBA

(1) Le démarrage d’une application

Lors du démarrage d’une base Access, si aucun paramétrage n’est effectué, tous les objetsde la base sont lisibles et modifiables à volonté. Une fenêtre spécifique gère les conditionsgénérales d’exploitation de la base :

1. Démarrez la base de données « ECOLE_INTERNATIONALE » des exercices.

2. Cliquez sur le bouton « Office ».

3. Cliquez sur le bouton « Options Access ».

4. Dans le pavé de gauche, sélectionnez Base de données active pour accéder à la fenêtrede la figure 9.1.

Paramétrer une application revient à sélectionner ou non chacune des options proposéesdans la fenêtre de démarrage. Une fois sélectionnées, ces options deviennent opérationnellesaprè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 faireallusion à Microsoft Access !)

• L’icône choisie pour l’application sera constamment appliquée dans les formulaires etles barres de menu

• Le formulaire désigné dans la zone Afficher le formulaire s’ouvrira automatiquement audé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 premierformulaire 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 : soitAccess ouvrira plusieurs documents avec autant d’onglets (mode Access 2007), soit lesfenêtres se superposeront (mode Access 2003).

Figure 9.1Fenêtre de démarrage.

Access Livre Page 236 Mercredi, 27. f vrier 2008 7:28 07

Page 242: Access 2007 Et VBA

237La finalisation, monter une application

9Chapitre

• Les touches spéciales (Alt + F11 par exemple) doivent être désactivées si le programmeurne veut pas que les utilisateurs accèdent à des parties sensibles de l’application.

• Le compactage automatique à la sortie de l’application n’est pas indispensable : il ralen-tit notablement les procédures de fermeture et ne se justifie que si les volumes de don-nées manipulées s’avèrent très importants. En revanche, il est recommandé de pratiquermanuellement ce compactage en fin de développement et périodiquement grâce àl’option Bouton Office > Gérer > Compacter la base de données. Le gain de place disquepeut être considérable.

• Les options concernant le volet de navigation, les barres de menus et les rubans serontétudiées plus loin. Ici, elles seront simplement invalidées ou mises en place. L’optionAutoriser les menus contextuels par défaut doit être désactivée si le programmeur veutinterdire le clic sur le bouton droit de la souris (dangereux à certaines occasions).

• La partie concernant la correction automatique de nom ne gère pas, contrairement à ceque l’on pourrait croire, l’orthographe, mais les erreurs de noms des objets d’Access.Elle pourra être conservée en standard. Il sera parfois utile, en revanche, d’invalider lacorrection automatique dans le chapitre Vérifications des Options d’Access. En effet,la saisie du mot « FRANCE » en majuscules, par exemple, est automatiquement modi-fiée par l’orthographe « France » en minuscules, ce qui peut induire des difficultés dansla rédaction d’une table des pays.

La plupart des options citées ici sont invalidées lorsque l’application est démarrée enconservant le doigt sur la touche Majuscule pendant le démarrage : on accède alors à labase comme son programmeur1.

(2) La gestion des utilisateurs

Jusqu’à Access 2003, le programme contenait des options permettant de gérer les accès desutilisateurs avec un mot de passe par utilisateur. Access 2007 a complètement supprimécette notion2. Il n’est plus possible que de créer un mot de passe général à un fichier« .accdb » (option Outils de base de données > Chiffrer avec mot de passe). La gestion desutilisateurs est donc totalement reportée sur les programmes développés, leur code VisualBasic et leurs formulaires.

Pour reprendre l’exemple de la base Northwind, étudiée au début de cet ouvrage, il existeune table « Employés » et une table « Privilèges » qui gèrent quelques droits particuliersdes utilisateurs compte tenu de leur position hiérarchique. Il n’existe pas, en revanche, demenu particulier pour telle ou telle catégorie d’employés.

L’insertion d’un formulaire modal d’identification au démarrage de l’application a pourprincipal avantage, ici, de créer et d’incrémenter une variable publique qui pourra êtreutilisée comme valeur par défaut dans tous les formulaires et états. C’est la démarche quia été choisie par les concepteurs de la base Northwind.

Pour une gestion plus fine des droits des utilisateurs, il n’est donc envisageable que decréer une base de données SQL Server à laquelle sera connectée la base Access. En effet,

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.

Access Livre Page 237 Mercredi, 27. f vrier 2008 7:28 07

Page 243: Access 2007 Et VBA

238 Access® 2007 et VBA

SQL Server gère parfaitement les droits des utilisateurs, table par table, fonctionnalité parfonctionnalité.

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 quibloqueront telle ou telle option si les privilèges requis ne sont pas atteints par l’utilisateuren cours.

On mesure là l’une des limites du programme Access.

(3) Le volet de navigation

Le volet de navigation peut être choisi comme menu général d’une application : on ytrouve tous les éléments formulaires qui fondent la base de données pour l’interface utili-sateur.

Si tous les exercices des chapitres précédents ont été réalisés, la base de données ECOLEINTERNATIONALE comprend sept formulaires qui peuvent servir de menu général àl’application. La démarche de mise en place sera la suivante :

1. Faites un clic droit sur le premier élément : « Frm_ChoixEleve ».

2. Cliquez sur « Ajouter à un groupe > Nouveau groupe ».

3. En haut, nommez le nouveau groupe « ECOLE » (au lieu de Personnalisé1).

4. Inscrivez les autres formulaires dans ce nouveau groupe par un clic droit sur chaqueélément puis en cliquant sur ECOLE. On doit obtenir les éléments suivants :

• Choix d’un élève.

• Envoi lettre de fin d’année.

• Envoi mail des résultats.

• Notation des élèves

• Liste des élèves.

• Moyennes des élèves1.

• Visualisation des élèves.

5. Faites un clic droit sur chacun des éléments listés ci-dessus puis cliquez sur Renommerle raccourci 2 : mettez un nom bien orthographié comme dans la liste (et non plus lesnoms techniques de formulaires tel Frm_ChoixEleve).

6. Cliquez du bouton droit sur tous les éléments que vous ne voulez pas faire apparaîtreet sélectionnez l’option Masquer dans ce groupe. Pour opérer plus rapidement, vouspouvez faire un clic droit sur un groupe d’éléments (Tables par exemple) et sélectionnerMasquer3.

1. Les sous-formulaires de ce formulaire n’ont pas besoin d’être libellés.

2. Les éléments ne peuvent être renommés que s’ils sont inscrits à un groupe. Il est vivement recommandé, dans les options de navigation,d’opter pour le double-clic sur les éléments de navigation : les actions sur les noms de raccourcis sont en effet très difficiles à réaliser lorsque lesimple clic est choisi. On peut, le cas échéant, retourner au simple clic ensuite.

3. Pour rendre à nouveau visibles les éléments masqués, accédez aux Options de navigation par le menu du démarrage (voir paragrapheprécédent) ou en faisant un clic droit sur la barre supérieure du volet de navigation, et cochez à nouveau les éléments masqués.

Access Livre Page 238 Mercredi, 27. f vrier 2008 7:28 07

Page 244: Access 2007 Et VBA

239La finalisation, monter une application

9Chapitre

Il est envisageable de créer autant de groupes personnalisés que de besoin (maximum 10)pour s’adapter aux utilisateurs.

À l’issue de ces manipulations, la limitation des menus prendra le dessin de la figure 9.2.

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 programmationsera nécessaire. Il suffira de créer la macro Mcr_VerrouillageVolet présentée à la figure9.3 et, le cas échéant, de la traduire en code Visual Basic (voir chapitre 7).

La macro (ou le code) sera lancée avec l’application, par exemple sur l’action Sur ouvertured’un formulaire de démarrage.

(4) La gestion des rubans

Les menus et des rubans sont gérés de manière toute à fait nouvelle avec Access 2007. Siune application avait été développée sous Access 2003 avec des barres de menus person-nalisées, celles-ci sont récupérées sous Access 2007, mais dans un menu « Compléments »peu esthétique et qui laisse toute sa place aux rubans dans lesquels de nombreuses fonc-tionnalités peuvent être considérées comme « dangereuses » par le programmeur. Il devientdès lors nécessaire de les concevoir à nouveau complètement.

Avant même de débuter la construction d’un ruban, il est nécessaire de créer les macros oule code Visual Basic aptes à ouvrir les formulaires auxquels on veut associer un bouton deruban.

1. Dans le menu « Créer », cliquez sur « Macros ».

2. Dans la colonne Action, sélectionnez Ouvrir formulaire.

3. Dans le Nom du formulaire, entrez « Frm_EnvoiMail ».

Figure 9.2Volet de navigation personnalisé.

Figure 9.3Macro destinée à verrouiller le volet de navigation.

Access Livre Page 239 Mercredi, 27. f vrier 2008 7:28 07

Page 245: Access 2007 Et VBA

240 Access® 2007 et VBA

4. Enregistrez la macro sous le nom « Mcr_Ouv_EnvoiMail ».

5. Réitérez la même opération pour obtenir une macro nommée « Mcr_Ouv_EnvoiLettre »,destinée à ouvrir le formulaire d’envoi d’une lettre personnalisée.

Ces deux macros, qui pourraient être traduites en langage Visual Basic, seront invoquéeslors de la création des boutons du ruban.

Alors qu’Access 2003 disposait d’un assistant graphique très rapide pour mettre en placedes barres de menu, Access 2007 n’en dispose plus, alors que la conception, totalementnouvelle, se fonde sur XML (eXtensible Markup Language). Il est souhaitable, dès lors, dedisposer d’un éditeur XML pour rédiger ses menus et rubans, bien qu’un simple éditeurde texte puisse suffire.

XML est un langage utilisant des balises pour décrire des structures de données. Une balisese signale par les signes < et >. Généralement, il existe une balise ouvrante, notée <rib-bon> par exemple et une balise fermante notée </ribbon>. Les balises peuvent être dotéesd’attributs du type <balise attribut1 ="valeur1" attribut2 = "valeur2">.

Dans un fichier texte ou XML, entrez le code suivant :

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

<ribbon startFromScratch="true">

<tabs>

<tab id="tabMenuGeneral" label="Menu Général">

</tab>

</tabs>

</ribbon>

</customUI>

La première balise <customUI> (Customized User Interface ou Interface utilisateur person-nalisée) est fermée en fin de fichier par la même balise démarrée avec une barre de fraction(</ribbon>). Elle fait appel à une adresse constante.

La deuxième balise <ribbon> porte l’attribut startFromScratch positionné à vrai. Cettecommande va supprimer le ruban standard et le remplacer par le ruban personnalisé. Sicet attribut est omis (ou positionné à faux), le menu personnalisé s’ajoutera au menustandard.

La troisième balise <tabs> vise les onglets supérieurs des rubans.

Il n’a été créé ici qu’un seul onglet <tab> nommé tabMenuGeneral et dont le libellé visiblesera « Menu Général ».

Ce texte pourrait être conservé au format XML et chargé séparément au moment dudémarrage d’Access, mais nous n’étudierons que la faculté d’Access de stocker ce codedans une table spécifique.

1. Dans le menu « Créer », cliquez sur « Création de table ».

2. Nommez le premier champ « RibbonName »1 (type texte de longueur 255).

3. Nommez le second et dernier champ « RibbonXml » (type mémo).

4. Enregistrez la table sous le nom exact « USysRibbons » sans clé primaire (répondez« Non » à la demande de création de la clé).

1. Les noms cités sont obligatoires.

Access Livre Page 240 Mercredi, 27. f vrier 2008 7:28 07

Page 246: Access 2007 Et VBA

241La finalisation, monter une application

9Chapitre

5. USysRibbons étant une table système, elle est normalement non visible : pour la faireapparaître, dans les Options Access, cliquez sur « Base de données active > Optionsde navigation et cochez la case Afficher les objets système.

6. Ouvrez la table « USysRibbons ».

7. Au premier enregistrement, champ RibbonName, entrez le libellé « Ruban1 ».

8. Dans le deuxième champ, faites un copier/coller du code XML indiqué plus haut afind’obtenir le résultat présenté à la figure 9.4, puis fermez la table1.

9. Cliquez sur les Options Access.

10. Sélectionnez la rubrique Base de données active.

11. Dans la zone Options de la barre d’outils et du ruban, écrivez « Ruban1 » pour renseignerle nom du ruban (la zone de liste déroulante n’est pas opérationnelle).

12. Fermez la base, puis ouvrez-la à nouveau : il n’y a plus que l’onglet Menu Général.Rappel : on peut outrepasser ce démarrage en gardant le doigt sur la touche « Maj »pendant l’ouverture de la base.

Nous nous proposons à présent de créer un simple ruban, comme présenté à la figure 9.5,dans lequel apparaîtront :

• Un groupe nommé Gestion des courriers et dans lequel sont placés deux boutonsd’envoi mail et envoi courrier.

• Un groupe nommé Application et contenant un bouton de fermeture de la base.

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

Figure 9.4Code XML inséré dans la table USysRibbons.

1. On prendra garde à parfaitement orthographier le fichier XML, qui est sensible à la casse (caractères minuscules et majuscules). Touteerreur renverra un problème au démarrage.

Figure 9.5Ruban personnalisé.

S

Access Livre Page 241 Mercredi, 27. f vrier 2008 7:28 07

Page 247: Access 2007 Et VBA

242 Access® 2007 et VBA

USysRibbons avec le code XML suivant, qui pourra être saisi au préalable dans un éditeurde 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 etle 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 idMso1. La fermeture de la base, en bas ducode, en est un exemple.

• Un label, qui s’affichera sur le bouton.

• Une taille, qui peut être normal ou large.

• Une image2.

• 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 êtreouvert sous Excel (dans le ruban Développeur d’Excel).

Access Livre Page 242 Mercredi, 27. f vrier 2008 7:28 07

Page 248: Access 2007 Et VBA

243La finalisation, monter une application

9Chapitre

Il existe de nombreuses autres présentations des éléments qui peuvent apparaître dans unruban (séparateurs, zones de liste déroulante, menus déroulants) ; il serait trop long de lesénumérer ici.

RésuméPar défaut, le programme Access met à disposition de l’utilisateur tous les éléments d’unebase de données : tables, formulaires et autres. Cette liberté peut être conservée dans lecadre d’une organisation où l’utilisateur et le programmeur ne font qu’un. Dès que la basede données est mise à disposition de plusieurs personnes, il devient indispensable de gérerles 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 nonavertis.

Access donne la possibilité d’organiser le volet de navigation pour ne plus faire apparaîtreque 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 barrehorizontale des anciennes versions.

Mais le volet de navigation n’est pas obligatoire et peut être remplacé (ou augmenté) parune gestion complète des rubans. Dépourvu de concepteur graphique, le gestionnaire deruban 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.

Access Livre Page 243 Mercredi, 27. f vrier 2008 7:28 07

Page 249: Access 2007 Et VBA

Access Livre Page 244 Mercredi, 27. f vrier 2008 7:28 07

Page 250: Access 2007 Et VBA

245Index

Symboles& 185.accdb 3, 23.csv 77.dsn 72.laccdb 23.mdb 3, 23

AAcrobat 169Actions (macros) 182ActiveX (contrôle) 143ADO 208Afficher le sélecteur 155Ajout

copier par 66formulaire 128

Alias 89, 96And 88Apercu avant impression 168ArrêtMacro (action) 187As 89Assistant Masque de saisie 35Attache 71Automation

Excel 215Word 231

BBalise 240Barre

de synchronisation 32de défilement 155

Begin transaction 99Bentrée 184BOF 210Boîte de dialogue modale 174BoîteMsg (action) 185

Bouton de commande 183de déplacement 155

Branchement 192

CCase à cocher 139Champ 47Champ-père 158Clé

étrangère 51, 94primaire 40, 54

Coller 66par ajout 66

Colonne liée 135Column (VB) 198, 232Coma Separated Values 77Comme 87, 104Commit transaction 100Compactage 237Compte() 149CompteDom() 150Concaténation 185Conditions 186Continu (formulaire) 127Contrainte référentielle 50, 80Contrôle 22, 125

ActiveX 143Bouton de commande 137Cadre d’objet dépendant 138Case à cocher 139Etiquette 133Onglet 141zone de liste 135

déroulante 133zone de texte 131

Conversion (en Visual Basic) 189Copier 66

Curseur 210

DDAO 208Date() 119DéfinirVarTemp (action) 184Delete 97Délimitée (structure de fichier) 69Démarrage, paramètres 236Diagramme

d’activité 32d’état 32

Dim (VB) 197Distinct 88Distinctes, valeurs 107Diviseur d’enregistrements 136DoCmd 192Domaine 149Données externes 69Doublon 94

EEdit (VB) 213Enregistrement, ligne 18En-tête

de formulaire 124de ligne ou colonne 114

Entier Long 76Entrée de données (formulaire) 129EnvoyerObjet (action) 201EOF 210Et 88États 12, 167Etiquette 133

de ligne 192Excel 67

automation 215

Index

Access Livre Page 245 Mercredi, 27. f vrier 2008 7:28 07

Page 251: Access 2007 Et VBA

246 Access® 2007 et VBA

ExécuterMacro (action) 187ExtracChaîne() 91

FFacture, créer 27Fen

indépendante 174Modale 174

Feuille (de données) 16Fields 209Filtre 15, 87, 103Find 211, 225Fonction 90

Compte() 149CompteDom() 150Date() 119de domaine 149ExtracChaîne() 91Format() 196Gauche() 90MoyDom() 195RechDom() 184Round() 112SommeDom() 150VB 191VraiFaux() 90, 148

Format() 196Formulaire 12

ajout 128continu 127entrée de données 129unique 127

GGauche() 90Générateur

d’expressions 90, 140de code 220

GoTo 192Graphique 142Groupe d’options 139

IIcône 236Identifiant 40Importation de données 66Index 48Intégrité référentielle 50IsDate 222IsNumeric 222

JJeu d’enregistrements 208Jointure 93, 108

droite ou gauche 94

LLabel 192Largeurs colonnes 56Lecture seule 154Légende 48Liaisons de données 71Lien hypertexte 143Like 87Limiter à liste 56, 133Longueur fixe (structure de fichier) 69

MMacro 12, 164, 178, 181

conditionnelle 186incorporée 137

Mail 201Mailing 172Masque de saisie 18, 63Me 222Merise 38Mise à jour en cascade 51Mise en forme conditionnelle 169Mise en page 168Modèle physique 38Module 12, 190, 206Move 210MoyDom() 195MsgBox 191MySQL 4, 72

NNon-correspondance 95Not 88, 105Null interdit 48

OObjet graphique 142ODBC 71Onglet 141OpenRecordSet 210Opération 91, 108Options Access (bouton) 236Or 87Ou 87, 105Où 87, 103

PParamètres

d’importation 70de démarrage 236

Pas 88, 105PDF 169Pièce (jointe) 18Pied de formulaire 125Points-virgules 78

Processus 32Produit cartésien 94Projet 191Propriété (de formulaire) 126

RRechDom() 184RecordCount 211RecordSet 208Rectangle (contrôle formulaire) 136Réel Double 76Regroupement 91, 108, 170, 175Regrouper et trier 171Relation 38

de plusieurs à plusieurs 42de un à plusieurs 42icône 34réflexive 45, 61

Réorganiser (onglet) 153Requête

ajout 95, 118création 100définition de données 101mise à jour 98paramétrée 89Sélection 12, 84suppression 97, 120

Round() 112Ruban 11, 21, 239RunSql 206

SSelect Case 226Sélecteur 125

afficher 155Sélection

étendue (zone de liste déroulante) 136multiple (zone de liste déroulante) 135simple (zone de liste déroulante) 136

Séparateur 70SetWarnings 222SommeDom() 150Source de données (formulaire) 129Sous-formulaire 144, 155SQL Server 4, 72, 238Structure de fichier 69Sub (VB) 191Suppression en cascade 45, 52, 97SurClic (propriété) 196, 222SurErreur (action) 188

TTable 12

création 46

Access Livre Page 246 Mercredi, 27. f vrier 2008 7:28 07

Page 252: Access 2007 Et VBA

247Index

Tableau 227croisé dynamique 113

Tabulaire, mode 153Temps, notion de 44Titre de l’application 236Totaux (icône) 91Tracé d’enregistrement 70Transaction 98TransférerFeuilleCalcul (action) 183Tri 15, 86, 103

UUML (Unified Modeling Language) 31

Unique (formulaire) 127Update (VB) 214USysRibbon 240

VValeurs distinctes 88, 107Variable tableau 227VarTemp 185VBA 205vbCrLF 202Verrouillage volet 239Volet de navigation 4, 12, 238VraiFaux() 90, 148

WWhere 87

XXML 4, 240

ZZone

de liste 135, 194déroulante 39, 56, 76, 133,153, 161

de texte 131, 221

Access Livre Page 247 Mercredi, 27. f vrier 2008 7:28 07

Page 253: Access 2007 Et VBA

La collection Synthex informatique propose de découvrir les fondements théoriques et les applications pratiques des principales disciplines de science informatique. À partir d’une synthèse de cours rigoureuse et d’exercices aux corrigés détaillés, le lecteur, étudiant ou professionnel, est conduit au cœur de la discipline,et acquiert une compréhension rapide et un raisonnement solide.

ISBN : 978-2-7440-4014-6Pearson Education France

47 bis, rue des Vinaigriers75010 ParisTél. : 01 72 74 90 00Fax : 01 42 05 22 17www.pearson.fr

Ce livre, qui porte sur la dernière version d’Access, présente toutes les étapes de la conception de bases de données de taille moyenne. Il explique également comment réaliser des interfaces graphiques de saisie et de visualisation.

Les premiers chapitres traitent de la modélisation des données, de la conception de tables grâce à l’interface graphique d’Access, et de l’échange de données avec d’autres applications, tellesqu’Excel. Les chapitres suivants présentent les requêtes SQL,les formulaires et les états, ainsi que les macros et la program-mation en langage VBA.

Le livre comprend de nombreux exemples et exercices dont les don-nées peuvent être récupérées sur le site www.pearsoneducation.fr. Les exercices sont tous intégralement corrigés.Ce livre s’adresse en premier lieu aux étudiants de premier cycle, aux étudiants en IUT et en BTS. Il sera également utile aux PME désirant créer leurs propres bases de données.

I n f o r m a t i q u e

Synthèsede cours

exercicescorrigés

&L'auteur :

Bernard Minot est professeur associé en informatique à l’université Paris-Est. Il y enseigne l’utilisation des tableurs, l’audit informatique et la gestion des bases de données sous Oracle. Il est également auditeur informatique dans le cabinet qu’il dirige.

Dans la même collection :• Excel et VBA, B. Minot

• Le langage C, J.-M. Léry

• Le langage C++, M. Vasiliu

• Java 5 et 6, R. Chevallier

• UML 2, deuxième édition, B. Charroux et al

• Création de bases de données, N. Larrousse

• SQL, F. Brouard, C. Soutou

• LaTeX, J.-C. Charpentier, D. Bitouzé

• Algorithmique, applications en C,J.-M. Léry

• Algorithmique en C++, J.-M. Léry

• Algorithmique en Java 5, J.-M. Léry

• Mathématiques discrètes appliquées à l’informatique, R. Haggarty

• Architecture de l’ordinateur, E. Lazard

• Systèmes d’exploitation, B. Lamiroy et al

• Linux, J.-M. Léry

• Architecture des réseaux, D. Seret, D. Dromard

• XML, G. Chagnon, F. Nolot

Microsoft®Access 2007et VBA

®