Вы находитесь на странице: 1из 253

Informatique

Synthse de cours

& exercices
corrigs
Microsoft

Access 2007
et VBA
Les fonctionnalits pour crer des bases de donnes performantes Des dizaines dexemples et dexercices avec leurs corrigs dtaills Les fichiers sources des exercices disponibles ladresse www.pearson.fr

collection

Synthex

Bernard MINOT

Informatique

Synthse de cours

&

exercices corrigs

Access 2007 et VBA


Bernard Minot
universit Paris-Est Avec la relecture de Jean-Michel Lry universit Paris-Est

Synthex

collection

ISBN : 978-2-7440-4014-6 ISSN : 1768-7616 Copyright 2009 Pearson Education France Tous droits rservs

Composition sous FrameMaker : TyPAO

Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de la proprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans le respect des modalits prvues larticle L. 122-10 dudit code.

Sommaire
Introduction Chapitre 1 Chapitre 2 Les objets dAccess Le modle relationnel, concevoir une base de donnes Les diffrentes formes dacquisition de donnes, importer et attacher Les requtes Les formulaires Les tats Les macros Le langage VBA sous Access La finalisation, monter une application
1 9

37

Chapitre 3

65 83 123 167 181 205 235

Chapitre 4 Chapitre 5 Chapitre 6 Chapitre 7 Chapitre 8 Chapitre 9

Sommaire III

Introduction
Positionnement dAccess dans la gamme Microsoft
Le positionnement du programme Microsoft Access se rvle singulier tous les points de vue. Dans la gamme Ofce, en premier lieu, il est considr comme un peu marginal, beaucoup moins utilis que Word, Excel et Outlook, et considr, tort, comme beaucoup plus complexe. Parmi les produits de la rme de Bill Gates, ensuite, il nest que le petit frre de SQL Server, une base de donnes beaucoup plus puissante. Dans le monde des bases de donnes, enn, Access se singularise par une multiplicit des fonctions peu commune.

Base de donnes ou produit intermdiaire ?


Access nest pas quune base de donnes au sens strict du terme, mais un ensemble doutils permettant de grer compltement une base de donnes, ce qui savre trs diffrent. Au-del des tables et de leur organisation relationnelle (fonction essentielle des bases de donnes), Access met disposition un outil permettant de monter des formulaires et de mettre en place une interface graphique avec lutilisateur ; cet outil ne fait pas partie des fonctions classiques dune base de donnes. De la mme manire, Access possde un gnrateur dtats qui offre au programmeur la possibilit de construire des impressions de bonne qualit : deuxime exception. Enn, et comme tous les produits de la gamme Ofce, Access fait appel au langage VBA (Visual Basic for Application) pour la programmation. Ces fonctionnalits ne nous permettent plus de placer Access dans la catgorie base de donnes au sens strict. Et pourtant, on ne peut pas classer Access parmi ce quil est convenu dappeler les ateliers de gnie logiciel (AGL) qui offrent, par exemple, des fonctions daide la modlisation plus dveloppes. Produit intermdiaire, donc, Access

Introduction 1

se positionne au plus prs des besoins des PME : ni trop complexe, auquel cas il serait rserv aux professionnels de linformatique, ni trop lger et vou alors un chec commercial certain.

Un premier pas vers la modlisation et la gestion de tables


Access possde toutes les qualits et toute la solidit dune bonne base de donnes relationnelle. Il sert trs souvent comme outil de premire approche aux tudiants avant que dautres produits tels Oracle, DB2 ou SQL Server, plus abstraits et plus puissants, ne fassent lobjet dtudes plus approfondies. Lune des caractristiques majeures des bases de donnes, en effet, rside dans la ncessit de connatre quelques aspects thoriques de la modlisation avant que la structure de la base ne soit mise en place. Le lecteur nchappera donc pas, videmment, un large chapitre sur les fondements de la thorie relationnelle qui gouverne la construction de tout systme dinformation. On aborde l les notions lmentaires du mtier informatique qui, pris au pied de la lettre et au sens noble, est la science du traitement de linformation. Toutes les proprits essentielles des bases de donnes relationnelles, les notions de cls primaires et trangres, lintgrit rfrentielle et bien dautres encore sont oprationnelles sur Access et leur connaissance peut tre extrapole sur les autres bases du march.

Contexte professionnel dutilisation dAccess


Les informaticiens professionnels ont parfois sur Access une opinion mitige, regardant avec condescendance lune des plus petites bases de loffre actuelle. Cest l une vision bien troite et dpourvue du contexte dans lequel sont utiliss ces produits. Nul besoin dtre un spcialiste du langage SQL pour mettre en place une requte sous Access, nul besoin dembaucher des quipes entires : pour des besoins limits, dans un environnement rduit, Access suft largement rpondre la demande de petites entits dans des structures conomiques taille humaine. Lassistant la cration de requte, si la structure de la base est adquate, rpond parfaitement ce niveau de comptence. Il gnre des requtes qui peuvent atteindre une complexit apprciable et donner, dans de courts dlais, des rsultats extraits dassez gros volumes.

Une approche intuitive grce aux assistants


La cration de formulaire est, elle aussi, accompagne de nombreux assistants. Par exemple, il suft de dessiner une zone de texte ou une liste droulante pour obtenir immdiatement sa cration. L encore, et condition que la structure soit bien conue, une approche intuitive peut pallier labsence de savoir direct. En revanche, il vaudra

Access 2007 et VBA

mieux bien connatre la palette des outils disposition (les types de contrles dans le jargon du mtier) an de choisir bon escient celui qui sera le plus pertinent pour lutilisateur. Lesthtique des formulaires, qui peut tre relativement pousse si le dessinateur veut sen donner la peine, comptera ici beaucoup moins que lefcacit dans la prsentation et le traitement des donnes.

La programmation en Visual Basic


Le passage la programmation, enn, se fera graduellement, avec une escale sur les macros. Fondamentalement diffrentes de celles dExcel, les macros dAccess sont une simple mise en place et enregistrement sur interface graphique dactions prprogrammes. Elles peuvent tre insres directement dans lensemble des autres lments de la base mais gagnent tre traduites en langage Visual Basic. Ds lors, le programmeur dbutant lit la fois le droulement des actions quil veut gnrer et le code VB qui sy associe. Le pied ltrier, il ne lui reste plus quun effort smantique faire pour accder la programmation proprement dite. Cest tout ce chemin qui sera parcouru dans les lignes qui viennent. Quil soit bien clair, toutefois, que louvrage ne prtend pas faire du lecteur un programmeur en 256 pages !

Nouveauts dAccess 2007


Les nouveauts dAccess 2007 par rapport ses versions antrieures ne sont pas ngligeables. Si les principes fondamentaux de la thorie relationnelle restent constants (comment pourrait-il en tre autrement !), les changements sur la forme et le fond sont consquents. En premier lieu, mais lutilisateur ne le verra pas, le moteur de base de donnes Microsoft Jet des versions 2003 et antrieures a t remplac par ADE (Access Data Engine) ; lune des consquences de cette volution se constate dans le changement de type de chier ( .accdb la place de .mdb ), qui rend toutes les versions antrieures incompatibles. Access 2007 peut lire les chiers .mdb mais Access 2003 ne lit pas les chiers .accdb . Lutilisateur aura donc tout intrt transfrer ses bases au nouveau format, avec les nombreuses implications visuelles que cela entrane. limage dExcel et de Word, en effet, Access 2007 se singularise par un changement radical du haut de lcran. Le ruban, large zone remplie dicnes, prend la place des sousmenus que lutilisateur connaissait depuis toujours. Avec la base de donnes, cette volution a une double porte, qui ncessitera des adaptations : non seulement lutilisateur devra shabituer ce nouveau cadre de travail (comme dans les autres produits Ofce), mais le programmeur Access, quant lui, devra rcrire toutes les procdures de menus et sous-menus pour mettre jour les applications dj dveloppes.

Introduction 3

Et sur ce point, les concepteurs dapplications Access ne seront pas aids par le nouveau produit : alors que la version 2003 tait dote dun assistant graphique fort commode pour raliser rapidement des menus complets, le nouvel outil, qui utilise dsormais le langage XML, ncessite la saisie manuelle du code sur un diteur externe Access ! Autre innovation, le volet de navigation, gauche de lcran, prsente tous les objets de la base et peut, le cas chant, devenir une forme de menu gnral (en plus de la barre de menu et des rubans). Lergonomie gnrale des applications dveloppes sen trouvera donc fortement modie, mme si ce volet peut tre rtractable. Alors quAccess 2003 prsentait toujours ses lments en pleine page, la version 2007 offre la possibilit douvrir simultanment de nombreux documents et de les prsenter sous forme donglets suprieurs, un peu la manire des onglets bas dExcel. Le graphisme gnral a ainsi t profondment modi, le plus souvent en mieux : les zones de date, par exemple, sont dsormais systmatiquement associes un petit calendrier, alors que toutes les colonnes peuvent tre tries et ltres avec les mmes menus contextuels que sous Excel. Les assistants la cration dobjets (requtes, formulaires, tats) ont t pousss tel point quun simple clic suft dsormais une gnration immdiate, sans mme dtapes de conception, devenues seulement optionnelles. Microsoft insiste l sur la capacit dAccess monter trs vite de petits projets dentreprise : il sagit du crneau essentiel dutilisation du produit. Tout au contraire, Microsoft ninsiste plus sur la mise en ligne sur Internet des projets Access, secteur dans lequel dautres concurrents, notamment du monde libre avec des produits comme MySQL, ont largement pris de lavance. En revanche, tous les produits Ofce peuvent dsormais partager des donnes sur un site SharePoint sous Windows Server 2003, publi sur Internet. Cette nouvelle notion permet de partager et de synchroniser, par exemple, des tables communes tous les services dune petite entreprise. La taille maximale dun chier .accdb , enn, est maintenue 2 Go, comme dans les versions antrieures, limitant par l les vellits de projets inadapts. linverse dExcel, qui a multipli par 1 000 le nombre de cellules dune feuille, Access reste donc contraint dans son ancienne volumtrie : les projets plus ambitieux devront passer SQL Server !

Structure de louvrage
Le dessin gnral du livre reprend, trs classiquement, lordre dans lequel est construite une base de donnes. Mais nous avons insr des points sur lesquels il nous semble indispensable dinsister. Le premier chapitre part la dcouverte du produit via une base de donnes fournie par Microsoft pour rpondre aux questions du nophyte. Quels sont les lments constituant une base de donnes ? Comment lie-t-on tous ces lments entre eux ? la dcouverte du vocabulaire se joint une rexion sur la manire dont se construit un systme dinformation.

Access 2007 et VBA

Fondamentale, la modlisation couvre une bonne partie du deuxime chapitre avec de multiples exemples et un fort accent mis sur la mthode, sans pour autant tomber dans une abstraction excessive. Lexprience montre, en effet, que dinnombrables bases de donnes sont cres dans les PME (qui constituent, rappelons-le, lessentiel du tissu conomique du pays) avec de nombreuses erreurs de conception qui les rendent peu exploitables. Il y a, sur ce point, de rels efforts fournir pour pouvoir mieux stocker linformation et mieux la faire circuler. Cration et utilisation des tables, des requtes, des formulaires et des macros forment la suite logique et lessentiel de louvrage. chaque fois, la synthse de cours fait appel des exemples rapidement fournis, au dtriment du discours mandarinal : sufsamment simples, ils visent directement le thme du cours sur un mode dmonstratif ; sufsamment volumineux, ils montrent en grandeur nature la problmatique rencontre en entreprise. Reprenant lobjectif ouvertement afch par Access de RAD (Rapid Application Development), lexpos est conu pour permettre des mises au point rapides sur des solutions lgres . Linformaticien professionnel ny trouvera donc pas son compte de complexit. On prfrera passer plus de temps rchir sur le papier dans le cadre dun change utilisateur/concepteur sur les lments de base (tables, relations, maquettes dcrans et dtats), et moins de temps sur le clavier et la souris. Le chapitre entirement consacr VBA se base, initialement, sur la conversion automatique des macros. Considrant que le lecteur a dj, au moins, une petite exprience des autres produits de la gamme Ofce, il aborde le sujet comme si la mme approche a dj t pratique avec Excel, par exemple. Cela permet de dcouvrir des sujets peu tudis dans les courts ouvrages publis en la matire, mais qui ouvrent des voies trs larges pour des projets plus ambitieux. Le dernier chapitre, enn, dcrit rapidement la dmarche adopter pour mettre en place une application : les changements dans la nouvelle version dAccess npargneront donc pas un dtour par XML. Tous les chapitres sont diviss en deux parties parts gales, les exercices et leur correction prenant donc une proportion considrable. Chaque exercice reprend une partie du cours et lapplique dans un contexte diffrent, mais de nouvelles manires de procder sont galement introduites. Lensemble des exercices porte sur une mme base de donnes mise disposition sur le site des ditions Pearson : www.pearsoneducation.fr.

Primtre de louvrage
Toutes les fonctionnalits et tous les dtails dAccess ne sont pas passs en revue. Il ne sagit pas dune encyclopdie inventoriant lexhaustivit des possibilits offertes : il faudrait pour cela un ouvrage beaucoup plus volumineux, que dautres ont dj fait, qui servirait plus de rfrentiel occasionnel que de livre de travail et dtudes. Tout au contraire, il nous a t difcile de ne pas aborder certains sujets un peu moins importants : aprs arbitrage, le livre contient lessentiel des fonctions utilises gnralement et, parmi celles-ci, de trs simples comme dassez complexes.

Introduction 5

Dans la partie relative la programmation en langage Visual Basic, il nous a paru plus important dinsister sur lutilisation du langage SQL via VBA et sur la notion de jeu denregistrements qui ouvre la voie de nombreux programmes, plutt que sur la partie boucles ou gestion des entres/sorties.

qui sadresse ce livre


Au premier chef, les tudiants de tous niveaux trouveront ici les bases ncessaires pour dmarrer dun bon pied la conception et la cration dun petit systme dinformation. La partie relative la modlisation leur permettra dviter les piges les plus rpandus et celle portant sur VBA confortera leur initiation la programmation. Le reste de louvrage leur donnera un large panorama des fonctionnalits du produit. De nombreux professionnels liront aussi ces lignes avec intrt, et en particulier : ceux qui pratiquent dj Access et protent de la version 2007 pour approfondir leurs connaissances ; ceux qui pratiquent dj Access et ressentent le besoin dun appui pour passer la nouvelle version, en particulier pour mettre jour les bases de donnes dj conues ; tous les professionnels qui, de prs ou de loin, ont besoin de mettre en place de petites bases de donnes dans le cadre de leur mtier de gestionnaire, dans la plus large acception du terme.

Les supplments
Les chiers des exercices et des exemples, au format source .accdb , sont tlchargeables sur le site de lditeur, ladresse www.pearsoneducation.fr. Le lecteur pourra les mettre en uvre pour son apprentissage, mais aussi les complter et se constituer ainsi sa propre base dexemples.

Lauteur
Bernard Minot est professeur associ (PAST) luniversit Paris-Est. Docteur en histoire conomique, diplm daudit informatique et Certied Information Systems Auditor, il dirige galement un cabinet daudit informatique. Sa mission luniversit consiste rapprocher les mondes universitaire et professionnel ; dans ce cadre, il assure un enseignement sur la mise en pratique des tableurs et des bases de donnes, ainsi que sur laudit informatique.

Access 2007 et VBA

Remerciements
Remerciements Jean-Michel Lry, relecteur mthodique et efcace, pour son assistance. Une attention toute particulire pour Caroline Rimbault-Minot et sa constante complicit.

Introduction 7

Chapitre

Les objets dAccess

1. Les lments essentiels de la base............................... 10 Problmes et exercices 1. Crer un client et une commande .................... 25 2. Pratiquer un rassort................ 28 3. Analyser les processus et les tats ............................... 31 4. Analyser les donnes ............... 33 5. Retoucher un formulaire en mode cration .................... 35

En vue de simplifier la terminologie, on parle gnriquement de la base de donnes Access pour dsigner lensemble du logiciel. En fait, Access nest pas quune simple base de donnes, mais plus exactement un ensemble dobjets beaucoup plus large et dont le cur est constitu par une base de donnes. Ce premier chapitre commence par dcrire sommairement lensemble des objets contenus dans la base, puis aborde lutilisation du produit en se limitant la gestion dune base existante. Il existe, en effet, deux manires dutiliser le produit : soit manipuler les donnes contenues dans des objets existants (le contenu), soit crer et modifier la structure elle-mme, les objets de la base (le contenant).

(1)

Les lments essentiels de la base


Quelle que soit la manire daborder la base de donnes, il est indispensable, en premier lieu, didentier chacun des objets quelle contient an daccder rapidement loutil voulu. En vue dnumrer et dexposer brivement la nature de chacun dentre eux, la base exemple de Microsoft Northwind est employe ici aprs avoir t mise en place. Pour ce faire, dmarrez Access (Dmarrer > Tous les programmes > Microsoft Ofce > Microsoft Ofce Access 2007). La grille-cran reprsente la gure 1.1 apparat.

Figure 1.1
Dmarrage dAccess.

Le pav central permet de choisir parmi des bases de donnes prtes lemploi concernant des domaines varis (Contacts, Etudiants, etc.). Licne en haut gauche du pav central permet de crer un chier vide qui contiendra ultrieurement tous les objets que lon crera. La partie droite de lcran permet douvrir des chiers dj crs ou des bases rcemment utilises. La base de donnes slectionner se trouve sous le libell Exemple de la partie de gauche de lcran et sappelle Northwind . 1. Cliquez sur Exemple gauche. 2. Cliquez sur Northwind . 3. Cliquez sur le bouton Crer en bas droite aprs avoir not le chemin o sera cr le chier Northwind.accdb 1. 4. Une bote message propose la connexion sous un nom dutilisateur : prendre celui par dfaut et cliquer sur Connexion.

1. Dans une configuration Microsoft Vista, le fichier est insr sous C:\Users\Nom_Utilisateur\Documents ; dans une configuration

Microsoft XP, il sera sous C:\Documents and Settings\Nom_Utilisateur\Mes documents.

10

Access 2007 et VBA

Chapitre

Laccueil dans la base de donnes se visualise comme la gure 1.2. Figure 1.2
Principaux lments de lorganisation dAccess.
Barre de menu Barre doutils daccs rapide

Ruban

Volet de navigation

Formulaire daccueil

1.1 LA

BARRE DOUTILS DACCS RAPIDE ET LE BOUTON

OFFICE

Comme pour lensemble de la gamme Ofce, la prsentation de la partie suprieure de lcran a largement volu entre la gamme des produits Excel, Word et Access de 2003 et celle de 2007. La barre bleue suprieure sappelle dsormais une barre doutils daccs rapide et comporte en standard les raccourcis les plus utiliss : Enregistrer, Annuler ou Rpter Frappe, Imprimer ou Faire un aperu avant impression. Il est possible dajouter cette barre tous les autres raccourcis de lapplication Access. Chaque option de la barre de menu (Accueil Crer Donnes Externes Outils de base de Donnes) ne comporte plus de sous-menus comme dans les versions antrieures, mais ouvre ce quon appelle un ruban dans lequel on trouvera de trs nombreuses icnes. Chaque ruban est compos de groupes dicnes, tel que Afchages Presse-papier, etc. contenant chacun les icnes elles-mmes. On lira dans le dernier chapitre comment personnaliser les rubans, soit en les augmentant avec des boutons personnaliss, soit en crant soi-mme des menus et rubans compltement nouveaux. Avant toute personnalisation, lexhaustivit des commandes disponibles est regroupe dans les quatre options du menu gnral 1. Le bouton Ofce , en haut gauche, remplace en partie le menu Fichier des applications antrieures. Outre les items classiques Ouvrir Fermer Enregistrer Quitter , il contient les options dimpression, de gestion des proprits, douverture des chiers rcents et surtout laccs aux options dAccess, particulirement importantes.
1. Il nexiste pas, comme dans Word ou Excel, doption de menu supplmentaire et spcifique Dveloppeur .

Les objets dAccess 11

1.2 LE

VOLET DE NAVIGATION La partie gauche de lcran intgre un volet de navigation qui contient et reprsente tous les objets de la base, quils soient prexistants ou crs par lutilisateur. La nature mme des objets nest pas toujours indique, la seule distinction tant dsormais tablie par le logo de lobjet. Fondamentalement, on retiendra donc les grandes classes suivantes, comme elles se prsentent la gure 1.3.

Figure 1.3
Types et logos des objets Access.

Les tables contiennent les donnes stockes ; leur nombre est illimit. Ces tables peuvent tre en relation les unes avec les autres, do lexpression de base de donnes relationnelle. Les requtes mmorisent des instructions dinterrogation des tables. On parlera dans dautres bases de donnes de Vues . Une requte peut tre lance tout moment pour obtenir des rsultats soit de visualisation, soit de manipulation des donnes (ajout, modication, suppression). Les formulaires gnrent des masques de visualisation des donnes. Alors que lafchage des tables na pour rendu quune grille de donnes (un peu comme dans un tableur), les formulaires procurent une interface homme/machine agrable. Un formulaire peut tre bas directement sur une table mais aussi sur une requte ; il permet toutes les manipulations de donnes. Les tats permettent les impressions ; paramtrables, ils autorisent des tris et totalisations des donnes imprimer. Les macros, fondamentalement diffrentes de celles dExcel, mmorisent des actions prslectionnes. Elles peuvent tre lances directement ou bien partir de boutons crs dans des formulaires. Les modules sont des containers de code Visual Basic. Ils peuvent tre crits directement ou rsulter de la traduction de macros. Le volet de navigation peut tre cach pour laisser plus de place et de visibilit aux formulaires et autres objets ouverts. Cliquez sur le double chevron tourn vers la gauche pour le faire disparatre ; il sera possible de le faire rapparatre tout moment.

12

Access 2007 et VBA

Chapitre

Alors que cette partie gauche de lcran tait constante dans les versions dAccess antrieures 2007, elle est maintenant devenue paramtrable. Lide consiste permettre de construire une sorte de menu en utilisant cette partie de lcran et non plus la barre de menus suprieure comme par le pass. Le volet de navigation comprend la mention Les Comptoirs en haut : il sagit dun libell et dun menu 1 crs par le programmeur pour afcher les objets voulus. En dessous, Clients et commandes , Inventaires et achats sont de grandes rubriques contenant elles-mmes les objets Access. Ainsi, lobjet Les dix premires commandes compris dans la rubrique Clients et commandes est une requte, alors que lobjet immdiatement en dessous est un formulaire. Un double-clic sur lun de ces objets en permet louverture dans la partie droite de lcran. 1. Cliquez sur le triangle tourn vers le bas, situ en haut droite du Volet de Navigation. Une zone de liste droulante permet dordonner diffremment les objets de la liste. 2. Cliquez sur Type dobjet : le volet de navigation nafche plus que les grandes classes dobjets Access vues plus haut. 3. Dveloppez les tables en cliquant sur le double chevron tourn vers le bas : vous listez la totalit des tables contenues dans la base (voir gure 1.4). Figure 1.4
Visualisation des seules tables dans le volet de navigation.

Un clic sur le triangle droite de Tous les objets Access suivi du choix de Les Comptoirs permet de revenir la situation de dpart. Cette manipulation montre que le travail sur la base Northwind peut soprer de deux manires : soit en qualit de simple utilisateur grce aux menus de gauche tels quils ont t conus par le programmeur ;
1. Et plus prcisment une catgorie du volet de navigation comme on le verra plus loin.

Les objets dAccess 13

soit en qualit de dveloppeur, en afchant tous les objets, mme ceux qui ne sont pas inclus dans le volet de navigation prparamtr. Outre ces deux approches, il est possible dafcher les objets sous divers autres ordonnancements comme les dates de cration ou de modication, lassociation dobjets (tables et formulaires lis par exemple) et dautres critres encore. Il est inutile, au moins dans un premier temps, de multiplier les afchages sous peine de se disperser dans diffrentes voies daccs aux objets. Un clic droit sur la catgorie Les Comptoirs , en haut gauche, ouvre une fentre droulante qui prsente, en sus des options dj vues : Les Options de navigation , qui permettront plus tard de monter des menus personnaliss. Un Volet de recherche ouvrant une petite fentre de recherche en haut du volet de navigation. Les recherches se feront par mot-cl, ltablissement de la liste rsultante se ralisant au fur et mesure de la saisie.

1.3 LA

FENTRE PRINCIPALE DAFFICHAGE En ouvrant la base de donnes Northwind, un formulaire daccueil apparat automatiquement dans la fentre principale. Il a t conu pour tre le plus ergonomique possible ; avec les menus prsents dans le volet de navigation, il constitue lenvironnement gnral de lutilisateur nal. Le fait quil sagisse dun formulaire est attest par la prsence du logo contenu dans longlet suprieur : ce formulaire a pour nom Interne . Il se ferme en cliquant sur la croix place au mme niveau droite de lcran ; la fentre principale se vide mais il est possible de retrouver ce formulaire en parcourant les objets dans le volet de navigation et en faisant un double-clic sur lobjet Interne . 1. Faites un double-clic dans le volet de navigation sur Les dix premires commandes , un deuxime onglet apparat droite de Interne et vient recouvrir le contenu du menu daccueil. 2. Faites un double-clic sur Liste commandes : un troisime onglet se surajoute. 3. Faites un double-clic sur Dtail commande : cette fois une fentre souvre au-dessus de lensemble, sans incrustation dans la fentre des onglets. Il sagit dans ce cas dune fentre indpendante . 4. Fermez la fentre Dtail commande en cliquant sur la croix suprieure droite. 5. Fermez tous les onglets successivement, chacun avec sa croix de fermeture. Tous ces effets visuels ont t prpars par le programmeur et sinscrivent dans une dmarche logique denchanement des tches.

Manipulation dun formulaire de visualisation


Faites un double-clic sur le formulaire Liste commande . Si lon essaie deffectuer une modication dans les donnes qui safchent, toute opration sera systmatiquement rejete : les donnes sont xes et le formulaire ne souvre quen mode visualisation. Seules les deux actions Ajouter une nouvelle commande ou Afcher la facture , en haut, permettent une interactivit.

14

Access 2007 et VBA

Chapitre

En bas gauche de lcran apparaissent les boutons de dplacement qui permettent de naviguer rapidement parmi les lignes (ou enregistrements) de la liste rsultant dune requte. Le libell 1 sur 49 indique que lutilisateur pointe ce moment sur le premier enregistrement dune srie de 49. Il est plus rapide demployer les boutons de dplacement que les ches directionnelles du clavier. Ces boutons permettent respectivement, et de gauche droite, daller au premier, au prcdent, au suivant et au dernier de la liste. Parmi les champs afchs, certains ont des caractristiques bien particulires : le champ Date de commande, quand il est actif, saccompagne dun petit calendrier droite qui devrait permettre le choix dune date ; le champ Reprsentant est une zone de liste droulante qui afche tous les reprsentants prsents dans la base ; le champ Client est une autre zone de liste droulante. L encore, toutes ces commodits de saisie sont des artices crs par le programmeur pour simplier ou guider la tche de lutilisateur. Nous apprendrons les crer dans les prochains chapitres. En haut de chaque colonne, chaque nom de champ saccompagne dun petit triangle sa droite, dont louverture donne la possibilit de trier et ltrer la liste suivant de nombreux critres (voir gure 1.5). Figure 1.5
Tris et ltres sur une liste de formulaire.

Les deux premires lignes proposent de trier par ordre alphabtique : Access sait que la colonne concerne est alphabtique et suggre demble un critre de tri logique. La ligne Filtres de texte propose de nombreux critres de ltres comme Est gal , Commence ou Ne commence pas par, etc.

Note
On rappelle ici la distinction fondamentale entre tri et ltre : un tri rordonne une liste en conservant tous les arguments, un ltre ne fait plus apparatre dans une liste que les enregistrements correspondant aux critres prtablis.

Les objets dAccess 15

Le dernier encart, plus bas, numre des cases cocher correspondant aux occurrences trouves dans la colonne. Le fait de dcocher lune de ces cases provoque la disparition de la liste des items cits. Cette prsentation des tris et ltres est exactement similaire celle des autres produits de la gamme Ofce 2007. Elle sadapte la nature de chaque colonne vise : un clic sur le triangle voisin du champ Date dexpdition propose des critres de ltre trs rafns sur la base de dates, alors que celui portant sur les colonnes de chiffres de droite ne slectionne que des ltres numriques. Enn, nous pouvons remarquer que le bouton Afcher la facture est un bouton contextuel qui afche la facture correspondant exactement la ligne de commande active au moment du clic. L encore, il sagit dun mcanisme cr de toutes pices par le programmeur.

Manipulation dune requte de visualisation


Aprs avoir ferm le formulaire Liste des commandes , faites un double-clic dans le volet de navigation sur la premire option Les dix premires commandes pour ouvrir la requte correspondante. Comme dans le premier cas de gure, la requte est paramtre pour ne permettre que la visualisation et non pas la modication. Leffet graphique obtenu est moins rafn que dans un formulaire : il ne sagit que dun afchage en mode Feuille de Donnes, en tous points comparable un tableau Excel. Le raccourci clavier Ctrl + A, ou un clic droit dans le coin suprieur gauche du tableau, puis un Coller permettent de placer lensemble des donnes dans le presse-papiers. Un simple Coller dans une feuille Excel nouvelle (ou Word, ou toute autre application graphique) reportera les donnes copies dans le nouveau document. Toutes les commandes de tris et de ltres semploient de la mme manire quavec un formulaire. Dans le cas prcis du formulaire Les dix premires commandes , le programmeur a cr une requte spcique qui nafche que les dix plus importantes commandes enregistres dans la base. Il nest pas possible dafcher toutes les commandes par cette option. Si ce besoin est impratif, lutilisateur peut ouvrir une autre requte, plus bas, nomme Commande de produits , qui montre toutes les commandes. ceci prs que, dans ce dernier tableau, les commandes se dcomposent en lignes parses (une commande, numrote comme telle, comporte plusieurs lignes de commandes) ; de plus, pour chacune des lignes dites, il nest indiqu que le prix unitaire et la quantit de produits commands, non le montant de la ligne (sa multiplication dune quantit par un prix). Cette dcomposition provient du caractre relationnel de la base de donnes sur lequel nous reviendrons longuement.

Manipulation dun tat


Dans le volet de navigation, plus bas, il existe un tat nomm Les dix commandes les plus importantes , correspondant trs exactement la requte voque au paragraphe prcdent. Le rsultat renvoy est naturellement le mme au plan des donnes mais trs diffrent quant la prsentation, beaucoup plus soigne. 1. Cliquez sur le bouton Ofce .

16

Access 2007 et VBA

Chapitre

2. Cliquez sur Imprimer . 3. Choisissez Aperu avant impression 1 . Le rendu visuel de ltat permet une impression soigne.

Manipulation directe dune table


Louverture des objets cits plus haut, requtes, formulaires et tats, a t prvue et paramtre par le programmeur ; elle ne risque donc en aucune manire dendommager la base de donnes. De la mme manire, il existe des options crites par le dveloppeur, que nous verrons plus loin, permettant de crer de nouveaux clients, de nouvelles commandes et de nouvelles factures ; en revanche, il ne doit pas tre possible, dans une application bien crite, de revenir sur des donnes dj entres. Si le programme Northwind tait parfaitement boucl , il serait impossible lutilisateur de faire les manipulations que nous allons maintenant mettre en uvre pour dcouvrir lunivers des bases de donnes. 1. Dans le volet de navigation, ouvrez les Catgories et choisissez Types dobjet : la liste fait apparatre les classes dobjets. 2. Dveloppez, le cas chant, la classe Tables (doubles chevrons vers le bas). 3. Double-cliquez sur Clients . La table des clients apparat telle qu la gure 1.6 ; on peut llargir en masquant le volet de navigation (doubles chevrons vers la gauche). Figure 1.6
Table des clients.

La table des clients safche comme une feuille de donnes, identique celle dExcel. Les noms de champ se prsentent en en-ttes. Les clients apparaissent en liste ; il existe apparemment un ordre par numro dID, mais il ne sagit que dun artice d au fait que les clients ont t entrs dans la base dans lordre prsent ici : lordre de saisie des clients ninue pas sur la prsentation lcran. Il est possible que les numros se retrouvent ultrieurement en dsordre et il reviendra lutilisateur de prsenter ses ditions avec des critres de tri.

1. Le mme rsultat peut tre obtenu par un clic droit sur ltat et en slectionnant Aperu avant impression .

Les objets dAccess 17

louverture, le curseur se positionne sur la cellule la plus en haut droite : les ches directionnelles ou le taquet de tabulation du clavier permettent de naviguer dans les champs ou les enregistrements, lhorizontale ou la verticale. Un carr contenant le signe + dbute chaque ligne ; cette prsentation dpend des relations tablies entre les tables. Dans le cas prsent, il existe un lien permanent entre la table des clients et celles des commandes : un client donn correspond 0 ou plusieurs commandes. Si lon clique sur le signe plus, en dcal et en dessous de la ligne du client, les lignes de commandes que celui-ci a dj mises apparaissent. Un clic sur le signe moins rtablit lafchage dorigine. Presque toutes les zones de cette table sont modiables directement, avec tous les dangers que de telles manipulations entranent. Seule la premire colonne de la table, contenant le numro identiant de chaque client, nest pas modiable. Le nom de la premire socit, par exemple, se modie sans difcult ; pire, on peut le remplacer par le nom dune autre socit existant dj dans le chier. Il est donc possible de crer des doublons apparents, mais lon ne peut pas en faire reproche au programmeur : il est tout fait envisageable que deux clients portent le mme nom (DUPONT par exemple) tout en tant domicilis deux adresses diffrentes ! En modiant une quelconque donne dans cette source dinformations quest la table, limpact du changement se rpercutera sur tous les objets de la base en aval : les requtes, les formulaires et les tats. La saisie des donnes prend donc une importance toute particulire : Toutes les modications opres sur une ligne denregistrement ne sont dnitivement prises en compte que lorsque lutilisateur passe sur un autre enregistrement ou ferme la table ; la touche Echap rtablit toutes les donnes (mme sur plusieurs champs) dans ltat o elles se trouvaient initialement tant quun autre enregistrement nest pas atteint. Inversement, il nexiste aucun bouton de validation : ds quun nouvel enregistrement est atteint les changements deviennent dnitifs dans le prcdent. Il nexiste pas ncessairement de masque de saisie dans la table : par exemple, tous les numros de tlphone afchs ont le format international standard, mais il est possible de saisir un numro non conforme (1234 par exemple). Le masque de saisie existe probablement dans le formulaire de saisie ou de modication dun client, non dans la table source. Contrairement Excel, ou dautres programmes bureautiques, les modications apportes dans les donnes sont dnitivement enregistres sur le disque dur : il nest pas ncessaire de manipuler le bouton Ofce et loption Enregistrer . En faisant dler la fentre de la table vers la droite, on notera une colonne particulire dote de trombones et dun type tout nouveau dans Access 2007. Un double clic sur lun de ces trombones permet de joindre une pice externe un enregistrement prcis. Dans le cas prsent, on pourrait joindre lenregistrement du client n 1 des pices comme sa photo ou le document Word contenant le contrat sign.

Manipulation directe dune requte


Comme on la vu, les requtes mmorisent des interrogations faites aux tables ; plus prcisment, elles permettent non seulement de faire appel aux donnes contenues dans les tables, mais aussi de modier les donnes source travers le masque de saisie quelles constituent dans le mme temps.

18

Access 2007 et VBA

Chapitre

1. Dans le volet de navigation, dveloppez la classe Requtes . 2. Double-cliquez sur la premire requte nomme Achats de produits . La liste des donnes qui safche reprend, de manire non exhaustive, des informations issues de trois tables (que lon pourra consulter si ncessaire) : une table des fournisseurs ; une table des bons de commande ; une table de dtail des bons de commande. Parmi les champs afchs, la date de cration du bon de commande, par exemple, est tout fait modiable : tout changement affectera lafchage en cours, mais aussi, et surtout, la donne de base contenue dans la table des bons de commande. Dans ce cas de gure, la requte sert de masque de saisie pour intervenir sur la table dorigine. Il est clair que le programmeur doit interdire aux utilisateurs de telles interventions en mettant en place des mthodes contrles daccs aux donnes.

Manipulation directe dun formulaire


Dans la base Northwind et dans le cadre de son exploitation par des utilisateurs, les formulaires souvrent normalement loccasion dun clic sur un bouton cr par le programmeur. Souvent, cette ouverture correspond une dmarche bien prcise : lutilisateur, par exemple, consulte dabord la liste gnrale des clients puis clique sur un bouton pour consulter le dtail des commandes en cours mises par celui-ci. On peut galement ouvrir un formulaire en dehors de ce contexte, pour sa mise au point par le dveloppeur, par exemple. 1. Dans le volet de navigation, dveloppez la classe Formulaires . 2. Faites un double-clic sur le deuxime formulaire nomm Bote de dialogue tats ventes . Comme son nom lindique, ce formulaire nest pas destin afcher des donnes stockes dans la base, mais servir de bote de dialogue pour que lutilisateur choisisse des options ddition (voir gure 1.7). Figure 1.7
Formulaire de dialogue.

Les objets dAccess 19

Un clic sur le bouton Imprimer ou Aperu permet le lancement de procdures dimpression commandes via une macro ou du code Visual Basic. Lutilisateur doit pralablement choisir un type dtat et sa priodicit, qui deviendront autant de paramtres ldition. Il est galement possible douvrir directement des formulaires qui ciblent des tables ou des requtes de la base. Dans le cas prsent, nous ouvrons le formulaire destin modier les clients ou en crer de nouveaux. 1. Dans le volet de navigation, si ncessaire, dveloppez la classe Formulaires . 2. Double-cliquez sur le formulaire Dtail du client . La fentre qui apparat afche les coordonnes du premier client de la base (voir gure 1.8). Figure 1.8
Formulaire daccs aux donnes.

Ici, Access ne liste pas lensemble des clients (formulaire dit continu), mais prsente les clients les uns aprs les autres (formulaire dit unique). Les boutons de dplacement, en bas, permettent non seulement de faire dler les clients, mais aussi, droite, daccder directement la cration dun nouveau client. Le programmeur a galement prvu des boutons Enregistrer et Nouveau , en haut, pour faire la mme opration ; on verra, en effet, quil existe souvent de nombreuses manires de faire la mme opration dans la mme grille-cran. La saisie des donnes est rgie par des rgles identiques celles qui sont applicables dans les tables : appuyer sur la touche Echap annule toute lopration. En revanche, le formulaire peut tre assorti de masques de saisie ou de conditions de validation qui auront t poses par le programmeur. On peut, par exemple, imaginer quun contrle de validation prohibe une adresse e-mail si la chane de caractres entre ne comporte pas de signe arobase (@).

20

Access 2007 et VBA

Chapitre

1.4 LA

BARRE DE MENUS ET LES RUBANS Dans la base Northwind, le programmeur a laiss lutilisateur le loisir daccder la barre de menu, laquelle peut avoir t masque par loption de la barre doutils daccs rapide Rduire le ruban . Le cas chant donc, rtablissez-la en cliquant sur le petit triangle droite des raccourcis de la barre suprieure et en dcochant Rduire le ruban . La barre de menu dAccess 2007 ne comporte quun petit nombre doptions (quatre en standard) qui font apparatre chacune un ruban diffrent, particulirement riche en icnes. Le menu Accueil regroupe les fonctions principales ddition (polices de caractres par exemple), de traitement des listes (tris et ltres) et de recherche. On notera, gauche, un bouton destin au mode dafchage qui sera trait dans le paragraphe suivant. Le menu Crer comprend les icnes de cration de tous les objets de la base. Le menu Donnes externes inclut la mise en place de toutes les formes de liaisons avec toutes les sources de donnes quAccess peut tablir. Le menu Outils de base de donnes , enn, permet louverture de Visual Basic et gre les utilitaires comme la documentation de la base ou ltablissement des relations entre les tables, par exemple. Dune manire gnrale, la manipulation du clic droit sur les objets ou lments modifier permet, tout comme les icnes, daccder la majeure partie des actions possibles. On choisira donc trs souvent le clic droit au dtriment des options du menu.

1.5 LES

MODES DAFFICHAGE DES OBJETS DACCESS Jusqu prsent, nous avons ouvert les objets contenus dans la base et crs par le programmeur en mode formulaire. Ce mode, le plus naturel, est celui de lutilisateur. En double-cliquant sur un objet, quel quil soit, on accde aux objets dans ce mode. Pour le programmeur qui dessine les objets (tables, requtes et autres formulaires), lafchage propre la mise en uvre doit se faire en mode cration. Au cours des manipulations qui suivent, nous passerons alternativement du mode formulaire au mode cration, pour en dcouvrir les diffrences fondamentales : 1. Dans le volet de navigation, si ncessaire, dveloppez la classe Formulaires . 2. Cliquez du bouton droit sur le formulaire Bote de dialogue tats ventes (notez que dans le ruban du menu Accueil , licne Afchage de droite est grise et ne peut pas tre slectionne). 3. Dans la fentre contextuelle qui souvre, cliquez sur Mode cration .

Les objets dAccess 21

Le formulaire, que nous avions prcdemment ouvert en mode normal par un doubleclic, safche maintenant sous une tout autre prsentation, propre au concepteur du formulaire (voir gure 1.9). Figure 1.9
Exemple de formulaire ouvert en mode cration.

Chaque carr, chaque bouton prsent dans lobjet formule se nomme contrle. Ils sont modiables en toute libert, ce quon se gardera bien de faire pour le moment ! Vous aurez peut-tre remarqu que licne du ruban dAccueil est devenue active lors de louverture en mode cration : 1. Cliquez sur le bouton Afchage du menu Accueil . 2. Repositionnez lafchage en mode formulaire : vous constatez que la Bote de dialogue tats des ventes a repris lapparence que nous lui connaissions auparavant. 3. Fermez la fentre avec la croix du coin suprieur droit. 4. Si Access demande laccord pour enregistrer les modications dans la structure du formulaire, rpondez bien videmment : Non ; le formulaire conu par le programmeur ne doit pas tre modi. 5. Fermez toutes les fentres de la partie droite de lcran. De la mme manire, vous pouvez ouvrir tous les autres objets de la base : soit en mode cration pour le concepteur de la base ; soit en mode utilisateur, celui-ci tant variable suivant la nature de lobjet ; il existe diffrents modes que nous tudierons plus tard : le mode feuille de donnes, le mode formulaire, le mode tableau crois dynamique, et dautres encore. Vous pouvez constater encore cette distinction fondamentale entre les deux modes douverture avec une table : 1. Dans le volet de navigation, si ncessaire, dveloppez la classe Tables . 2. Cliquez du bouton droit sur la table Clients . 3. Ouvrez cette table en mode cration.

22

Access 2007 et VBA

Chapitre

La table Clients souvre avec lapparence de la gure 1.10. Figure 1.10


Exemple de table ouverte en mode cration.

1.6 CONVERSION

DES FICHIERS

ACCESS

DES VERSIONS ANTRIEURES

Comme on la vu, la base Northwind est tout entire contenue dans le seul chier Northwind.accdb . Lextension de ce chier correspond au nouveau format des bases de donnes Access 2007. Les anciens chiers des versions antrieures taient, eux, sufxs .mdb . Une base de donnes sous lancien format peut souvrir avec Access 2007 en mode compatibilit ; en revanche, une base de donnes accdb ne peut pas souvrir avec Access 2003. Il sera prfrable, ds que possible, de transformer les anciennes bases au nouveau format ; la procdure en est un peu spcique : 1. Crez une nouvelle base de donnes vide. 2. Cliquez dans le menu Donnes Externes sur le bouton Access . 3. laide du bouton Parcourir , pointez la base de donnes au format mdb. 4. Dans la fentre Importer , cliquez sur le bouton Slectionner tout (si vous souhaitez rcuprer la totalit des objets de lancienne base). 5. Cliquez sur OK 1. Lorsquune base de donnes .accdb est ouverte, le systme dexploitation Windows cre provisoirement un autre chier, sufx .laccdb , destin contrler le partage de la base. Au moment o tous les utilisateurs simultans dune base ferment lapplication, le systme supprime automatiquement ce chier laccdb .

1. Si des barres de menus avaient t programmes dans lancienne base, elles seront dplaces dans une nouvelle option du menu gnral Complments .

Les objets dAccess 23

Rsum
Le programme Access gnre une base de donnes, mais aussi un ensemble doutils permettant de crer des applications entires. Ces lments sont : des tables, contenant les donnes ; des requtes, permettant dinterroger les structures de tables mises en place ; des formulaires prsentant les donnes dans une interface homme/machine adapte ; des tats destins imprimer des rsultats ; un langage de programmation, VBA. Le volet de navigation peut servir de gnrateur de menus an daider lutilisateur atteindre les objets de la base en mode formulaire ou feuille de donnes, cest--dire en tant que gestionnaire quotidien de la base et non pas de concepteur. tout moment, et pourvu que le concepteur nait pas ferm laccs au mode cration, tous les objets safchent soit en mode cration pour le concepteur, soit en mode normal pour les utilisateurs.

24

Access 2007 et VBA

Chapitre

Problmes et exercices
Ces premiers exercices ont pour objectif de familiariser le lecteur avec lenvironnement dAccess en mode utilisateur nal. On insistera sur leffet des choix du programmeur sur le droulement des actes de lutilisateur : cette dmarche ouvrira la voie aux dveloppements des chapitres suivants. Les exercices choisis permettront de montrer que la matrise dAccess ne passe pas seulement par une bonne connaissance des options du logiciel et de ses fonctionnalits. Il est ncessaire aussi (voire dabord) de dominer le sujet par une vue densemble de lapplication qui sera conue. Pour plus de clart, on dissociera toujours les donnes stables de lapplication (tables), dune part, et les processus modiant ou augmentant les donnes stockes, dautre part. Cette division, toute thorique, est la base dune analyse solide de lobjet global concevoir et mettre en uvre.

EXERCICE 1
nonc

CRER

UN CLIENT ET UNE COMMANDE

Dans cet exercice, vous devez vous placer en tant quutilisateur de la base Northwind, cest--dire un professionnel de la vente. 1. laide des outils dj existants dans cette base, crez un nouveau client (libell au choix). 2. Puis, crez une commande sur la base de produits dj existants et en stock. Vriez votre travail et allez jusqu la facturation des produits commands.

* Solution

1. Cration dun nouveau client 1. Fermez la base Northwind et ouvrez-la nouveau pour vous assurer de votre qualit dutilisateur (et non de concepteur). Dans le volet de navigation, retournez la catgorie Les Comptoirs an de visionner les formulaires et tats crs par le concepteur. Logiquement, la cration dun nouveau client passe par loption Liste des clients du volet de navigation : lutilisateur doit dabord consulter cette liste an de vrier que le client nexiste pas. 2. Double cliquez sur Liste des clients dans le volet de navigation et droulez la liste des clients dj existants. Au besoin, vous pourrez cliquer en bas dcran sur la zone Rechercher pour retrouver toute occurrence similaire 1. 3. Dans la barre grise suprieure du formulaire, cliquez sur le bouton Nouveau client .

1. Il nexiste pas, demble, de formulaire de cration dun nouveau client : cest un choix dlibr du concepteur qui, dune certaine manire, se justifie.

Les objets dAccess 25

Exercices

4. Remplissez correctement les zones (ou contrles) du formulaire pour obtenir un rsultat satisfaisant, limage de la gure 1.11. Figure 1.11
Remplissage du formulaire de cration dun nouveau client.

Le bouton Enregistrer et nouveau , en haut droite, permet denchaner la cration de nouveaux clients. Le bouton Fermer , tout fait droite, suft pour : valider la saisie (donc valider le nouvel enregistrement dans la table Clients ) ; fermer le formulaire. Immdiatement, le nouveau client apparat dans la liste des clients. On remarquera que les numros de tlphone saisis limage de ceux de la gure 1.11 ne sont pas lists comme les autres, dots des prxes internationaux. On peut en conclure que le concepteur na pas mis en place de masque de saisie en vue de formater correctement ces numros : ici commence laudit de la conception du programme. Un clic sur le numro identicateur du client, en bleu gauche, permet de rviser la che du client et, le cas chant, de la mettre jour. 2. Cration dune commande et facturation De la mme manire que linsertion dun nouveau client passait par la liste des clients, une nouvelle commande passe par la liste des commandes. 1. Dans le volet de navigation, double-cliquez sur Liste des commandes (il est possible mais non indispensable de fermer la liste des clients). 2. Cliquez dans la barre suprieure grise sur Ajouter une nouvelle commande : lencart suprieur afche le libell Commande n (Nouveau) , sans indiquer encore de numro prcis. Lincrmentation du nouveau numro se ralisera lorsque ladite commande sera valide et seulement ce moment.

26

Access 2007 et VBA

Chapitre

3. Ouvrez la liste droulante des clients en haut gauche et choisissez le nouveau client cr. Les onglets qui apparaissent ce moment permettent de commencer la saisie de la commande. 4. Dans longlet Dtail commande et la zone de liste droulante Produit , choisissez le produit Olive Oil ; lhuile dolive a t choisie dans ce premier exemple car il en existe en stock. Le prix unitaire, enregistr dans la base, safche automatiquement ; saisissez la quantit 2. 5. Cliquez sur le bouton Ordre dexpdition . Il semble naturel, puisque le produit est en stock, dexpdier maintenant la marchandise. Or, une bote de message apparat, qui prvient lutilisateur que le produit ne peut pas tre envoy sans avoir t factur au pralable. On voit, par cet exemple, que le programmeur a conu le logiciel dans le respect des choix de procdures jugs indispensables par les commanditaires. 6. Cliquez sur le bouton Crer une facture : une deuxime bote de message refuse de valider la facture sans avoir saisi tous les renseignements ncessaires. 7. En parcourant les trois onglets du bon de commande, saisissez un transporteur, une date de livraison, un type et une date de paiement. Vriez que tous les champs sont remplis (ladresse de livraison en particulier) pour ne plus gnrer de message derreur. Dans le cas prsent, on peut estimer que les contrles de saisie sont un peu excessifs (la zone du dpartement, par exemple, est obligatoire alors quil en existe une autre pour le code postal). 8. Lorsque la saisie est valide, le programme afche la facture sous forme daperu avant impression. Un clic droit dans la fentre permet daccder une option dimpression. Ce clic permet galement de passer en mode cration : il sagit l dune faiblesse du programme dans son tat actuel. Fermez la fentre. 9. Cliquez de nouveau sur le bouton Crer une facture : bien videmment, cette opration nest pas autorise car la facture a dj t gnre. Une bote de dialogue propose de limprimer et renvoie ltape prcdente. 10. Cliquez sur Ordre dexpdition ; si ncessaire, remplissez les zones obligatoires jusqu ce que lopration soit valide. Enn, cliquez sur le bouton Terminer la commande pour gnrer le message La commande est dsormais marque comme ferme . La pratique de ce petit logiciel de gestion commerciale nous a permis de constater que la mise en uvre du processus de facturation est beaucoup plus complexe quil ny parat. En premier lieu, les diffrents acteurs doivent tre en place et, au moins : un client ; un fournisseur ; un produit ; un reprsentant ; un transporteur. En second lieu, lvnement de la commande (imaginons par exemple lappel tlphonique du client) dclenche une cascade dactions obligatoirement successives. La commande, prise dans le sens dun document, va passer par des tats successifs, et dans le cas prsent, par les tats : nouveau ;

Les objets dAccess 27

Exercices

factur ; expdi ; ferm. Au plan de la base de donnes Access, tous ses objets vont tre mis contribution : Les donnes relatives aux clients, fournisseurs, produits, reprsentants et transporteurs sont stocks dans des tables diffrentes. Les commandes sont stockes dans dautres tables qui, ncessairement, seront en relation avec les tables prcdentes. On y adjoindra des notions dtat. Des requtes permettent dafcher, au moment voulu, les donnes ncessaires, reconstitues en croisant les informations des deux types de tables voqus prcdemment. Des formulaires prsentent, de manire cohrente et comprhensible, des donnes issues des requtes. Des tats, ventuellement caractre lgal comme la facture, matrialisent lacte commercial en utilisant dautres requtes. Un programme prsente, logiquement et au moment voulu, les formulaires, et contrle en permanence le respect des procdures.

EXERCICE 2
nonc

PRATIQUER

UN RASSORT

1. En utilisant la base Northwind, effectuez une commande client en choisissant un article dont le stock est puis (prenez larticle Beer). Observez leffet de cette commande et tentez de reconstituer le chemin des processus mis en uvre. 2. Lorsque cette commande est valide, indiquez les actions effectuer lors de sa rception.

* Solution

1. 1. 2. 3. 4.

Ralisation dune commande client avec un article puis Cliquez dans le volet de navigation sur Liste commande . Cliquez sur Ajouter une nouvelle commande . Choisissez le client cr dans lexercice 1. Parmi les produits de la zone de liste droulante, slectionnez larticle Beer dont la quantit disponible est gale 0. 5. La saisie dune quantit commande de 20 articles provoque louverture dune fentre de message particulire. Le programme a consult linventaire du stock et constat quil tait insufsant pour satisfaire la commande. Malgr tout, il est possible de valider la commande en ltat (quitte, plus tard pratiquer un rassort de ce produit). 6. Justement, le logiciel gre ce quon appelle le systme de contremarque : une commande client, quand elle ne peut tre satisfaite, gnre automatiquement une commande fournisseur hauteur des mmes quantits. Cest la raison pour laquelle le logiciel ouvre automatiquement une fentre Inventaire insufsant. Voulez-vous crer un bon de commande ? . Il sagit l dun bon de commande fournisseur ; les

28

Access 2007 et VBA

Chapitre

puristes pourront reprocher au concepteur de navoir pas prcis cela dans la fentre en question ni dans les encarts suprieurs de chacun des formulaires. 7. Le bon de commande fournisseur qui souvre est dj numrot ( la diffrence du prcdent). Son tat initial est soumise (en haut gauche). Le fournisseur est dj renseign. La quantit commande est identique celle de la commande client. Lapprobation de cette commande nest ni signe ni date. Il ny a pas de date prvue de livraison. Vous pouvez fermer les deux fentres des bons de commande Client et Fournisseur. 8. Dans le volet de navigation, cliquez sur Liste bon de commande dans la catgorie Inventaire et achats pour obtenir la liste des commandes fournisseur telle qu la gure 1.12. Figure 1.12
Liste des commandes fournisseur en cours.

Dans cette liste, les commandes fournisseurs ont, suivant les cas, deux tats possibles : Soumise ou Approuv. Celles qui ne sont pas approuves ne comportent ni nom dapprobateur, ni date (ni, a fortiori, de date de paiement) 1. 1. Double-cliquez sur la commande la plus rcente, en haut, celle que vous venez de gnrer. 2. Cliquez sur le bouton Approuver lachat : automatiquement, Access appose la date du jour dans la zone de date dapprobation et colle le nom de lutilisateur en cours dans la zone Approuv par . 3. Fermez la fentre et constatez que la liste nest pas mise jour immdiatement : il faut appuyer sur la touche F5 (ou fermer et rouvrir le formulaire) pour rafrachir la liste.

1. Il nexiste pas de commande fournisseur dclare ferme . En fait, le programme est inachev et il nexiste pas de moyen de fermer une commande fournisseur, mme lorsque tous les champs sont correctement remplis.

Les objets dAccess 29

Exercices

Note
Ces dernires manipulations nous conduisent dceler trois imperfections dans le programme : Imperfection sur le fond, tout dabord : il nest pas logique que la mme personne ait la fois le droit de soumettre une commande fournisseur et simultanment le droit de lapprouver. La sparation des fonctions, lie au contrle interne dans lentreprise, nest pas oprationnelle. Au pire, et en admettant quil ne soit pas utile dapprouver une commande, le passage par une tape dapprobation ne sert ds lors informatiquement rien*. Dans la mesure o le bouton Approuver lachat vient coller automatiquement le nom de lutilisateur dans la zone, il ny a nul besoin de crer cet endroit une zone de liste droulante qui afche tous les utilisateurs ; une simple zone de texte et suf. Il manque une ligne de programme pour provoquer un rafrachissement de la liste au moment de la fermeture du bon de commande.

* En fait, le programmeur a bien prvu une notion de privilge dapprobateur dans la base mais ne la pas mise en uvre. Le reprsentant Cencini, premier de la liste, et sous le nom duquel on se connecte par commodit a tous les droits.

2. Rception dune commande fournisseur Lorsque la commande de 20 bouteilles de bire parvient lentreprise, le rceptionniste doit procder de la manire suivante : 1. Double-cliquez sur la ligne de commande fournisseur correspondante. 2. Cliquez dans longlet Rception dans linventaire. 3. Cochez la case Ajouter linventaire : une fentre vous informe que Le produit a t correctement entr dans linventaire 1. 4. Immdiatement aprs, une deuxime fentre souvre : Voici les commandes contenant ce produit en livraison diffre. Voulez-vous les remplir maintenant ? En dautres termes, voulez-vous traiter les commandes clients en attente ? Rpondez Non . Dans le cas contraire, vous accderiez la saisie des livraisons telle que nous lavons pratique lexercice prcdent. Le fait quil nexiste pas dtat Rceptionn un bon de commande fournisseur nest pas choquant : un bon de commande peut comprendre plusieurs articles dont certains ont t rceptionns et dautres non. la rigueur on pourrait imaginer un tat Rceptionn lorsque tous les articles dun bon sont reus. La synthse des oprations ralises peut se lire dans linventaire, lequel nous conduit aux produits. 1. Dans le volet de navigation, cliquez sur Inventaire dans la catgorie Inventaire et achats . 2. La liste de tous les produits et diffrentes quantits dinventaire apparat : il ne sagit que dune synthse, et il nest pas possible, ce niveau, de vrier les mouvements de stock.

1. La case cocher a ici une double vocation un peu particulire : dune part, elle est une case cocher simple qui indique un tat (on constatera tout moment que le produit est entr en inventaire), dautre part, le simple fait de cocher lance une action prcise, celle dajouter larticle linventaire. Cette double utilisation simultane du mme objet est relativement peu orthodoxe.

30

Access 2007 et VBA

Chapitre

3. Double-cliquez sur le produit Beer : vous ouvrez la table des produits et ciblez plus prcisment cet article (voir gure 1.13). Figure 1.13
Fiche produit.

Comme on la vu plus haut, lafchage en mode formulaire unique des articles de la table sadjoint, en bas dcran, de boutons de dplacement, dun ltre et dun mode Recherche. En haut, le formulaire comprend deux onglets Dtail du produit et Historique des achats/commandes . En cliquant sur ce deuxime onglet, on lit tous les mouvements du produit en entre et en sortie. On comprend donc que le mme formulaire, au travers de deux onglets, vise deux domaines bien distincts pour nous maintenant : dune part, le produit lui-mme, dautre part, la synthse des commandes clients/fournisseurs du mme produit.

EXERCICE 3
nonc

ANALYSER

LES PROCESSUS ET LES TATS

En reprenant les deux exercices prcdents, reprsentez graphiquement les processus et les tats mis en place depuis la commande un fournisseur jusqu la facture un client

* Solution

Il existe de nombreuses manires de reprsenter graphiquement des processus et des tats. Dans la mesure o le lecteur nest pas spcialiste de ce type de reprsentation, on prendra des schmas de type UML (Unied Modeling Language), tout en gardant une certaine libert dans le formalisme.

Les objets dAccess 31

Exercices

Un diagramme dactivit reprsente les actions successives, de haut en bas, de gestion des bons de commande fournisseur et client (voir gure 1.14). Limportant, ici, consiste montrer lordonnancement des actions et les deux cas de gure, si larticle command par le client est disponible ou non. Figure 1.14
Reprsentation de la gestion des commandes sous forme de diagramme dactivit.

Dans la gure 1.14, la possibilit de passer du circuit client au circuit fournisseur a bien t reprsente, bien quun peu abusivement : lutilisateur a le droit darrter la commande au moment o il est inform quun article est non disponible et nest pas oblig de passer aux actions de la partie gauche du schma. Au contraire, la possibilit de passer au traitement des commandes clients, lorsquun article est rceptionn, nest pas dessine. Le trait noir pais de la partie gauche, appel barre de synchronisation par les professionnels, exprime la ncessit de prsence des deux actions, commande fournisseur et approbation, pour pouvoir continuer le l des actions. Les cercles noirs, en haut de gure, reprsentent le point dentre dans le processus, les doubles cercles, en bas, les points naux. Un autre type de reprsentation appel diagramme dtat , plus statique, synthtise les diffrents tats par lesquels passe le bon de commande client. Il nest pas indispensable de procder des reprsentations graphiques trs pousses lorsque lapplication dvelopper avec Access conserve des objectifs modestes et une porte limite. Toutefois, ces illustrations permettent de faciliter le dbat ncessaire entre le(s) dveloppeur(s) et les utilisateurs, qui doit avoir lieu lors de la conception du produit logiciel. Elles peuvent servir de base, en partie, lamorce dun cahier des charges et permettent au dveloppeur, surtout, davoir une ide bien claire de la problmatique et des objectifs poursuivre.

32

Access 2007 et VBA

Chapitre

Figure 1.15
Reprsentation de la gestion des commandes client sous forme de diagramme dtat.

EXERCICE 4
nonc

ANALYSER

LES DONNES

En reprenant les deux premiers exercices, numrez graphiquement les donnes, regroupes par grands ensembles, entrant dans le cadre de lapplication.

* Solution

Les donnes se regroupent dans des tables, comme nous lavons vu dans la partie thorique de ce chapitre. Ici, nous nabordons volontairement pas les liens entre les tables, mais uniquement leur contenu. Il sagit de dissocier les domaines de chaque table et de ne pas les mlanger.

Figure 1.16
Reprsentation des donnes essentielles de la base Northwind.
CLIENT N de client Raison sociale Adresse FOURNISSEUR N de fournisseur Raison sociale Adresse TRANSPORTEUR N de transporteur Raison sociale Adresse EMPLOYE N demploy Nom Prnom Fonction Rle

COMMANDE CLIENT N de commande client N de client N de produit Quantit Etat C.Client

PRODUIT N de produit Dsignation Prix unitaire

COMMANDE FOURNISSEUR N de commande fournisseur N de fournisseur N de produit

Quantit Etat C.Fournisseur

Dans la ralit, la base de donnes est plus complexe : ne sont reprsentes ici que les donnes essentielles qui seront dcomposes par la suite. En revanche, le dessin gnral est incontournable. Clients, fournisseurs, transporteurs et employs regroupent des entits bien distinctes qui ne peuvent en aucun cas constituer un seul chier des partenaires de lentreprise. Chacun des ensembles mis en place dispose dune numrotation qui lui est propre : lintrieur dun mme ensemble, chaque client, par exemple, a un numro propre qui lui sert didentiant. Par commodit, on parlera dID (pour lIDentity amricain).

Les objets dAccess 33

Exercices

Certains libells, et en particulier les identiants, se retrouvent dans dautres tables que dans leur propre univers : le numro de client dans la commande client, le numro de fournisseur dans la table des commandes fournisseur. Il nexiste quune seule table Produit dont les numros se retrouvent dans les tables des commandes, aux fournisseurs comme aux clients : sagissant de ngoce, les produits lachat sont bien les mmes que ceux qui seront revendus (sans transformation). Les deux tables des commandes fournisseurs et clients ont chacune une notion dtat (soumis, ferm, factur, expdi) qui reprend les aspects abords lors de lanalyse des processus. Les deux tables des commandes ne comportent pas le prix de la commande ou tout autre information inutile : la quantit commande suft puisque linformation du prix unitaire est stocke dans la table des produits. On notera que le pluriel nest jamais utilis dans la gure 1.16 : on parle de la notion de client et non pas du chier des clients (au pluriel). Une dmarche correcte consiste manipuler le concept et non la ralit nale : il est vident quil existera des centaines de clients, fournisseurs et autres lments dans la base. Une proprit afrme pour vraie concernant un lment doit ncessairement rester vraie pour tous les lments de la mme classe ; voil pourquoi le concept na pas sappliquer au pluriel. Le concepteur de la base Northwind, en fait, a dmultipli certains ensembles, qui ont t synthtiss ci-dessus, pour en arriver au modle de la gure 1.17. Pour visualiser ce modle 1 : 1. Cliquez dans la barre de menu sur Outils de base de donnes . 2. Cliquez sur licne Relations. Figure 1.17
Modle relationnel de la base Northwind.

1. Pour notre part, nous napprouvons pas, dans la conception de la base, de nombreux points visibles sur ce modle. Les tables sont notes au pluriel, ce qui est contraire aux standards en la matire. Les identifiants sont nots par le seul libell ID sans prciser de quel ID il sagit. De nombreux champs sont nots avec des espaces, ce qui complique passablement le travail des programmeurs dans les requtes SQL. Le mot Commandes de la table du mme nom sous-entend Commande_Client alors que le mot Bons de commandes sous-entend Commande_Fournisseur , do des confusions syntaxiques trs risques. Et il ne sagit l que des lments les plus frappants !

34

Access 2007 et VBA

Chapitre

EXERCICE 5
nonc

RETOUCHER

UN FORMULAIRE EN MODE CRATION

Comme vu prcdemment, le formulaire de saisie et de modication dun nouveau client dans la base Northwind ne comporte pas de masque de saisie des numros de tlphone pour contrler la validit de leur format. Modiez cette zone pour la rendre plus conviviale et adapte. Cet exercice est destin familiariser le lecteur avec les basculements successifs du mode utilisateur au mode cration.

* Solution

Il sagit de modier les contrles de ce formulaire : il est donc impratif de passer en mode cration pour en modier les proprits : 1. Dans le volet de navigation, cliquez du bouton droit sur le formulaire Dtails du client . 2. Dans la fentre contextuelle, cliquez sur Mode cration ; vous visualisez le formulaire tel quil apparat la gure 1.18.

Figure 1.18
Formulaire de saisie des clients en mode cration.

Les objets dAccess 35

Exercices

3. Cliquez au-dessus de la zone blanche Tlphone professionnel : le contrle est mis en surbrillance. 4. Cliquez du bouton droit au mme endroit, puis cliquez sur Proprits (on peut galement cliquer sur Feuille des proprits dans le ruban du menu Cration qui est apparu lors du passage en mode cration) : la feuille des proprits apparat. 5. Seul longlet Donnes est accessible, mais il est prfrable dafcher toutes les proprits en utilisant longlet Toutes . 6. Descendez jusqu litem Masque de saisie . 7. Sur la mme ligne, droite, cliquer sur le carr muni de trois points.

8. Access dmarre un Assistant Masque de saisie comme le prsente la gure 1.19. Figure 1.19
Assistant Masque de saisie dAccess.

9. Choisissez dans la liste le format Numro de tlphone , ou bien Numro de tlphone international si la base commerciale est destine linternational. 10. Passez ltape suivante, qui permet de modier partiellement ou totalement le masque choisi. 11. Passez ltape suivante, qui conditionne le stockage de la donne entre avec ou sans son masque. 12. Terminez lassistant. 13. Testez la modication en repassant en mode formulaire (dans le ruban du menu Cration, cliquez sur licne Afchage gauche). 14. Quand les tests sont positifs, appliquez les mmes modications aux contrles Tlphone mobile et N de tlcopie . 15. Passez alternativement du mode utilisateur au mode cration jusqu ce que tous les contrles soient oprationnels. Cette modication de la base Northwind na pas dincidence sur les fonctionnalits du logiciel.

36

Access 2007 et VBA

Chapitre

Le modle relationnel, concevoir une base de donnes


1. Merise, un outil mthodologique ...................... 38 Problmes et exercices 1. Crer la base de donnes dune bibliothque de prt ....... 53 2. Grer un organisme de formation ........................... 57 3. Crer la base de donnes du systme tlpage............... 60

Les exercices du chapitre prcdent ont laiss entrevoir que lassemblage des donnes stockes dans une base ncessitait une organisation particulire ; dans la mme optique, le montage des objets qui contiennent ces donnes ncessite une mthode. Nous tudierons donc maintenant la cration des tables et la mise en place des relations entre elles. Laspect thorique, ici, aura au moins autant dimportance que la manipulation du logiciel Access.

37

(1)

Merise, un outil mthodologique


Merise (Mthode dtude et de Ralisation Informatique pour les Systmes dEntreprise), est une mthode, prsent ancienne, qui donne un cadre formel au dveloppeur pour mettre en uvre sa base de donnes. Merise, au dpart, distingue plusieurs niveaux dabstraction des modles et plusieurs types de base de donnes. Pour lexpos qui suit, nous ne retiendrons que les deux aspects suivants : le modle physique des donnes et plus prcisment lorganisation des donnes dans des tables ; la base de donnes relationnelle. Dans la mesure o nous naborderons pas la plus grande partie de la mthode Merise, trs thorique, nous simplierons lapproche en conservant les grands principes de base.

1.1 PRINCIPE DUNICIT

DE LINFORMATION

Le premier enseignement fondamental de la mthode touche lunicit de linformation : toute information ne doit tre stocke quune et une seule fois dans une base 1. Un exemple illustrera ce premier point, en rutilisant la base de donnes Northwind. Celle-ci comprend : une table Client contenant toutes les coordonnes 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 ladresse du client, contrairement toute attente. Pour imprimer le bon de commande, par exemple, il sera ncessaire de chercher les informations ncessaires dans la table Client par un lien dnir. La table commande client contient le numro du client, qui, donc, servira de lien. On dit quil existe une relation entre la table client et la table commande ; le numro de client, prsent dans les deux tables, matrialise cette relation. Une telle organisation est dabord conome en termes despace disque, mais, surtout, le systme de gestion de base de donnes la gre compltement en interne. Nul besoin de contrler le rapprochement des occurrences de part et dautre des deux tables laide de programmes lourds et complexes, le systme contrle en permanence lintgrit de la base. Un second exemple, plus matriel encore, illustrera lutilit dune organisation en tables. Imaginons que vous ayez crer un chier complet de vos relations personnelles. Pour chaque enregistrement, cest--dire chaque parent ou ami, vous voudrez videmment commencer la saisie par la civilit Monsieur, Madame ou Mademoiselle. Si vous vous contraignez oprer cette saisie, vous penserez probablement, aprs une dizaine de lignes, que cette frappe est fastidieuse et rptitive. Dans un premier temps, vous utiliserez un raccourci du type M., Mme, Mlle et plus loin encore vous nirez par crire 1 (qui signiera Monsieur), 2 (Madame) ou 3 (Mademoiselle), la forme la plus rapide de raccourci. Cest trs exactement ce que fait une base de donnes, au travers de ce quun utilisateur
1. Ce principe peut tre outrepass si des obligations dordre lgal, par exemple, contraignent au stockage de donnes valides et archives (paie, facturation, etc.). Ceci ne remet pas en cause la thorie.

38

Access 2007 et VBA

Chapitre

verra comme une zone de liste droulante. Le dessin des deux tables mises en uvre sera celui de la gure 2.1. Figure 2.1
Modle relationnel simpli CivilitContact.

La notation utilise dans la gure 2.1 est particulire, nous y reviendrons plus loin. Attachons-nous dabord comprendre le schma gnral. Les deux carrs reprsentent des containers des donnes qui y seront stockes, non les donnes elles-mmes. La table CIVILITE de gauche ne contiendra, en dnitive, que trois enregistrements que lon pourra dcrire trs exactement comme la gure 2.2. Figure 2.2
Contenu de la table CIVILITE.

Dans la table CIVILITE , il nexiste aucune allusion aux contacts du carnet dadresses. En revanche, la table CONTACT comporte un champ nomm ID_CIVILITE ; ce dernier ne contiendra pas de donnes telles que M. ou Madame, mais uniquement les chiffres correspondants de la table CIVILITE , et dans la pratique les chiffres 1 ou 2 ou 3. Le mme champ ID_CIVILITE se retrouve dans les deux tables CIVILITE et CONTACT . On notera tout de suite quil nexiste pas dans la gure 2.1, pour le moment, de trait (de lien) entre les deux ID_CIVILITE , celui de la table CIVILITE et celui de la table CONTACT ; cette prsentation est volontaire. Il peut exister un lien rel, entr dans la base de donnes et que lon traitera plus loin ; mais il peut aussi ne pas en exister. Limportant, fondamentalement, rside dans la prsence effective dun champ ID dans la table CONTACT qui corresponde une valeur contenue dans la table CIVILITE . Enn, la gure 2.1 montre un libell parfaitement identique du terme ID_CIVILITE dans les deux containers de droite et de gauche. Cette volont smantique nest pas obligatoire, mais optionnelle : Access saurait rapprocher deux colonnes ne portant pas le mme nom. En revanche, et pour des raisons videntes de clart dans la dmarche, nous dconseillons fortement de nommer diffremment les deux colonnes dans chacune des tables.

Le modle relationnel, concevoir une base de donnes 39

1.2 PRINCIPE DIDENTIFIANT


lintrieur dune mme table, chaque item de lensemble (en dautres termes chaque enregistrement), doit pouvoir tre identi de manire unique et obligatoire. La runion de ces deux conditions permet de considrer linformation didentication comme une cl primaire de la table. En reprenant lexemple de la table CIVILITE , la colonne ID_civilite doit : tre obligatoire, le champ ne peut pas tre vide (null) ; contenir des valeurs parmi lesquelles ne se trouve aucun doublon. Ds lors que ces deux conditions sont respectes, on peut considrer que la colonne ID_civilite est lidentiant des enregistrements quon ajoutera la table. Un bon principe de base consiste crer systmatiquement un champ de cl primaire dans toutes les nouvelles tables, mme lorsque le besoin immdiat nen est pas vident. Inversement, il est possible quune table contienne une cl primaire constitue de plusieurs champs ; nous tudierons ce cas plus loin. La nature de cette cl primaire peut tre varie et il nexiste pas dobligation particulire sur ce point. La plupart du temps, on utilisera un code numrique, le plus simple, et pour lequel Access propose une solution dincrmentation automatique. Mais une cl primaire peut aussi tre constitue de lettres (pensons la codication trois lettres de tous les aroports du monde : JFK pour lun des aroports de New York et CDG pour celui de Roissy) ou bien toute autre organisation. On vitera des cls primaires trop compliques ou gnrant des problmes lgaux (le numro de Scurit sociale par exemple). Le choix dune cl primaire tant primordial, on portera une attention particulire sa validit dans tous les cas de gure traiter ultrieurement. Par exemple, il est maladroit didentier les villes de France au moyen de leur code postal : un bureau de Poste peut couvrir plusieurs communes. Sil nexiste pas de besoin particulier didentier toutes les communes de France, ce choix portera la table environ 8 000 enregistrements ; dans le cas contraire (et le plus gnral), il sera plus judicieux dutiliser les codes Insee des communes (environ 36 000). On rchira galement ltendue de la codication : pour reprendre lexemple des aroports, la codication choisie trois lettres permet denregistrer 263 aroports soit 19 604 au maximum.

1.3 ASPECT

DE LA PRSENTATION UNIFORME DES DONNES. Ds quune donne peut se rpter plusieurs fois sous diverses formes, il devient ncessaire de mettre en place un systme permettant dadopter un rfrentiel. Imaginons une table ETUDIANT contenant les coordonnes de ceux-ci. Si un champ de cette table doit contenir le dernier diplme obtenu par les tudiants, il est maladroit de crer une simple zone de texte dans laquelle lutilisateur aura toute libert de saisir les valeurs qui lui semblent les plus adquates. Dans ce cas prcis, il y a fort craindre quune personne saisira Baccalaurat scientique mention Bien , pendant quune deuxime mettra Bac S Mention B , et une dernire Bac S . Nul doute quil ne sera pas possible de faire des

40

Access 2007 et VBA

Chapitre

requtes structures sur de pareils libells. Il devient donc indispensable dtablir un systme relationnel entre les tudiants et leurs diplmes, limage de la gure 2.3. Figure 2.3
Modle relationnel simpli EtudiantDiplme.

1.4 PRINCIPE

DE LA RDUCTION LMENTAIRE Imaginons maintenant que la volont du dveloppeur consiste enregistrer tous les diplmes obtenus par les tudiants. Il ne peut pas exister, parmi les champs de la table, un champ DIPLOMES au pluriel, destin recevoir la liste des diplmes dj obtenus par ltudiant. En admettant que le programmeur ait prvu 255 caractres de long pour remplir le champ de donnes, la saisie au kilomtre de diplmes varis ne constituera quun ensemble totalement inexploitable par la suite. Chaque champ ne doit donc comporter quune et une seule information : cette information doit tre rduite son expression lmentaire. Certes, une solution btarde consisterait multiplier les champs DIPLOME1, DIPLOME2, etc., mais on imagine aisment que le procd est excessivement limit : un tudiant brillant dpassera ncessairement, tt ou tard, le nombre de diplmes prvus. De plus, les requtes qui seront faites pour compter les diplmes par tudiant, par exemple, savreront trs compliques mettre en place. Le systme relationnel de la gure 2.3 ne suft ds lors plus et il est ncessaire de passer une forme plus labore telle que celle de la gure 2.4.

Figure 2.4
Modle relationnel Etudiant_Diplme.

Dans le modle dtaill de la gure 2.4, il est possible dinsrer un innit de diplmes une innit dtudiants, grce linsertion dune table intermdiaire dont nous verrons le fonctionnement dans le point suivant. Notons tout de suite que cette prsentation permet aussi dinsrer des informations nouvelles telles que la mention au diplme ou la date dobtention.

Le modle relationnel, concevoir une base de donnes 41

1.5 PRINCIPES

RELATIONNELS

Les relations entre les tables doivent tre conjugues logiquement avant dtre mises en place. On focalisera lattention sur le rapport quantiable entre les deux tables relier. La conjugaison sexprime, pour reprendre les exemples prcdents, de la manire suivante : Un contact porte une et une seule civilit (on ne peut tre simultanment Monsieur et Madame) ; une civilit sapplique plusieurs contacts (le carnet dadresses peut comporter plusieurs Monsieur et plusieurs Madame). Un bon de commande client correspond la commande dun et un seul client (si un autre client fait une autre commande, y compris portant sur les mmes articles, un autre bon de commande sera rdig) ; un client peut faire zro, une, ou une innit de commandes. Un bon de commande fournisseur est soumis par un et un seul reprsentant (celui qui sest connect initialement la base) ; un reprsentant peut rdiger zro, un ou plusieurs bons de commande fournisseur. Dans ces trois noncs, la conjugaison semble naturelle et logique ; elle intgre demble une relation de un plusieurs. En revanche, il arrivera frquemment que la mise face-face de deux tables induise des conjugaisons diverses. tudions donc les cas de gure possibles, qui se limitent logiquement trois : les relations de 1 plusieurs, dj vues ; les relations de 1 1 ; les relations de plusieurs plusieurs.

Les relations de 1 1
Nous supposons la prsence de deux tables contenant des donnes relatives, par exemple, vos contacts professionnels, dune part, et vos contacts personnels, dautre part. La conjugaison de ces deux tables peut se dcliner ainsi : un contact professionnel correspond soit zro, soit un et au plus un contact personnel (un partenaire commercial peut aussi tre un ami !) ; un contact personnel correspond soit zro, soit un et au plus un contact personnel (mme raison). Nous sommes ici devant une relation de un un. A priori, et pourvu que les uns et les autres naient pas de rle particulier jouer dans le systme dinformation mettre en place, il ny a aucune raison pour ne pas fusionner purement et simplement les deux chiers. La seule opration mettre en place avant ladite fusion consiste crer une proprit particulire la table qui fusionne les deux chiers pour distinguer les commerciaux des amis personnels . Cet exemple peut tre gnralis : les relations de un un dans une base bien conue nexistent pas 1.

1. Seul cas de figure possible : si la table doit compter plus de 255 colonnes, il sera ncessaire de crer une table fille .

42

Access 2007 et VBA

Chapitre

Les relations de plusieurs plusieurs


Le cas inverse est beaucoup plus frquent. Imaginons que la base de donnes crer concerne des lves qui apprennent des langues vivantes au lyce. La conjugaison des relations serait, en premire analyse, la suivante : un lycen apprend plusieurs langues ; une langue est apprise par plusieurs lycens. La relation semble plurielle dans les deux sens. En ltat, elle ne sera pas grable par une base de donnes, et il savre obligatoire de dvelopper cette relation plurielle dans les deux sens en deux relations de un plusieurs. Dans le cas des lycens, cela nous conduira la proposition suivante : un lycen fait un choix pour une langue ; un choix de langue sapplique plusieurs lycens ; et un choix de lycen porte sur une langue ; une langue donne lieu plusieurs choix. En dautres termes, on intercale une table intermdiaire entre les deux tables des lycens et des langues (voir gure 2.5). Figure 2.5
Modle relationnel Lycen-Langue.

Ici, la table OPTION_LINGUISTIQUE comporte non seulement sa propre cl primaire mais les identiants des deux tables LYCEEN et LANGUE : on parle de cls trangres. Le contenu effectif des tables sera semblable celui de la gure 2.6. Figure 2.6
Contenu des tables du modle relationnel LycenLangue.

Le modle relationnel, concevoir une base de donnes 43

On lit dans la table OPTION_LINGUISTIQUE les inscriptions suivantes aux langues : Bertrand DUPOND, lycen n 2 est inscrit en Anglais, langue n 1 ; Claude MARTIN, lycen n 3 est inscrit en Anglais, langue n 1 ; Bertrand DUPOND, lycen n 2 est inscrit en Allemand, langue n 2. En rsum, toute relation de plusieurs plusieurs doit tre dcompose pour ne grer avec Access que des relations de un plusieurs. Cest dailleurs exactement la reprise du cas de gure des clients et des produits. Au dpart, il peut tre afrm : un client commande un ou plusieurs produits ; un produit est command par un ou plusieurs clients. Prsente ainsi, cette relation apparat comme une relation de plusieurs plusieurs. En fait, et dans le modle Northwind, elle a t dcompose ainsi : un client fait une ou plusieurs commandes ; une commande relve dun et un seul client ; et un produit rentre dans une ou plusieurs commandes ; une commande (pris dans le sens dune ligne de commande) concerne un et un seul produit.

La problmatique du temps
Il est toujours ncessaire de rchir sur la notion de temps. La conjugaison de la relation doit tre vraie un instant t et tous les instants t, t, etc. Si lvolution dans le temps doit changer la nature de la relation, alors le modle relationnel doit en tenir compte. Imaginons un salari nouvellement embauch ; aux premiers jours de son emploi, il sera plac un certain niveau de la Convention Collective Nationale (CCN) de laquelle il relve. Or, il est probable que le mme salari, avec lanciennet et de nouvelles qualications, progressera dans lchelle de la Convention collective. Si lchelon est simplement port comme un champ parmi dautres dans la table SALARIE , la valeur contenue dans ce champ devra tre modie dans la table SALARIE au moment de sa promotion. Malheureusement, la valeur prcdente disparatra dnitivement et il ne sera plus possible de faire une reconstitution de carrire et connatre la vitesse de promotion du salari dans lentreprise. Aussi, la panoplie complte des outils relationnels doit tre mise en uvre pour arriver au modle prsent la gure 2.7. Figure 2.7
Modle relationnel Salari-Convention Collective Nationale.

44

Access 2007 et VBA

Chapitre

Dans ce modle, la notion de date daffectation un niveau de Convention collective sinsre dans la table intermdiaire AFFECTATION_CCN . Cest prcisment cette table qui permettra de faire lhistorique de carrire du salari. La proposition littrale de relation est la suivante : un salari a une ou plusieurs affectations dans sa carrire ; 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 zro, une ou plusieurs affectations.

Le cas particulier des relations rexives


Une table peut comporter des relations avec elle-mme. Cest le cas, par exemple, dune table des salaris dans laquelle on veut faire intervenir une notion de parent. Initialement, la proposition de relation peut sexprimer ainsi : un salari est le parent (frre ou sur ou autre) de plusieurs salaris ; un salari a pour parents plusieurs salaris ; Le modle gnrer sera celui de la gure 2.8. Figure 2.8
Modle relationnel Salari-Lien de parent.

Ici, Access cr ctivement une table SALARIE_1 , qui reprsente la mme table que SALARIE et permet de reprsenter la relation dun salari un autre. Dans la table PARENTE , on mettra le libell des parents possibles (frre, sur, cousin, pre, etc.). Dans la table LIEN_DE_PARENTE , on insrera le lien entre un salari et un autre. Pour parfaitement exprimer le lien de parent frre/sur entre Anatole et Zo, deux enregistrements seront ncessaires 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 Frre) ; le second avec un ID_SALARIE1 sur Zo et un ID_SALARIE2 sur Anatole (l ID_PARENTE tant positionn Sur) 1.

1. Les deux relations entre le lien de parent et la table salari devront imprativement comporter loption de suppression en cascade des enregistrements correspondants car, sans cette option, toute suppression de salari ayant un rapport de parent avec un autre deviendrait impossible (voir dans la section de ce mme chapitre la notion de suppression en cascade).

Le modle relationnel, concevoir une base de donnes 45

1.6 LA

CRATION DES TABLES Cette premire approche thorique tant bien assimile, des cas pratiques peuvent tre abords. Nous allons crer une base de travail et y crer des tables et autres objets Access. Vous aurez donc conserver en permanence ce chier. Fermez toutes les applications ventuellement ouvertes. Dmarrez Access. Cliquez sur licne Base de donnes vide. En bas droite, indiquez le nom de base BASE_DE_TRAVAIL.ACCDB en lieu et place du libell Base de Donnes1.accdb donn par dfaut. 5. Le rpertoire de classement est par dfaut le rpertoire Mes Documents ; changezle si ncessaire (retenez alors le nouveau chemin !). 6. Cliquez sur le bouton Crer . 7. Immdiatement, la table Table1 de la nouvelle base est cre, qui contient dj une nouvelle table, nomme Table1, laquelle est dj ouverte en mode saisie. 8. Cliquez sur la croix en haut droite pour fermer ce premier objet (et apprendre ainsi, ds le dmarrage, crer une table). 9. Dans la barre de menus, cliquez sur Crer , puis sur licne Table. Immdiatement une nouvelle table est cre, ouverte en mode saisie. Il est dconseill dutiliser ce mode pour crer la nouvelle table (ses proprits ne seront pas accessibles et les champs seront nomms Champ1, Champ2, etc.). 10. Cliquez sur licne Afchage en haut gauche. 11. Access propose denregistrer la table sous un nouveau nom : saisissez SALARIE 1. La fentre de cration de table apparat sous lapparence de la gure 2.9. 1. 2. 3. 4.

Figure 2.9
Fentre de cration de table.

1. Dans la totalit de louvrage, nous utilisons des conventions de noms que nous recommandons : les noms de tables et noms de champs sont entrs en majuscules (non accentus), sans aucun espace. Labsence daccentuation limite les possibilits derreurs, labsence despace vite au programmeur de cerner les noms de champ par des crochets ([ ]) dans la saisie des requtes SQL. On verra plus loin que laspect esthtique de la prsentation des tables peut tre retrouv grce la notion de Lgende .

46

Access 2007 et VBA

Chapitre

La partie suprieure comporte tous les champs de la table pendant que la partie infrieure afche les proprits de chacune des lignes, ligne par ligne, au fur et mesure et suivant le positionnement du pointeur du pav suprieur. Access propose demble de commencer la table par un champ de cl primaire symbolis dans la colonne de gauche par une petite cl jaune. Ce premier point tant conforme aux recommandations nonces dans la partie thorique, nous le maintiendrons. Le premier champ sappelle par dfaut N : ce dbut de libell peut tre conserv et continu par une prcision sur le type de numro ; le champ pourra tre nomm NSALARIE , par exemple. Malheureusement, le signe du N peut poser des problmes par la suite : cest la raison pour laquelle de nombreux programmeurs utilisent plutt ID_SALARIE (sans espace), mais avec un soulignement (underscore) entre ID et SALARIE . La faute ne pas commettre, linverse, consiste nommer le champ ID ou N sans autre prcision. Access accepte ce type de confusion alors que dautres bases ne lacceptent pas ; dans tous les cas de gure, cette dmarche maladroite exposera ultrieurement de forts risques de confusion entre les tables. Le type de donnes de la future colonne de la table, indiqu droite, est NumroAuto : en clair, cela signie quAccess incrmentera dune unit chaque nouvel enregistrement. Cette prsentation, bien que peu pratique dans certains cas, est conserve ici. Dans le pav infrieur, les zones vrier sont les suivantes : Le type de donnes NumroAuto est de la forme dun entier long ( retenir pour la cration des cls trangres ultrieurement). Les nouvelles valeurs seront sous la forme dincrment et non pas des valeurs alatoires (sans doublon). Le format, ici, na pas tre prcis. La lgende peut tre renseigne en respectant parfaitement lorthographe ; nous suggrons donc par exemple Numro de salari (avec les espaces et laccentuation). La lgende apparatra automatiquement en lieu et place du code ID_SALARIE dans tous les formulaires et tats. Lindex est positionn Oui Sans doublon : cette disposition est obligatoire pour un champ de cl primaire. Balises actives et Aligner le texte seront abords plus loin. Sur la deuxime ligne de la colonne Nom de champ, saisissez le libell NOM_SALARIE : encore une fois, cette convention de nom peut paratre lourde, mais elle entre dans une dmarche logique. Il peut exister un grand nombre de tables dans lesquelles le vocable NOM sera employ ; dans une petite base, on peut dj imaginer NOM_CLIENT, NOM_ FOURNISSEUR, NOM_SALARIE, par exemple. Cest la raison pour laquelle il est utile de prciser de quel nom il sagit an que le Dictionnaire des donnes, cest--dire lensemble des noms de champs, ne comporte pas de doublons. Access propose par dfaut ( droite du nom de champ) que le format des donnes soit de type Texte, ce qui, pour le cas prsent, est valide. La longueur par dfaut, indique en bas, est de 255 caractres, mais peut tre rduite (un nom de salari excdera rarement

Le modle relationnel, concevoir une base de donnes 47

50 caractres). Nous prciserons, ce stade, quelques autres proprits du champ NOM_SALARIE : La lgende sera Nom du salari , correctement orthographi pour une bonne lisibilit ultrieure dans les formulaires. La zone Null interdit sera positionne Oui (quand lutilisateur cre un nouveau salari, la zone du nom doit tre imprativement remplie, sinon lenregistrement ne sera pas valid). La Chane vide autorise sera positionne Non (lutilisateur ne peut pas tricher en remplaant labsence de nom par une simple chane vide). La zone Index peut ventuellement tre positionne Oui avec doublon (il peut y avoir plusieurs Dupont ou plusieurs Martin, donc les doublons doivent tre autoriss). La mise en place dun index acclrera les recherches sur le nom, si elles sont frquentes ; en revanche, la cration dun index multipliera par deux lespace disque ncessaire pour stocker les donnes et la saisie de nouveaux enregistrements sera ralentie. En consquence, les index ne doivent tre mis en place que sur les colonnes sur lesquelles sont effectues de nombreuses recherches et uniquement pour les tables dont le nombre de crations ou mises jour est faible. Le troisime champ, nomm PRENOM_SALARIE sera trait de la mme manire que le prcdent, de mme que le quatrime champ ADRESSE1_SALARIE (longueur de texte pousse 100 toutefois). Le cinquime champ ADRESSE2_SALARIE, destin indiquer un nom de btiment ou une prcision sur un lieudit ne sera pas obligatoire (zone Null interdit positionne Non ). Le sixime champ, indiquant le code postal et nomm CP_SALARIE, mrite quelques dveloppements : Contrairement aux apparences, il ne sagit pas dune zone numrique : le code postal de Bourg-en-Bresse est le 01000, avec un zro en premire position, et non pas 1000. Si le champ de code postal est format en numrique, tous les zros gauche ne seront pas pris en compte. Il sagit donc bien dune zone Texte, quon positionnera 5 caractres de long (si la base de donnes na pas pour vocation de grer des codes postaux internationaux). Le masque de saisie peut tre prcis : cliquez sur les trois petits points droite de la zone Masque de saisie ; le cas chant, enregistrez provisoirement la table, et visualisez lassistant la cration de masque de saisie. Parmi les diffrentes prsentations proposes, celle des codes postaux franais est numre : validez-la. Le champ Null interdit peut tre positionn Non . Terminez la saisie des champs de la table de la manire suivante : Le champ VILLE_SALARIE est une zone de texte (50 caractres), obligatoire. Le champ SALAIRE_BRUT_SALARIE est une zone numrique (rel double), non obligatoire.

48

Access 2007 et VBA

Chapitre

La description des champs, droite, peut tre remplie, aux seules ns de documenter lapplication ; la table doit avoir les caractristiques prcises la gure 2.10 Figure 2.10
Table SALARIE en n de cration.

Dans la mesure o la table a dj t nomme SALARIE antrieurement, il nest plus utile de reprciser ce paramtre. Il suft de fermer longlet en cours et daccepter lenregistrement des modications. En procdant de la mme manire, crez une nouvelle table nomme CCN (pour Convention Collective Nationale) et dote des champs suivants : ID_CCN , cl primaire, incrmentation automatique ; LIBELLE_CCN , zone de texte de 100 caractres, obligatoire. Toujours de la mme manire, crez une troisime et dernire table nomme AFFECTATION_CCN et dote des champs suivants : ID_AFFECTATION_CCN , cl primaire, incrmentation automatique ; ID_SALARIE , zone numrique au format nombre entier, obligatoire ; ID_CCN , zone numrique au format nombre entier, obligatoire ; DATE_AFFECTATION_CCN , zone au format date obligatoire laquelle on ajoutera la valeur par dfaut Date() (qui mettra automatiquement la date du jour chaque nouvel enregistrement).

Le modle relationnel, concevoir une base de donnes 49

Les deux nouvelles tables auront les caractristiques de la gure 2.11. Figure 2.11
Tables CCN et AFFECTATION_CCN en n de cration.

Il est souhaitable deffectuer la saisie de ces renseignements avec un soin extrme pour pargner au dveloppeur de fastidieux retours en arrire. Il faut prvoir tous les cas de gure avant davancer dans les oprations ; il est toujours possible dajouter des champs, den supprimer ou de les renommer, mais ces dmarches sont hasardeuses.

1.7 LINTGRIT

RFRENTIELLE

Jusqu maintenant, toutes les relations explicites entre des tables nont eu quun fondement smantique. Cest parce que nous avons utilis le vocable ID_SALARIE , par exemple, la fois dans la table SALARIE et dans la table AFFECTATION_CCN que le lecteur a fait le rapprochement, se doutant que les valeurs contenues dans ces champs de la table devaient pouvoir tre apparies. Au-del de cette dmarche intellectuelle, il ny a rien dans la base de donnes, ce stade, pour contrler si les appariements des valeurs vont effectivement se raliser. En dautres termes, et au stade o se trouve la cration de la base, il est possible dattribuer le coefcient 250 de la Convention Collective au premier salari venu alors mme que ce coefcient nexiste pas dans la table CCN ; de la mme manire, il est possible de crer une ligne daffectation dans la table AFFECTATION_CCN alors que le salari nexiste pas ! Une base de donnes peut trs bien fonctionner ainsi 1 : le contrle de la saisie des valeurs est alors report sur le programme informatique dinterface homme/machine qui, en consquence, salourdit considrablement. Il est inniment plus efcace dutiliser les contraintes dintgrit rfrentielle que comporte toute base de donnes relationnelle an de garantir la cohrence des valeurs contenues dans chacune des tables. En reprenant le premier exemple des deux tables CONTACT et CIVILITE , il est possible de poser une contrainte dintgrit rfrentielle via le champ ID_CIVILITE qui se trouve simultanment dans les deux tables :
1. Cest malheureusement trop souvent le cas, mme sur des bases de donnes plus puissantes quAccess. Seules des problmatiques de rpartition des tables dans les environnements client/serveur, ou bien des impratifs de migrations de donnes peuvent lgitimer labsence dintgrit rfrentielle dans la base.

50

Access 2007 et VBA

Chapitre

En qualit de cl primaire pour la table CIVILITE ; En qualit de cl trangre dans la table CONTACT . Ds lors, il sera impossible dinsrer une valeur diffrente de 1, ou 2, ou 3 (quivalentes de Monsieur, Madame, Mademoiselle) dans la table CONTACT , ces trois seules valeurs ayant t saisies dans la table CIVILITE . La mise en place des contraintes rfrentielles sopre avec une option des outils de base de donnes : Dans le menu Outils de base de donnes , cliquez sur Relations . Dans le ruban, cliquez sur le bouton Relations . Double-cliquez sur les tables SALARIE , CCN et AFFECTATION_CCN (ou cliquez 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 (la souris afche un signe +) et relchez. La fentre de la gure 2.12 apparat, permettant de crer les paramtres de la relation. Figure 2.12
Paramtrage dune relation.

La contrainte entre les deux tables peut comporter plusieurs niveaux : Le seul fait de cliquer immdiatement sur Crer (sans avoir coch la case Appliquer lintgrit rfrentielle ) cre un simple lien entre les deux tables : lorsquune requte appelant ces deux tables sera faite, Access proposera ce lien qui aura t mmoris. Mais il nexiste pas dintgrit rfrentielle. linverse, en cochant loption Appliquer lintgrit rfrentielle , on tablit une relation forte entre les deux tables : il sera impossible dajouter une affectation dans la table AFFECTATION_CCN si l ID_SALARIE invoqu nexiste pas dans la table SALARIE . Ce contrle sera permanent. Une intgrit rfrentielle tant pose, les deux options en dessous deviennent manipulables. La premire permet de Mettre jour en cascade les champs correspondants . Dans la pratique cela signie que si la valeur 1 dans le champ ID_SALARIE de la table SALARIE est change par la valeur 10, par exemple, toutes les anciennes valeurs 1 de la table des affectations seront changes en 10 1.
1. Dans le cas prsent, cette modification est impossible dans la mesure o le champ ID_SALARIE de la table SALARIE est un NumroAuto . La validation de loption de mise jour en cascade na donc aucun intrt dans cette configuration.

Le modle relationnel, concevoir une base de donnes 51

La dernire option ouvre la voie la Suppression en cascade . Dans la pratique, cela signie que si un salari est supprim de la table SALARIE , tous les enregistrements le concernant seront supprims de la table AFFECTATION_CCN . Naturellement cette option est utiliser avec circonspection. 1. Cochez la case Appliquer lintgrit rfrentielle et cliquez sur Crer . La fentre des relations contient dsormais un l de liaison entre les deux ID_SALARIE . Le fait davoir coch lintgrit rfrentielle montre le symbole 1 du ct Un de la relation de Un--plusieurs et le symbole du ct Plusieurs de la relation de Un--plusieurs. 2. Procdez de la mme manire avec la table CCN pour obtenir le rsultat de la gure 2.13 qui prsente la contrainte dintgrit rfrentielle entre ID_CCN de la table CCN (cl primaire) et ID_CCN de la table AFFECTATION_CCN (cl trangre). 3. Fermer ensuite la fentre de mise en relation en appuyant sur le bouton Fermer et en validant les modications. Figure 2.13
Modle relationnel Salari-CCN.

On ne saurait que trop recommander la mise en place des contraintes dintgrit rfrentielle ds les premiers instants de la cration de la base de donnes ; il sera toujours trs ardu dajouter ces contraintes lorsque des donnes auront dj t enregistres. En effet, Access refusera cette mise en place si tous les enregistrements ne respectent pas la nouvelle rgle.

Rsum
La cration des objets fondamentaux que sont les tables dans une base Access doit procder dune rexion mthodique pralable sur la conception et lorganisation des informations grer. Cette rexion sappuiera sur Merise comme base mthodologique. Toutes les tables cres comporteront systmatiquement un identiant, tous les champs crs ne contiendront que des donnes lmentaires, non dcomposables. Des relations seront imprativement mises en place entre toutes les tables, en reportant la cl primaire des tables principales sur un champ de cl trangre dans la table mettre en relation. Toutes les relations seront unies dans un rapport dUn--plusieurs, sauf exceptions. Les relations ne doivent pas seulement tre possibles, mais formalises par ltablissement de contraintes dintgrit rfrentielle.

52

Access 2007 et VBA

Chapitre

Problmes et exercices
Les exercices ci-aprs permettent de mettre en place les fondements dune base de donnes dans divers systmes dinformation. Chaque fois, les modles demands se limitent lessentiel de la base, sans entrer dans le dtail quexigerait un vritable dveloppement logiciel. Dans tous les cas, il sagit : de rchir sur larchitecture du systme dinformation ; de crer les tables ncessaires ; dtablir les relations.

EXERCICE 1
nonc

CRER

LA BASE DE DONNES DUNE BIBLIOTHQUE DE PRT

Vous devez concevoir le systme dinformation dune petite bibliothque municipale qui prte des livres. 1. Commencez par porter sur le papier vos premires approches. Pensez dissocier la gestion des adhrents et celle des livres, et dnissez les relations entre ces deux entits. 2. Crez les tables ncessaires. 3. Mettez en place les contraintes dintgrit rfrentielle.

* Solution

Le modle relationnel, concevoir une base de donnes 53

Exercices

1. Conception du modle Les premires tables qui peuvent tre mises sur papier sont : une table quon appellera ADHERENT , pour dsigner lemprunteur du livre ; une table LIVRE . La conjugaison de la relation, en premire analyse, donnerait : un adhrent emprunte un ou plusieurs livres (surtout dans le temps) ; un livre est emprunt par un ou plusieurs adhrents (successivement, par ncessit). Cette premire nonciation fait apparatre une relation de plusieurs--plusieurs qui doit tre dveloppe en plusieurs relations de un--plusieurs. La solution serait : un adhrent effectue un ou plusieurs emprunts ; un emprunt est fait par un et un seul adhrent ; et un livre donne lieu plusieurs emprunts ; un emprunt concerne un et un seul livre ; Linsertion de la table intermdiaire EMPRUNT solutionnera donc ce premier aspect de la problmatique. En premire analyse, le schma relationnel ne devrait donc comporter que les trois tables suivantes : une table ADHERENT qui contient la cl primaire ID_ADHERENT et tous les champs ncessaires la che de celui-ci (nom, prnom, adresse, etc.) ;

une table LIVRE qui contient la cl primaire ID_LIVRE et tous les champs relatifs la che du livre ; une table EMPRUNT qui contient une cl primaire, la cl trangre ID_LIVRE et la cl trangre ID_ADHERENT . Un champ supplmentaire DATE_ EMPRUNT permet de connatre la date de lemprunt. Rchissons prsent sur le choix des cls primaires : Dans la table ADHERENT , lID pourra tre constitu dun simple numro incrmentiel : le premier aura le numro 1, le suivant 2, etc. Il sufra de prvoir, dans le programme, un contrle pour viter quun adhrent dj inscrit ne soit pas recr une deuxime fois. Dans la table EMPRUNT , pour les mmes raisons, une numrotation incrmentielle sufra. En revanche, la cl primaire de la table LIVRE pose un nouveau problme ; admettons quune numrotation incrmentielle soit choisie, lachat de deux exemplaires dun mme livre va aller lencontre du principe merisien de lunicit de linformation : la che dun livre sera remplie deux fois sous deux numros. Or, une telle possibilit est quasi certaine : une bibliothque de prt, mme modeste, risque fort dacheter au moins trois ou quatre exemplaires des Quatre Mousquetaires dAlexandre Dumas pour rpondre la demande des collgiens. Une autre ide pourrait consister prendre pour identiant du livre son ISBN (International Standard Book Number), mais dans ce cas, si deux livres identiques sont achets, le deuxime ISBN sera vu comme un doublon et rejet. Le modle initial est donc faux et ncessite de nouveaux dveloppements. Linsertion dune nouvelle table EXEMPLAIRE savre indispensable, pour dsigner non pas la notion de livre, mais celle du volume qui sera rang sur une tagre. Ltude de la relation entre un livre et un exemplaire sexprime par les postulats suivants : Un livre est achet en un ou plusieurs exemplaires ; Un exemplaire correspond un et un seul livre. Ici, la relation sexprime immdiatement comme tant de un--plusieurs. La table EXEMPLAIRE contient une cl primaire ID_EXEMPLAIRE incrmentation automatique, laquelle on pourra ajouter une notion de date dachat et dtat du volume (neuf, bon tat, mdiocre, mettre au pilon). Il faut ajouter ces champs la cl trangre ID_LIVRE correspondant au livre concern. La table LIVRE contient une cl primaire ISBN et tous les champs utiles un chier bibliographique (titre, auteur, diteur, etc.). Naturellement, il serait possible maintenant dtendre la base de donnes un classement bibliographique plus large en crant des tables des auteurs, des diteurs, etc. Toutefois, et sagissant dune petite bibliothque, on considrera ces extensions non indispensables.

54

Access 2007 et VBA

Chapitre

2. Cration des tables La rexion sur la structure de la base tant acheve, il est possible de passer la cration physique. Crez la base de donnes Bibliothque . Crez ensuite la table ADHERENT limage de la table SALARIE du cours et avec les champs suivants : ID_ADHERENT, cl primaire, NumroAuto, Entier long, Index sans doublons. NOM_ADHERENT, Texte, 50 caractres, Null interdit, Index avec doublons. PRENOM_ADHERENT, Texte, 50 caractres, Null interdit, non index. ADRESSE1_ADHERENT, Texte, 100 caractres, Null interdit, non index. ADRESSE2_ADHERENT, Texte, 100 caractres, Null autoris, non index. CP_ADHERENT, Texte, 5 caractres, Null interdit, non index. VILLE_ADHERENT, Texte, 50 caractres, Null interdit, non index. Pour chaque champ, nomettez pas de complter la zone Lgende an de rendre comprhensibles les intituls techniques des noms de champ. Crez la table LIVRE avec les items suivants : ISBN_LIVRE, cl primaire, Texte, 18 caractres, Index sans doublons. La cration de la cl donnera lieu linsertion dun masque de saisie dj existant (masque ISBN). TITRE_LIVRE, Texte, 100 caractres, Null interdit, Index sans doublon. AUTEUR_LIVRE, Texte, 100 caractres, Null interdit, Index sans doublon. EDITEUR_LIVRE, Texte, 50 caractres, Null autoris, non index. DATE_LIVRE, Numrique, Entier, Null autoris, non index (on indiquera seulement lanne de parution). NB_PAGES_LIVRE, Numrique, Entier, Null autoris, non index. PRIX_LIVRE, Numrique, Rel double, Null autoris. Crez la table EMPRUNT avec les caractristiques suivantes : ID_EMPRUNT, cl primaire, NumroAuto, Entier long, Index sans doublon. ID_ADHERENT, Numrique, Entier Long, Null interdit, non index. ID_EXEMPLAIRE, Numrique, Entier Long, Null interdit, non index. DATE_EMPRUNT, Date, Format Date, Gnral (date et heure complets). RETOUR_EMPRUNT, Date, Format Date, Gnral . La cration de la table EXEMPLAIRE va nous permettre de dcouvrir une nouvelle fonction. Crez la table et son identiant ID_EXEMPLAIRE , cl primaire, NumroAuto, Entier long, Index sans doublon. Crez un champ ETAT_LIVRE , Numrique, Entier, Null interdit, non index. Le champ ETAT_LIVRE tant actif, cliquez dans le pav infrieur sur longlet Liste de choix.

Le modle relationnel, concevoir une base de donnes 55

Exercices

Crez le champ ISBN_LIVRE , texte, 18 caractres, non index (cl trangre).

Dans Afcher le contrle , choisissez Zone de liste droulante . Dans Origine source , choisissez Liste Valeurs . Dans Contenu , insrez les valeurs suivantes, spares par des points-virgules 1;"Neuf ";2;"Bon tat";3;"Mdiocre";4;"A pilonner". La colonne lie est la 1 (par dfaut). Le nombre de colonnes est de 2. Dans En-tte colonne , choisissez Non . Dans Largeurs colonnes , insrez les valeurs suivantes, spares par des points-virgules 0;3 (prsentation des largeurs en centimtres : la premire colonne sera cache). Dans Lignes afches , indiquez 4 . Dans Limiter liste , choisissez Oui . Laissez les autres paramtres leur valeur par dfaut. Pour viter de crer une table supplmentaire dsignant ltat des livres, le champ ETAT_LIVRE a t paramtr pour montrer les quatre valeurs possibles et nautoriser que lune des quatre (la zone tant obligatoire). Il est important de comprendre que la table va effectivement stocker les valeurs numriques 1, 2, 3 ou 4 et non les textes Neuf , Mdiocre et autres. Il reviendra au dveloppeur dinterprter cette colonne numrique au moment de faire des requtes pour synthtiser, par exemple, ltat gnral de la bibliothque. Nhsitez pas tester, par la suite, les effets visuels de la saisie dune valeur dans ce champ. On pourrait, de la mme manire, faire appel des zones de liste droulante pour afcher le contenu dune table au moment de la saisie dune autre. Par exemple, la zone ID_ ADHERENT de la table EMPRUNT peut comporter une zone de liste droulante appelant la table ADHERENT : nous verrons plus loin dans la cration des formulaires cette facult de liaison. 3. Mise en place de lintgrit rfrentielle Ouvrez la fentre des relations. Ajoutez les tables ADHERENT , LIVRE , EXEMPLAIRE . Par un glisser-dplacer, liez les deux champs ID_ADHERENT prsents. De la mme manire, liez les deux champs ID_LIVRE . Liez enn les deux champs ID_EXEMPLAIRE an dobtenir le modle de la gure 2.14. Figure 2.14
Modle relationnel dune bibliothque de prt.

56

Access 2007 et VBA

Chapitre

EXERCICE 2
nonc

GRER

UN ORGANISME DE FORMATION

Vous devez concevoir le systme dinformation dun organisme de formation. Les clients de cette socit, spcialise dans la formation informatique, sont tous eux-mmes des socits commerciales qui envoient leurs salaris des formations. Lorganisme salarie (en CDD) des formateurs en free-lance pour assurer des sessions de formation portant sur divers sujets. Vous devez donc mettre en relation les notions de socit cliente, salari, formateur, cours, session de formation et salle de formation, puis crer les tables ncessaires. 1. Premire approche conceptuelle. Pour vous aider, nous vous indiquons le processus oprationnel : Relation client, salari, embauche. Relation salari, session, inscription. Relation session et formateur. Relation cours et session. Relation session et salle de formation. 2. Cration des tables de la base.

* Solution

1. La relation tablie ici recouvre une approche puriste du modle relationnel. Dans bien des systmes dinformation, on considrera que les cas de multi-employeurs ou de salaris quon retrouve dans plusieurs entreprises clientes est trop marginal pour mriter une table intermdiaire EMBAUCHE . En effet, lintroduction de cette table alourdit singulirement les procdures dinscription dun nouveau salari une nouvelle session de formation. Dans bien des cas, les concepteurs prfreront les solutions dans lesquelles un mme salari est entr plusieurs fois dans la base de donnes au titre de plusieurs employeurs.

Le modle relationnel, concevoir une base de donnes 57

Exercices

1. Conception du systme Les donnes sur le client et ses salaris conduisent la relation : Un client a un ou plusieurs salaris ; Un salari a un ou plusieurs employeurs (simultanment ou successivement). On peut en effet imaginer que le salari est temps partiel chez plusieurs employeurs ou change demploi 1. Cette afrmation sera dveloppe en : un client procde 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 simultanment). Le salari et la session de formation sont lis par la relation : un salari participe une ou plusieurs sessions ; une session runit plusieurs salaris. Quon dveloppera 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.

La table intermdiaire INSCRIPTION servira, par exemple, tablir la base des listes dmargement de la formation. La session se conjugue avec le formateur de la manire suivante : une session est assure par un et un seul formateur ; un formateur assure une ou plusieurs formations. Il ny a donc pas lieu de dvelopper cet aspect. On notera toutefois que, dans cette organisation, la session ne peut tre assure que par un seul formateur : on exclut par l une session o plusieurs intervenants sont ncessaires. Le cours (la matire enseigne) sassocie 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 reoit plusieurs sessions (dans le temps). Ici encore, nous excluons le cas o une session de plusieurs jours pourrait avoir lieu dans plusieurs salles. Le dessin global (et rduit ses seules cls du modle relationnel) sera celui de la gure 2.15. Figure 2.15
Premire approche du modle relationnel dun organisme de formation.

2. Cration des tables Crez la table CLIENT avec les champs suivants : ID_CLIENT, cl primaire, NumroAuto, Entier long, Index sans doublons. RAISON_SOCIALE_CLIENT, Texte, 50 caractres, Null interdit, Index avec doublons. ADRESSE1_CLIENT, Texte, 100 caractres, Null interdit, non index. ADRESSE2_CLIENT, Texte, 100 caractres, Null autoris, non index.

58

Access 2007 et VBA

Chapitre

CP_CLIENT, Texte, 5 caractres, Null interdit, non index. VILLE_CLIENT, Texte, 50 caractres, Null interdit, non index. Crez la table SALARIE avec les champs suivants : ID_SALARIE, cl primaire, NumroAuto, Entier long, Index sans doublons. NOM_SALARIE, Texte, 50 caractres, Null interdit, Index avec doublons. PRENOM_SALARIE, Texte, 50 caractres, Null interdit, Non index. Notez quil nest pas utile, moins dune demande formelle du commanditaire de lapplication, dinsrer les coordonnes du salari : lorganisme de formation na pas crire, par exemple, au salari. Tous les rapports avec les stagiaires seffectuent via le client. Crez la table EMBAUCHE avec les champs suivants : ID_EMBAUCHE, cl primaire, NumroAuto, Entier long, Index sans doublons. ID_CLIENT, (cl trangre de la table CLIENT), Numrique, Entier long, Null interdit, Non index. ID_SALARIE, (cl trangre de la table SALARIE), Numrique, Entier long, Null interdit, Non index. DATEDEBUT_EMBAUCHE, Date, Format Abrg, Null interdit, Non index. DATEFIN_EMBAUCHE, Date, Format Abrg, Null autoris, Non index. Crez la table INSCRIPTION avec les champs suivants : ID_INSCRIPTION, cl primaire, NumroAuto, Entier long, Index sans doublons. ID_SESSION, (cl trangre de la table SESSION), Numrique, Entier long, Null interdit, Non index. ID_SALARIE, (cl trangre de la table SALARIE), Numrique, Entier long, Null interdit, Non index. Crez la table FORMATEUR avec les champs suivants : ID_FORMATEUR, cl primaire, NumroAuto, Entier long, Index sans doublons. NOM_FORMATEUR, Texte, 50 caractres, Null interdit, Index avec doublons. ADRESSE1_FORMATEUR, Texte, 100 caractres, Null interdit, non index. ADRESSE2_FORMATEUR, Texte, 100 caractres, Null autoris, non index. CP_FORMATEUR, Texte, 5 caractres, Null interdit, non index. VILLE_FORMATEUR, Texte, 50 caractres, Null interdit, non index. Crez la table SALLE avec les champs suivants : ID_SALLE, cl primaire, NumroAuto, Entier long, Index sans doublons. ETAGE_SALLE, Numrique, Entier, Null interdit, non index. NUMERO_SALLE, Numrique, Entier, Null interdit, non index. Crez la table COURS avec les champs suivants :

ID_SESSION, cl primaire, NumroAuto, Entier long, Index sans doublons.

Le modle relationnel, concevoir une base de donnes 59

Exercices

ID_COURS, cl primaire, NumroAuto, Entier long, Index sans doublons. NOM_COURS, Texte, 50 caractres, Null interdit, non index. DUREE_COURS, Numrique, Entier, Null interdit, non index. Crez la table SESSION avec les champs suivants :

ID_COURS, (cl trangre de la table COURS), Numrique, Entier long, Null interdit, Non index. ID_SALLE, (cl trangre de la table SALLE), Numrique, Entier long, Null interdit, Non index. ID_FORMATEUR, (cl trangre de la table FORMATEUR), Numrique, Entier long, Null interdit, Non index.

EXERCICE 3
nonc

CRER

LA BASE DE DONNES DU SYSTME TLPAGE

Imaginez que vous tes le responsable informatique du systme tlpage. Les grands principes : un groupement dintrt conomique nomm Tlpage runit toutes les socits dautoroute franaises (Sanef, APRR, Escota, etc.). Chaque socit dautoroute possde des pages. Les particuliers ou les entreprises peuvent louer un ou plusieurs badges coller sur le pare-brise du vhicule (mais le badge nest pas ncessairement associ un vhicule prcis). Le passage un page est automatiquement dtect, lentre comme la sortie, de sorte que les voyages sont facturs en n de mois et en bloc pour tous les passages dun badge. Vous devez concevoir le systme dinformation de Tlpage, en vous limitant aux tables essentielles du modle. 1. Commencez par mettre sur papier vos premires approches conceptuelles. 2. Crez les tables ncessaires et les contraintes dintgrit rfrentielle.

* Solution

Bien que relativement simple, le modle relationnel du systme tlpage demande un niveau dabstraction assez lev et recle quelques piges si ses lments fondamentaux ne sont pas bien dissocis. 1. Conception du systme En premier lieu, la notion de page doit tre prcise : par page, on entend, non pas un groupement de passages, tous abrits par une grande arche, mais un couloir de page par lequel ne peut passer quun seul vhicule en mme temps. Cette distinction revt la plus haute importance pour arriver bien conjuguer les relations mettre en place, en particulier considrant le facteur temps. La notion de page comporte donc les caractristiques suivantes : un numro dordre ; un nom gnrique (Chartres nord, Chartres centre, Chartres sud par exemple) ; un n de couloir dans la station de page. Cette seule numration nous conduit penser quil serait judicieux de crer deux tables, lune pour les stations, lautre 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 sagit l dune relation de un--plusieurs ne ncessitant pas de dveloppements supplmentaires.

60

Access 2007 et VBA

Chapitre

La prsence de deux types de clients, les particuliers et les entreprises, pourrait induire en erreur et pousser le concepteur crer deux tables distinctes. Cette dissociation nest pas ncessaire et compliquerait beaucoup le modle pour un faible avantage. La seule problmatique de la fusion des deux types de clientle concernera les zones obligatoires de la che client, diffrentes pour les uns et les autres. Dans les deux cas, particulier ou entreprise, un client peut louer un ou plusieurs badges (un particulier peut trs bien louer 3 badges, pour lui-mme et ses deux enfants). Le badge apparat donc comme un lment indispensable du modle : ce nest pas le client qui passe le page, mais son badge, ce qui est trs diffrent (le locataire peut trs bien prter son badge un ami). La relation mettre en place pourrait donc se conjuguer ainsi : un client possde un ou plusieurs badges ; un badge appartient un et un seul client. Mais cette dernire afrmation est-elle exacte tous les instants ? Certainement non. Il est envisageable quun client rende son badge au systme tlpage, pour beaucoup de motifs valables, et que ce dernier soit mis en location auprs dun autre et nouveau client. En dautres termes, si le badge est considr comme une non-valeur et quil est jet aprs usage, alors lafrmation prcdente est juste ; dans le cas contraire (qui est le cas actuel), la relation doit sexprimer ainsi : un client possde un ou plusieurs badges ; un badge est lou par plusieurs clients (dans le temps). tant plurielle dans les deux sens, la relation doit se dvelopper selon le modle 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 page, elle, traduit la relation qui existe entre un badge et un couloir de page ; elle donne lieu lafrmation suivante : un badge passe par plusieurs couloirs de page (videmment pas au mme moment !) ; un couloir de page voit passer plusieurs badges (videmment pas ensemble, le couloir tant trop troit !) ; Laquelle doit tre dveloppe 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 modle. Assurment, il ne peut pas tre intgr directement dans la table des stations de page puisquil est fonction non pas dune seule station mais du degr de proximit avec une autre station. Il sagit donc bien dune relation rexive de la table STATION avec elle-mme.

Le modle relationnel, concevoir une base de donnes 61

Exercices

une station de dpart correspond un prix pour joindre une autre station darrive (il nest pas possible de faire demi-tour sur une autoroute !) ; une station darrive correspond un prix pour tre jointe une station de dpart. Cette afrmation laisse entendre que le modle permet dintgrer des prix diffrents pour laller et le retour depuis une station vers une autre. On peut galement ajouter une date de tarif qui permettra de grer dans le temps les augmentations inluctables. Pour terminer, les socits dautoroute doivent tre lies aux stations de page : une socit dautoroute possde une ou plusieurs stations ; une station est possde par un et un seul concessionnaire. Cette premire tape de rexion bnciera dun premier brouillon sur le papier, o lon se contentera de jeter les petits carrs des tables, les identiants et les cls trangres, et les relations. Le brouillon devrait donner un rsultat voisin de la gure 2.16. Figure 2.16
Premire approche du modle relationnel du systme tlpage.

Cest volontairement que ce modle ne reprsente pas les tables contenant, par exemple, les lments de la ralisation de la facturation. En revanche, toutes les informations sont en place pour raliser ladite facturation tant au prot des socits dautoroutes (qui peroivent, au nal, les droits de page) et les clients (qui paient leurs passages). La table PASSAGE , la plus sollicite de toutes, sera automatiquement incrmente par les systmes de barrires. Sa lecture mensuelle sera la base de la facturation. 2. Cration des tables Voici la liste des tables avec leurs diffrents champs. ID_CLIENT, Cl primaire, NumroAuto, Entier long. TYPE_CLIENT, Numrique, Entier, Obligatoire, non index, pourvu dune liste de choix en forme de zone de liste droulante et dont la liste des valeurs est 1 pour Entreprise et 2 pour Particulier (la liste doit tre limite ces deux seules valeurs, le format est 1;"Entreprise";2;"Particulier"). RAISON_SOCIALE_CLIENT, Texte, 50 caractres, Null autoris, non index. La zone ne peut pas tre obligatoire puisque certains clients sont des particuliers. Il faudra donc prvoir des contrles particuliers dans les formulaires de saisie pour vrier que lun

Table CLIENT :

62

Access 2007 et VBA

Chapitre

des deux champs NOM_CLIENT ou RAISON_SOCIALE_CLIENT est effectivement rempli. NOM_CLIENT, Texte, 50 caractres, Null autoris, non index 1. PRENOM_CLIENT, Texte, 50 caractres, Null autoris, non index. SIRET_CLIENT (SIRET signiant Service dInscription au Registre des tablissements et constituant lidentiant de toute socit commerciale). Le champ est de type Texte avec 15 caractres, le Null est autoris, mais la colonne est indexe sans doublon an de garantir labsence de double inscription dune entreprise. Le champ est dot dun masque de saisie dj existant, nomm NSiret . NO_INTRACOM_CLIENT : il sagit du n intracommunautaire, obligatoire pour la facturation des clients europens non franais. Comme le SIRET, la colonne est en Null autoris mais indexe sans doublon . Le masque de saisie nexistant pas, il faut le crer, il est de la forme CC 99 000 000 000 o CC dsigne le pays (FR, BE, IT, etc.), 99 est une cl et les 9 chiffres suivants les 9 premiers chiffres du numro de Siret (il faudra prvoir dans le formulaire de saisie un contrle pour vrier que les deux numros concordent, ce type de contrle ntant pas possible au niveau de la table elle-mme). Pour crer un nouveau masque de saisie : 1. Le curseur suprieur visant le champ NO_INTRACOM_CLIENT , cliquez sur la zone Masque de saisie et sur le bouton aux trois petits points de la marge de droite. 2. Cliquez sur Modier la liste. 3. Crez un nouvel enregistrement en cliquant sur le point jaune voisinant les boutons de dplacement. 4. Dans Description , indiquez NIntracommunautaire . 5. Dans Masque de saisie , saisissez la chane de caractres > CC 00 000 000 000 (le signe suprieur > oblige une saisie en majuscules, le CC indique quil sagit de caractres, les zros suivants obligent la saisie de chiffres, les espaces dcomposent logiquement la codication). 6. Dans lexemple, recopiez la chane de caractres CC 99 000 000 000 . 7. Fermez la fentre et choisissez le nouveau masque (testez-le en saisie pour vrier sa conformit). ADRESSE1_CLIENT, Texte, 100 caractres, Null interdit, non index. ADRESSE2_CLIENT, Texte, 100 caractres, Null autoris, non index. CP_CLIENT, Texte, 5 caractres, Null interdit, non index. VILLE_CLIENT, Texte, 50 caractres, Null interdit, non index. ID_STATION, Cl primaire, NumroAuto, Entier Long, Obligatoire, Index sans doublon. ID_STE_AUT, (cl trangre de la table STE_AUT ), Numrique, Entier long, Null interdit, non index. NOM_STATION, Texte, 50 caractres, Null interdit, non index.

Table STATION :

1. Un index avec doublon pourrait tre pos sur les deux champs RAISON_SOCIALE_CLIENT et NOM_CLIENT pour amliorer les recherches, mais cet index aurait a grer de nombreuses valeurs Null , ce qui le rendrait peu performant.

Le modle relationnel, concevoir une base de donnes 63

Exercices

Table PEAGE :

Table PASSAGE :

Table TARIF :

Table BADGE :

Table LOCATION :

Table STE_AUT :

Il ne faut videmment pas crer de table STATION_1 comme lindique le modle relationnel de la gure 2.15 : cette prsentation est ctive et Access grera automatiquement la relation rexive de la table STATION sur elle-mme. ID_PEAGE, Cl primaire, NumroAuto, Null interdit, Index sans doublon. ID_STATION, (cl trangre de la table STATION ), Numrique, Entier long, Null interdit, non index. NO_PEAGE, Numrique, Entier, Null interdit, non index (pour indiquer le numro du couloir dans la station de pages). ID_PASSAGE, Cl primaire, NumroAuto, Null interdit, Index sans doublon. ID_PEAGE, (cl trangre de la table PEAGE), Numrique, Entier long, Null interdit, non index. ID_BADGE, (cl trangre de la table BADGE), Numrique, Entier long, Null interdit, non index. DATE_PASSAGE, Date, Null interdit, non index. Il est trs important, ici que le format de la date soit de type Gnral, indiquant aussi lheure exacte de passage. ID_TARIF, Cl primaire, NumroAuto, Null interdit, Index sans doublon. ID_STATION1, (premire cl trangre de la table STATION ), Numrique, Entier long, Null interdit, non index. Par convention, on considrera quil sagit du page de dpart. ID_STATION2, (deuxime cl trangre de la table STATION ), Numrique, Entier long, Null interdit, non index. Par convention, on considrera quil sagit du page darrive. PRIX_TARIF, Numrique, Rel Double, Null interdit, Non index. DATE_TARIF, Date au format Gnral, Null interdit, Non index. ID_BADGE, Cl primaire, NumroAuto, Null interdit, Index sans doublons. CODEBARRE_BADGE, Texte, 13 caractres, Null interdit, Index sans doublon. ID_LOCATION, Cl primaire, NumroAuto, Null interdit, Index sans doublons. ID_BADGE, (cl trangre de la table BADGE), Numrique, Entier long, Null interdit, Non index. ID_CLIENT, (cl trangre de la table CLIENT), Numrique, Entier long, Null interdit, Non index. DATEDEBUT_LOCATION, Date au format abrg, Null interdit, Non index. DATEFIN_LOCATION, Date au format abrg, Null autoris, Non index. La table STE_AUT sera en tous points identique celle des clients. Il est nanmoins dangereux de pratiquer la cration de cette table en effectuant un copier/coller de la table des clients. Les noms de champs, en particulier, doivent tous tre sufxs _STE_AUT et non plus _CLIENT . Vous terminerez lexercice en mettant en place toutes les relations grce au bouton Relations des Outils de base de donnes . Noubliez pas de cocher loption dintgrit rfrentielle ; la mise jour ou la suppression en cascade ne sont pas indispensables.

64

Access 2007 et VBA

Chapitre

Les diffrentes formes dacquisition de donnes, importer et attacher


1. Les importations de donnes..... 66 2. Les liaisons de donnes ............ 71 Problmes et exercices 1. Importer des donnes au format Excel ....................... 75 2. Importer des donnes au format CSV ........................ 77 3. Importer des donnes dune autre base Access........... 79 4. tablir les contraintes rfrentielles............................ 80

Il existe de multiples manires dacqurir des donnes dans Access. On peut les importer compltement dans une base dj existante, mais, au-del de cette premire approche, on peut attacher des sources de donnes une base sans avoir les manipuler dans Access. Ces donnes acquises, le logiciel offre un puissant assistant pour crer des requtes propres interroger la masse dinformations et raliser aisment de lourds traitements. Le mme outil peut servir insrer de nouvelles donnes, les modifier ou les supprimer.

65

(1)

Les importations de donnes


Par importation, on entend laddition de nouvelles donnes dans une base existante, qui deviennent ds lors totalement indpendantes de la source depuis laquelle elles ont t puises. Pour les exposs venir, il est ncessaire de rcuprer sur le site de lditeur, ladresse www.pearsoneducation.fr, les chiers Codes_Postaux_France.xlsx (Excel), Codes_Postaux_France.accdb (Access), Codes_Postaux_France_Sparateurs.txt (format texte dlimit) et Codes_Postaux_France_Fixe.txt (format texte xe).

1.1 LE

SIMPLE COPIER-COLLER Dans la mesure o les produits Microsoft sont intgrs les uns aux autres, la manire la plus aise de rcuprer des donnes dans Access consiste simplement les copier et les coller, mais avec une option spcique. 1. Crez une nouvelle base de donnes nomme MesContacts et range dans vos documents favoris. 2. Crez une table nomme CP , dote de deux colonnes nommes CODE et VILLE , toutes deux de type texte de 255 caractres de long (valeur par dfaut). Supprimez toute cl primaire cre par dfaut de sorte que la table ne comporte que deux colonnes. 3. Ouvrez la table CP en mode Feuille de donnes en double-cliquant sur le nom de la table. 4. Ouvrez le chier Codes_Postaux_France.xlsx . 5. Mettez en surbrillance la totalit des deux colonnes A et B. 6. Appuyez sur Ctrl + C (copier). 7. Sans ncessairement 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 licne Coller. 9. Cliquez sur Coller par ajout . Access afche un message dinsertion identique celui de la gure 3.1. Cette manipulation appelle quelques commentaires : Lemploi du simple coller (Ctrl+V) aurait gnr un message derreur : si Access cherche coller lensemble des 8 004 enregistrements dans un seul champ, il ny parviendra videmment pas ( texte trop long pour tre modi dit le message erreur). Cest donc bien un Coller par ajout quil faut utiliser.

66

Access 2007 et VBA

Chapitre

Figure 3.1
Ajout des codes postaux dans la table CP.

Access cherchera coller les donnes dans la mesure du possible : les deux colonnes qui rceptionnent les donnes sont au format texte et dune trs grande largeur, le collage sera donc effectif. Mais en supposant que la colonne Ville soit initialement au format numrique, limportation ne se fera pas, car les donnes ne sont pas conformes. Access proposera de crer une table des erreurs dimportations qui contiendra tous les enregistrements en erreur. Le collage tant ralis, on remarque que la premire ligne, qui contenait dans Excel les libells de colonne na pas t colle, alors quelle aurait pu tre importe, puisque les colonnes destinataires ont un format texte conforme. Le copier/coller par ajout sera toujours possible, quil sagisse dune feuille Excel, dun tableau dans Word, dun chier texte ou de toute autre source, condition que les formats source et destination soient compatibles.

1.2 LIMPORTATEUR EXCEL


Access dispose doutils destins importer ou lier des donnes externes. Dans le menu Donnes externes , cliquez sur licne Excel du ruban.

Les diffrentes formes dacquisition de donnes, importer et attacher 67

Le programme ouvre une fentre de dialogue prsente la gure 3.2. Figure 3.2
Ajout des codes postaux dans la table CP.

Cette grille-cran propose : Soit dimporter les donnes dans une nouvelle table. Soit dimporter les donnes dans une table existante (cest lquivalent exact du copier/ coller par ajout du paragraphe prcdent). Soit dtablir un lien, comme on le verra plus loin. Dans un premier temps, nous importerons les donnes dans une nouvelle table : 1. Cliquez sur le bouton Parcourir , choisissez le chemin et le nom du chier importer (Codes_Postaux_France.xlsx), puis cliquez sur OK . 2. Lassistant dimportation ouvre une fentre de premire tape permettant de choisir la feuille o se trouvent les donnes importer. Le nom de longlet deviendra le nom de la table (quil sera toujours possible de renommer ultrieurement). Cliquez sur Suivant . 3. La deuxime tape demande lutilisateur si len-tte des colonnes est indiqu sur la premire ligne Excel : cochez la case puisque cest effectivement le cas, puis cliquez sur Suivant . 4. La troisime tape ouvre la fentre prsente la gure 3.3. Les en-ttes de colonnes du chier Excel ayant t reconnus, ils sont incorpors aux noms de champ (sils nexistaient pas, il serait alors possible de les indiquer dans la zone suprieure gauche). Le type de donnes est reconnu daprs les caractristiques Excel, mais il peut tre modi.

68

Access 2007 et VBA

Chapitre

Access adapte le mieux possible le niveau dindex. Toutefois, il ne lit pas la totalit de la colonne et propose un niveau moyen : ici, lindex sans doublon peut tre choisi puisquil ny a pas de doublon. La case infrieure droite permet de ne pas importer des colonnes exclues. Figure 3.3
tape 3 dune importation Excel.

Ltape suivante concerne la cl primaire de la table ; par dfaut, Access propose dajouter une colonne qui servira de cl primaire incrmentation automatique. Dans le cas prsent, la colonne CODE nayant pas de doublon peut trs bien constituer une cl primaire. Il est possible ensuite de renommer longlet Excel par un nom de table non existant dans la base importatrice : nommez la table CODE_POSTAL . ce stade, tous les paramtres de limportation sont en place et il serait possible de cliquer sur Terminer ; toutefois Access permet denregistrer ces paramtres pour reproduire la mme opration ultrieurement. Il sufra alors de cliquer dans le ruban du menu Donnes externes sur licne Importations enregistres pour excuter le mme type dimportation de nouvelles fois.

1.3 LIMPORTATEUR

DE FICHIER TEXTE

Comme Excel, Access peut importer tous types de chier texte : chier structure dlimite, dans lequel chaque champ est spar par un caractre particulier, le point-virgule, la virgule ou tout autre ; chier structure de longueur xe, dans lequel chaque champ a une position et une longueur de caractres prdnies.

Les diffrentes formes dacquisition de donnes, importer et attacher 69

Les chiers texte dlimit


Dans le ruban du menu Donnes externes , cliquez sur licne Fichier texte ; le choix du chier Codes_postaux_France_Sparateurs.txt , tlcharg depuis le site de lditeur, ladresse www.pearsoneducation.fr, provoque louverture de la fentre prsente la gure 3.4. Figure 3.4
tape 1 dune importation de chier texte dlimit.

Dans le pav infrieur, la lecture du texte permet de bien identier la nature du chier et la dnition du sparateur, ici le point-virgule. Ltape qui suit validera le choix du sparateur et la prsence des en-ttes de colonnes. Toutes les tapes suivantes sont identiques celles qui ont t dcrites dans la section 1.2 des importations depuis Excel.

Les chiers texte de longueur xe


Les procdures dimportation dun chier texte de longueur xe ne varient pas des autres ceci prs que le positionnement des champs sera dtermin par un trac denregistrement fourni par le concepteur du chier source. La dtermination des largeurs de champ est ralise grce lutilisation dune rglette visible lors de la deuxime tape. Il est vivement recommand dutiliser le bouton Avanc de cette tape et de mmoriser les paramtres dimportation. Cette phase tant dlicate et longue mettre en uvre, il est

70

Access 2007 et VBA

Chapitre

plus prudent de lintgrer limportation elle-mme suivant la dmarche montre la gure 3.5. Figure 3.5
tape 2 dune importation de chier texte de longueur xe et mmorisation des paramtres.

(2)

Les liaisons de donnes


Contrairement aux importations, qui intgrent dnitivement les donnes dans la base active et doivent tre reproduites chaque mise jour du chier source, les liaisons de donnes permettent une mise jour permanente du rsultat afch dans Access. En revanche, sauf en cas de connexion ODBC (Open DataBase Connectivity) ou de liaison avec une autre base de donnes, toute modication dans la base active des donnes source est impossible : les donnes attaches Access sont en lecture seule. Les liaisons avec Excel, une autre table Access ou un chier texte se mettent en place de la mme manire que pour une importation, la diffrence prs que loption Importer les donnes est remplace par loption Lier la source de donnes en crant une table attache . Pour ce nouveau cas de gure, procdez aux oprations suivantes : 1. Dans le ruban du menu Donnes Externes , cliquez sur licne Access. 2. Pointez le chier Codes_Postaux_France.accdb et cochez loption Lier la source de donnes .

Les diffrentes formes dacquisition de donnes, importer et attacher 71

3. Access propose la liste des tables contenues dans la base cible, comme la gure 3.6. Figure 3.6
Choix des tables lier la base active.

4. Cliquez sur le bouton Slectionner tout puis sur OK : toutes les tables sont attaches. Il est frquent de lier une base Access une base Microsoft SQL Server (ou une autre base : Oracle, DB2, MySQL, etc.) ; cette liaison ncessite une procdure particulire : 1. Dans le ruban du menu Donnes externes , cliquez sur licne Plus dans le pav Importer . 2. Cliquez sur Bases de donnes ODBC . 3. Cliquez sur Lier la source de donnes en crant une table attache puis sur OK . 4. Vous devez crer un chier .dsn qui contiendra vos paramtres de connexion : cliquez sur nouveau . 5. Slectionnez le pilote correspondant la base laquelle vous voulez vous connecter (Oracle, SQL Server). 6. Cliquez sur Parcourir pour prciser le chemin et le nom du chier .dsn crer. 7. Donnez un nom votre chier puis cliquez sur Suivant pour voir la grille-cran que montre la gure 3.7. Figure 3.7
Paramtrage de la connexion ODBC.

72

Access 2007 et VBA

Chapitre

Contrairement aux liens avec Access, laccs la base de donnes via ODBC est conditionn par la mise au point des moyens daccs cette base : le paramtrage reprsent la gure 3.8 est donc primordial. Figure 3.8
Paramtrage du login la base de donnes.

Deux cas de gure peuvent se prsenter : Soit des procdures de single sign-on ont t mises en place dans lentreprise : celles-ci permettent de coupler lidentication et lauthentication la base de donnes avec lidentication au niveau du login rseau Windows ; la connexion est immdiate si lutilisateur est dj reconnu sur le rseau. Soit les paramtres de login/mot de passe sont spciques la base cible. Dans ce cas, ladministrateur de la base de donnes doit imprativement vous communiquer ces coordonnes. Suivant le type de base sur laquelle se fait la liaison, deux grilles-cran proposent ventuellement de peauner la connexion ; il sagit surtout des connexions avec SQL Server. lissue de ces oprations, le serveur SQL (ou toute autre base) liste toutes les tables accessibles, limage de celles prsentes la gure 3.9. Figure 3.9
Tables, vues et autres objets disponibles sous SQL Server.

Les diffrentes formes dacquisition de donnes, importer et attacher 73

La mise en place de ce type de liaison ouvre la porte des dveloppements consquents dans lesquels les tables, vues et autres objets sont stocks dans une grosse base de donnes centrale grant avec prcision et scurit les accs aux informations (contrairement Access). Au total, les diffrents types de liens sont reprsents la gure 3.10, chacun avec son logo particulier. Pendant que la simple table afche le logo classique dj tudi, chaque liaison se signale par la prsence dune petite che et un dessin particulier. Figure 3.10
Logos des liaisons.

Pour retrouver lemplacement des chiers source (sauf connexion ODBC), cliquez du bouton droit sur la table attache puis slectionnez le Gestionnaire de tables lies . Cette option permet galement de mettre jour les liaisons.

Rsum
Access dispose de tous les outils ncessaires pour importer des donnes de toute provenance, chiers Excel, tables dun autre chier Access, chiers texte dlimits ou chiers texte de largeur xe. Les paramtres dimportation peuvent tre mmoriss et permettre ainsi la reproduction de ces importations. Toutes les caractristiques de limportation sont applicables de la mme manire pour crer des attaches avec les mmes objets sources. Contrairement aux importations, les attaches offrent une mise jour constante des donnes de destination dans Access. Les bases Access se connectent via ODBC (Open Date Base Connectivity) des bases de donnes dentreprise telles quOracle, MS-SQL Server, MySQL ou autres.

74

Access 2007 et VBA

Chapitre

Problmes et exercices
Les exercices de ce chapitre visent importer de diverses manires des donnes externes pour mettre en place une base de donnes qui servira pour tous les travaux ultrieurs. Aprs les importations effectues dans les exercices ci-aprs, ceux des chapitres suivants exploiteront les donnes charges via de nombreuses requtes.

EXERCICE 1
nonc

IMPORTER

DES DONNES AU FORMAT

EXCEL

1. Tlchargez le chier ELEVE.xlsx sur le site de lditeur, ladresse www.pearsoneducation.fr, puis importez-le dans une nouvelle base nomme ECOLE_INTERNATIONALE.accdb . 2. Aprs importation, mettez au point tous les champs pour une utilisation optimale des donnes.

* Solution

1. Importation du chier Le chier ELEVE.xlsx est un chier au format Excel 2007. Son importation ncessite la cration pralable de la future base de donnes. 1. Dmarrez Access. 2. Cliquez sur le bouton Base de donnes vide . 3. En bas droite, prcisez le chemin de cration de cette base en cliquant sur licne de dossier Windows. 4. En bas droite, nommez la nouvelle base ECOLE_INTERNATIONALE.accdb . 5. Cliquez sur le bouton Crer . 6. Pour plus de clart, fermez la table qui a t cre automatiquement. 7. Dans le ruban du menu Donnes externes , cliquez sur Excel. 8. Dans la fentre qui sest ouverte, pointez le chier ELEVE.xlsx . 9. Vriez que le bouton, en dessous, concerne bien une importation et non une attache puis validez par OK . 10. Cliquez sur Suivant la premire tape dimportation (il ny a quune seule feuille dans le chier Excel, nomme elle aussi ELEVE ). 11. la deuxime tape, cochez la case Premire ligne contient les en-ttes de colonne , puis Suivant . 12. Lorsque tous les paramtres de la troisime tape sont corrects (vriez-les colonne par colonne !), cliquez sur Suivant . 13. la quatrime tape, cochez loption Choisir ma propre cl primaire et laissez la colonne ID_ELEVE propose ; cliquez sur Suivant . 14. la cinquime tape, laissez le nom ELEVE pour la future table, ne cochez pas loption Je souhaite que lassistant (nous ferons nous-mmes lanalyse propose).

Les diffrentes formes dacquisition de donnes, importer et attacher 75

Exercices

15. Ne cochez pas loption de mmorisation de cette importation (elle ne se reproduira pas). 2. Paramtrage de la table La table est importe. Analysons ses caractristiques : 1. Cliquez du bouton droit sur la table ELEVE et slectionnez Mode cration . 2. Le champ ID_ELEVE a t cr de type Numrique avec une taille Rel Double : cette prsentation peut tre gnante par la suite pour les relations entre les tables. Positionnez la taille de ce champ Entier Long (on remarquera quil nest plus possible de modier le type et de le faire passer en NumroAuto ). 3. Mettez une lgende correcte et comprhensible au champ ID_ELEVE comme N de llve par exemple. 4. La proprit Null Interdit du champ ID_ELEVE est positionne Non , ce qui parat tonnant puisque la colonne est une colonne primaire. Vous pouvez modier cette proprit en Oui , mais il ny aura pas dincidence sur la table. 5. Cliquez immdiatement sur la petite disquette denregistrement dans la barre suprieure de lcran, Access avertit que certaines donnes peuvent tre perdues. Cela provient du fait que la colonne ID_ELEVE est passe de Rel Double Entier Long ; aucune donne ne sera altre puisque le plus grand ID porte le n 26 : cliquez sur Oui . 6. Le champ NOM_ELEVE est positionn 255 caractres (valeur par dfaut), rduisez-le 50. 7. Le champ NOM_ELEVE na pas de lgende : indiquez simplement Nom . 8. Le champ NOM_ELEVE nest pas obligatoire : modiez cette option en mettant la proprit Null interdit Oui et la proprit Chane vide autorise Non . 9. Les champs PRENOM_ELEVE et ADRESSE1_ELEVE seront modis de la mme manire que le nom. 10. Le champ ADRESSE2 peut tre vide ( Null interdit Oui ). 11. Le code postal est rduit 5 caractres, obligatoire. 12. La ville est rduite 50 caractres, obligatoire. 13. Le pays est rduit 5 caractres, obligatoire. 14. Le numro de tlphone est rduit 10 caractres (effectivement en type Texte), obligatoire. 15. Le format Date/heure du champ DATENAISSANCE_ELEVE est correct, mais doit devenir obligatoire. 16. Le champ SEXE_ELEVE peut tre rduit un caractre et dot dune liste de choix : cliquez sur longlet correspondant. Choisissez Zone de liste droulante pour la zone Afcher le contrle , Liste valeurs pour la zone Origine source , M;Masculin;F;Fminin 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 davertissement.

76

Access 2007 et VBA

Chapitre

EXERCICE 2
nonc

IMPORTER

DES DONNES AU FORMAT

CSV

1. Tlchargez le chier NOTE.csv et importez-le dans la base ECOLE_INTERNATIONALE.accdb . 2. Aprs importation, mettez au point tous les champs pour une utilisation optimale des donnes.

* Solution

1. Importation Le chier NOTE.csv est un chier texte, et plus prcisment un chier dlimit sparateur point-virgule (csv tant labrviation de Coma Separated Values). Il est possible douvrir directement ce chier avec Excel, mais pour bien en comprendre la structure, il est prfrable de louvrir avec un simple diteur de texte : 1. Cliquez sur le bouton Ofce en bas dcran. 2. Cliquez sur Tous les programmes > Accessoires > Bloc-Notes : la fentre de lditeur NotePad souvre. 3. Cliquez sur Fichier > Ouvrir . 4. Dans la fentre douverture de chier, cliquez sur le type Tous les chiers et pointez le chier NOTE.csv rcupr. Ce chier apparat tel qu la gure 3.11.

Figure 3.11
Fichier CSV lu sous NotePad.

Les diffrentes formes dacquisition de donnes, importer et attacher 77

Exercices

Chaque ligne comprend 4 champs spars chacun par des points-virgules : Le premier champ est le numro (lID) de llve. Le deuxime champ est le numro de la matire enseigne. Le troisime champ est la note de llve. Le dernier champ est la date dattribution de la note. Fermez le chier pour pouvoir limporter : 1. Ouvrez nouveau, si ncessaire, la base de donnes ECOLE_INTERNATIONALE.accdb . 2. Dans le menu Donnes externes , cliquez sur Fichier texte . 3. Dans la fentre dimportation, pointez le chier NOTE.csv et cliquez sur Ouvrir . 4. Optez pour une importation et non pas une attache ou lajout une table existante. 5. La premire tape de limportation dtecte juste titre un chier dlimit, cliquez sur Suivant . 6. La deuxime tape dtecte juste titre le point-virgule comme sparateur. 7. La troisime tape ne reconnat pas de noms de champ puisque, par dnition, il nen existe pas : Le champ1 doit tre renomm ID_ELEVE , le type de donnes et lindex sont corrects. Cliquez dans le corps des donnes prsentes et dans la deuxime colonne : le champ2 doit tre renomm ID_MATIERE , le type de donnes et lindex sont corrects. Le champ3 doit tre renomm NOTATION , le type de donnes doit tre modi en rel simple (les notes ne sont pas toujours des valeurs entires, mme si, ici, il nexiste que des notes arrondies lunit). Le champ4 doit tre renomm DATE_NOTE , le type de donnes Date/heure est correct. 8. Cliquez sur Suivant . 9. Dans ltape suivante, laissez Access ajouter une cl primaire, puis cliquez sur Suivant . 10. la dernire tape, nommez la table NOTE (valeur reprise par dfaut). 11. Nenregistrez pas les tapes dimportation. La table importe doit avoir lapparence de la gure 3.12.

78

Access 2007 et VBA

Chapitre

Figure 3.12
Table NOTE immdiatement aprs importation.

2. Rvision des caractristiques de la table La cl primaire insre par Access porte le nom ID par dfaut : renommez-la ID_ NOTE . Dclarez tous les champs en Null interdit . Insrez des lgendes tous les champs. Au moment de la fermeture de la table en mode modication, Access avertit que les rgles dintgrit ont t modies (les champs ont t dclars en Null interdit). Il propose de tester les donnes existantes avec les nouvelles rgles : rpondez par Oui , puisque les nouvelles rgles sont conformes.

EXERCICE 3
nonc

IMPORTER

DES DONNES DUNE AUTRE BASE

ACCESS

Tlchargez le chier MATIERE.accdb et importez la table de cette base nomme MATIERE dans la base ECOLE_INTERNATIONALE.accdb . Aprs importation, mettez au point tous les champs pour une utilisation optimale des donnes.

* Solution

La base ECOLE_INTERNATIONALE tant ouverte, procdez de la manire suivante : 1. Dans le menu Donnes externes , cliquez sur le bouton Access du ruban. 2. Dans la fentre dimportation, pointez le chier MATIERE.accdb puis Suivant .

Les diffrentes formes dacquisition de donnes, importer et attacher 79

Exercices

3. Slectionnez la table MATIERE (la seule), de la base et cliquez OK . 4. Ne mmorisez pas les paramtres. Vous devez vrier tous les paramtres, mais les caractristiques de la table sont conformes aux normes qui ont t exposes auparavant.

EXERCICE 4
nonc

TABLIR

LES CONTRAINTES RFRENTIELLES

partir des trois tables qui ont t intgres la base ECOLE_INTERNATIONALE , mettez en place toutes les contraintes dintgrit rfrentielles possibles. Sachant que trois matires (ANGLAIS, ALLEMAND, ITALIEN) doivent tre considres comme un ensemble nomm LANGUES VIVANTES, mettez en place la solution relationnelle.

* Solution

La premire partie du problme met en application les principes tudis au chapitre 2. 1. Dans le ruban du menu Outils de base de donnes , cliquez sur le bouton Relations . 2. Ajoutez les trois tables en prsence. 3. Liez, avec intgrit rfrentielle, les cls primaires avec leur cl trangre de sorte dobtenir le modle relationnel de la gure 3.13.

Figure 3.13
Premier modle relationnel de la base ECOLE_ INTERNATIONALE.

Le regroupement des diffrentes langues en une seule matire Langues Vivantes oblige la cration dune table GROUPE destine lister tous les groupes de matires : dune part, les matires non regroupes et, dautre part, les langues vivantes. En gnralisant, on peut imaginer que chaque matire peut tre dgroupe en plusieurs ; par exemple, lhistoire-gographie pourrait tre scinde en histoire, dune part, et gographie, dautre part. Il faut donc crer une table GROUPE , mais aussi une table REGROUPEMENT pour mettre en place une sorte de tableau dquivalence. 1. Vous devez crer une nouvelle table nomme GROUPE , pour cela : 2. Dans le ruban du menu Crer , cliquez sur Table .

80

Access 2007 et VBA

Chapitre

3. Cliquez immdiatement sur le bouton du Mode modication : Access demande le nom de la nouvelle table GROUPE . 4. La cl primaire sera nomme ID_GROUPE . 5. Crez un champ NOM_GROUPE , type Texte, 50 caractres, obligatoire, non index. Oprez de mme avec la table REGROUPEMENT , dote des champs suivants : ID_REGROUPEMENT, cl primaire, NumroAuto, Index sans doublon. ID GROUPE (cl trangre), Numrique, Entier long, obligatoire, non index. ID_MATIERE (cl trangre), Numrique, Entier long, obligatoire, non index. tablissez les relations avec ces nouvelles tables : 1. Ouvrez nouveau, le cas chant, la fentre des relations. 2. Cliquez sur le bouton du ruban Afcher la table . 3. Ajoutez les tables GROUPE et REGROUPEMENT . 4. tablissez les contraintes rfrentielles de sorte dobtenir le modle relationnel de la gure 3.14. Figure 3.14
Second modle relationnel de la base ECOLE_ INTERNATIONALE.

Il reste remplir les tables GROUPE et REGROUPEMENT pour obtenir les rsultats de la gure 3.15. Conservez ces travaux, qui resserviront dans les chapitres suivants.

Les diffrentes formes dacquisition de donnes, importer et attacher 81

Exercices

Chapitre

Les requtes

1. Les requtes Slection .............. 84 2. Les requtes Insertion, Suppression et Mise jour ....... 95 3. Les requtes cration.............. 100 Problmes et exercices
1. 2. 3. 4. 5. 6. Affichage par ordre alphabtique .. 103 Affichage sur critre de prnom ..... 104 Affichage sur critre excluant un pays 104 Affichage sur critres multiples ....... 105 Affichage sur critre de date .......... 105 Affichage sur critres de date et de pays .......................................... 7. Affichage avec valeurs distinctes .... 107 8. Affichage des premiers lments .... 107 9. Affichage avec regroupement par pays et comptage.................... 108 10. Affichage avec jointure.................. 108 11. Affichage avec jointure et regroupement............................ 109 12. Appel de requtes multiples ........... 110 13. Affichage de la moyenne gnrale . 111 14. Affichage de la moyenne par matire......................................... 112 15. Tableau crois dynamique ............. 113 16. Tableau crois avec regroupement . 114 17. Regroupement et coefficient ........... 115 18. Requte Ajout ............................... 118 19. Requte Suppression ..................... 120 20. Requte Mise jour ...................... 121

Cest par excs de langage quAccess nomme Requte loutil qui permet de rdiger et stocker une requte SQL. Une requte est une interrogation dune ou plusieurs tables ; linterrogation utilise un langage gnrique nomm SQL pour Structured Query Language (langage de requte structure). Outre la lecture des donnes suivant une grande varit de tris et de ltres (cest la commande SELECT de SQL), les requtes permettent lcriture de donnes par ajout, modication 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 , tlchargeable sur le site de lditeur, ladresse www.pearsoneducation.fr. Par la suite, la table ADRESSE , dans le mme fichier Access, sera utilise.

83

(1)

Les requtes Slection


Cette section prsente lassistant de requtes dAccess et les requtes de slection partir du chier des codes postaux. 1. Ouvrez le chier CODES_POSTAUX.accdb . 2. Dans la barre de menu Crer , cliquez sur licne Cration de requte, sur la droite du ruban. Access ouvre une fentre dans laquelle apparaissent toutes les tables prsentes ; un autre onglet propose aussi dafcher les requtes (il est possible, voire indispensable parfois, de faire une requte sur une requte). 3. Cliquez sur la table CODE_POSTAL puis sur Ajouter (un double-clic aboutit au mme rsultat). 4. Fermez cette fentre dappel des sources. Lcran, prsent la gure 4.1, se divise en deux parties : 1. Une partie suprieure qui montre la ou les tables et requtes appeles Une partie infrieure prsentant un tableau, pour le moment vide, o lon paramtrera : Les champs que lon veut voir retourns dans la feuille des rsultats ; Le ou les ordres de tris attendus ; Le ou les ltres sur les donnes.

Figure 4.1
Fentre de lassistant requtes dAccess.

1. Faites un double-clic sur ltoile se trouvant au-dessus de la cl primaire CODE . 2. Dans le pav infrieur, premire colonne, la zone Champ contient le libell CODE_POSTAL.* signiant Tous les champs de la table CODE_POSTAL ; la zone Table contient elle aussi le mme nom de table. 3. Dans le ruban, cliquez sur Afchage (licne apparat sous forme dune grille, ce qui signie afchage sous forme de feuille de donnes). 4. La nouvelle fentre fait apparatre les donnes dans un tat exactement similaire celui de la table dorigine. 5. Dans le ruban, cliquez sur le petit triangle situ dans licne Afchage puis sur Mode SQL . 6. Une feuille blanche prsente la requte SQL, crite dans le langage original SQL.

84

Access 2007 et VBA

Chapitre

La syntaxe complte est SELECT CODE_POSTAL.* FROM CODE_POSTAL; qui signie littralement : slectionnez tous les champs dans la table CODE_POSTAL. On notera que la requte se termine obligatoirement par un point-virgule qui, dans le langage SQL, signale la n dinstruction. Lassistant requtes permet donc de prsenter une requte sous au moins trois formes : un mode cration destin rdiger la requte avec un outil graphique ; un mode feuille de donnes prsentant les rsultats ; un mode SQL permettant de rdiger directement ou de voir simplement la requte sous la forme du langage SQL ; ce dernier mode nous servira ultrieurement pour copier/ coller du code SQL et lintroduire dans du code Visual Basic. Laccs ces trois modes est obtenu grce la che situe au-dessous de licne Afchage du ruban. On y accde galement grce aux petites icnes situes en bas droite de la fentre. 1. Revenez en mode cration (che sous Afchage et Mode cration , ou bouton Mode cration en bas de la fentre). 2. Placez la souris au-dessus de la premire colonne, de sorte que le pointeur apparaisse comme une che noire vers le bas. 3. Appuyez sur la touche Sup. : la colonne est supprime. Lassistant est prt pour une nouvelle requte. 4. Dans la partie suprieure prsentant les tables, cliquez sur le mot CODE de la table CODE_POSTAL et, sans relcher la souris, faites glisser cette zone dans la ligne Champ de la premire colonne situe dans la partie infrieure de la fentre. Le mme rsultat est obtenu en double-cliquant sur le mot CODE de la table. 5. Faites de mme avec le mot VILLE en le faisant glisser vers la zone Champ de la deuxime colonne, ou bien en double-cliquant dessus. 6. Le code SQL associ (obtenu via la che sous licne Afchage du ruban, ou la petite icne en bas droite) est SELECT CODE_POSTAL.CODE, CODE_POSTAL.VILLE FROM CODE_POSTAL; qui pourrait tre simpli dans le cas prsent en SELECT CODE, VILLE FROM CODE_POSTAL;. 7. Le rsultat est obtenu en passant en mode feuille de donnes (via la che sous Afchage ou la premire petite icne en bas de la fentre). Il est exactement similaire au prcdent, la diffrence prs que les champs ont t appels sparment. Lafchage en mode feuille de donnes permet, comme pour les tables, de prsenter provisoirement les donnes de diffrentes manires. En cliquant sur la zone de liste droulante, accessible par le triangle point en bas, situ droite du nom de colonne, il est possible deffectuer des tris et des ltres. Ces oprations sont totalement accompagnes par des choix doption adapts au type de colonne (texte, numrique ou date). On peut, par exemple, ne montrer que les villes commenant par PARIS, ou les codes postaux nissant par 000 (prfectures). Ces assistants ne mmorisent pas la prsentation obtenue. Il ne sagit ici que dune modication temporaire de lafchage, qui naffecte en rien la requte initiale. Les explications qui suivent montrent comment raliser des tris et des ltres de plus en plus labors, et comment enregistrer les requtes ainsi obtenues.

Les requtes 85

1.1 LES

TRIS Le chier livr est dj tri par ordre de code postal, nous voulons prsent le trier par ville. 1. Repassez en Mode cration sur la requte prcdente an de pouvoir la modier (soit par la che sous Afchage du ruban, soit par les icnes en bas de la fentre). Cliquez sur la ligne Tri de la colonne VILLE, puis ouvrez la zone de liste droulante qui apparat sur la droite de cette zone. 2. Slectionnez Croissant . 3. Repassez en Mode feuille de donnes pour visualiser le rsultat (petite icne en bas de la fentre). La requte renvoie tous les enregistrements tris par ville. Si lon consulte la liste la lettre P comme Paris, on constate que les codes postaux pour tous les items de la capitale sont prsent dsordonns La deuxime requte visera donc trier le chier par VILLE puis par CODE. 1. Repassez en Mode cration pour effectuer une nouvelle modication de la requte. Placez la souris au-dessus de la colonne VILLE pour faire apparatre la che noire pointe vers le bas. 2. Cliquez sur la colonne VILLE . 3. En gardant le clic enfonc, dplacez la colonne vers la gauche pour lamener gauche de la colonne CODE puis relchez 4. Sur la ligne Tri, dans la colonne CODE, slectionnez aussi le tri croissant . 5. Afchez les donnes en slectionnant le Mode feuille de donnes . Le tri est dsormais correct et sapplique aux villes puis, lintrieur dune mme ville, par code postal. Lassistant requte se lit de gauche droite et les tris seffectuent successivement de gauche droite. En supposant que la liste attendue doive prsenter malgr tout les codes avant les villes, le procd suivant devra tre utilis : 1. Repassez en Mode cration . Cliquez sur le champ VILLE (pour placer le curseur cette colonne). 2. Dans le ruban, cliquez sur Insrer des colonnes . Une nouvelle colonne vient se mettre gauche. 3. Glissez de nouveau le champ CODE dans cette nouvelle colonne, ny ajoutez pas de notion de tri. 4. Dcochez la zone Afcher de la colonne CODE de droite pour obtenir la structure de la gure 4.2.

Figure 4.2
Requte de tris successifs avec rordonnancement des colonnes.

86

Access 2007 et VBA

Chapitre

Lquivalent SQL de cette requte est SELECT CODE, VILLE FROM CODE_POSTAL ORDER BY VILLE, CODE; o la clause ORDER BY de tri se ralise dans lordre prcis. CODE et VILLE peuvent tre ventuellement prcds par le nom de leur table dappartenance CODE_POSTAL avec un point sparateur (par exemple CODE_POSTAL.CODE) si la base de donnes possde dautres tables.

1.2 LES

FILTRES Cette section aborde les requtes de ltrage. Il est prfrable dannuler les consignes de tri prcdentes, situes dans les colonnes VILLE et CODE en remplaant croissant par non tri grce la liste droulante de la zone tri. Nous dsirons maintenant ne consulter que les items concernant Paris : Dans la zone Critres de la colonne VILLE, saisissez le mot PARIS et validez. Des guillemets se positionnent automatiquement pour cerner ce mot. Afchez en Mode feuille de donnes . La requte renvoie 29 enregistrements qui contiennent tous et exactement le seul mot PARIS. Cherchons prsent afcher tous les enregistrements commenant par le mot Paris : 1. Repassez en Mode cration . Dans la zone critre, remplacez le libell actuel par Comme "PARIS*" . 2. La requte renvoie cette fois 152 enregistrements dont le libell de ville commence par Paris. Lquivalent SQL de cette requte est SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE "PARIS*"; 1. Lastrisque qui suit le mot Paris fonctionne comme un joker qui slectionne toutes les occurrences possibles aprs le mot Paris. Le positionnement de lastrisque en dbut de chane de caractres renverrait toutes les villes dont le libell se termine par Paris (30 enregistrements et non 29 car il existe une ville nomme DAMPARIS). Un autre type de joker, le point dinterrogation, dsigne un et un seul caractre qui peut prendre toutes les valeurs possibles ; ainsi la requte SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE "P???S*"; renvoie 30 enregistrements car, outre la ville de Paris, la ville de Poses commence par un P et nit aussi par un S tout en comptant 5 caractres. Nous cherchons maintenant afcher les enregistrements relatifs Paris OU Bordeaux. On portera une attention particulire la terminologie : en utilisant le mot OU , exact, nous dsirons voir tous les codes postaux parisiens et tous les codes postaux bordelais (addition des deux natures ditems). 1. Repassez en Mode cration . Dans la premire ligne des critres, colonne VILLE, insrez le mot PARIS . 2. Dans la deuxime ligne des critres, mme colonne, insrez le mot BORDEAUX . 3. La requte renvoie 34 enregistrements. 1. 2. 3. 4.

1. Lapproche volontaire et directe du code SQL ralise ici ne doit pas tre applique la lettre toutes les bases de donnes. Des diffrences syntaxiques importantes sont dplorer ; sous Oracle, la mme requte se terminerait par WHERE VILLE LIKE PARIS%;

Les requtes 87

Dune manire diffrente, on peut galement choisir la clause ET (AND en anglais). Si lon dsire voir toutes les prfectures (les villes dont le code postal nit par 000) et commenant par le mot ST , on procdera de la manire suivante : 1. Repassez en Mode cration . Dans la premire ligne des critres, colonne CODE, insrez Comme "*000" . 2. Dans la premire ligne des critres, colonne VILLE, insrez Comme "ST*" . 3. La requte renvoie 4 enregistrements : St-Brieuc, St-tienne, St-Lo, Strasbourg. Dans ce nouveau cas de gure, et pour cumuler les conditions, les critres sont disposs sur la mme ligne. On peut exclure des enregistrements par linstruction Pas (NOT en anglais). 1. En Mode cration , tous les critres antrieurs tant effacs, insrez le libell Pas PARIS dans le premier critre de la colonne VILLE. 2. Le rsultat renvoie tous les enregistrements sauf ceux dont la ville comporte le mot PARIS (7 980 lignes). La commande SQL originale utilise la clause NOT : SELECT CODE FROM CODE_POSTAL WHERE ((Not (VILLE)="PARIS")); Outre le simple rapprochement de caractres, lassistant requte peut faire jouer de nombreux autres oprateurs : 1. En Mode cration , effacez les critres de ltre prcdents. 2. Dans la zone Critres de la colonne CODE, insrez le libell >=75000 . 3. La requte renvoie 1 818 enregistrements et plus prcisment tous les codes postaux suprieurs ou gaux 75000. On notera que lopration fonctionne alors mme que la colonne est dclare comme de type texte : Access effectue une conversion implicite des donnes pour interprter la requte. La requte appelant tous les enregistrements relatifs la ville de Paris sur la base du code postal scrira comme lindique la gure 4.3 (101 enregistrements renvoys). Figure 4.3
Requte cumulant des critres oprateur arithmtique.

Lquivalent SQL de cette requte scrit SELECT CODE, VILLE FROM CODE_POSTAL WHERE
CODE>="75000" AND CODE<"76000"; .

1.3 LES

REQUTES VALEURS DISTINCTES Reprenons la requte ne renvoyant que les enregistrements dont la ville est PARIS (le libell "PARIS" dans la zone Critre de la colonne VILLE) : nous rappelons quelle renvoie 29 lignes. Il est possible de ne vouloir afcher que les valeurs distinctes dans les critres demands : 1. Supprimez la colonne relative au CODE pour ne plus avoir que la colonne VILLE.

88

Access 2007 et VBA

Chapitre

2. Posez le critre PARIS (la requte doit renvoyer ce moment 29 lignes). 3. En Mode cration , dans le ruban, cliquez sur Feuille des proprits de la requte (ou bien cliquez du bouton droit et slectionnez Proprits ). 4. la ligne Valeurs distinctes, mettez la proprit Oui . 5. La requte ne renvoie plus quun seul enregistrement car toutes les valeurs de la colonne VILLE sont identiques. Il sagit du mot PARIS. Cette requte scrit simplement SELECT DISTINCT VILLE FROM CODE_POSTAL WHERE VILLE="PARIS";

Attention
La clause DISTINCT sapplique toutes les colonnes de la requte ; si vous remettez la colonne CODE dans la requte, celle-ci renverra alors et de nouveau 29 enregistrements.

1.4 LES

REQUTES PARAMTRES Une requte peut intgrer un ou plusieurs paramtres qui seront fournis par lutilisateur lors de son lancement. 1. Le cas chant, supprimez tous les critres ou proprits antrieurs (la proprit DISTINCT en particulier) et ajoutez ventuellement une colonne CODE en doublecliquant sur le champ CODE de la table. 2. Dans la zone Critre de la colonne VILLE, entrez le libell suivant, cern par des crochets : [Indiquez une ville pour en connatre le code postal] . 3. Passez en Mode feuille de donnes : ce moment, une bote de dialogue souvre contenant la question que vous avez paramtre. 4. Saisissez une ville de votre choix, la requte renverra le ou les enregistrements correspondants la ville saisie.

1.5 LES

ALIAS ET LES FONCTIONS Pour viter de prsenter le nom du champ do sont extraites les donnes, souvent peu comprhensibles, une requte peut renvoyer un en-tte de colonne diffrent quon nommera alias. Cet artice nest pas seulement utile au plan esthtique , il pourra servir dans la requte SQL ultrieurement ou dans une autre requte en cascade. Dans la zone champ et la colonne o est indique la ville, saisissez le libell suivant : Bureau distributeur : VILLE . La partie gauche des deux points (:) constitue lalias du champ VILLE prsent droite des deux-points ; on notera que lalias peut comporter des espaces alors que si le nom de champ avait des espaces, il serait ncessaire de cerner lexpression par des crochets. La traduction SQL de cette requte scrira SELECT VILLE AS [Bureau distributeur], CODE FROM CODE_POSTAL; o le mot AS dsigne lalias.

Les requtes 89

Les alias deviennent indispensables lorsque des fonctions sont utilises. Nous allons crer une requte dans laquelle apparatra une colonne supplmentaire indiquant le dpartement. 1. Au pralable, supprimez les diffrents critres prcdents et remettez la proprit Valeurs distinctes Non dans la feuille de proprits de la requte en mode cration. 2. Dans la premire colonne, zone Champ, insrez la formule Dpartement: Gauche (CODE;2). 3. Dans les colonnes plus droite, remettez en place les deux autres champs, CODE et VILLE. 4. Visualisez la requte en mode feuille de donnes. La fonction GAUCHE() , ici, a t utilise ; elle extrait les caractres de gauche dune chane de caractres ; le nombre de caractres extraire doit tre indiqu dans la fonction aprs un sparateur point-virgule. Lquivalent SQL donne SELECT Left([CODE],2) AS Dpartement, CODE, VILLE FROM CODE_POSTAL; le mot-cl LEFT est le mme en SQL et en Visual Basic ; comme presque tous les autres mots-cls, il est francis pour lutilisation dAccess en version franaise. Access dispose dun gnrateur dexpression qui aide la mise au point de formules labores : 1. 2. 3. 4. 5. Figure 4.4
Gnrateur dexpression dAccess.

Cliquez dans le Champ dune colonne vide en mode cration. Saisissez Formule : (le mot formule suivi de deux points). Cliquez dans le ruban sur licne Gnrateur. Dans le pav de gauche, dveloppez litem Fonctions , puis Fonctions intgres . Vous lisez dans le pav de droite toutes les fonctions disponibles dans Access comme le montre la gure 4.4.

On prendra garde au fait que les mots-cls utiliser sont parfois identiques ceux dExcel, comme la fonction GAUCHE() par exemple. Ils sont quelquefois diffrents, comme dans les deux exemples suivants : la fonction SI() sous Excel se nomme VRAIFAUX() sous Access ;

90

Access 2007 et VBA

Chapitre

la fonction STXT() sous Excel (extraction de caractres dans une chane) se nomme EXTRACCHANE() sous Access. Toutes les fonctions utilisables ici sont dites scalaires : elles sappliquent sur tous les enregistrements afcher dans le rsultat de la requte, contrairement aux fonctions agrgats qui sappliquent sur des ensembles denregistrements et qui sont tudies ci-aprs.

1.6 LE

REGROUPEMENT DE DONNES Ds quil est ncessaire de regrouper des donnes, soit pour prsenter des synthses, soit pour effectuer des calculs, lafchage de la requte en mode cration doit comporter des critres de regroupement : 1. Dans le ruban, cliquez sur licne Totaux . 2. Une ligne supplmentaire apparat dans le pav infrieur nomme Opration. 3. Toutes les oprations sont considres par dfaut comme Regroupement limage de la gure 4.5.

Figure 4.5
Requte de regroupement de donnes.

Rdige comme le prsente la gure 4.5, la requte de regroupement renverra le mme nombre denregistrements quune requte simple : tous les enregistrements sont distincts et ne peuvent pas tre regroups puisque les codes postaux sont tous diffrents. 1. Supprimez la colonne CODE et visualisez de nouveau le rsultat. La requte ne renvoie plus que 7 766 enregistrements (au lieu de 8 004) : toutes les lignes contenant le mme mot PARIS, par exemple, ont t regroupes pour ne plus dcompter les doublons. 2. Supprimez la colonne VILLE, le rsultat renvoie les 97 dpartements franais (Outre-Mer compris). Lquivalent SQL de cette requte sera SELECT Left([CODE],2) AS Dpartement FROM CODE_POSTAL GROUP BY Left([CODE],2); o la clause GROUP BY commande le regroupement. Le nombre de bureaux distributeurs par dpartement sera obtenu de la manire suivante : 1. Dans la premire colonne, renseignez la zone Champ par Dpartement: Gauche ([CODE] ;2) . 2. Choisissez lopration Regroupement . 3. Dans la deuxime colonne, insrez le champ CODE . 4. Choisissez lopration Compte . Le rsultat montre que le dpartement de lAin compte 90 bureaux distributeurs, lAisne 78, etc.

Les requtes 91

Si seuls les bureaux distributeurs du dpartement de lAin doivent tre dcompts, il sufra dajouter le critre "01" dans la colonne Dpartement. La condition = "01" ne porte pas sur chaque item mais sur le regroupement, comme le montre plus explicitement la traduction SQL SELECT Left([CODE],2) AS Dpartement, Count(CODE_POSTAL.CODE) FROM CODE_POSTAL GROUP BY Left([CODE],2) HAVING (((Left([CODE],2))="01")); o la clause HAVING est insre aprs le GROUP BY. Pour faire intervenir une condition sur chaque enregistrement, il faut utiliser lopration O (quivalent linstruction WHERE dans la syntaxe SQL) dans une colonne nouvelle, et non plus sur le regroupement. Supposons, par exemple, que le rsultat attendu compte tous les bureaux distributeurs de la ville de Paris, il faudra composer la requte limage de la gure 4.6. Figure 4.6
Requte de regroupement de donnes avec ltre scalaire.

Cette fois, linterprtation SQL de la requte devient SELECT Left([CODE],2) AS Dpartement, Count(CODE) FROM CODE_POSTAL WHERE VILLE="PARIS" GROUP BY Left([CODE],2); o la condition WHERE est applique avant doprer le regroupement GROUP BY.

1.7 LES

REQUTES SUCCESSIVES Dans le paragraphe prcdent, il a t possible de lister les 97 dpartements par une opration de regroupement ; en revanche, il nest pas possible dobtenir directement le dcompte 97 (en une seule ligne) car il est ncessaire de faire deux oprations successives : le regroupement (GROUP BY) ; puis le compte (COUNT). La solution la plus aise consiste faire une premire requte, puis en crer une seconde avec les rsultats de la premire 1. Procdez de la manire suivante : 1. En mode cration, rduisez la premire requte la dnition du Dpartement (pas dautre colonne). 2. Slectionnez lopration de regroupement. 3. Vriez le rsultat ( renvoi de 97 enregistrements en liste) et enregistrez la requte sous le nom Req_Regroupement 2. 4. Crez une nouvelle requte qui appelle la requte Req_Regroupement. Pour cela, slectionnez Crer et Cration de requte dans le ruban, puis dans la fentre Afcher la table , en slectionnant longlet Requtes et Req_Regroupement .

1. Il est aussi possible de crer des sous-requtes, dans certains cas de figure, que nous ntudierons pas ici, dans le cadre dune approche limite du langage SQL. 2. Une convention de nom largement rpandue veut que les noms des requtes commencent par le prfixe Req_ ou Rqt_ ou Qry_ pour bien indiquer quil sagit de requtes et non pas de tables. Si nous approuvons cette convention, nous nous refusons, en revanche prfixer les tables Tbl_ et recommandons de ne pas insrer despaces dans les noms dobjets. Ces recommandations cherchent recouper clart dans les concepts et facilit dans la frappe du code.

92

Access 2007 et VBA

Chapitre

5. Insrez le champ Dpartement en premire colonne, en double-cliquant sur ce champ dans la table. 6. En option dopration, slectionnez le Compte . 7. On obtient le seul enregistrement de dcompte nal avec la valeur 97.

1.8 LES

JOINTURES La table ADRESSE est contenue dans le chier Access CODES_POSTAUX.accdb disponible sur le site de lditeur, ladresse www.pearsoneducation.fr. 1. Fermez toutes les requtes 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 renseigns, en revanche, il manque une colonne pour dsigner la ville du domicile. En fait, cette situation est tout fait normale puisque les noms des villes peuvent tre parfaitement connus grce aux seuls codes postaux et la table de tous les codes franais. Les actions suivantes mettent en place une jointure entre la table ADRESSE et la table CODE_POSTAL , ce qui permet dafcher le nom de la ville associe au code postal contenu dans la table ADRESSE . 1. Crez une nouvelle requte. 2. Slectionnez les tables CODE_POSTAL et ADRESSE dans la fentre Afcher la table : vous noterez quun l de liaison apparat automatiquement entre les deux champs CODE des deux tables ; cest uniquement en raison de lidentit des noms de champ quAccess tablit cette liaison puisquaucune relation formelle na t pose entre les deux tables. 3. Insrez, dans la zone Champ de chaque colonne, tous les champs des deux tables pour obtenir le rsultat visuel de la gure 4.7.

Figure 4.7
Requte avec jointure.

Afche en mode feuille de donnes, la requte montre six enregistrements, le code tant prsent deux fois (dans la table ADRESSE et dans la table CODE_POSTAL ). La ville de domicile est dsormais correctement renseigne ; il a t tabli une jointure entre les

Les requtes 93

deux tables et Access montre tous les enregistrements de la table ADRESSE et tous les enregistrements correspondants de la table CODE_POSTAL . 1. En mode cration, cliquez du bouton droit sur la jointure (le trait) qui avait t tablie automatiquement entre les deux tables et slectionnez Supprimer : la requte renvoie maintenant 48 024 enregistrements. En procdant ainsi, on ralise un produit cartsien des deux tables, cest--dire la mise en place de toutes les combinaisons possibles entre tous les lments de la premire table avec tous les lments de la seconde. moins de circonstances exceptionnelles, ce cas de gure ne se prsente jamais. En revanche, cette manipulation correspond une erreur trop souvent commise et quon vitera tout prix. Il est donc trs important dtablir des jointures correctes ds que plusieurs sources de donnes sont appeles dans la requte. Il peut tre cr autant de jointures que ncessaire, en nombre illimit. 2. Rtablissez la jointure en faisant un glisser/dplacer de la cl primaire CODE vers sa cl trangre de la table ADRESSE , puis cliquez nouveau du bouton droit sur cette jointure pour en afcher les proprits, comme la gure 4.8. Figure 4.8
Proprit dune jointure.

Access offre la possibilit dtablir des jointures dites droite ou gauche : La jointure gauche (cas numro 2 de la gure 4.8) montre tous les enregistrements de la table des adresses et seulement ceux correspondants dans la table des codes (elle renvoie six enregistrements puisque tous les codes postaux des adresses sont valides). La jointure droite (cas numro 3 de la gure 4.8) montre tous les enregistrements de la table 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 LASSISTANT

LA RDACTION DE REQUTES

En sus de loutil Requtes , Access propose un Assistant requte qui dcompose pas pas la mise en place des requtes. Cet outil est utile mais non indispensable ds que les notions abordes dans les paragraphes prcdents sont bien assimiles ; de fait, il ralentit singulirement la mise en place dune requte. En revanche, le mme bouton du ruban propose aussi de crer des requtes assez complexes et pourtant frquemment utilises : les requtes disolement des doublons ;

94

Access 2007 et VBA

Chapitre

les requtes de non-correspondance. En voici un exemple : 1. Dans le ruban du menu Crer , cliquez sur licne Assistant Requte. 2. Slectionnez lassistant Trouver les doublons. 3. Choisissez la table CODE_POSTAL . 4. Choisissez la Ville comme champ susceptible de contenir des doublons. 5. Dans ltape suivante, demandez afcher aussi les codes postaux. 6. Cliquez sur Terminer . La requte renvoie effectivement tous les doublons (489).

(2)

Les requtes Insertion, Suppression et Mise jour


Toutes les requtes Slection ne font que lire la ou les tables et requtes de la base, sans rien changer de leur contenu. Les requtes tudies ici, au contraire, modient les donnes par ajout, mise jour ou suppression. Elles sont indispensables pour manipuler le contenu sans lintervention dune saisie manuelle et seront intgres, ultrieurement, dans du code Visual Basic pour automatiser des procdures.

2.1 LES

REQUTES

AJOUT

Pour quune requte ajout soit fonctionnelle, elle doit respecter en tous points les contraintes dintgrit qui ont t poses lors de la conception de la base. En particulier, lajout dun enregistrement ne se ralisera que si tous les champs dont la proprit Null interdit est positionne Oui (champs Not Null) sont effectivement servis. 1. Dans le ruban du menu Crer , cliquez sur licne Cration requte. 2. Fermez immdiatement la fentre dafchage des tables sans slectionner aucun objet. 3. Dans le ruban, cliquez sur licne Ajout symbolis par une croix verte avec un point dexclamation. 4. Dans la bote de dialogue dAjout, citez la table ADRESSE comme destination des ajouts et validez par OK . 5. Dans la premire colonne, en bas, saisissez lalias MON_NOM suivi de deux points (:) et de votre nom entre guillemets, puis prcisez dans la zone Ajouter (situe en dessous) le champ NOM grce la liste droulante. 6. Dans la deuxime colonne, saisissez MON_PRENOM : et votre prnom entre guillemets, puis slectionnez le champ PRENOM dans la zone Ajouter . 7. Dans la troisime colonne, saisissez MON_ADRESSE : et votre adresse entre guillemets, puis slectionnez le champ ADRESSE1 dans la zone Ajouter . 8. Dans la quatrime colonne, saisissez MON_CP : et votre code postal entre guillemets puis slectionnez le champ CODE dans la zone Ajouter .

Les requtes 95

Passez en mode SQL et visualisez le code ; celui-ci devrait tre similaire au suivant : INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE) SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des Vinaigriers" AS MON_ADRESSE, "75010" AS MON_CP; 1. Cliquez sur licne de point dexclamation Excuter. 2. Un message vous avertit que vous allez ajouter une ligne la table destination, validez par OK 1. 3. Allez consulter la table ADRESSE : cette nouvelle ligne a t ajoute. On retiendra que les guillemets, sagissant dune zone texte, sont obligatoires. Ils sont facultatifs, en revanche, lorsque linsertion concerne une valeur numrique dans un champ du mme type. Les dates, enn, sont automatiquement cernes par Access dun signe dise (#). Cette premire requte ajout a ralis une insertion partir de donnes totalement externes la base, mais il est galement possible dinsrer des donnes partir dautres tables. 1. Reprenez en mode cration la requte ajout qui a t mise en place. 2. Cliquez sur Afcher la table situ dans le ruban. 3. Slectionnez la table CODE_POSTAL . 4. Supprimez la colonne actuelle dinsertion du code postal dans la partie infrieure de lcran. 5. Faites un glisser/dplacer du champ CODE vers une nouvelle colonne, puis prcisez dans la zone Ajouter le champ CODE pour destination. 6. Faites un glisser/dplacer du champ VILLE vers une nouvelle colonne et ne prcisez aucun champ de destination. 7. Dans la zone Critre de la colonne VILLE, insrez le nom dune ville qui ne compte pas de doublon 2 : Gex, par exemple, code 01170. La gure 4.9 prsente ce que vous devez voir lcran. Figure 4.9
Insertion dun enregistrement partir dune autre table.

1. Les messages de service tels que celui-ci peuvent tre supprims dans lapplication en allant dans le sous-menu Avanc des Options dAccess (bouton Office) et en dcochant Confirmer > Requtes actions. On peut aussi utiliser la commande Visual Basic DoCmd.SetWarnings False. 2. Si linsertion concerne une ville reprsente plusieurs fois dans la table source, il y aura autant de lignes ajoutes que de lignes sources.

96

Access 2007 et VBA

Chapitre

Dans cette requte, on ajoute une ligne dadresse avec le code postal dont la ville est Gex, code postal retrouv grce la table des codes postaux. Sa prsentation SQL est INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE) SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des Vinaigriers" AS MON_ADRESSE, CODE_POSTAL.CODE FROM CODE_POSTAL WHERE (((CODE_POSTAL.VILLE)="Gex")); 8. Enregistrez cette requte sous le nom Req_Ajout_Perso car celle-ci nous resservira ultrieurement.

2.2 LES

REQUTES

SUPPRESSION

La requte suppression qui correspond linstruction SQL DELETE, ralise la suppression denregistrements. Avec Access, elle se met en uvre de la manire suivante : Le cas chant, fermez les requtes et tables actives. Dans le ruban du menu Crer , cliquez sur licne Cration requte. Slectionnez la table ADRESSE puis fermez. Faites un glisser/dplacer du champ NOM depuis la table ADRESSE vers la premire colonne. 5. Cliquez sur licne Suppression du ruban, reprsent par un X rouge avec un point dexclamation (la zone Supprimer sincrmente automatiquement du mot-cl O ). 6. Dans la zone Critres, saisissez votre nom (celui que vous avez insr dans lexercice prcdent). 7. Dans le ruban, cliquez sur le bouton Excuter . 8. Un message de service vous indique que vous allez supprimer un enregistrement ; rpondez Oui . Si lindication de votre nom avait comport une faute dorthographe, Access aurait simplement dit que vous alliez supprimer 0 enregistrement. Lquivalent SQL de cette manipulation donne DELETE NOM FROM ADRESSE WHERE NOM="MINOT";. Tous les oprateurs de comparaison dj vus (LIKE, par exemple) peuvent tre utiliss pour prciser ltendue des suppressions dsires. On prendra garde au fait quune requte suppression sans oprateur de comparaison supprime tous les enregistrements de la table source (DELETE NOM FROM ADRESSE;) 1. Rappelons enn que si une contrainte dintgrit rfrentielle avec suppression en cascade a t mise en place au niveau relationnel, la suppression dun enregistrement dans la table mre provoque la suppression de tous les enregistrements correspondants dans les tables lles. 1. 2. 3. 4.

1. Access ne prend pas en charge la commande TRUNCATE qui, dans beaucoup de bases de donnes, permet de vider trs rapidement le contenu entier dune table.

Les requtes 97

2.3 LES

REQUTES

MISE

JOUR

Ces requtes, qui correspondent linstruction SQL UPDATE, ralisent la mise jour de tout ou partie dun ou plusieurs enregistrements. Lassistant requtes dAccess la propose sous la forme graphique suivante : 1. Dans le ruban du menu Crer , cliquez sur licne Cration requte. 2. Slectionnez la table ADRESSE puis fermez. 3. Cliquez sur licne Mise jour dans le ruban, symbolis par un petit crayon sur une grille, suivi par un point dexclamation. 4. Faites un glisser/dplacer du champ NOM depuis la table ADRESSE vers la premire colonne. 5. Faites un glisser/dplacer du champ CODE depuis la table ADRESSE vers la seconde colonne. 6. Dans la zone Critres du champ NOM, saisissez DUPONT (il sagit dun des contacts de la table ADRESSE dont le code postal, avant mise jour est 01000). 7. Dans la zone Mise jour du champ CODE, saisissez un code postal quelconque (mais existant !). Lassistant requtes sera donc dispos comme la gure 4.10. Figure 4.10
Paramtrage dune requte mise jour.

Lquivalent SQL de cette requte est UPDATE ADRESSE SET CODE="75010" WHERE NOM="DUPONT";. Sil existe plusieurs contacts nomms Dupont dans la table ADRESSE, tous seront dots, aprs la mise jour, du code postal saisi. Comme pour toutes les requtes actions, Access informe lutilisateur du nombre de mises jour quil effectue lorsquil excute cette requte.

2.4 LA

NOTION DE TRANSACTION Toute requte action (ajout, suppression, mise jour) sinclut dans une transaction. Cette notion est particulirement importante lorsque la base de donnes est partage par plusieurs utilisateurs. La dmarche gnrale dune transaction se traduit par les vnements successifs suivants : Un utilisateur (numrot 1) dmarre explicitement une transaction (par une commande quon verra plus loin).

98

Access 2007 et VBA

Chapitre

Lutilisateur 1 procde une ou plusieurs requtes action. Pendant ce temps, et jusqu ce que lutilisateur 1 ait achev sa transaction, les autres utilisateurs ne voient pas les ajouts, mises jour ou modications apports la base. Dans ce mme temps, les enregistrements impacts par les actions de lutilisateur 1 sont bloqus (LOCK), cest--dire quun utilisateur 2 ne peut pas y porter une autre requte action. Lutilisateur 1 clt sa transaction. Les autres utilisateurs voient les nouvelles donnes et peuvent intervenir. La notion de transaction est oprationnelle : avec les tables dune base de donnes active ; avec les tables dune base de donnes connecte sous ODBC 1. Elle nest pas oprationnelle avec les tables Access ou autres objets (feuille Excel, chier texte, etc.) attachs la base active.

Attention
Pour que le mode transactionnel soit utilisable, il faut que la base de donnes utilise une syntaxe compatible avec SQL Server : cliquez sur le bouton Ofce > Options Access > Concepteurs dobjets et cochez la case Syntaxe compatible SQL Server pour cette base de donnes. Il faudra sassurer ensuite dannuler ce paramtrage car il comporte de lourds effets sur toutes les syntaxes SQL employes dans cette base.

Procdons la mise en uvre de cette notion : 1. Dans le menu Crer , cliquez sur Cration de requte. 2. Fermez immdiatement la fentre afchant toutes les sources de donnes sans slectionner aucun objet. 3. Cliquez dans le ruban sur Dnition des donnes (nous reviendrons plus loin sur ce passage en mode SQL de dnition de donnes). 4. Dans la fentre blanche SQL ouverte, saisissez les mots-cls BEGIN TRANSACTION suivi par un point-virgule. 5. Cliquez dans le ruban sur le point dexclamation Excuter. 6. Il ne se passe apparemment rien : Access a seulement mmoris que les requtes actions venir donnaient lieu transaction, avec la possibilit de valider ou annuler toutes les commandes gnres aprs le BEGIN TRANSACTION. 7. Rouvrez la requte Req_Ajout_Perso en mode SQL et copiez (Ctrl + C) la requte. 8. Retournez dans la requte en cours et collez la commande INSERT au complet (Ctrl + V) la place du BEGIN TRANSACTION. 9. Cliquez sur Excuter ( partir de longlet Crer situ droite) : SQL vous informe quun enregistrement va tre ajout. Validez cet ajout.

1. condition que la base de donnes connecte sous ODBC supporte elle-mme la notion de transaction.

Les requtes 99

10. Ouvrez la table ADRESSE et rafrachissez lafchage si cela est ncessaire (cliquez deux fois sur Afchage gauche dans le ruban) : elle ne contient apparemment pas votre enregistrement. Refermez-la. 11. Effacez le texte dinsertion dans la requte en cours et remplacez-le par les mots-cls COMMIT TRANSACTION (avec le point-virgule de n), et excutez cette requte. Si le symbole Excution napparat plus dans le ruban, cliquez sur le second onglet Crer situ sur la droite. 12. Rouvrez la table ADRESSE et rafrachissez lafchage si cela est ncessaire (cliquez deux fois sur Afchage dans le ruban) : le nouvel enregistrement est bien prsent. Si la commande ROLLBACK TRANSACTION avait t utilise en lieu et place du COMMIT TRANSACTION , linsertion aurait t purement et simplement annule. Quelques derniers points essentiels sont retenir sur cet aspect : Access oblige un BEGIN TRANSACTION explicite, contrairement dautres bases. La notion de transaction sapplique exclusivement aux commandes DML (Data Management Language) comme INSERT, DELETE ou UPDATE, non sur les commandes DDL (Data Denition Language) qui permettent de crer des objets. Lutilisation du mode transactionnel ralentit les procdures. La fermeture dAccess effectue un COMMIT implicite.

Attention
Noubliez pas de remettre les options qui taient actives avant cette manipulation. Pour cela supprimez la requte transactionnelle en cours, si cela nest pas dj fait, puis cliquez sur le bouton Ofce > Options Access > Concepteurs dobjets et dcochez la case Syntaxe compatible SQL Server pour cette base de donnes.

(3)

Les requtes cration


Les tables et autres objets crs jusqu maintenant ont donn lieu des interventions manuelles . Ces dernires peuvent tre automatises, soit par une option spcique de cration de table, soit directement avec la palette complte du langage SQL.

3.1 LES

REQUTES CRATION DE TABLE Il est toujours ais de copier un objet comme une table vers le mme objet en le renommant : le nouvel objet hrite alors de presque toutes les proprits de loriginal. Cette manipulation sopre de la manire suivante : 1. Cliquez du bouton droit sur la table ADRESSE dans le volet de navigation. 2. Slectionnez Copier . 3. Cliquez nouveau du bouton droit et slectionnez Coller .

100

Access 2007 et VBA

Chapitre

4. Access propose de crer un objet Copie de ADRESSE (quon peut nommer diffremment) et suggre, soit la copie de la structure seule, soit celle de la structure et des donnes. 5. Optez pour une copie complte : deux tables sont dsormais disponibles 1. Cependant, le copier/coller na pas ralis de choix slectif des donnes transmettre : cest lavantage des requtes cration de tables que dy parvenir : 1. Dans le ruban du menu Crer , cliquez sur Cration de requte. 2. Slectionnez la table ADRESSE dans la fentre dafchage des tables puis refermezla. 3. Cliquez dans le ruban sur le bouton Cration de table . 4. Dans la fentre qui souvre, nommez la nouvelle table NEW_ADRESSE et validez par OK . 5. Insrez tous les champs de la table ADRESSE dans les colonnes du pav infrieur. 6. Dans la zone Critres de la premire colonne, saisissez <4 pour obtenir le dessin de la gure 4.11. Figure 4.11
Paramtrage dune requte cration de table.

7. Cliquez sur Excuter : Access vous avertit que trois enregistrements seront colls dans une nouvelle table. 8. La nouvelle table, nomme NEW_ADRESSE , ne contient que les trois enregistrements correspondant aux ID 1, 2 et 3.

3.2 LES

REQUTES

DFINITION

DE DONNES

Le mode dafchage SQL habituel, celui des requtes Slection ou Action vues auparavant, ne supporte pas certaines commandes, et en particulier toutes celles qui relvent du DDL (Data Denition Language) telles que CREATE ou ALTER. Les requtes Dnition de donnes autorisent, elles, ces commandes. Il nest pas possible ici, de dtailler la syntaxe de toutes les commandes SQL tant elles sont nombreuses. Les lecteurs qui auront besoin dutiliser en direct ces commandes pourront se reporter laide en ligne et aux ouvrages consacrs au langage SQL (pour Access et MS-SQL Server en loccurrence).

1. Si la table source tait dote de contraintes dintgrit rfrentielle, ces dernires ne sont pas attribues au nouvel objet.

Les requtes 101

Un seul exemple sera utilis pour montrer quelles sont les possibilits de cet outil. On se propose de modier la largeur de la colonne NOM de la table ADRESSE en la faisant passer de 50 100 caractres de long : 1. 2. 3. 4. 5. Fermez toutes les ventuelles requtes et/ou tables ouvertes. Dans le ruban du menu Crer , cliquez sur le bouton Cration de requte . Fermez la fentre dafchage des tables sans slectionner aucune table. Dans le ruban, cliquez sur Dnition de donnes . Dans la fentre SQL blanche, saisissez la commande SQL suivante : ALTER TABLE ADRESSE ALTER COLUMN NOM TEXT(100) NOT NULL termine par un pointvirgule, puis excutez cette requte. 6. Ouvrez la table ADRESSE en mode cration : le champ NOM est effectivement largi, tout en maintenant le type de la colonne en Texte et la proprit Null interdit Oui.

Rsum
Loutil Requtes sert exploiter les donnes stockes dans les tables. Les requtes Slection lisent et ordonnent les donnes suivant de multiples critres de tri et de ltrage. Avec la notion de jointure, les requtes Slection permettent de recroiser les donnes en provenance de multiples tables ou autres requtes suivant le modle relationnel. Les requtes Action ajoutent, suppriment ou modient les donnes ; elles sinscrivent dans le cadre de transactions dans la base. Access supporte, en direct ou en mode assist, un grand nombre des commandes du langage SQL, langage commun des bases de donnes.

102

Access 2007 et VBA

Chapitre

Problmes et exercices
Les exercices suivants sont constitus de questions rapides sur la mise en place de requtes. On commencera par des requtes Slection destines afcher des donnes ou des synthses (exercices 1 17) puis on fera quelques requtes Action dinsertion, de mise jour et de suppression de donnes (exercices 18 20). Tous concernent la base ECOLE_INTERNATIONALE cre dans les exercices du chapitre 3. On sappliquera enregistrer chaque requte sous la forme Req_4xx pour pouvoir la rutiliser ultrieurement.

EXERCICE 1
nonc

AFFICHAGE

PAR ORDRE ALPHABTIQUE

Afchez les noms, prnoms, adresse, code postal, ville et pays des lves franais prsents par ordre alphabtique.

* Solution

Un ordre de tri croissant doit tre mis sur la colonne NOM_ELEVE de la table ELEVE et un critre de ltre doit tre pos sur la colonne PAYS_ELEVE pour obtenir le rsultat de la gure 4.12. Pour cela effectuez les actions suivantes : 1. Dans le ruban du menu Crer , cliquez sur Cration de requte . 2. Slectionnez la table ELEVE dans la fentre dafchage des tables puis refermez-la. 3. Placez dans chacune des colonnes du tableau les champs NOM_ELEVE , PRENOM_ELEVE , ADRESSE1_ELEVE , CODEPOSTAL_ELEVE , VILLE_ ELEVE , PAYS_ELEVE . 4. Dans la zone Tri de la colonne NOM_ELEVE, choisissez croissant dans la liste droulante. 5. Dans la zone Critres de la colonne PAYS_ELEVE, inscrivez le texte "FR" . 6. Enregistrez la requte sous le nom Req_411 .

Figure 4.12
Paramtrage de lexercice 1.

Les requtes 103

Exercices

La requte 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 prcise le ltre et la clause ORDER BY prcise le tri.

EXERCICE 2
nonc * Solution

AFFICHAGE

SUR CRITRE DE PRNOM

Afchez les noms et prnoms des lves dont le prnom commence par un A.

Le critre de ltre utilisera le mot-cl Comme (LIKE en anglais) et le caractre * (voir gure 4.13). Pour cela effectuez les actions suivantes : 1. Dans le ruban du menu Crer , cliquez sur Cration de requte . 2. Slectionnez la table ELEVE dans la fentre dafchage des tables puis refermez-la. 3. Placez dans chacune des colonnes du tableau les champs NOM_ELEVE , PRENOM_ELEVE . 4. Dans la zone Critres de la colonne PRENOM_ELEVE, inscrivez Comme "A*" . 5. Enregistrez la requte sous le nom Req_412 .

Figure 4.13
Paramtrage de lexercice 2.

EXERCICE 3
nonc * Solution

AFFICHAGE

SUR CRITRE EXCLUANT UN PAYS

Afchez les seuls noms et prnoms des lves qui ne sont pas franais.

Le critre de ltre utilise le mot-cl Pas ; la colonne PAYS ne devant pas tre afche, la case Afcher est dcoche (voir gure 4.14). Effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1).

1. Toutes les syntaxes sont simplifies pour une meilleure lecture ; les parenthses inutiles ou les prfixes de tables sont ici supprims par rapport la requte cre par le gnrateur dAccess. On notera aussi que les guillemets devront tre remplacs par des apostrophes ou des doubles guillemets lorsque ces requtes seront insres dans du code Visual Basic.

104

Access 2007 et VBA

Chapitre

2. Placez dans les colonnes du tableau les champs NOM_ELEVE , PRENOM_ ELEVE et PAYS_ELEVE . 3. Dans la zone Critres de la colonne PAYS_ELEVE, inscrivez Pas "FR" . Dcochez la case Afcher. Figure 4.14
Paramtrage de lexercice 3.

EXERCICE 4
nonc * Solution

AFFICHAGE

SUR CRITRES MULTIPLES

Afchez les noms et prnoms des lves amricains, allemands et anglais. Le mot ET utilis dans lnonc ne doit pas induire en erreur : un lve nest pas simultanment de plusieurs nationalits ; aussi cest bien le critre OU qui doit tre utilis (voir gure 4.15). Effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1). 2. Placez dans les colonnes du tableau les champs NOM_ELEVE , PRENOM_ ELEVE et PAYS_ELEVE . 3. Dans la zone Critres de la colonne PAYS_ELEVE, inscrivez "USA" . Puis dans les zones Ou suivantes, "D" et "UK" .

Figure 4.15
Paramtrage de lexercice 4.

EXERCICE 5
nonc

AFFICHAGE

SUR CRITRE DE DATE

Les requtes 105

Exercices

Afchez les noms et prnoms des lves franais ns entre le 1er janvier 1960 et le 31 dcembre 1969.

* Solution

Trois conditions se cumulent et doivent tre places sur la mme ligne. La colonne DATENAISSANCE_ELEVE invoque deux fois nest afche quune fois. Les caractres dise (#) qui cernent les dates nont pas besoin dtre saisis : Access les pose automatiquement (voir gure 4.16). Effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 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 Critres de la colonne PAYS_ELEVE, inscrivez "FR" . Dans la zone Critres de la premire colonne DATENAISSANCE_ELEVE, inscrivez >=01/01/1960 . Dans la zone Critres de la seconde colonne DATENAISSANCE_ELEVE, inscrivez <=31/12/1969 .

Figure 4.16
Paramtrage de lexercice 5.

EXERCICE 6
nonc

AFFICHAGE

SUR CRITRES DE DATE ET DE PAYS

Afchez les noms et prnoms des lves franais et amricains ns avant le 1er janvier 1960.

* Solution

Il convient de rpter la condition dge sur les deux lignes pour quelle sapplique chaque fois aux deux populations diffrentes (voir gure 4.17). Effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1). 2. Placez dans les colonnes du tableau les champs NOM_ELEVE , PRENOM_ ELEVE , PAYS_ELEVE , DATENAISSANCE_ELEVE . 3. Dans la zone Critres de la colonne PAYS_ELEVE, inscrivez "FR" , et dans la zone Ou "USA" . Dans la zone Critres de la colonne DATENAISSANCE_ELEVE, inscrivez <01/01/1960 . Et inscrivez la mme valeur dans la zone Ou de cette colonne.

Figure 4.17
Paramtrage de lexercice 6.

106

Access 2007 et VBA

Chapitre

EXERCICE 7
nonc * Solution

AFFICHAGE

AVEC VALEURS DISTINCTES

Citez tous les pays reprsents dans lcole.

Pour rpondre cette question, il serait possible de faire une requte avec regroupement de donnes sur la colonne PAYS_ELEVE. Mais cette rponse nest pas judicieuse : on pourra avoir raliser ultrieurement des requtes dans lesquelles la notion de regroupement sajoute la slection de valeurs distinctes. Cest donc bien la zone Valeurs distinctes dans la feuille des proprits de la requte qui doit tre positionne Oui. La requte en code SQL est : SELECT DISTINCT PAYS_ELEVE FROM ELEVE; , beaucoup plus simple quune requte dote dun GROUP BY. Pour obtenir ce rsultat, effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1). 2. Placez dans la premire colonne du tableau le champ PAYS_ELEVE. 3. Dans le ruban, slectionnez la feuille des proprits. Positionnez la proprit Valeurs distinctes Oui .

EXERCICE 8
nonc * Solution

AFFICHAGE

DES PREMIERS LMENTS

Afchez les ID, noms et prnoms des 5 premiers lves.

Pour obtenir ce rsultat, effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1). 2. Placez dans les deux premires colonnes du tableau les champs NOM_ELEVE , et PRENOM_ELEVE . 3. Dans le ruban de cration de requte, cliquez sur licne Renvoyer et slectionnez la valeur 5 . Il ne sagit pas forcment des ID de 1 5, mais des 5 premiers enregistrements quAccess afchera. Cette option est destine nafcher quun aperu des donnes lorsque la table comprend un trs grand nombre denregistrements. La traduction SQL de cette requte donne : SELECT TOP 5 ID_ELEVE, NOM_ELEVE, PRENOM_ELEVE FROM ELEVE;.

Les requtes 107

Exercices

La gure 4.18 prsente les paramtres de cette requte. Figure 4.18


Paramtrage de lexercice 8.

EXERCICE 9
nonc * Solution

AFFICHAGE

AVEC REGROUPEMENT PAR PAYS ET COMPTAGE

Combien y a-t-il dlve par pays reprsent ?

La rponse cette question induit un regroupement par pays et un comptage sur ce mme critre. Pour obtenir ce rsultat, effectuez les actions suivantes : 1. Crez la requte partir de la table ELEVE (deux premires tapes de lexercice 1). 2. Placez dans les deux premires colonnes du tableau le champ PAYS_ELEVE , et nouveau PAYS _ELEVE . 3. Cliquez sur le bouton du ruban de cration de requte. On notera quAccess fait un tri sur la colonne de regroupement sans mme que cette option ait t demande (voir gure 4.19), puis changer lopration Regroupement de la deuxime colonne en Compte grce la liste droulante.

Figure 4.19
Paramtrage de lexercice 9.

EXERCICE 10 AFFICHAGE
nonc * Solution

AVEC JOINTURE

Afchez les noms des lves, leurs notes et la matire correspondante.

Cette question ncessite lintroduction des tables NOTE et MATIERE (voir gure 4.20). Pour obtenir ce rsultat, effectuez les actions suivantes :

108

Access 2007 et VBA

Chapitre

1. Crez la requte partir des tables ELEVE , NOTE et MATIERE . On constate que les relations entre les trois tables apparaissent automatiquement (puisque quelles sont tablies dnitivement dans le modle relationnel mis en place la n des exercices du chapitre 2). 2. Placez dans les colonnes du tableau les champs NOM_ELEVE , MATIERE et NOTATION . 3. La requte renvoie 19 760 enregistrements. Figure 4.20
Paramtrage de lexercice 10.

EXERCICE 11 AFFICHAGE
nonc

AVEC JOINTURE ET REGROUPEMENT

Afchez les noms des lves, la moyenne de leurs notes et la matire correspondante. Classez les lves par ordre alphabtique et par matire.

* Solution

Le regroupement sajoute ici la jointure des tables (voir gure 4.21). En premire analyse, les moyennes sont afches avec un grand nombre de chiffres aprs la virgule, ce qui est peu indicatif. Il faut limiter la prcision de la moyenne deux dcimales. 1. Repassez en mode cration de requte construite lexercice prcdent. 2. Cliquez sur le bouton du ruban de cration de requte pour faire apparatre lopration regroupement. 3. Modiez lOpration de la colonne NOTATION en Moyenne. 4. Double-cliquez du bouton droit sur la colonne NOTATION. 5. Slectionnez Proprits. 6. Dans la zone Format, prcisez Fixe. 7. Dans la zone Nombre de dcimales, prcisez 2.

Les requtes 109

Exercices

8. Enregistrez la requte sous le nom Req_4111 . Figure 4.21


Paramtrage de lexercice 11.

EXERCICE 12 APPEL
nonc

DE REQUTES MULTIPLES

Afchez les noms des lves, la moyenne de leurs notes et la matire correspondante. Classez les lves par ordre alphabtique et par matire. Les moyennes doivent tre arrondies au point le plus voisin.

* Solution

La question comporte un pige. La premire tentation consisterait utiliser une formule darrondi en utilisant la requte de lexercice 11. Or, cet essai sera infructueux : si la formule darrondi est applique directement, elle portera sur toutes les notes prises individuellement et non sur le rsultat nal. Il sagit de calculer dans un premier temps la moyenne par lve, puis de larrondir ensuite. Premire mthode Une premire solution, un peu lourde mettre en uvre, consiste rcuprer les rsultats de la requte Req_4111 et dy appliquer une formule darrondi, comme la gure 4.22. 1. Fermez toutes les requtes en cours. 2. Crez une nouvelle requte dont la source sera la Req_4111 . Slectionnez pour cela longlet requte lorsque la fentre Afcher la table apparat aprs la Cration de requte. Dans la liste choisissez Req_4111 . 3. Insrez les deux premires colonnes NOM_ELEVE et NOM_MATIERE . 4. Dans la troisime colonne, saisissez la formule : MoyenneFinale:Round([MoyenneDeNOTATION];0) o MoyenneFinale (en un seul mot) est lalias de la colonne et Round() la fonction darrondi.

Figure 4.22
Premire solution de lexercice 12.

110

Access 2007 et VBA

Chapitre

Seconde mthode Il existe une solution plus esthtique , nutilisant quune seule requte pour faire les deux oprations simultanment et dans le bon ordre : 1. Reprenez la requte Req_4111 . 2. Dans la colonne NOTATION, utilisez lOpration Expression (et non plus Moyenne). 3. Dans la zone Champ, la place de NOTATION, entrez lexpression : MoyenneFinale: Round(Moyenne([NOTATION]);0) o lon voit bien que la moyenne est calcule avant de larrondir. La gure 4.23 prsente ltat de la requte en cration. Figure 4.23
Seconde solution de lexercice 12.

EXERCICE 13 AFFICHAGE
nonc

DE LA MOYENNE GNRALE

Afchez les noms des lves et leur moyenne gnrale. Classez les lves du plus brillant au moins bon. On ne veut voir que ceux qui ont la moyenne.

* Solution

Ici, la table MATIERE nest plus utile puisquil sagit dune moyenne toutes matires confondues (voir gure 4.24). Pour obtenir ce rsultat, effectuez les actions suivantes : 1. Crez la requte 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 cration de requte pour faire apparatre lopration regroupement. 4. Modiez lOpration de la colonne NOTATION en Moyenne. 5. Ajoutez dans la colonne NOTATION le critre >=10 . 6. Cliquez du bouton droit sur la colonne NOTATION. 7. Slectionnez Proprits. 8. Dans la zone Format, prcisez Fixe.

Les requtes 111

Exercices

9. Dans la zone Nombre de dcimales, prcisez 2. Figure 4.24


Paramtrage de lexercice 13.

EXERCICE 14 AFFICHAGE
nonc

DE LA MOYENNE PAR MATIRE

Afchez les noms des lves et leur moyenne en franais. Les lves de cette nationalit tant avantags, ajoutez 2 points tous ceux de nationalit trangre.

* Solution

La table MATIERE est de nouveau ncessaire et donne lieu un critre de ltre sur la matire FRANCAIS. Une condition VraiFaux doit tre introduite pour solutionner le problme, insre dans Expression et non un regroupement ou tout autre calcul intgr (voir gure 4.25). La formule insrer dans la dernire colonne se rdige ainsi : NoteRvalue : VraiFaux([PAYS_ELEVE]<>"FR";Round((Moyenne([NOTATION])+2);2); Round(Moyenne([NOTATION]);2)) Pour obtenir ce rsultat, effectuez les actions suivantes : 1. Crez la requte 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 cration de requte pour faire apparatre lopration regroupement. 4. Ajoutez dans la colonne MATIERE le Critre FRANCAIS . 5. Modiez lOpration de la colonne NOTATION en Moyenne. 6. Cliquez du bouton droit sur la colonne NOTATION. 7. Pour la colonne NOTATION, slectionnez Proprits, dans la zone Format, prcisez Fixe, puis deux dcimales. 8. Changez le champ de la colonne NOTATION en NoteBrute:NOTATION.

112

Access 2007 et VBA

Chapitre

9. Dans une nouvelle colonne, indiquez dans la zone Champ la formule NoteRvalue prsente prcdemment. 10. Modiez le champ Opration de cette colonne en Expression. Figure 4.25
Paramtrage de lexercice 14.

EXERCICE 15 TABLEAU
nonc

CROIS DYNAMIQUE

Faites un tableau crois dynamique des lves et de leur moyenne par matire. Un tel tableau prsente aux croisements des lignes et des colonnes les valeurs correspondantes. Dans notre cas, les lignes indiqueront le nom des lves, les colonnes les matires et chaque cellule de ce tableau prsentera la note moyenne de chaque lve pour cette matire.

* Solution

Cet aspect des requtes na pas t prsent dans le cours. Il est possible, comme dans Excel, de monter des tableaux croiss pourvu que les donnes sy prtent, ce qui est le cas ici. Oprez de la manire suivante : 1. Fermez les ventuelles requtes ouvertes. 2. Crez une nouvelle requte et appelez les tables ELEVE , NOTE et MATIERE . 3. Dans le ruban du menu de cration de requte, cliquez sur le bouton Analyse croise . 4. Dans le damier du pav infrieur apparaissent deux nouvelles zones, lune dj connue et nomme Opration (pour les regroupements), lautre nomme Analyse pour dsigner les en-ttes de lignes et de colonnes. 5. Insrez le champ NOM_ELEVE dans la premire colonne. 6. Dans la zone Analyse de la premire colonne, indiquez En-tte de ligne. 7. Insrez le champ NOM_MATIERE dans la deuxime colonne. 8. Dans la zone Analyse, indiquez En-tte de colonne. 9. Insrez le champ NOTATION dans la troisime colonne. 10. Dans la zone Opration de la troisime colonne, indiquez Moyenne (au lieu de Regroupement pour les deux colonnes prcdentes). 11. Dans la zone Analyse de la troisime colonne, slectionnez Valeur. 12. Afchez le rsultat et largissez les colonnes an de pouvoir lire les donnes (au besoin, prcisez dans la proprit de la colonne NOTATION le format Fixe et le nombre de dcimales voulu).

Les requtes 113

Exercices

Le paramtrage dcrit et le rsultat obtenu sont prsents sur la gure 4.26. Figure 4.26
Paramtrage dun tableau crois et rsultats.

EXERCICE 16 TABLEAU
nonc

CROIS AVEC REGROUPEMENT

Prsentez le mme tableau qu la question prcdente, mais en utilisant la notion de Langue vivante et non plus en dtaillant Anglais, Allemand et Italien.

* Solution

Il suft de faire intervenir les tables GROUPE et REGROUPEMENT (mises en place dans lexercice 4 du chapitre 3) en sus de celles dj existantes pour obtenir le rsultat voulu. La colonne MATIERE comme en-tte de colonne doit tre remplace par le champ NOM_ GROUPE. Oprez de la manire suivante : 1. partir de la requte prcdente, ajoutez les tables GROUPE et REGROUPEMENT via licne Afcher la table du ruban. 2. Insrez une nouvelle colonne NOM_GROUPE , en premire position, avant la colonne NOM_ELEVE. Pour cela, slectionnez la colonne NOM_ELEVE actuelle et cliquez sur Insrer des colonnes dans le ruban. Dans cette premire colonne ajouter le champ NOM_GROUPE de la table GROUPE grce la liste droulante. Dans la zone Analyse de cette colonne, slectionnez En-tte de colonne. 3. Supprimez la colonne NOM_MATIERE pour ne conserver que les trois colonnes NOM_GROUPE, NOM_ELEVE, NOTATION comme cela est prsent sur la gure 4.27.

114

Access 2007 et VBA

Chapitre

Figure 4.27
Paramtrage de lexercice 16.

EXERCICE 17 REGROUPEMENT
nonc

ET COEFFICIENT

En reprenant lexercice prcdent, la notation doit dsormais tre corrige par un coefcient. Les coefcients sont les suivants : Histoire-gographie : 5. Langues vivantes : 4. Franais : 3. Physique-chimie : 2. Mathmatiques : 1. Prsentez les rsultats gnraux de la classe groupe de matires par groupe de matires en tenant compte du coefcient et prsentez dans le mme tableau la note nale.

* Solution

Lajout de la notion de coefcient oblige une modication des tables car elle nest insre nulle part. Le fait que lnonc donne un coefcient aux langues vivantes (et non chaque langue sparment) incite crer la notion au niveau de la table GROUPE et non celui de la table MATIERE. 1. Ouvrez la table GROUPE en mode cration. 2. Ajoutez un champ COEF_GROUPE , Numrique, Entier. Ne posez pas la consigne Null interdit car la table ne pourrait pas tre enregistre (les coefcients ne sont pas saisis). 3. Repassez en mode feuille de donnes et saisissez les coefcients indiqus. 4. Repassez en mode cration et mettez la proprit Null interdit Oui. 5. Refermez la table.

Les requtes 115

Exercices

Lutilisation dun tableau crois nest pas possible dans limmdiat pour au moins deux raisons : dune part, le tableau crois ne fait pas apparatre les rsultats gnraux (la moyenne des moyennes) ; dautre part, les en-ttes de colonnes et de lignes doivent tenir compte dune multiplication par un coefcient. Il faut donc procder par tapes successives : a. Calculer les moyennes coefcientes par lve et par matire ; en faire une premire requte. b. Monter un tableau crois partir de la requte prcdente dans une deuxime requte. c. Crer une troisime requte, appelant la deuxime et ajoutant une colonne de moyenne gnrale. La premire tape comprend la cration dune requte appelant toutes les tables (ELEVE, NOTE, MATIERE, GROUPE et REGROUPEMENT). Elle a la structure de la gure 4.28, o un alias MoyenneCoefciente prcde la multiplication de la note par le coefcient correspondant. 1. La zone champ de la premire colonne, contient NOM_ELEVE et la zone Opration est positionne Regroupement. 2. La zone champ de la deuxime colonne, contient NOM_GROUPE et la zone Opration est positionne Regroupement. 3. La zone champ de la troisime colonne, contient NOTATION et la zone Opration est positionne Moyenne. 4. La zone champ de la quatrime colonne, contient lexpression MoyenneCoefficiente: Moyenne([NOTATION]*[COEF_GROUPE]) et la zone Opration est positionne Expression. Figure 4.28
Premire tape de lexercice 17 (Requte Req_4117-1).

Il faut sauvegarder cette requte sous le nom Req_4117-1 pour pouvoir la rutiliser tout de suite aprs. En effet, la deuxime tape commence par crer une nouvelle requte de type Analyse croise (bouton dans le ruban) qui rcupre les donnes agrges de la requte Req_4117-1. 1. En premire colonne, le champ NOM_ELEVE est choisi, la zone Analyse est positionne En-tte de lignes, et la zone Opration Regroupement. 2. En deuxime colonne, le champ NOM_GROUPE est choisi, la zone Analyse est positionne En-tte de colonnes, et la zone Opration Regroupement. 3. En troisime colonne, la moyenne coefciente est reprise comme valeur (zone Champ affecte MoyenneCoefciente, et zone Analyse affecte Valeur), avec une fonction dagrgat quelconque (Somme, Moyenne ou autres, dans le champ Opration) ; elle ne peut pas tre une expression (qui ne ferait pas partie dun agrgat) et ne peut pas tre non plus un regroupement (puisque les deux axes sont dj utiliss). Essayez ces diffrentes possibilits et voyez les ractions dAccess. La fonction Somme employe ici nadditionne rien puisquune seule valeur est dclare par ligne dans la requte prcdente.

116

Access 2007 et VBA

Chapitre

La structure de la deuxime requte, quon enregistrera sous le nom Req_4117-2 , est prsente la gure 4.29. Figure 4.29
Deuxime tape de lexercice 17 (Requte Req_4117-2).

La dernire tape a pour but damliorer la prsentation (les moyennes sont afches avec de nombreuses dcimales) et dajouter la moyenne nale de chaque lve sur 20. 1. Aprs avoir enregistr la requte prcdente et lavoir ferme, crez-en une nouvelle. 2. Dans la fentre dafchage des tables et requtes, slectionnez la requte Req_4117-2 . 3. On constate que la liste des champs afchs porte le nom des matires, qui sont devenues des en-ttes dans le tableau crois. 4. Cliquez sur le bouton pour passer en mode Regroupement de donnes . 5. Insrez le champ NOM_ELEVE dans la premire colonne, prcd de lalias Nom pour parfaire la prsentation. 6. La deuxime colonne contient une expression, et non un regroupement, de la forme : Littrature: Round(Somme([Franais]);2) . Lalias ne doit pas porter le mme nom quun champ : cest la raison pour laquelle nous avons employ le mot Littrature. La fonction Somme() est prsente car une fonction agrgat doit imprativement tre utilise mais, encore une fois, la fonction ne fait quadditionner un seul chiffre. La fonction Round() arrondit le rsultat 1. 7. Prsentez les 4 autres matires sous la mme forme que le Franais. On prendra garde la prsence des parenthses et des crochets, indispensables. Les formules sont respectivement : Histoire-Go: Round(Somme([HISTOIRE-GEOGRAPHIE]);2) Langues: Round(Somme([LANGUES_VIVANTES]);2) Maths: Round(Somme([MATHEMATIQUES]);2) Physique: Round(Somme([PHYSIQUE-CHIMIE]);2). 8. La dernire colonne contient une dernire expression pour calculer la moyenne gnrale : Moyenne Gnrale sur 20: Round(((Somme([Franais])+Somme([HISTOIREGEOGRAPHIE])+Somme([LANGUES_VIVANTES])+Somme([MATHEMATIQUES]) +Somme([PHYSIQUE- CHIMIE]))/15);2) .

1. La prsentation des rsultats (proprit Format Fixe 0 dcimales) ne fonctionne pas toujours correctement dans ce type de tableau ; il est donc prfrable de forcer le rsultat par lusage dune fonction dans lexpression.

Les requtes 117

Exercices

Note
Le chiffre 15 a t mis ici pour simplier la somme des coefcients de toutes les matires. Ce procd peu orthodoxe sera avantageusement remplac par une fonction qui va additionner tous les coefcients de la table GROUPE ; or, nous navons pas encore tudi cette fonction de domaine. La bonne tournure serait SomDom("[COEF_GROUPE]";"GROUPE").

La structure de la dernire requte est prsente la gure 4.30. Figure 4.30


Troisime tape de lexercice 17 (Requte Req_4117-3).

EXERCICE 18 REQUTE AJOUT


nonc * Solution
Ajoutez la note de 14 en mathmatiques Martin EDEN.

Cet nonc trs court revt en fait plusieurs difcults : la matire est exprime alphabtiquement alors que la table NOTATION ne comporte que des IDs, le nom de llve est cit alors que la mme table NOTATION ne contient que les numros des lves. En outre, un champ supplmentaire est obligatoire dans la table NOTATION concernant la date dattribution de la note. Deux manires de procder sont possibles : soit rdiger une requte ajout aprs avoir consult les tables et repr les ID de la matire et de llve ; soit rdiger une requte ajout qui parvient utiliser les noms contenus dans les champs adquats. Nous utiliserons les deux mthodes qui nous conduiront dcouvrir de nouvelles fonctionnalits. Premire mthode Crez une nouvelle requte de la manire suivante : 1. 2. 3. 4. Appelez la table NOTE . Cliquez sur le bouton Ajout du ruban. Dans la fentre qui souvre, notiez que les ajouts se feront dans la table NOTE . Faites glisser le champ ID_ELEVE dans la premire colonne : vous noterez quAccess place automatiquement le champ ID_ELEVE dans la zone Ajouter : la similitude des noms suft. Saisissez la suite du nom de champ le signe deuxpoints et le chiffre 1 (correspondant llve EDEN).

118

Access 2007 et VBA

Chapitre

5. Faites glisser le champ ID_MATIERE en deuxime colonne. Ajoutez la suite du nom de champ le signe deux-points et le chiffre 2 (correspondant la matire Mathmatiques). 6. Faites glisser le champ NOTATION en troisime colonne, ajoutez la suite du nom de champ le signe deux-points et le chiffre 14 . 7. Faites glisser le champ DATE_NOTE en quatrime colonne, ajoutez la suite du nom de champ le signe deux-points et la formule Date() . Cette formule (suivie par des parenthses) est une fonction Access qui renvoie la date du jour. 8. Cliquez sur le bouton Excuter : vous constatez avec effroi que le programme va ajouter des dizaines de milliers de lignes, ce qui nest pas du tout votre intention ! 9. Annulez cette commande qui provient du fait que tous les enregistrements de la table NOTE sont compts pour linsertion. 10. Retirez la table NOTE du pav suprieur en appuyant sur la touche Sup. du clavier aprs avoir cliqu dans la table. 11. Cliquez de nouveau sur Excuter : cette fois, une seule ligne sera insre. Acceptez lopration. 12. Enregistrez cette requte sous le nom Req_421-1 . Le code SQL de cette requte est : INSERT INTO [NOTE] (ID_ELEVE, ID_MATIERE, NOTATION, DATE_NOTE ) SELECT 1 AS ID_ELEVE, 2 AS ID_MATIERE, 14 AS NOTATION, Date() AS DATE_NOTE; La gure 4.31 prsente les paramtres de cette requte. Figure 4.31
Premire solution de lexercice 18 (Req_421-1).

Seconde mthode Cette deuxime mthode fait appel la notion de sous-requte, que nous navons pas encore tudie, et lutilisation dun subterfuge d limperfection de linterprteur de requte dAccess. Il est ncessaire tout dabord de crer une table fantme quon appellera TABLEVIDE, contenant un et un seul enregistrement : 1. Crez la table avec pour seul champ le N tabli par dfaut. 2. En mode cration, nommez-la TABLEVIDE . 3. En mode feuille de donnes, validez une ligne pour obtenir un et un seul enregistrement. 4. Fermez la table. Reprenons la premire requte :

Les requtes 119

Exercices

1. La requte Req_421-1 tant ferme, cliquez du bouton droit dessus et slectionnez Copier . 2. Dans le volet de navigation, cliquez du bouton droit et slectionnez Coller . 3. Renommez la nouvelle requte Req_421-2 (en lieu et place de Copie de Req_421-1). 4. Ouvrez la nouvelle requte en mode cration.

5. Ajoutez la table TABLEVIDE 1 grce licne Afcher la table du ruban. 6. la place de la valeur 1, positionne aprs lalias de la premire colonne ID_ELEVE, insrez le texte suivant entre parenthses, correspondant une requte pour retrouver lID de llve partir de son nom : (SELECT ID_ELEVE FROM ELEVE WHERE NOM_ ELEVE="EDEN"). 7. la place de la valeur 2, positionne aprs lalias de la deuxime colonne, insrez le texte suivant entre parenthses (SELECT ID_MATIERE FROM MATIERE WHERE NOM_ MATIERE="MATHEMATIQUES") La requte, fonctionnelle, possde la structure de la gure 4.32 2, son excution affecte la note 14 llve EDEN en Mathmatiques. Figure 4.32
Seconde solution de lexercice 18 (Req_421-2).

EXERCICE 19 REQUTE SUPPRESSION


nonc * Solution
Supprimez la ou les notes qui viennent dtre ajoutes lors de lexercice prcdent.

1. 2. 3. 4.

Crez une nouvelle requte. Appelez la table NOTE . Cliquez dans le ruban sur licne Suppression. Faites glisser les quatre champs ID_ELEVE , ID_MATIERE , NOTATION et DATE_NOTE dans les colonnes du pav infrieur. 5. Insrez dans la zone Critres les mmes que ceux de lexercice prcdent, soit respectivement 1 , 2 , 14 et Date() , pour obtenir le dessin de la gure 4.33.

1. Il est obligatoire dutiliser ce subterfuge car Access refuse de faire des sous-requtes si une table au moins nest pas cite dans le FROM. 2. Une troisime solution consisterait utiliser la fonction RechDom(), non encore tudie, et qui naurait pas utilis la notion de sousrequte, bien utile par ailleurs.

120

Access 2007 et VBA

Chapitre

Figure 4.33
Requte suppression.

EXERCICE 20 REQUTE MISE


nonc

JOUR

Modiez toutes les notes en leur ajoutant 2 points sauf si la note est dj suprieure ou gale 18.

* Solution

Lexercice permet de modier en bloc toutes les notes. La condition pose (sont exclues les notes suprieures 18) vite de voir des lves dots dun 21/20, par exemple ! 1. Crez une nouvelle requte. 2. Appelez la table NOTE . 3. Cliquez sur le bouton Mise jour du ruban. 4. Faites glisser le champ NOTATION dans la premire colonne. 5. Dans la zone Mise jour, en bas dcran, insrez la formule [NOTATION]+2 . 6. Dans la zone critres, saisissez <18 . La syntaxe SQL de cette requte dont la reprsentation graphique est en gure 4.34 est : UPDATE NOTE SET NOTATION=NOTATION+2 WHERE NOTATION<18; .

Figure 4.34
Requte mise jour.

Les requtes 121

Exercices

Chapitre

Les formulaires

1. Les grands principes de fonctionnement ................. 124 2. La manipulation des outils ..... 131 Problmes et exercices 1. Formulaire unique daffichage des lves ............................. 151 2. Formulaire et sous-formulaire des lves et de leurs moyennes 155 3. Formulaire avec zone de liste et ractualisation ................... 160

Le formulaire constitue loutil graphique essentiel pour la prsentation des donnes stockes dans les tables, leur modification ou linsertion de nouvelles donnes. Ce chapitre prsente en premier lieu les grands principes de fonctionnement des formulaires, puis tudie tous les outils mis disposition du programmeur pour manipuler les donnes, quel que soit leur genre. Lobjectif final consiste construire ex nihilo une interface complte homme/machine permettant un utilisateur de manipuler ses donnes dans un contexte ergonomique et scuris.

123

(1)

Les grands principes de fonctionnement


Avec Access 2007, la mise en uvre dun formulaire est devenue dune extrme simplicit. Nous commencerons par dnir les lments principaux constitutifs du paysage de ces documents partir de la base CODES_POSTAUX de la partie thorique du chapitre prcdent. 1. Ouvrez la base CODES_POSTAUX et slectionnez la table CODE_POSTAL , sans pour autant louvrir. 2. Dans la barre de menu Crer , cliquez sur licne Formulaire (et non pas cration de formulaire que nous utiliserons plus tard). Un formulaire est dj cr, tel que montr la gure 5.1, et il se visualise immdiatement en mode formulaire, par opposition au mode cration grce auquel on le modie. Sa prsentation, tout fait correcte, est susceptible damlioration. Dune manire gnrale, il est prfrable douvrir les documents crs automatiquement, et non dmarrer dun formulaire totalement vierge partir du bouton du ruban Cration de formulaire.

Figure 5.1
Formulaire initial en mode Formulaire.

Les diffrents lments de ce simple afchage doivent tre prcisment numrs an que les proprits de lobjet formulaire soient bien comprises et retrouves dans le ddale des options possibles : En haut, dans longlet, le nom de lobjet (dont lintitul peut tre modi par la proprit Lgende) ; Au-dessous, une zone bleue, xe, nomme En-tte de formulaire ; Au milieu, une zone blanche nomme Dtail ;

124

Access 2007 et VBA

Chapitre

En bas une deuxime et dernire zone xe nomme Pied de formulaire, qui napparat pas ici ; gauche, dot dun petit triangle en haut, le Slecteur, qui correspond un enregistrement ; Tout en bas, les boutons de dplacement ; Dans le corps du formulaire, deux contrles, qui sont plus prcisment des zones de texte ; chacune dentre elles se compose dune tiquette (qui restera xe) et de la zone de texte proprement dite (qui verra dler le contenu des enregistrements). Tous ces lments, afchables ou non, peuvent changer de forme, de couleur et autres caractristiques. Cliquez dans le ruban sur le triangle situ sous le bouton Afchage et passez en mode cration 1 : vous observez la constitution mme du document tel quil apparat la gure 5.2. Figure 5.2
Formulaire initial en mode cration.

1.1 CONVENTIONS

DE NOMS

Avec la nouvelle prsentation du volet de navigation dAccess 2007, le nom qui est attribu au formulaire peut tre diffrent de celui qui apparat dans le volet de navigation et diffrent du nom qui apparat dans longlet de la barre suprieure. An de bien distinguer tous les lments dune base requtes, formulaires et macros de nombreux dveloppeurs font prcder les formulaires dun prxe Frm_ ou Form_ ou simplement F_. Cette syntaxe particulire, applique aussi avec les bases Access 2003 et antrieures, savre bien utile lorsquon se sert de fonctions complexes comme les fonctions de domaine (SomDom, RechDom, qui seront tudies ultrieurement). Cest la mme convention qui prvaut pour les autres objets Req_ (pour les requtes) et Mcr_ (pour les macros) : on sefforcera de raccourcir au maximum le nom des objets et dviter les espaces. Dans la pratique, une convention de noms bien organise emploie trois rfrences : Le nom du formulaire proprement dit (prx par Frm_ par exemple), technique. Le nom qui apparatra dans le volet de navigation (correctement orthographi et clair mais sufsamment court). Le nom de longlet suprieur (correctement orthographi et libre), renseign par la proprit Lgende de la feuille de proprit du formulaire.

1. On peut aussi faire un clic droit dans le document et slectionner Cration.

Les formulaires 125

Ds lors, nous ne cherchons pas tout de suite monter un volet de navigation mais seulement enregistrer le nouveau formulaire qui vient dtre cr sous un nom conforme la convention : 1. Cliquez du bouton droit sur longlet CODE_POSTAL du formulaire en cours de cration. 2. Slectionnez Enregistrer . 3. la place de CODE_POSTAL (un nom identique au nom de la table source pourrait amener de graves confusions), saisissez Frm_Codes 1. Dsormais un nouvel objet apparat dans le volet de navigation. Sil nest pas visible, cliquez sur le triangle suprieur du volet et slectionnez Tous les objets par Type dobjets .

1.2 LES

FEUILLES DE PROPRITS Ouvrez nouveau le formulaire en mode cration (slection du formulaire dans le volet de navigation, clic-droit, puis Mode cration), cliquez du bouton droit dans le corps du document (partie bleue en dessous de Pied de formulaire) et slectionnez Proprits . La feuille de proprit apparat telle qu la gure 5.3, qui montre toutes les proprits de tous les objets contenus dans le formulaire.

Figure 5.3
Feuille de proprits.

En haut gauche, une zone de liste droulante fait apparatre tous les objets du formulaire, qui portent tous un nom : le formulaire lui-mme a sa feuille de proprit ; il existe deux zones de texte CODE et VILLE ; dautres lments encore ont leur feuille de proprit : les tiquettes, len-tte, etc. Les onglets sous la zone de liste droulante montrent, par catgorie, les diffrentes proprits car il en existe un grand nombre. Le dernier onglet Toutes liste toutes les proprits des onglets prcdents. Contrairement un prjug, lexprience montre quil est plus rapide de retrouver une proprit par longlet Toutes quen cherchant parmi les autres. Longlet Format liste toutes les proprits ayant trait la prsentation de lobjet (taille, couleur, etc.).
1. Par dfaut, longlet qui apparait dans la barre suprieure porte le nom du formulaire, mais il est toujours possible de nommer diffremment longlet en utilisant la proprit Lgende du formulaire.

126

Access 2007 et VBA

Chapitre

Longlet Donnes regroupe les options relatives aux valeurs prsentes dans lobjet (source, droits de modication, etc.). Longlet vnement contient les liens avec les macros ou le code Visual Basic excuter, loccasion dvnements prcis (sur clic, avant ou aprs mise jour, etc.). Longlet Autres rassemble toutes les proprits non incluses dans les options prcdentes.

1.3 FORMULAIRE

UNIQUE OU CONTINU

Ds la cration dun formulaire, lun des aspects les plus importants mettre en place consiste dnir le mode dafchage des donnes, soit en mode unique, soit en mode continu. 1. Ouvrez la feuille des proprits du formulaire. 2. Choisissez Formulaire dans la liste droulante suprieure. 3. Descendez la proprit Afchage par dfaut. 4. Ouvrez la liste droulante droite de cette zone. 5. Slectionnez Formulaires continus . 6. Fermez la feuille des proprits et repassez en mode formulaire (bouton de gauche en bas de la fentre). Lafchage des donnes change (voir gure 5.4) : on lit les six premiers enregistrements (sur 8 009) de la table et non plus un seul ; les donnes dlent avec les boutons de dplacement en bas, les touches PgDn/PgUp du clavier ou la barre de dlement vertical droite de lcran. Figure 5.4
Afchage du formulaire en mode continu.

Les formulaires 127

Au seul plan ergonomique, certaines rgles doivent tre respectes : si un enregistrement comporte de trs nombreuses colonnes, il est toujours souhaitable dafcher les donnes en formulaire unique : le grand nombre de contrles rend la lecture difcile en mode continu ; en cas de formulaire servant entrer de nouvelles donnes, le mode unique est prfrable au continu ; inversement, si le formulaire est destin un balayage visuel permanent et des manipulations de lecture/modication, le continu est recommander. Au plan technique, le choix induit les consquences suivantes : un formulaire en mode unique na pas ncessairement besoin den-tte et de pied puisque tous les lments sont inclus dans la mme fentre (y compris un titre de fentre et des zones de renseignements divers) ; un formulaire en mode continu implique toujours la prsence dun en-tte dans lequel on insrera un titre et des en-ttes de colonnes (celles qui apparaissent dans le corps) ; le pied de formulaire sert souvent afcher des totaux. Outre les modes continu et unique, un formulaire peut safcher : en mode feuille de donnes, auquel cas il ressemble sy mprendre la prsentation dune table ; en mode double afchage : cette nouvelle prsentation est particulire Access 2007. Elle montre les donnes en deux fentres : lune en formulaire et lautre en feuille de donnes ; en mode tableau ou graphique crois dynamique ; on rservera ces prsentations aux donnes qui sy prtent : sauf de rares cas, il ne sagit que de formulaires en lecture seule.

1.4 FORMULAIRE DAJOUT

OU DE MODIFICATION

Dans le cadre de lutilisation de formulaires pour contrler la saisie ou la modication des donnes par les futurs utilisateurs, il est vivement recommand de spcier des formulaires diffrents pour la lecture, la cration et la modication de donnes (sans parler des suppressions, traiter souvent part). La saisie de nouvelles donnes donne lieu, dans la plupart des cas, la mise en place de rgles de gestion dans le formulaire pour contrler au plus prs la qualit des entres. Deux exemples pour illustrer ce propos : la saisie dun Relev dIdentit Bancaire, il existe toujours un petit programme associ qui vrie le numro de cl du RIB. la saisie dun nouveau client, il existe souvent des procdures pour vrier que le client nexiste pas dj. La prsence de nombreuses rgles de gestion pousse toujours un peu plus le programmeur vers la solution dune sparation entre le formulaire Ajout de donnes et le formulaire dafchage des donnes existantes. Pour citer un cas concret, la dmarche frquemment utilise sera la suivante : a. lutilisateur se trouve dans un formulaire de consultation ;

128

Access 2007 et VBA

Chapitre

b. il dispose dune zone de liste droulante qui montre, par exemple, tous les clients ; c. il peut soit saisir le nom (la zone de liste afche au fur et mesure les donnes correspondant aux caractres saisis), soit faire dler la zone de liste ; d. sil ne trouve pas le client, il saisit son nom et valide ; e. le programme ouvre une bote message Le client nexiste pas. Voulez-vous le crer ? ; f. en rpondant Oui , lutilisateur passe (sans le savoir parfois) dun formulaire de consultation un formulaire de cration. Ces diffrents cas de gure se mettent en place dans la feuille de proprits du formulaire, et plus prcisment dans longlet Donnes : La proprit du formulaire Entre donnes, positionne par dfaut Non, permet lutilisateur soit de consulter, soit dentrer des donnes. Si elle est positionne Oui, le formulaire ne peut plus servir qu linsertion. La proprit du formulaire Ajout autoris, positionne par dfaut Oui, permet lutilisateur dinsrer de nouvelle donnes. Positionne Non, le formulaire ne peut plus servir qu la lecture ou la modication. La proprit du formulaire Suppression autorise, qui est par dfaut Oui, peut tre inverse. La proprit du formulaire Modication autorise, qui est par dfaut Oui, peut tre inverse. Lensemble de ces proprits permet de raliser toutes les combinaisons possibles, depuis la position la plus souple, celle par dfaut, jusqu la plus rigide, avec par exemple, un seul droit de lecture uniquement, sans insertion, ni modication, ni suppression. Une bonne dmarche du concepteur consiste donc, ds le dbut du projet, dissocier tous les formulaires entre ceux qui permettent de crer des donnes (et/ou en supprimer) et ceux qui permettent de les visualiser (et/ou modier). Ds la cration du formulaire, les premires proprits dnies concerneront le mode dafchage (continu/unique) et le mode de saisie (combinaison des proprits listes ci-dessus).

1.5 LES

SOURCES DE DONNES Dans le cas du formulaire des codes postaux, la source des donnes est, directement, la table CODE_POSTAL. Cette proprit se vrie dans la zone Source de la feuille des proprits du formulaire. Ce cas de gure est relativement rare : dans la plupart des cas, la source des donnes est prcise diffremment et, le plus souvent, rsulte dune requte car plusieurs tables sont invoques. La dmarche la plus rpandue passe par les tapes suivantes : cration dune requte qui appelle toutes les donnes qui seront ncessaires au formulaire, enregistrement de la requte ; cration dun formulaire dont la source de donnes est la requte cre prcdemment. Dans la pratique, il pourra donc exister, par exemple : une requte nomme Req_saisie_codes ; un formulaire nomm Frm_saisie_codes ;

Les formulaires 129

une requte nomme Req_modif_codes ; un formulaire nomm Frm_modif_codes. Bien que cet agencement soit le plus rpandu, il ne manque pas de poser des problmes des niveaux informatiques dun autre ordre : si la requte appelle de nombreuses donnes et que la base Access est utilise en environnement rseau multi-utilisateurs, la remonte des donnes depuis le serveur vers le poste utilisateur va reprsenter un encombrement rseau non ngligeable : le nombre denregistrements bloqus en raison de leur manipulation par un premier utilisateur risque de poser des problmes dergonomie et de temps de rponse. Comme on le verra plus loin, il est tout fait possible de ne pas citer de source de donnes au niveau du formulaire, et de faire des appels cibls la base de donnes pour afcher au moment le plus opportun linformation la plus prcise. 1. Ouvrez le formulaire Frm_codes en mode cration. 2. Afchez la feuille de proprits du formulaire. 3. Dans longlet Toutes , cliquez sur la premire zone nomme Source. 4. droite de la fentre apparaissent une zone de liste droulante et un carr muni de trois petits points. La zone de liste droulante ouverte montre toutes les sources de donnes directement disponibles, tables et requtes. Si lune dentre elles est choisie, cest lensemble des donnes de cette source qui sera renvoy lutilisateur. Un clic sur la zone voisine dmarre le gnrateur de requtes et ouvre une fentre davertissement. 1. Rpondez Oui la cration dune requte. 2. Lcran qui souvre est trs exactement celui des requtes tudies au chapitre 4. 3. Insrez les champs CODE et VILLE dans la requte. 4. Posez le critre Comme "01*" dans la colonne CODE (le formulaire ne prsentera plus que les villes du dpartement de lAin). 5. Fermez la fentre de la requte et validez lenregistrement de la requte SQL. La proprit Source du formulaire nest plus CODE_POSTAL (la totalit de la table des codes), mais la requte : SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE Like "01*";. Cette requte limitative rduit notablement le nombre de donnes traiter. Passez en mode formulaire pour voir le rsultat. En rsum, la proprit Source du formulaire varie entre : une table. une requte enregistre comme telle. une requte insre dans le formulaire dans sa proprit Source. ou bien rien du tout (les donnes seront appeles plus tard).

130

Access 2007 et VBA

Chapitre

(2)

La manipulation des outils


Un formulaire est constitu de contrles, chacun dentre eux permettant de visualiser des informations (contrles de zones) ou de dclencher des actions (boutons). Tous constituent autant doutils la disposition du programmeur pour mettre en place une interface homme/machine rigoureusement organise. Nous tudions ci-aprs en dtail tous les contrles utilisables.

2.1 LES

CONTRLES DE FORMULAIRE Quand un formulaire est ouvert en mode cration, la barre de menu suprieure comporte un onglet supplmentaire Cration contenant toutes les icnes destines btir et modier le document ; sa partie centrale regroupe les contrles de formulaire utilisables, prsents la gure 5.5.

Figure 5.5
Contrles du ruban de cration de formulaire.

Les contrles de zones


Les contrles zones de texte Comme son nom lindique, une zone de texte dite des caractres : ceux-ci peuvent dler, le cas chant, si la longueur du texte excde celle de la zone. Si lautorisation y est accorde, les zones de texte permettent lafchage, la modication ou la suppression. Elles peuvent recevoir des caractres mis depuis le presse-papier (le rsultat dun coller) ou bien faire lobjet dun copier pour rditer les donnes ailleurs. Au plan de la prsentation, les caractres peuvent tre rgls comme dans un traitement de texte (police, taille, gras, etc.). Toutefois, pour des raisons videntes de confort graphique, il est dconseill de faire varier ces coordonnes dune zone une autre, dun formulaire un autre. Il savre prfrable de rgler ces paramtres par dfaut au dbut dun nouveau projet et de sy tenir pour lensemble du logiciel cr. Dans les options dAccess (bouton Ofce) : la page Feuille de donnes paramtre les valeurs par dfaut pour la prsentation des feuilles ; la page Concepteur dobjets paramtre les valeurs par dfaut dans la cration des tables, requtes et formulaires. La source des donnes qui vont safcher peut tre : un champ parmi ceux qui sont renvoys par la table ou la requte la source du formulaire ;

Les formulaires 131

le rsultat dune formule faisant appel des donnes externes au formulaire (du type RechDom) ; le rsultat dune formule, de tout type, interne au formulaire. Une zone de texte est soit lie un enregistrement, soit indpendante de tout enregistrement, mais elle ne peut pas, sauf formule particulire, tre lie un groupe denregistrement. Voici un exemple dutilisation dune zone de texte : 1. Dans le menu Crer , cliquez sur licne Cration de formulaire : Access ouvre un formulaire vierge nomm Formulaire1 . 2. Dans la barre dicnes du menu Cration , cliquez sur Zone de texte. 3. Dessinez un rectangle en haut de page et relchez la souris : le programme cre en mme temps une tiquette de zone de texte, gauche, et la zone de texte proprement dite. Si lon dplace lun des deux objets, lautre suit ; mais il est possible de les manipuler sparment en cliquant et glissant partir de langle suprieur gauche de lun des deux objets. 4. Cliquez dans le libell Texte0 de ltiquette, et remplacez ce libell par Ceci est une zone de texte . Ncessairement, vous devrez dplacer ltiquette pour laisser visible la zone adjacente. 5. Cliquez du bouton droit sur ltiquette et slectionnez Proprits (ou bien cliquez dans la barre dicne sur Feuille de proprits). 6. Vous noterez que le nom de ltiquette est Etiquette1 (attribu automatiquement par Access), alors que la lgende est le texte afch en mode formulaire ; le cas chant, modiez le nom de ltiquette pour bien la distinguer des autres objets. Attention ! Un nom de contrle dans un formulaire est obligatoirement unique. Une convention de nom judicieuse consiste nommer les tiquettes en les prxant par Eti_ et en dsignant 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 proprits ouverte : le nom du contrle est Texte0 et la source nest pas renseigne. Dans la mesure o le formulaire lui-mme na pas de source de donnes, aucun champ nest disponible. Vous pouvez, provisoirement, insrer la valeur 2 ou le mot Bonjour dans le champ Source contrle : ces valeurs sont afches de manire statique dans le formulaire. 8. Soit avec les boutons de la barre dicne, soit avec les proprits de la feuille, vous pouvez modier la police, la taille et la couleur des caractres ; les caractristiques du fond de la zone et de ses bordures sont modiables galement. On prendra garde permettre une lecture correcte de tous les caractres du champ en tenant compte de sa longueur maximale. 9. Cliquez du bouton droit sur longlet Formulaire1 , en haut, puis slectionnez Enregistrer . 10. Nommez votre formulaire Frm_Essais_Contrles .

132

Access 2007 et VBA

Chapitre

Un exemple de zone de texte est prsent la gure 5.6. Figure 5.6


Une zone de texte.

Les contrles tiquettes Les tiquettes ne peuvent pas invoquer une source de donnes, ce sont de simples libells qui serviront pour les titres, en-tte de colonnes et autres zones de texte xe. 1. Dans le mme formulaire dessais, cliquez sur licne Etiquette et dessinez un rectangle tout en haut de page. 2. Saisissez lintitul Titre du formulaire directement dans le rectangle. Vous noterez quAccess insre un message dalerte gauche : si lon clique sur licne jaune, Access informe que cette tiquette nest lie aucun contrle (ce type de message est nouveau avec Access 2007) : ce message na rien dtonnant puisque ltiquette est effectivement isole ! Les contrles de zones de liste droulante Il ne faut pas confondre zone de liste (simple) quon verra plus loin et zone de liste droulante telle quelle est prsente la gure 5.7. Cette dernire est dabord destine contraindre lutilisateur faire un choix unique. Le principe en est le suivant : lorsque la zone de liste droulante est utilise, elle est au dpart vide de tout libell ; lutilisateur peut ouvrir la liste droulante grce au petit triangle situ droite et slectionner une valeur parmi une liste provenant soit dune liste de valeurs entres par le programmeur, soit dune requte. Le choix ne peut tre quunique. Le contrle zone de liste droulante prend alors la valeur de loccurrence choisie ; mais lutilisateur peut aussi saisir un texte dans la zone gauche du triangle : au fur et mesure de sa frappe, la fentre qui sest ouverte prsente toutes les occurrences qui se rapprochent au mieux du texte entr. Encore une fois, le choix ne peut tre quunique parmi les items renvoys par une liste de valeurs ou une requte. le contrle peut tre programm pour naccepter quune des occurrences de la liste (la proprit du contrle Limiter liste est positionne Oui) ou bien accepter une valeur nouvelle (la mme proprit est Non) et dans ce cas, le programmeur prvoit une procdure an de poursuivre le traitement : enregistrement du nouvel item dans une table, simple poursuite avec avertissement, etc. Une zone de liste droulante peut comporter plusieurs colonnes et souvrir sur un nombre ditems paramtrable ; certaines des colonnes peuvent tre caches (une colonne didentiant en particulier) et le programmeur peut citer la colonne dont la valeur pourra tre stocke pour un usage ultrieur.

Les formulaires 133

La zone de liste droulante est un lment essentiel de la saisie guide de lutilisateur : plus elle pourra tre utilise, plus le travail de loprateur en sera facilit et cadr. Figure 5.7
Une zone de liste droulante ouverte.

Voici la liste des actions pour crer une liste droulante de slection des codes postaux (voir gure 5.7). 1. Dans le formulaire dessais, fermez le cas chant, la feuille de proprits. 2. Dans le ruban, cliquez sur licne Zone de liste droulante, et tracez un rectangle dans le formulaire. 3. Un assistant de cration de zone de liste droulante souvre, proposant dabord soit dutiliser comme source du contrle une table ou une requte, soit dinsrer une liste de valeurs xe. choisissez la premire option de table comme source et cliquez sur Suivant . 4. Pointez la table CODE_POSTAL comme source du contrle dans la deuxime tape puis cliquez sur Suivant . 5. Dans la troisime tape, slectionnez les deux champs Code et Ville et placezles dans le pav de droite an quils apparaissent dans les champs afchs, puis cliquez sur Suivant . 6. Ne demandez pas, dans ltape suivante, de tri particulier des donnes : les codes postaux sont dj tris; cliquez sur Suivant . 7. Access propose, dans la cinquime tape, de cacher la cl de la table (les codes postaux) ; dans le cas prsent, cette proposition nest pas adquate car les codes postaux sont indicatifs : dcochez cette option. 8. Rglez la largeur des colonnes an dadapter la colonne CODE la largeur constante de 5 caractres et largissez la colonne VILLE pour bien lire le libell des communes. 9. La dernire tape consiste opter pour une colonne qui servira de valeur de renvoi au contrle : slectionnez la valeur par dfaut CODE et cliquez sur Terminer .

134

Access 2007 et VBA

Chapitre

La zone de liste droulante peut tre teste : elle est parfaitement fonctionnelle. Cliquez du bouton droit sur ce contrle et consultez la liste des proprits : Le nom du contrle est Modiable5, nom attribu par dfaut : il peut tre chang, par exemple, par Choix_Code. La proprit Source est vide, ce qui est normal, alors que la proprit Contenu est : SELECT [CODE_POSTAL].[CODE], [CODE_POSTAL].[VILLE] FROM CODE_POSTAL; . Cette requte SQL se vrie en cliquant sur les trois points droite de la proprit. Elle est modiable par les mmes moyens. La proprit Nombre de colonnes est deux, correspondant au nombre de colonnes choisi au moment de la cration avec laide de lassistant. La proprit Largeurs de colonnes est libelle en centimtres, chaque chiffre tant spar du suivant par un point-virgule. La proprit Colonne lie est xe 1, correspondant la colonne CODE choisie prcdemment. On notera pour nir que toutes les proprits du type vnement sont vides : il ny a pas daction programme sur ce contrle pour le moment. Les contrles de zones de liste La dmarche dutilisation dune zone de liste diffre de celle dune liste droulante. Ds lafchage du formulaire, moins quune mise jour ne soit ncessaire, la zone de liste est dj servie denregistrements en provenance dune liste de valeurs ou dune requte ; il nexiste pas de triangle ouvrant la liste. Une ou des actions se dclenchent lors dun clic ou un double-clic sur un lment de la liste. Le choix de plusieurs items dans la liste est possible, ds lors que le programmeur la autoris (proprit : Slection multiple). La zone de liste servira donc en priorit pour lancer des actions qui reprennent comme paramtres les items choisis dans la liste. Un exemple illustrera cette utilisation : imaginons que lutilisateur ait regrouper plusieurs bons de commandes pour lancer la facturation correspondante. Si la liste des bons de commandes en attente de facturation est prsente dans une zone de liste, lutilisateur slectionnera les bons adquats et lancera un programme qui fera le regroupement demand. Voici la mise en uvre dune zone de liste slection multiple : 1. Fermez, le cas chant, la feuille de proprits ouverte. 2. Le formulaire dessais tant ouvert en mode cration, cliquez dans le ruban sur licne Zone de liste et dessinez un large rectangle. 3. Un nouvel assistant, destin aux Zones de listes, souvre : choisissez encore une fois une table comme source des donnes (proprit Contenu du futur contrle) et cliquez sur Suivant . 4. Slectionnez la table CODE_POSTAL . 5. Dplacez les deux champs CODE et VILLE dans le pav de droite pour quils soient afchs.

Les formulaires 135

6. Nutilisez pas de fonction de tri particulire. 7. Dcochez loption de non-afchage de la cl, comme dans lexemple prcdent, et rglez les largeurs de colonnes. 8. Retenez le champ Code comme colonne lie et cliquez sur Terminer . Le rsultat safche comme lexemple de la gure 5.8. Figure 5.8
Une zone de liste slection multiple.

En passant en mode formulaire, vous constatez que la zone de liste est immdiatement exploitable et afche tout de suite les donnes. Les proprits de cet objet, consultables en mode cration par un clic droit sur lobjet, sont trs voisines de la zone de liste droulante mise en place prcdemment. En revanche, une proprit supplmentaire, en bas de liste, mrite une attention particulire : la proprit Slection multiple, xe par dfaut Aucun : cette premire option signie que lutilisateur ne pourra choisir quun seul item de la liste ; si loption Simple est choisie, lutilisateur pourra slectionner plusieurs items (en gardant le doigt sur Ctrl et en cliquant plusieurs lignes) ; si loption Etendu est choisie, lutilisateur pourra slectionner plusieurs items avec les touches Maj et ou prendre toute la liste avec Ctrl + . Les contrles de traits et rectangles Ces deux outils permettent de dessiner des formes dans les formulaires. Quasi inutiles dans les formulaires continus (la proprit Diviseur denregistrements cre dj un trait appropri), ils seront employs avec modration dans les formulaires uniques. En effet, une trop grande surcharge de lcran induit souvent une gne visuelle de lutilisateur. 1. 2. 3. 4. 5. Dans le ruban, cliquez sur le bouton Rectangle . Dessinez un rectangle qui englobe les deux zones de listes prcdemment faites. Consultez, en mode formulaire, leffet rendu. Repassez en mode cration et cliquez sur lobjet Rectangle . Dans le ruban, droite des boutons de cration de contrles, 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, par exemple. 7. Vriez son aspect visuel.

136

Access 2007 et VBA

Chapitre

Les contrles de dclenchement daction


Le contrle Bouton de commande sert exclusivement au dclenchement dactions gnres 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 dun libell, soit dune image bitmap. Mais il peut tre aussi compltement transparent (une action est gnre, par exemple, par un simple clic sur une zone dune image superpose) ou partiellement transparent (seul un texte ou une icne se dgage du fond) ; cette dernire option est nouvelle avec Access 2007. La gure 5.9 montre de gauche droite trois prsentations possibles des boutons : La premire est dote des proprits Image : bitmap, Style fond : Standard. La deuxime est dote des proprits Image : aucune, Style fond : Standard, Lgende : Fermer formulaire. La troisime a les proprits Image : bitmap, Style fond : Transparent. Figure 5.9
Diverses prsentations des boutons de commande.

1. Dans le formulaire dessais, fermez le cas chant, la feuille de proprits. 2. Cliquez sur licne Bouton et dessinez un carr en bas droite dcran. 3. Lassistant Bouton de commande dAccess afche une tape 1 qui aide le programmeur atteindre son objectif : ici, nous allons crer un bouton destin fermer le formulaire. 4. Dans le pav de gauche des Catgories, choisissez Oprations sur formulaire . 5. Dans le pav de droite des Actions, choisissez Fermer un formulaire . 6. Cliquez sur Suivant . 7. Dans la deuxime tape, conservez les options par dfaut dun bouton qui est sous forme dimage avec Sortir par la portire et cliquez sur Suivant . 8. la place du nom donn dofce par Access, mettez un nom explicite, Sortie par exemple, 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 slectionnez Proprits . 11. Atteignez la proprit SurClic (pour cela faites dler un peu lascenseur) : elle est dote du libell Macro incorpore. 12. Cliquez sur le carr, droite, dot de trois points : vous accdez une macro dont nous verrons la signication plus loin. Lassistant Bouton de commande a non seulement cr le bouton proprement dit, mais gnr la macro de fermeture du formulaire. En lieu et place dune macro incorpore, il serait possible dcrire directement du code Visual Basic pour effectuer la mme opration. Cette nouvelle manire de travailler sera privilgie lorsque lexprience sera acquise : le code Visual Basic sexcute plus vite et plus facilement que les macros.

Les formulaires 137

Les autres contrles


Les contrles cadres dobjet dpendants Le bouton Cadre dobjet dpendant permet de crer des zones dans lesquelles seront insrs des objets dpendants denregistrements, tel que le montre la gure 5.10. Lexemple le plus rpandu est celui de la photo dans un chier de personnes : le formulaire afche en mme temps les coordonnes du contact et la photo de la personne correspondante. Cette photo est stocke dans un champ OLE (Object Linking and Embedding)1. Mais plus gnralement, lobjet dpendant peut tre non seulement une image bitmap (ou autres formats) mais aussi une grille Excel, un document Adobe Acrobat ou tout autre. Figure 5.10
Formulaire avec cadre dobjet dpendant.

Ouvrez la table ADRESSE de la base de donnes CODES_POSTAUX_FRANCE ; vous constatez quil existe un champ nomm PHOTO. Nous allons monter un nouveau formulaire, de type continu, bas sur une requte qui va lier les tables ADRESSE et CODE_POSTAL. Crons tout dabord la requte ncessaire : 1. Cliquez sur le menu Crer et licne Cration de requte. 2. Ajoutez les deux tables ADRESSE et CODE_POSTAL (on notera que les champs CODE sont dj lis par une relation). 3. Insrez tous les champs des deux tables dans les colonnes de destination (choisissezles sparment plutt que dutiliser le caractre gnrique *). 4. Afchez les rsultats pour tester la requte : vous constatez que le champ VILLE safche bien en regard de tous les codes postaux. 5. Enregistrez la requte sous le nom Req_Annuaire . Fermez tous les objets ouverts et laissez en surbrillance la requte Req_Annuaire dans le volet de navigation (sans pour autant louvrir) ; nous crons maintenant le formulaire continu en utilisant lassistant. 1. Dans le menu Crer , cliquez sur le bouton Plusieurs lments parmi les boutons de formulaires. 2. Le formulaire est cr immdiatement. 3. Enregistrez le nouveau formulaire sous le nom Frm_Annuaire (et non pas Req_ Annuaire comme Access la dsign par dfaut). Cette nouvelle grille-cran mrite quelques commentaires : les noms des colonnes prsentes ne sont pas ceux des champs, mais ceux des lgendes qui y ont t ajoutes ;
1. Plus prcisment, la table contient un lien vers un objet stock sur un disque (et non pas lobjet lui-mme).

138

Access 2007 et VBA

Chapitre

la largeur de chaque colonne ntant pas parfaitement adapte, il est ncessaire de manipuler la barre de dlement horizontale (en bas) pour visualiser lensemble des donnes dune ligne ; la hauteur de chaque ligne est assez importante, conditionne par linsertion du champ PHOTO. Par un clic du bouton droit sur le champ PHOTO, il peut tre slectionn loption Insrer un objet qui offrira lutilisateur le loisir de pointer une image stocke sur son disque 1 : 1. Cliquez du bouton droit sur le champ PHOTO dun enregistrement quelconque. 2. Slectionnez Insrer un objet . 3. Cliquez sur la case doption partir dun chier. 4. Pointez un chier de votre choix : le rsultat sen afche dans la zone. Les contrles cases cocher Dans la plupart des cas, les cases cocher sont lies des champs de tables du type Oui/ Non (boolen), mais elles peuvent galement servir pour des programmes plus labors et indpendants dune table 2. De forme carre, ils ne peuvent admettre que deux tats, coch ou non coch 3. Dans le formulaire Frm_Annuaire qui a t cr dans le paragraphe prcdent, il existe une colonne Membre le la famille correspondant au champ nomm FAMILLE de type boolen dans la table ADRESSE ; la cration automatique du formulaire a gnr une case cocher pour ce champ. 1. Ouvrez le formulaire Frm_Annuaire en mode cration. 2. Faites un clic droit sur le contrle FAMILLE . 3. Dans la feuille des proprits, notez que la proprit Triple tat est positionne Non (par dfaut) ; on pourra aussi regretter que la case cocher ne puisse pas tre rgle en hauteur et largeur. Les contrles cases doptions et les groupes doptions Il est rare quune case doption, ronde par opposition la case cocher carre, semploie isolment : gnralement, plusieurs cases doptions sont regroupes dans un groupe doptions. Dans ce cas, chaque case doption est exclusive des autres : si lutilisateur clique sur une case, les autres deviennent blanches. Le groupe doptions peut tre li un champ de table pour renvoyer une et une seule valeur parmi toutes celles des cases doptions prsentes lcran. Reprenons le formulaire Frm_Essais_Contrles pour crer trois cases doptions dans un groupe : 1. En mode cration, cliquez sur le bouton Groupe doptions du ruban (et non pas sur case doptions). 2. Dessinez un rectangle dans le formulaire.
1. Dans le cas dune utilisation en rseau de lapplication Access, il faudra naturellement que les fichiers dsigns soient accessibles par tous. 2. La valeur contenue dans la colonne de la table sera 0 (si la case nest pas coche) ou 1 (si la case est coche) : cette notation est spcifique Access. 3. Ils peuvent aussi comporter, sous condition, trois tats : vide, coch, non coch.

Les formulaires 139

3. Lassistant de cration de Groupe doptions souvre pour vous permettre de gnrer autant doptions que ncessaire : saisissez trois noms dtiquettes doption tels que Choix1 , Choix2 , Choix3 puis cliquez sur Suivant . 4. La deuxime tape permet de crer, le cas chant, une option coche par dfaut. 5. La troisime tape donne la possibilit de renvoyer des valeurs (ou formules) correspondant chacune des options. Laissez les valeurs proposes. 6. La quatrime tape offre la latitude de prendre case cocher ou case doption ou bouton bascule pour remplir le groupe doptions. Gnralement ce sont les cases doptions qui sont choisies. 7. Renseignez, dans la dernire tape, le nom du cadre avec le libell, par exemple, Faites votre choix . 8. Lors des tests, il sera possible de vrier que chacun des choix est bien exclusif des autres. La vrication de la valeur renvoye par le groupe doption nous permettra daller plus loin dans lutilisation des contrles crs jusqu maintenant : 1. Passez, le cas chant, en mode cration sur le formulaire Frm_Essais_Contrles. 2. Afchez la feuille des proprits du groupe doption. 3. Le nom du groupe doptions a t x par dfaut par Access Cadre30 (ou un autre numro dordre) : modiez-le par MonGroupeOptions . 4. Fermez la feuille des proprits. 5. Cliquez sur le bouton Zone de texte et dessinez un nouveau contrle voisin du groupe doptions. 6. Dans la feuille de proprits de cette zone de texte, positionnez-vous sur la proprit Source contrle et cliquez droite sur le bouton aux points de suspension : Access ouvre une fentre de gnrateur dexpression reprsent la gure 5.11. Figure 5.11
Le gnrateur dexpression dAccess.

Le formulaire ouvert est reprsent en haut gauche, et tous les contrles de ce formulaire sont lists dans le pav du milieu. 7. Dans le pav central, slectionnez le contrle MonGroupeOptions.

140

Access 2007 et VBA

Chapitre

8. Double-cliquez dans le pav de droite sur loption <Valeur> : la formule [MonGroupeOptions] (entre crochets) sinsre automatiquement. 9. Cliquez OK . 10. La proprit Source contrle devient = [MonGroupeOptions] (le signe gal dsignant une formule est obligatoire). 11. Repassez en afchage formulaire En cliquant sur les options du groupe doption cr lorigine, vous constatez que la valeur renvoye dans la zone de texte varie en mme temps que les choix dans le groupe voisin, sans ncessit de rafrachissement de la grille-cran. Les contrles onglet Les contrles onglet sont difcilement utilisables avec des formulaire continus mais sont particulirement bien adapts aux formulaires de type unique lorsquil existe un grand nombre de donnes relatives un seul enregistrement. Dans ce cas, il est judicieux de dcomposer les donnes en grandes catgories destines nommer les onglets. Nous proterons de lutilisation des onglets pour dcouvrir de nouvelles manires de crer un formulaire : 1. Fermez tous les objets ventuellement ouverts. 2. Dans le menu Crer , cliquez sur le bouton Cration de formulaire (pour obtenir un formulaire vierge). 3. Cliquez dans le ruban sur Feuille de proprits. 4. Ouvrez la zone de liste droulante Source (che vers le bas) et slectionnez la requte Req_Annuaire : dsormais le formulaire est bas sur les donnes renvoyes par la requte. 5. Cliquez sur le bouton Contrle Onglet et dessinez un large rectangle qui couvre toute la surface disponible. 6. Deux onglets ont t crs demble, nomms Page1 et Page2 1 ; cliquez sur le premier onglet, puis en utilisant la proprit Nom, changez son nom en Coordonnes et changez le second en Autres. 7. Fermez la feuille des proprits et activez longlet Coordonnes . 8. Cliquez dans le ruban sur le bouton Ajouter des champs existants : la liste de tous les champs rendus disponibles par la requte apparat. 9. laide de la touche Ctrl, slectionnez simultanment les champs NOM, PRENOM, ADRESSE1, ADRESSE2, CODE, VILLE. 10. Glissez ces 6 champs dans longlet actif (la disposition initiale est parfaire). 11. Cliquez sur longlet Autres et reproduisez la mme opration pour insrer les champs PHOTO, FAMILLE et PJ. 12. Enregistrez ce nouveau formulaire Frm_AnnuaireAOnglet . Le formulaire est prt pour une visualisation : les deux onglets dissocient coordonnes et autres champs pour un mme enregistrement. Le dplacement dun enregistrement un autre est assur par les boutons de dplacement, en bas gauche.

1. On peut ajouter de nouvelles pages avec le bouton du ruban Insrer une page .

Les formulaires 141

Les contrles dobjet graphique limage dExcel, Access permet de raliser trs aisment des graphiques. An dillustrer ces capacits, nous tenterons de reprsenter graphiquement le nombre de codes postaux par dpartements avec la mme base de donnes. Au dpart, il est ncessaire de raliser une requte qui calcule ce dcompte : 1. Dans le menu Crer , cliquez sur le bouton Cration de requte . 2. Ajoutez la seule table CODE_POSTAL . 3. Dans la premire colonne insrez lexpression : DPT: Gauche([CODE]; 2). 4. Cliquez sur le bouton Totaux du ruban. 5. Slectionnez lopration Regroupement pour la premire colonne. 6. Insrez le champ CODE dans la deuxime colonne et choisissez lopration Compte. 7. Enregistrez la requte sous le nom Req_Dcompte_Codes . La requte, 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 dcrite sur la gure 5.12. Figure 5.12
Requte de dcompte des codes postaux par dpartement.

1. Crez un formulaire vierge en cliquant sur Cration de formulaire dans le menu Crer . 2. Cliquez sur le bouton Insrer un graphique dans le menu Cration . 3. Dessinez un rectangle le plus large possible (le nombre de dpartements tant lev). 4. Lassistant graphique demande, dans son tape 1, la source des donnes : slectionnez la requte Req_Dcompte_Codes . 5. Dans la deuxime tape, dplacez les deux champs disponibles dans le pav de droite puis cliquez sur Suivant . 6. Choisissez le type de graphique en haut gauche (histogramme non empil), puis cliquez sur Suivant . 7. La quatrime tape 1 permet de prciser les trois paramtres des donnes poser sur laxe horizontal (ici les numros de dpartements), des diffrentes sries (il ny a quune srie reprsenter) et des donnes (le nombre de bureaux distributeurs).
1. Peu claire, il faut bien ladmettre

142

Access 2007 et VBA

Chapitre

8. 9. 10. 11.

Les paramtres tant bien choisis par dfaut, on peut passer ltape suivante alors quAccess ne reprsente pas laperu du graphique. Renseignez le titre du tableau Rpartition des bureaux de poste et optez pour labsence de lgende puis cliquez sur Terminer . Dans un premier temps, Access ne reprsente pas le graphique : il faut passer en mode formulaire pour le consulter. Laspect graphique peut ne pas convenir lutilisateur : cliquez du bouton droit en Mode cration et slectionnez Objet graphique > Ouvrir . Le programme Microsoft Graph souvre, commun tous les produits de la gamme Ofce. Il permet de modier la forme du graphique.

Les contrles Cadre dobjet indpendant et Image Ces deux types de contrles ont des fonctions qui se chevauchent : le Cadre dobjet indpendant permet dinsrer dans un formulaire toutes sortes dobjets (y compris les images) alors que le contrle Image ne peut insrer que des objets de type image. Comme son nom lindique, lobjet indpendant nest pas li un enregistrement de table, mais uniquement un chier externe. La cration des objets de ce type se rapproche beaucoup des objets dpendants, dj tudis. Les contrles de liens hypertexte Une zone de lien hypertexte peut tre insre dans un formulaire grce ce contrle, mais le lien est indpendant de toute donne de la base ; il renvoie directement toute source de donne, Web ou locale. On rappelle ici quil est possible de crer dans une table des champs de type Lien Hypertexte. Quand le champ est afch (en mode table, requte ou formulaire), un simple clic sur le lien permet daccder aux donnes rfrences. Un exemple pour illustrer cette fonctionnalit : le chier ADRESSE pourrait contenir un champ SITE_WEB de type Lien Hypertexte qui permettrait daccder directement au site web personnel de chaque personne cite. Les contrles Pices jointes La notion de pice jointe est nouvelle avec Access 2007. Elle se rapproche beaucoup de la notion bien connue dans les services de messagerie. Dans le formulaire Frm_AnnuaireAOnglet, une zone de pice jointe a dj t cre 1. 1. Ouvrez nouveau, si ncessaire, le formulaire en mode formulaire. 2. Un seul clic sur la zone de la pice jointe fait apparatre, au-dessus, une srie de trois icnes dont le trombone. Un clic sur ce dernier permet dajouter ou de consulter des pices jointes, relatives lenregistrement en cours. nen pas douter, cette nouvelle fonctionnalit est voue un franc succs pour lavenir. Les contrles ActiveX Les contrles ActiveX sont des utilitaires complmentaires qui permettent de trs nombreux dveloppements lintrieur mme dune application complte. Un bon nombre dentre eux ncessite linsertion de code Visual Basic pour commander les paramtres du contrle, code que nous navons pas encore tudi. On se limitera donc illustrer les possibilits de ces contrles en utilisant le trs classique contrle calendrier.
1. Pour quelle soit compltement fonctionnelle, le formulaire doit tre enregistr au pralable.

Les formulaires 143

1. Dans un formulaire vierge (ou un existant), en mode cration, cliquez sur le bouton Contrle ActiveX . 2. Slectionnez le Contrle Calendrier 12.0 puis cliquez OK . 3. Un calendrier sinsre, en haut gauche dans le formulaire ; on peut le dplacer et le redimensionner. Lavantage de ce calendrier rside dans le fait que, dot dune ergonomie complte et efcace, il renvoie une valeur de date conforme et rutilisable. Les sous-formulaires Les sous-formulaires, relativement complexes, constituent un lment essentiel de la palette des outils dAccess. Frquemment utiliss, ils savrent bien souvent incontournables car eux seuls permettent dafcher des donnes en relation et stockes dans diffrentes tables. Il existe bien un bouton, dans la barre dicne, permettant de crer de toutes pices un sousformulaire, mais cette mthode nous semble peu efcace et surtout peu pdagogique. Nous avons vu dans le chapitre sur les modles relationnels que larchitecture mettant en relation trois tables, deux tables principales et une table intermdiaire, tait fort courante. La visualisation dune telle architecture, via un formulaire, passe presque toujours par lutilisation dun sous-formulaire. Reprenons, pour illustrer cette prsentation, lexemple de la bibliothque de prts de livres, dont le modle simpli est dcrit la gure 5.13. Figure 5.13
Modle relationnel dune bibliothque de prt.

Dans le programme de gestion de la bibliothque, il savrera indispensable de monter un formulaire qui montre, adhrent par adhrent, tous les emprunts raliss ou bien, exemplaire par exemplaire, tous les emprunts en cours. Soit la vision sopre partir de la table de gauche sur la table intermdiaire, soit partir de la table de droite vers la mme table centrale. Access gre trs bien cette architecture en intgrant, dans lassistant la cration de formulaire, un systme dtectant les organisations de ce type. Aussi, alors mme que la conception manuelle de sous-formulaires est assez ardue, sa mise en place par le systme automatis seffectue en quelques minutes pourvu que le modle relationnel soit conforme aux normes merisiennes. 1. Reprenez le premier exercice du chapitre 2 ou recrez les trois tables dsignes dans la gure 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 dadhrents dans la table ADHERENT : Dupont , Durand et Martin par exemple (les ID sont numrots 1, 2, 3 automatiquement).

144

Access 2007 et VBA

Chapitre

3. Renseignez cinq ISBN ctifs dans la table EXEMPLAIRE : A , B , C , D , E (les ID sont numrots 1, 2, 3, 4, 5 automatiquement). 4. Renseignez une dizaine denregistrements dans la table EMPRUNT : la colonne ID_EXEMPLAIRE comprendra des valeurs 1, 2, 3, 4, 5 (il y aura donc ncessairement des doublons), la colonne ID_ADHERENT comprendra des valeurs 1, 2, 3 et les colonnes de dates pourront contenir nimporte quelle valeur de date. 5. Enregistrez une requte qui appelle tous les champs des trois tables (slectionnez ltoile de chaque table) et nomme Req_Emprunt , reprsente la gure 5.14. Figure 5.14
Requte Req_Emprunt pour sous-formulaire.

6. Dans le menu Crer , cliquez sur licne Plus de Formulaires > Assistant formulaire ; 7. Ouvrez la zone de liste droulante de lassistant et dsignez la requte Req_Emprunt comme source des donnes ; 8. Dplacez, grce au bouton dot de doubles chevrons, tous les champs dans le pav de droite puis cliquez Suivant ; 9. Immdiatement, Access reconnat la structure de la demande et propose un choix dans la fentre reprsente la gure 5.15. Figure 5.15
Assistant pour la cration de sousformulaire.

Les formulaires 145

Par dfaut, Access propose de faire un formulaire avec sous-formulaire et demande dans quel sens prsenter les donnes : Si loption Par ADHERENT est choisie, le formulaire principal permettra de faire dler les adhrents et de visualiser en dessous et simultanment dans un sous-formulaire tous les emprunts faits par les adhrents pris individuellement. Si loption Par EXEMPLAIRE est choisie, le formulaire principal permettra de faire dler les exemplaires et de visualiser en dessous et simultanment dans un sousformulaire tous les emprunts auxquels ils ont donn lieu, un par un. Si loption Par EMPRUNT est choisie, on listera tous les emprunts en visualisant les emprunteurs et exemplaires concerns. On voit bien ici la puissance du systme, dpendant essentiellement de la qualit du modle relationnel cr en amont. 10. Choisissez loption Par ADHERENT et cliquez sur Suivant . 11. ltape suivante, choisissez loption par dfaut Feuille de donnes (pour le sousformulaire) et cliquez sur Suivant . 12. Choisissez le style de prsentation qui vous convient le mieux (par dfaut Ofce) et cliquez sur Suivant . 13. Changez ventuellement le titre du formulaire en ADHERENT , puis cliquez sur Terminer . La visualisation obtenue, sous rserve du choix de style de prsentation, se prsente comme la gure 5.16. Figure 5.16
Formulaire et sous-formulaire imbriqu.

Les boutons de dplacements tout fait en bas permettent de faire dler les adhrents ; ceux au-dessus, inclus dans le sous-formulaire, balayent la liste complte des emprunts faits par ladhrent indiqu en haut de formulaire.

146

Access 2007 et VBA

Chapitre

2.2 LES

CALCULS ET LES AUTRES FONCTIONS DANS UN FORMULAIRE

Utilisation de fonctions traitant les donnes source du formulaire


Les contrles Zone de texte supportent toutes les fonctions dj vues dans lutilisation du langage SQL et dautres encore. Deux voies soffrent donc au dveloppeur pour la mise au point des formulaires : soit les calculs et prsentations de donnes sont raliss dans les requtes la source du formulaire ; soit la requte la source du formulaire ne livre que des donnes brutes et les calculs et prsentations sont faits dans le formulaire lui-mme. Un exemple rutilisant la table des codes postaux illustrera ce choix : 1. Fermez tous les onglets ouverts et mettez la table CODE_POSTAL en surbrillance (sans louvrir). 2. Dans le menu Crer , cliquez sur licne Formulaire : le programme cre un formulaire de type unique (un enregistrement par page). 3. En mode cration, modiez le type de formulaire : dans la feuille de proprits du formulaire, mettez la proprit Afchage par dfaut Formulaires Continus (au lieu de Formulaire Unique). 4. Nous voulons insrer une zone de texte afchant le seul numro de dpartement : toujours en mode cration, fermez la fentre des proprits, cliquez sur le bouton Zone de texte et dessinez un rectangle droite du code (dans la zone bleue de droite). 5. Renommez ltiquette du nouveau Contrle Dpartement. 6. Dans la feuille de proprits du nouveau contrle, renommez la zone de texte Dpartement au lieu de Texte4. 7. Reprez le nom du contrle contenant la valeur du code postal et situ dans la feuille de proprit du contrle : ce nom est CODE (celui hrit de la table). 8. Dans la feuille de proprits du nouveau contrle (slectionnez Dpartement dans la liste droulante de la fentre de proprit), entrez la formule : =Gauche([CODE];2) dans la proprit Source Contrle. En mode formulaire, vous constatez que le nouveau contrle droite afche bien le numro du dpartement, soit les deux caractres de gauche du contrle CODE afch ct. Dans le cas prsent, le formulaire utilise la valeur du contrle CODE pour calculer la valeur du contrle Dpartement. On aurait pu tout aussi bien crer une requte comme source de ce formulaire et crer dans la requte une colonne contenant la mme formule qui aurait t appele directement. Les formules peuvent tre beaucoup plus labores ; on se propose maintenant de crer une nouvelle zone de texte qui afche le mot PREFECTURE si cest le cas, ou bien rien. 1. Crez une nouvelle zone de texte en dessous de Dpartement en mode cration.

Les formulaires 147

2. Insrez la formule : =VraiFaux(Droite([CODE];3)="000";"PREFECTURE";"") dans le nouveau contrle 1. 3. Testez ce contrle. Il faut lire cette fonction, littralement, de la manire suivante : si les trois derniers caractres du code postal sont la chane 000, alors afcher le mot PREFECTURE , sinon ne rien afcher. On retiendra les points suivants concernant la syntaxe : Le mot CODE est cern de crochets pour indiquer un champ ou un contrle de formulaire : il nest pas indispensable de les saisir si le nom du champ est bien en un seul mot, Access se charge dajouter les crochets. Les chanes de caractres sont cernes par des guillemets ; un double guillemet conscutif quivaut une chane vide. Les arguments de la fonction sont spars par des points-virgules ; ici, la structure de la syntaxe est VraiFaux(<condition> ;<alors> ;<sinon>). Dune manire plus gnrale, le gnrateur dexpression dAccess, prsent la gure 5.17 et dj abord plus haut, est souvent utile. Ce gnrateur sobtient en cliquant sur les trois petits points droite de Source contrle dans la feuille des proprits. Figure 5.17
Fonctions intgres dans le gnrateur dexpressions.

Dans la partie de gauche, le gnrateur montre dabord les documents ouverts (et en premier lieu le formulaire en cours) puis un double-clic sur le signe + des tables montre toutes les tables disponibles. Il en va de mme pour les requtes, formulaires et tats. Un double-clic sur les fonctions afche, dune part, dventuelles fonctions (code Visual Basic) qui pourraient tre insres dans le formulaire en cours et, dautre part, les Fonctions Intgres dAccess montres la gure 5.17. On trouve ici la liste exhaustive (dans le pav de droite) des fonctions reclasses par domaine (pav du milieu).

1. On notera que cette syntaxe diffre suivant le programme Office : Excel utilise le mot-cl SI() alors quAccess utilise VRAIFAUX(). Il en est de mme pour la fonction dextraction de chane de caractres (EXTRACCHAINE() dans Access et STXT() dans Excel) et dans bien dautres fonctions. Seul le langage Visual Basic, commun aux deux produits, utilise la mme syntaxe.

148

Access 2007 et VBA

Chapitre

Pour chaque lment point grce au gnrateur dexpression, toutes les proprits de lobjet sont rcuprables (et non pas seulement une valeur de renvoi). Si lon clique sur CODE_POSTAL dans le pav de gauche et sur le contrle CODE dans le pav du milieu, la liste de droite renvoie, par exemple, la valeur de la proprit Visible. Ainsi, lafchage dune zone peut tre conditionn par la visibilit dune autre : ce nest quune parmi les millions des fonctionnalits qui peuvent tre cres. Il sagit maintenant dafcher en bas du mme formulaire des codes postaux le compte des codes de la table : Cliquez sur le bouton Zone de texte du ruban et dessinez un rectangle en bas de formulaire, sous la barre nomme Pied de Formulaire : automatiquement, le pied de formulaire jusqu maintenant inexistant est cr. Insrez la formule : =Compte([CODE]) dans la proprit Source contrle de la nouvelle zone. Vous constatez quAccess ralise bien le compte total de tous les codes contenus dans la table. On aurait pu tout aussi bien insrer cette zone de totalisation dans len-tte de formulaire, mais il aurait t mal venu de la placer dans le corps du formulaire, sagissant dun formulaire continu.

Utilisation des fonctions de domaine


Dans les exemples prcdents, les fonctions et oprations ralises ne concernaient que le formulaire en cours. Les fonctions de domaine ajoutent deux avantages majeurs : pouvoir faire appel des donnes trangres aux documents en cours et insrer des conditions de prise en compte. Les principales fonctions de domaine disponibles sont dtailles ci-aprs. La fonction RechDom() (DLookUp() en amricain) permet de retrouver une valeur dans une table sur la base de condition. Dans un premier exemple, nous cherchons retrouver directement le nom de la ville dont le code postal est 60000, cette table ntant pas ouverte, ni aucun formulaire associ. 1. Ouvrez un formulaire vierge en cliquant sur le bouton Cration de formulaire (le formulaire est vierge de tout contrle et sans donnes source). 2. Crez une zone de texte. 3. Affectez la proprit Source contrle de la nouvelle zone la valeur : =RechDom("[VILLE]";"CODE_POSTAL";"[CODE]='60000'")1. 4. Repassez en mode formulaire, le contrle afche effectivement la ville de Beauvais. La syntaxe trs particulire de cette fonction ncessite des explications : La structure globale de la fonction est RechDom(<Nom du champ recherch> ;<table source> ;<condition>). Chaque argument est cit entre guillemets. Le champ VILLE est cern par des crochets pour dsigner un nom de champ ; lutilisation des crochets est indispensable car Access ne traduit pas les noms de champs cits entre guillemets (il les interprte comme des chanes de caractres).

1. Dune certaine manire, cette requte quivaut un SELECT VILLE FROM CODE_POSTAL WHERE CODE = 60000 en langage SQL.

Les formulaires 149

La table CODE_POSTAL est cite entre guillemets, mais sans crochets. La condition est cite entre guillemets avec le nom de champ CODE cit entre crochets. La valeur 60000 est cite entre apostrophes car le champ CODE nest pas numrique mais alphabtique. Les apostrophes en lieu et place des guillemets sont indispensables 1. La fonction CompteDom() compte les arguments cits en permettant ventuellement dinsrer des conditions. 1. Crez une nouvelle zone de texte. 2. Affectez la proprit Source contrle de la nouvelle zone la valeur : =CpteDom("[CODE]";"CODE_POSTAL"). En mode formulaire, la zone renvoie le chiffre 8 009 correspondant au nombre de codes postaux stocks dans la table ; dans ce premier cas de gure, la fonction ne comprend pas de condition. 3. Modiez la formule en insrant une condition pour dcompter le nombre de codes postaux dont la ville est Paris. La formule devient : =CpteDom("[CODE]";"CODE_POSTAL";"[VILLE]='PARIS'"). En mode formulaire, on lit la valeur 29. Une autre fonction largement utilise est SomDom() qui additionne des valeurs contenues dans des champs numriques et dont la syntaxe est similaire celle de CpteDom(). Les autres fonctions de domaines sont rpertories dans le gnrateur de fonctions sous la catgorie Regroup.Domaine.

Rsum
Moyen central de visualisation des donnes, le formulaire peut prendre des formes multiples, utilisant toute la palette des outils graphiques. Un formulaire peut tre unique ou continu pour prsenter les donnes page par page ou listes. Il peut grer les droits des utilisateurs sur les donnes en acceptant un mode totalement libre ou bien en rservant les oprations la seule lecture, insertion ou modication. Toutes ces proprits sont composables entre elles. La bote outils du formulaire inclut de nombreux types de contrles qui utilisent des graphismes varis pour prsenter les donnes. Chacun des contrles est dot dune feuille de proprits destine paramtrer laspect graphique, la prsentation des donnes et la raction du formulaire aux sollicitations de lutilisateur. Les contrles Zone de texte et Etiquette servent essentiellement prsenter des donnes sous forme de caractres. Les contrles Zone de liste et Zone de liste droulante donnent des choix visuels lutilisateur. Les cases cocher, cases doptions et boutons bascules sont une autre forme de prsentation des choix. La source des donnes peut tre prcise pour le formulaire lui-mme via une requte ou une table mais peut ne pas ltre. Les valeurs renvoyes par les diffrents contrles seront directement issues des requtes source ou bien le rsultat de calculs via des fonctions. Ces dernires peuvent faire appel la source de donnes en cours mais aussi des domaines trangers au formulaire ouvert.

1. On verra plus loin que cette syntaxe pose des problmes dun autre ordre dans certains cas de figure. Les apostrophes (quotes simples amricaines) peuvent alors tre remplaces par des doubles guillemets.

150

Access 2007 et VBA

Chapitre

Problmes et exercices
EXERCICE 1 FORMULAIRE
UNIQUE DAFFICHAGE DES LVES Tous les exercices sont bass sur les donnes contenues dans la base ECOLE_INTERNATIONALE, ils visent, par degr de complexit croissant, monter des formulaires utilisant un bon nombre des outils dtaills dans le cours.

nonc

laborez un formulaire de type unique qui afche un par un les lves contenus dans la table ELEVE ; les champs PAYS_ELEVE et SEXE_ELEVE sont prsenter sous forme de zones de listes droulantes, la premire en extrayant toutes les nationalits comprises dans la table, la deuxime en utilisant une simple liste de valeurs. Le formulaire doit tre en lecture seule ; insrez galement un bouton pour fermer le formulaire et deux boutons pour faire dler les enregistrements ; retirez le slecteur denregistrement et les boutons de dplacements, devenus inutiles. Cration de la requte source et gnration automatique du formulaire Comme on la vu dans le cours, il est prfrable de crer au pralable une requte plutt que dutiliser directement la table comme source de donnes du formulaire. 1. Dans le menu Crer , cliquez sur licne Cration de requte. 2. Ajoutez la table ELEVE . 3. Slectionnez tous les champs de la table (de prfrence sans utiliser le caractre gnrique * ; il suft de double-cliquer sur chaque champ, successivement, pour que celuici sinsre la suite du prcdent). 4. Enregistrez la requte sous le nom Req_lve . 5. Dans le volet de navigation, sans louvrir, mettez la requte en surbrillance. 6. Dans le menu Crer , cliquer sur licne Formulaire. 7. Au premier jet, le formulaire se prsente comme la gure 5.18.

* Solution

Figure 5.18
Premire prsentation du premier exercice.

Les formulaires 151

Exercices

Mise en forme du formulaire gnr automatiquement Les dfauts de prsentation sont nombreux sur cette premire mouture : Le titre du formulaire et le nom de longlet ne sont pas valides : ils sont hrits de la requte source des donnes. Les tiquettes portent des noms techniques et non des libells comprhensibles ; ceci est d au fait que les lgendes ntaient pas toutes servies dans la table initiale : il faudra les corriger. La largeur des zones et la disposition gnrale ne sont pas bien adaptes. La zone PAYS_ELEVE est du type Zone de texte et non Zone de liste droulante comme demand. La zone SEXE_ELEVE est dj du type Zone de liste droulante comme demand dans lnonc : ceci est d au fait quune liste de valeurs existait dj dans la table source. Elle est donc correcte. Les boutons demands ne sont pas prsents. gauche, le slecteur denregistrements est inutile (sagissant dun formulaire de type unique). En bas, les boutons de dplacements doivent tre retirs. En bas, la barre de dlement horizontale est inutile. Le formulaire est en mode lecture/criture. Rsolvons tous ces problmes. Nom de lobjet, de longlet et du volet de navigation. 1. Enregistrez le formulaire sous le nom Frm_lve : ceci est le nom technique de lobjet 2. An davoir un nom donglet suprieur correct, dans la feuille de proprits du formulaire, servez la proprit Lgende avec un libell clair, du type Visualisation des lves. 3. An de prparer le volet de navigation la cration dun menu complet, renommez lobjet Frm_lve par Visualisation Elves (le libell est plus court pour permettre une lecture complte dans la bande troite du volet) : faites un clic droit sur lobjet dans le volet de navigation et slectionnez Renommer. Titre du formulaire. 1. En mode cration, cliquez sur licne Feuille de proprits. 2. Servez la proprit Lgende de la zone de texte du titre par le libell Visualisation des lves ( la place de Req_lve). Gardez la mme police, mais passez sa taille 28 et mettez-la en gras. Libell des tiquettes. 1. Cliquez directement sur les tiquettes de zones de texte en mode cration et modiez tous les libells. On insrera des items clairs et courts comme Nom, Prnom, Adresse, Code postal et Ville. 2. Ltiquette ADRESSE2, pour la deuxime ligne dadresse, ne sert rien. Cliquez directement sur cette tiquette, supprimez tous les caractres : Access fait disparatre

152

Access 2007 et VBA

Chapitre

automatiquement sa bordure. Le code postal et la ville peuvent tre aligns en mme temps : supprimez ltiquette du code postal. Disposition des tiquettes. 1. Si vous tentez de modier, par exemple, les largeurs des zones de texte, vous remarquerez que cette modication entrane le changement de largeur de toutes les zones de la colonne. Ceci est d au fait que le formulaire a t gnr automatiquement et que, par dfaut, Access a assign un mode tabulaire lensemble. 2. Appuyez sur Ctrl + A, puis dans longlet Rorganiser (qui napparat quen mode cration du formulaire en partie haute du ruban), cliquez sur licne Supprimer : les zones de texte deviennent indpendantes les unes des autres. 3. Vous remarquerez quavec la souris vous pouvez slectionner plusieurs zones simultanment et les manipuler toutes ensemble pour les re-disposer. 4. Pour dplacer les zones de texte, les ches directionnelles seront plus prcises et moins difciles demploi que la souris. Les combinaisons de touches Maj + , Maj +, Maj + , Maj + rglent la hauteur et la largeur des zones. 5. Servez-vous du quadrillage pour aligner parfaitement les zones : si vous souhaitez une haute prcision dans la disposition, vous pouvez dnir les proprits Gauche, Haut, Hauteur, Largeur des zones de texte en centimtres avec dcimales dans la feuille de proprits. Au nal, et en simpliant au maximum la prsentation, on doit parvenir une bauche similaire celle de la gure 5.19. Figure 5.19
Deuxime bauche du premier exercice aprs mise en forme des zones de texte.

Cration de la zone de liste droulante des nationalits Il serait possible de crer de toutes pices la zone de liste droulante demande, mais Access permet aussi de transformer un contrle dun type un autre : 1. En mode cration, faites un clic droit sur le contrle PAYS_ELEVE puis slectionnez Remplacer Par > Zone de liste droulante . 2. La zone de liste droulante est effective mais non paramtre : elle nafche aucune liste. Dans la proprit Contenu du contrle (et non pas Source du contrle), cliquez sur le bouton points de suspension. 3. Afchez la table ELEVE et refermez la fentre des sources disponibles. 4. Insrez le champ PAYS_ELEVE dans la premire colonne du bas. 5. Cliquez sur Feuille de proprits dans le ruban (feuille de la requte et non du formulaire).

Les formulaires 153

Exercices

6. Positionnez la proprit Valeurs distinctes Oui. 7. Refermez la feuille de proprits ; la requte doit afcher dix enregistrements seulement et son code SQL doit tre SELECT DISTINCT ELEVE.PAYS_ELEVE FROM ELEVE; (on afche tous les pays contenus dans la table ELEVE, mais une seule fois). 8. Fermez la fentre de la requte et rpondez Oui au message denregistrement. 9. La zone de liste droulante est fonctionnelle. Mode lecture seule du formulaire 1. En mode cration, cliquez sur licne Feuille de proprits. 2. Dans la zone de liste droulante en haut gauche, slectionnez Formulaire. 3. Positionnez les proprits Entre donnes, Ajout autoris, Suppression autorise, Modication autorise Non : le formulaire est entirement brid . Bouton de commande de sortie du formulaire 1. Dans le ruban, en mode cration, cliquez sur licne Bouton de commande. 2. Dessinez un carr en bas droite, de la taille dun pav du quadrillage. 3. Dans la premire tape de lassistant Bouton de commande, slectionnez Oprations sur formulaires > Fermer un formulaire . 4. Laissez les options par dfaut de la deuxime tape. 5. Nommez le bouton Fermer la troisime tape (ne laissez pas le libell automatique car le nom du bouton pourra tre utilis ultrieurement en code Visual Basic), puis cliquez sur Terminer . Boutons de commande de dlement du formulaire 1. Dans le ruban, en mode cration, cliquez sur licne Bouton de commande. 2. Dessinez un carr en bas, de la taille dun pav du quadrillage. 3. Dans la premire tape de lassistant Bouton de commande, slectionnez Dplacements entre enregistrements > Enregistrement suivant . 4. Laissez les options par dfaut de la deuxime tape. 5. Nommez le bouton Suivant la troisime tape. 6. Refaites la mme opration mais en prenant la premire tape les options Dplacements entre enregistrements > Enregistrement prcdent . 7. Testez les trois boutons de commande. Trs normalement, Access renvoie un message erreur lorsque lutilisateur clique sur Suivant alors quon a atteint la n de chier ou quil clique sur Prcdent lorsque le pointeur est en dbut de chier. Suppression du slecteur denregistrement, des boutons de dplacements systme et des barres de dlement 1. En mode cration, cliquez sur licne Feuille de proprits.

154

Access 2007 et VBA

Chapitre

2. Dans la zone de liste droulante en haut gauche, slectionnez Formulaire. 3. Positionnez la proprit Afcher le slecteur Non. 4. Positionnez la proprit Boutons de dplacement Non. 5. Positionnez la proprit Barres de dlement Aucune. Finalement, le formulaire a laspect de la gure 5.20, la zone de liste droulante tant ouverte. Figure 5.20
Rsultat du premier exercice.

EXERCICE 2
nonc

FORMULAIRE

ET SOUS-FORMULAIRE DES LVES ET DE LEURS MOYENNES

laborez un formulaire de type unique qui afche un par un les lves contenus dans la table ELEVE et simultanment leur moyenne dans chacune des matires. Le formulaire montrera galement la moyenne gnrale.

* Solution

Assurment, cette problmatique voque immdiatement le besoin dassocier un formulaire principal, afchant lidentit de llve, et un sous-formulaire afchant les moyennes correspondantes. Le procd de construction automatique vu dans le cours ne pourra malheureusement pas sappliquer car la notion de regroupement et de moyenne applique la table NOTE empche Access de reprer la structure en sous-formulaire. Il nous faut donc : Crer une requte source de donnes du formulaire. Crer une requte source de donnes du sous-formulaire. Crer un formulaire. Insrer un sous-formulaire dans le premier.

Les formulaires 155

Exercices

Cration des requtes 1. La premire requte, nomme Req1_Moyennes , contient le code SQL SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE; (les seuls numro, nom et prnom des lves sufsent). Elle a la structure de la gure 5.21. Figure 5.21
Structure de la premire requte Req1_Moyennes.

2. La deuxime requte, nomme Req2_Moyennes , contient le code SQL 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; . Elle a la structure de la gure 5.22. Figure 5.22
Structure de la deuxime requte Req2_Moyennes.

156

Access 2007 et VBA

Chapitre

Mise en uvre du formulaire principal 1. Dans le volet de navigation, mettez la requte Req1_Moyennes en surbrillance. 2. Dans le ruban du menu Crer , cliquez sur licne Formulaire. 3. Le formulaire est immdiatement cr en mode unique avec une large place vers le bas pour insrer le sous-formulaire. 4. Enregistrez le formulaire sous le nom Frm_Moyennes . Mise en uvre du sous-formulaire 1. En mode cration, positionnez la souris en bas du corps du formulaire, juste au-dessus de la barre libelle Pied de formulaire an dobtenir un pointeur en forme de che Nord-Sud. Tirez vers le bas en vue dagrandir le corps du formulaire. 2. Dans le ruban du menu Crer , cliquez sur licne Sous-formulaire/Sous-tat. 3. Dessinez un large rectangle dans la partie vide du corps de formulaire. 4. Lassistant sous-formulaire propose, dans une premire tape, les deux diffrents types de sources de donnes, requtes/tables ou formulaires : gardez loption de requtes prise par dfaut. 5. Dans la deuxime tape, slectionnez la requte Req2_Moyennes et dplacez les trois champs disponibles dans le pav des champs slectionns. 6. La troisime tape, reprsente la gure 5.23, consiste tablir le lien entre formulaire principal et sous-formulaire. Le texte afch en bas est le plus clair : il propose dtablir le lien sur le champ ID_ELEVE, ce qui est exact ; nous le vrierons plus tard. Cette tape est essentielle dans ce travail : sans elle, les afchages seraient fantaisistes et difcilement vriables. Validez en cliquant sur Suivant . Figure 5.23
tablissement du lien entre formulaire et sous-formulaire.

7. Dans la dernire tape, renommez le sous-formulaire Frm_Moyennes1 . 8. Testez le formulaire : en faisant dler les lves, les moyennes par matire varient. 9. Vriez la relation entre les deux documents : dans le formulaire principal, cliquez sur Feuille de proprits, slectionnez le sous-formulaire Frm_Moyennes1 : les

Les formulaires 157

Exercices

proprits Champs Pres et Champs Fils sont bien toutes deux positionnes ID_ ELEVE. La prsentation des rsultats du sous-formulaire en mode feuille de donnes et non formulaire nest pas trs heureuse : dune part, on lit le numro denregistrement de llve (ce qui devient inutile ds lorsque le lien formulaire/sous-formulaire est vri et fonctionnel) et, dautre part, laccs aux zones de listes droulante des en-ttes de colonnes renvoie des messages erreurs. Nous suggrons donc de transformer le sous-formulaire en mode continu et afchage formulaire, tout en faisant disparatre pour lutilisateur la zone ID_ELEVE. Initialement, le sous-formulaire a laspect reprsent la gure 5.24. Figure 5.24
Sous-formulaire avant modications.

1. Positionnez la proprit Afchage par dfaut du formulaire Formulaires continus ( la place de Feuille de donnes). 2. Slectionnez les trois contrles (CTRL + A) et dsolidarisez-les en cliquant sur Supprimer dans le menu Rorganiser . 3. Slectionnez le seul contrle ID_ELEVE et positionnez sa proprit Visible Non. 4. Rduisez la taille du contrle ID_ELEVE an quil prenne le moins de place possible en haut gauche du formulaire. 5. Modiez la proprit Couleur fond de len-tte de formulaire, si elle est noire, pour quelle devienne blanche. Pour ce faire, cliquez sur le bouton points de suspension de la proprit et choisissez la couleur dsire. 6. Dans len-tte de formulaire, insrez deux nouvelles tiquettes Matire et Moyenne. 7. Dans le corps de formulaire, modiez la proprit Format du contrle MoyenneDeNOTATION par Fixe (au lieu daucune proprit). 8. Modiez la proprit Dcimales du contrle Moyenne DeNOTATION en slectionnant 2 (au lieu daucune proprit) : la moyenne sera correctement prsente et non plus avec un trop grand nombre de dcimales. 9. Modiez la proprit Aligner le texte du contrle MoyenneDeNOTATION en slectionnant Droite (au lieu de Gauche). 10. Modiez la proprit Afcher slecteur du formulaire Frm_Moyennes1 en slectionnant Non.

158

Access 2007 et VBA

Chapitre

11. Modiez la proprit Boutons de dplacements par Non. 12. Modiez la proprit Barres de dlement par Aucune. 13. Insrez dans le Pied de formulaire une nouvelle zone de texte. 14. Modiez ltiquette par Moyenne gnrale. 15. Modiez la proprit Source de donnes du nouveau contrle par la formule : =Moyenne([MoyenneDeNOTATION]). 16. Modiez les proprits Format, Dcimales, Aligner le texte et Epaisseur police respectivement par Fixe, 2, Droite et Gras. 17. Enregistrez le formulaire aprs ces modications, an quil ait laspect dcrit la gure 5.25. Figure 5.25
Sous-formulaire aprs modications.

Dplacez et redimensionnez les zones de texte et le sous-formulaire an de disposer lensemble de manire claire et harmonieuse. Les rsultats, en mode cration et en mode formulaire apparaissent aux gures 5.26 et 5.27. Figure 5.26
Formulaire du deuxime exercice en mode cration.

Les formulaires 159

Exercices

Figure 5.27
Formulaire du deuxime exercice en mode formulaire.

EXERCICE 3
nonc

FORMULAIRE

AVEC ZONE DE LISTE ET RACTUALISATION

laborez un formulaire dpourvu de source de donnes ; une zone de liste droulante doit permettre dafcher tous les lves et den slectionner un. Au moment du choix de llve, lutilisateur dcouvrira en dessous une zone de liste prsentant les moyennes de llve.

* Solution

Cet exercice a le mme objectif, apparemment, que le prcdent : montrer la moyenne dun lve. Il en diffre pourtant profondment. Dune part, les outils zone de liste droulante et zone de liste ne sont pas les mmes que les zones de texte et sous-formulaires utiliss prcdemment mais, dautre part, laccs aux donnes sopre par des voies totalement nouvelles. Dans lexercice 2, lutilisateur remonte du serveur de donnes la totalit des informations, table des lves et table des notes : cette manire de faire, particulirement lourde pour la charge rseau, nest peut-tre pas indispensable. Si lutilisateur na besoin de connatre les rsultats que dun seul lve, quoi bon lui livrer la totalit des donnes ? Il sera ncessaire, pour cet exercice, dutiliser une macro, pour la premire fois, mais de manire trs limite. Cration du formulaire et de la zone de liste droulante 1. Fermez toutes les fentres ventuellement ouvertes. 2. Dans le menu Crer , cliquez sur Cration de formulaire (on obtient une grille vierge, le formulaire tant dpourvu de toute source de donnes). 3. Enregistrez le formulaire sous le nom Frm_Moyennes2 avec pour lgende Consultation des rsultats. 4. Dans le menu Rorganiser , cliquez sur licne du ruban tout fait droite en bas Afcher/masquer En-tte/Pied de formulaire.

160

Access 2007 et VBA

Chapitre

5. Insrez une tiquette de titre Consultation des rsultats. Pour cela revenez au menu Cration . 6. Dans le menu Cration , cliquez sur le bouton Zone de liste droulante et dessinez un rectangle en haut du formulaire. 7. ltape 1 de lassistant Zone de liste droulante, conservez loption par dfaut Je veux que la liste droulante recherche les valeurs dans une table ou requte . 8. ltape 2, choisissez la table ELEVE . 9. ltape 3, slectionnez les trois champs ID_ELEVE , NOM_ELEVE et PRENOM_ELEVE et insrez-les parmi les champs slectionns du pav de droite. 10. ltape 4 choisissez le champ NOM_ELEVE pour tablir un tri croissant. 11. ltape 5, laissez coche la case colonne cl cache et adaptez les largeurs de colonnes. 12. ltape 6 (dernire), nommez le contrle ELEVE en lieu et place de NOM_ELEVE. 13. Modiez la proprit Nom du contrle par Choix_Eleve (au lieu de Modiable0). Ce point est important car ce nom servira ultrieurement. 14. Testez le contrle : il doit afcher les noms et prnoms de tous les lves, sans les ID (la proprit Largeurs de colonnes du contrle Zone de liste droulante doit tre <0cm;3,5cm;2,5cm>). Le formulaire doit avoir laspect de la gure 5.28. Figure 5.28
Formulaire du troisime exercice avec la seule zone de liste droulante.

Dans les proprits de cette zone de liste droulante, on notera les points suivants :

Les formulaires 161

Exercices

Le contenu du contrle est une requte SQL dont le code est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE ORDER BY ELEVE.NOM_ELEVE; . louverture du formulaire, en consquence, lutilisateur ne gnre aucune requte (ni donc de trac rseau) ; louverture de la zone de liste droulante, il lance une requte qui vise non pas la totalit de la table ELEVE, mais les seules donnes dont il a besoin. Il rduit par l le trac rseau gnr.

La proprit Colonne lie est xe 1, qui dsigne la premire colonne, non visible, de lID de llve. Quand lutilisateur choisit un lve, le contrle prend ds lors la valeur du numro de llve dsign. Cette proprit nous sera utile. La proprit Limiter liste est positionne Oui : lutilisateur ne peut pas entrer un nom qui nexisterait pas dans la liste. La proprit Source de donnes est vide ; en dautres termes, le contrle nest li aucune source de donnes indique dans le formulaire. Cration de la zone de liste La zone de liste doit faire apparatre les moyennes des lves : nous savons dj comment crer une requte propre effectuer ce calcul ; en revanche, il sera ncessaire, ici, dajouter une condition pour faire en sorte que les moyennes afches correspondent llve choisi dans la zone de liste droulante suprieure. 1. En mode cration, cliquez dans le ruban du menu Cration sur le bouton Zone de liste puis dessinez un large rectangle sous la zone de liste droulante dj mise en place. 2. ltape 1 de lassistant Zone de liste droulante, conservez loption par dfaut Je veux que la liste droulante recherche les valeurs dans une table ou requte . 3. ltape 2, choisissez la table NOTE comme source des donnes : nous savons fort bien que cette table fournit lintgralit des notes et non les moyennes, nous corrigerons ce point ultrieurement. 4. ltape 3, pointez les champs ID_ELEVE , ID_MATIERE et NOTATION , puis insrez-les dans le pav des champs slectionns. Nous savons quil manque ici le libell de la matire (qui se trouve dans une autre table), nous corrigerons ce point ultrieurement. 5. Ngligez ltape suivante qui permet de prciser dventuels tris. 6. ltape 5, maintenez la colonne cl cache et les largeurs de colonnes dnies par dfaut. 7. Nommez ltape 6 ltiquette du contrle Moyennes puis cliquez sur Terminer . 8. Dans la feuille de proprit du contrle qui vient dtre cr, modiez la proprit Nom par Moyennes (et non Liste5). ce stade davancement, le formulaire peut tre visualis ; on y constate que les deux contrles sont fonctionnels, mais totalement indpendants lun de lautre : le premier montre tous les lves mais un choix dans la liste na aucun effet particulier ; le second montre la liste intgrale de toutes les notes, tous lves confondus. 1. Dans la feuille de proprits du contrle Moyennes, accdez la requte de la proprit Contenu en cliquant sur le bouton aux trois points de suspension. 2. Ajoutez tout dabord la table MATIERE manquante, grce licne Afcher 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 apparatre la notion dopration dans la requte et modier lOpration de la colonne NOTATION en Moyenne. Si on veut produire des moyennes avec un arrondi la deuxime dcimale, on peut affecter la zone Opration avec la valeur Expression ( la place de moyenne) et mettre

162

Access 2007 et VBA

Chapitre

lexpression suivante dans la zone Champ : MoyenneDeNOTATION:Round((Moyenne(NOTE.NOTATION));2) . 6. Faites un clic droit sur la colonne NOTATION et slectionnez Proprits : la proprit Format de la colonne doit tre mise Fixe et la proprit Dcimales 2. 7. Testez la requte : elle doit renvoyer toutes les moyennes, lve par lve, ventiles par matires. 8. Dans la ligne Critres de la colonne ID_ELEVE, insrez la formule : [Formulaires]![Frm_Moyennes2]![Choix_Eleve] . Cette formule permet de prciser dans la requte la valeur de lID_ELEVE dont on veut afcher les moyennes. Elle est compose de trois parties spares par des points dexclamation et de la forme : [Formulaires]![Nom_du_formulaire]![Nom_du_contrle]. 9. Le code SQL de la requte doit tre, au nal, 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 gure 5.29. La requte ainsi gnre par linterface peut tre sauvegarde et ferme pour revenir au formulaire. Figure 5.29
Requte de la zone de liste du troisime exercice.

Nouveau point sur le fonctionnement gnral du formulaire : apparemment le rsultat est correct au premier afchage (si un lve tait au pralable slectionn). Malheureusement, le choix dun autre lve ne provoque aucun changement dans la zone Moyennes en dessous. Pire, si le formulaire est ferm puis rouvert, le choix dun lve laisse la zone Moyennes compltement vierge ! Cette imperfection provient du droulement des faits suivants : louverture du formulaire, le contrle Choix_Eleve ne comporte pas de valeur (aucun lve nest slectionn). Simultanment, la requte du contrle Moyennes est lance : elle ne renvoie aucun enregistrement puisque la rfrence au contrle Choix_Eleve est vide. Au moment du choix dun lve, la valeur du contrle Choix_Eleve devient valide.

Les formulaires 163

Exercices

En revanche, la requte qui dtermine le contrle Moyennes ayant dj eu lieu, elle nest pas relance. Il ne manque donc plus qu monter un mcanisme pour relancer la requte la source des donnes du contrle Moyennes chaque fois que la zone de liste droulante est mise jour. Ce mcanisme doit sassocier la zone de liste droulante Choix_Eleve. 1. Slectionnez la proprit Aprs MAJ du contrle Choix_Eleve. 2. Cliquez sur le bouton aux trois points de suspension. 3. Choisissez Gnrateur de Macros et validez par OK . 4. la premire ligne, ouvrez la zone de liste droulante et slectionnez Actualiser. 5. En bas, dans la zone Nom du contrle, saisissez Moyennes . Le rsultat doit tre conforme la gure 5.30. Figure 5.30
Macro incorpore du troisime exercice.

6. Fermez et enregistrez la macro. 7. Testez le formulaire aprs lavoir ferm puis rouvert : au dpart, les deux contrles doivent tre vierges ; lors du choix dun lve, les moyennes apparaissent. Finition du formulaire 1. La proprit Nombre de colonnes du contrle Moyennes est x 3. 2. La proprit Largeurs de colonnes du contrle Moyennes est xe <0cm;3,505cm;0,501cm> 1.

1. Vous aurez peut-tre not que, bien que la requte fixe explicitement le format des chiffres deux dcimales, la zone de liste subsquente ne tient pas compte de cette proprit. Il sagit dune erreur de programmation dAccess : le format des donnes dans les colonnes de la zone de liste ne sont pas dterminables. Nous utilisons donc ici la largeur de colonne comme subterfuge pour cacher le grand nombre de dcimales des rsultats.

164

Access 2007 et VBA

Chapitre

3. La proprit Largeur du contrle Moyennes est xe 4 cm. La grille nale aura un aspect similaire celui reprsent la gure 5.31. Figure 5.31
Rsultat nal du troisime exercice.

Les formulaires 165

Exercices

Chapitre

Les tats

1. Fonctionnement automatis .... 168 2. Conception dtats, notion de regroupement ................... 170 Problmes et exercices 1. tat des notes des lves ........ 174

Il est toujours possible dimprimer des formulaires. Mais l nest pas leur destination premire. Les formulaires sont conus pour la visualisation des donnes, non leur impression. Access dispose pour ce type ddition dune option spcifique, dote doutils particuliers, les tats. Le programmeur ne doit pas ngliger cet aspect fondamental des tats imprims lors de la mise en uvre dune application : mme si la dmatrialisation des documents devient de plus en plus courante, les impressions conservent une force probante.

167

(1)

Fonctionnement automatis
limage des formulaires, les tats utilisent les mmes sources de donnes : tables directes ou requtes. Comme pour les formulaires, il sera prfrable de monter des requtes spciques chaque tat plutt que dutiliser les tables directement. En revanche, et linverse des formulaires, un tat ncessite imprativement des donnes ds louverture de ltat : il nest pas possible de faire intervenir des contrles tels que les zones de liste. Pour un premier essai, nous utiliserons les automatismes dAccess an de tester les fonctionnalits du programme : 1. Ouvrez la base de donnes des Codes Postaux . 2. Dans le volet de navigation, mettez la table CODE_POSTAL en surbrillance. 3. Dans le menu Crer , cliquez sur licne Etat. 4. Le programme construit un tat. Le document est prsent avec les standards de toute impression : en haut droite apparaissent la date et lheure de limpression. Il est visualisable comme un formulaire, mais non pas comme une impression. 1. Cliquez sur le triangle en bas de licne Afchage. 2. Slectionnez loption Aperu avant impression. 3. Le document apparat tel quil sera imprim, avec le montage des pages prvu (Access ne calcule pas immdiatement le nombre de pages imprimer, ici 217). 4. Chaque page reprend lintitul des colonnes an de rendre ltat comprhensible, quelle que soit la page. 5. La visualisation se fait sur une page et une seule : laperu est donc diffrent de celui de Word ou Excel, qui regroupent ltat en un seul document. 6. Une nouvelle barre dicne suprieure permet de rgler les paramtres dimpression (voir gure 6.1).

Figure 6.1
Menu de laperu avant impression.

Les boutons Taille, Portrait, Paysage et Marges sont des raccourcis du bouton Mise en page qui dtaille prcisment chacun de ces paramtres. Les marges sont exprimes en millimtres. Il est maladroit de chercher rduire excessivement les marges : outre des messages erreurs systmatiques, limpression est conditionne de toute faon par les capacits de limprimante. An de sadapter toutes les imprimantes du march, il est plus judicieux de ne pas descendre en de de 5 mm. Lorientation dpendra du format des tableaux prsenter : tous les calculs dimpression se font sur la base du papier gnralement utilis : en Europe, il sagit du format A4 alors quaux tats-Unis le format Lettre US est le standard (rglages prciser dans les Paramtres Rgionaux du panneau de conguration Windows). En vue dconomiser du papier, il est possible de multiplier les colonnes. Dans le cas prsent, le nombre de colonnes est x 1 mais dans la mesure o les seules donnes

168

Access 2007 et VBA

Chapitre

imprimer occupent peu de place en largeur, ce chiffre peut tre mont 2, rduisant de moiti le nombre de feuilles ncessaires ! 1. Sans mme disposer dAdobe Acrobat Writer, il est possible, avec la version 2007 dAccess, dimprimer vers un chier PDF. Il est ncessaire toutefois de tlcharger un complment Microsoft en accdant au site www.microsoft.com/downloads/Search.aspx?displaylang=fr dans la famille des produits Ofce (voir gure 6.2). Figure 6.2
Tlchargement du complment Microsoft Ofce 2007.

Nativement, Access peut exporter les impressions vers Word (chier RTF) ou vers un chier XML ou HTML. 1. Fermez lAperu avant impression. 2. Revenez au menu Format de ltat. Dans la partie droite du ruban, Access propose des mises en forme automatiques comme le montre la gure 6.3. Figure 6.3
Options de mise en forme automatique.

La mise en forme automatique peut tre accompagne de mises en forme conditionnelles, particulirement 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 de liste droulante et slectionnez Expression. 3. Dans la zone de lexpression insrez la formule : Droite([CODE];3)="000". 4. Cliquez sur le bouton Gras et la police de caractre colorie en rouge, par exemple. Grce cette mise en forme, toutes les prfectures seront imprimes en rouge et en gras alors que les autres bureaux distributeurs resteront en police normale.

1. Un rglage de la largeur des zones imprimer est raliser manuellement suivant des modalits que nous verrons plus loin.

Les tats 169

(2)

Conception dtats, notion de regroupement


Comme pour les formulaires, et moins de particularits, il est plus rapide de gnrer automatiquement un tat et de le modier que de partir dune matrice vierge. An dillustrer la fonction de regroupement et dtudier la conception des tats, nous envisagerons dimprimer un document qui fournit la liste des bureaux distributeurs, dpartement par dpartement. Commenons par crer la requte la source de ltat : 1. Crez une requte appelant la table CODES_POSTAUX . 2. Insrez les champs CODE et VILLE . 3. Ajoutez une troisime colonne nomme DEPARTEMENT dont la formule est Gauche([CODE];2). 4. Ajoutez le critre suivant la colonne DEPARTEMENT : Comme[Indiquez un numro de dpartement ou tapez *] . La requte, 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 numro de dpartement ou tapez *])); aura la structure graphique de la gure 6.4.

Figure 6.4
Requte paramtre des codes postaux par dpartement.

Rappel : la citation entre crochets dans la zone des critres gnre une requte dite paramtre qui ouvre une bote de dialogue destine lutilisateur. Le mot-cl Comme plac avant la citation entre crochets permet de faire intervenir le joker * pour montrer tous les dpartements. 5. Enregistrez la requte sous le nom Req_Codes_Dpts . 6. Fermez la requte tout en la laissant en surbrillance dans le volet de navigation. 7. Dans le menu Crer , cliquez sur licne Etat : le message de demande du dpartement apparat, appuyez sur la touche *. 8. Le nouveau document est immdiatement gnr. Cette impression nest pas satisfaisante : on souhaite un tat qui sinterrompe chaque dpartement, imprime un compte du nombre de bureaux distributeurs et nimprime pas la troisime colonne. On veut en outre que, pour chaque dpartement, les enregistrements soient tris par ordre alphabtique de ville.

170

Access 2007 et VBA

Chapitre

9. Cliquez sur licne Afchage en haut gauche et slectionnez le Mode Cration ; le document apparat tel qu la gure 6.5. Figure 6.5
tat en mode cration.

Le dessin gnral de ltat en mode cration ressemble beaucoup celui des formulaires. On y retrouve les En-tte et Pied dj vus, auxquels sajoutent ici un En-tte de page et un Pied de page. Ces deux derniers lments contiennent les libells (ou formules ou donnes) qui se rptent chaque page imprime ; dans le cas prsent, les libells CODE, VILLE et DEPARTEMENT sont inclus dans len-tte de page alors que le pied de page comprend une formule destine la pagination (sous la forme Page X sur Y pages). Lentte dtat, enn, contient une formule destine imprimer la date et lheure en cours. 1. Cliquez sur le bouton Regrouper et Trier du ruban : une fentre souvre en bas dcran. 2. Cliquez sur le bouton Ajouter un groupe . 3. Une nouvelle zone den-tte de groupe DEPARTEMENT dans ltat sest insre en dessous de len-tte de page. 4. Cliquez sur le champ DEPARTEMENT qui est apparu dans une nouvelle fentre en bas. 5. Dans la fentre infrieure, un bandeau jaune est apparu, cliquez sur Plus. 6. Cliquez sur la zone de liste droulante voisine de Avec un total de CODE. 7. Le type Compter les valeurs sur cette zone CODE est par dfaut le bon. 8. Cochez la case Afcher dans le Pied de page de groupe : un pied de page de groupe apparat avec une formule de Compte(). 9. Cliquez sur le champ DEPARTEMENT dans la zone Dtail. 10. Appuyez sur Ctrl + X (pour le couper). 11. Cliquez sur len-tte de groupe et utilisez la combinaison Ctrl + V (pour le coller). 12. Ajoutez une tiquette Dpartement dans len-tte de groupe (ltiquette dorigine a disparu lors du couper-coller). 13. Un smart tag ou message danomalie (triangle vert en haut gauche de la zone dtiquette) est apparu : cliquez sur le losange jaune et associez ltiquette la zone de texte voisine. 14. Dans le bandeau infrieur, cliquez sur Ajouter un tri.

Les tats 171

15. Slectionnez le champ VILLE pour que les villes soient tries par ordre alphabtique. La liste globale va donc afcher tous les dpartements en commenant par 01 pour nir par 98 mais, lintrieur de chaque dpartement, les enregistrements seront tris par ordre alphabtique de ville. Lordonnancement qui vient dtre mis en place nest nullement le rsultat de tris ou de sous-totalisations dans la requte source des donnes, mais bien leffet de la structure de ltat lui-mme. En dnitive, il doit avoir la structure prsente la gure 6.6. Figure 6.6
tat avec sous-totaux.

Il est possible de crer autant de groupes quil existe de champs dans la source de donnes. On prendra garde, pourtant, ne pas multiplier linni cette notion de rupture dans les impressions. Toutes les formules, tous les mots-cls utiliss dans les contrles Zone de texte des formulaires restent identiques dans les tats. Lutilisation dune tiquette comme dun texte complet permet denvisager le montage de publipostages dans Access mme, sans autre outil : les coordonnes des destinataires seraient gres comme tout autre champ en haut droite de la page et le texte mis en place dans autant dtiquettes quil y aurait de paragraphes. Mais cette dmarche nous parat hasardeuse : il serait impossible dinsrer des champs variables au sein mme des textes et surtout, il serait impossible de grer les largeurs de zones. Il est inniment plus efcace de faire le mailing dans Word en appelant les donnes stockes dans la base Access. Inversement, Access sadapte parfaitement bien limpression des documents structure xe comme les factures. Contrairement aux formulaires, enn, les enregistrements imprims dans un tat peuvent tre numrots pour tablir des rfrences prcises : 1. Dans ltat des codes postaux ci-dessus, en mode cration, dcalez les champs CODE et VILLE vers la droite de 2 carreaux (si les zones de texte sont restes solidaires, lensemble des zones se dcale simultanment). 2. Dans len-tte de page, ajoutez une tiquette N de ligne. 3. Dans le dtail, ajoutez une zone de texte vierge et retirez le texte de son tiquette. 4. Dans la feuille de proprits de la nouvelle zone, entrez la formule =1 la proprit Source contrle.

172

Access 2007 et VBA

Chapitre

5. Dans la mme feuille de proprits, positionnez la proprit Cumul Par Groupe (au lieu de Non). Le rsultat nal de ltat doit correspondre celui de la gure 6.7. Figure 6.7
Rsultat de ltat Bottin des codes postaux avec numrotation des lignes.

Rsum
Access a conu limpression des donnes par la gnration dtats dont lessentiel des rgles est rgi de la mme manire que les formulaires. La source des donnes sera, la plupart du temps, fournie par une requte spcique dont on exclura tout tri ou slection spcique ; en effet, Access permet de mettre en place dans les tats des ruptures ddition (avec ou sans sous-totaux) et des tris qui font du gnrateur dtats un outil particulirement performant. Inadapt aux mailings, ltat Access correspond trs bien, en revanche, aux besoins des gestionnaires et commerciaux (listings, factures, etc.).

Les tats 173

Problmes et exercices
EXERCICE 1 TAT
DES NOTES DES LVES Le seul exercice de ce chapitre porte sur les donnes contenues dans la base ECOLE_ INTERNATIONALE. Il met en uvre, simultanment, les connaissances acquises sur les formulaires et les tats.

nonc

Mettez en place un formulaire dot dune zone de liste droulante proposant tous les lves ; un clic sur un bouton dimpression dans le mme formulaire lancera laperu avant impression du carnet de notes de llve choisi avec toutes les moyennes ; il doit apparatre, en sus, une moyenne des langues vivantes. Le formulaire demand est un classique de la programmation : il sagit dune fentre de paramtres dimpression qui souvre uniquement au moment dune demande ddition ; on parle de bote de dialogue modale. La notion de ltre sur tat servira afcher llve slectionn dans la zone de liste droulante Cration de la bote de dialogue modale 1. Dans le menu Crer , cliquez sur licne Plus de formulaires. 2. Slectionnez Bote de dialogue modale : un formulaire vierge est cr. En le passant en mode formulaire, on constate quil sagit dune fentre dpourvue de boutons de dimension en haut droite (sauf la croix de fermeture) et que deux boutons dactions sont dj insrs en bas (OK et annuler). Les proprits Fen Modale et Fen indpendante du formulaire sont positionnes Oui, contrairement aux formulaires habituels o ces deux proprits sont positionnes Non. La fentre a laspect prsent la gure 6.8. 3. Enregistrez la bote de dialogue modale sous le nom Frm_Choix_Eleve et renseignez la proprit Lgende du formulaire par Choix dun lve , libell qui apparatra dans la barre bleue suprieure du formulaire 1. 4. Insrez une zone de liste droulante dans le formulaire. 5. ltape 1, conservez loption par dfaut de source des donnes (table). 6. ltape 2, choisissez la table ELEVE .

* Solution

1. On remarquera que laffichage de la bote de dialogue en mode cration ne peut pas tre obtenu avec le bouton haut gauche du ruban de cration ; il est ncessaire de faire un clic droit sur lobjet dans le volet de navigation et de slectionner Mode Cration .

174

Access 2007 et VBA

Chapitre

Figure 6.8
Bote de dialogue modale vierge.

7. ltape 3, faites glisser les trois champs ID_ELEVE , NOM_ELEVE , PRENOM_ELEVE dans le pav des champs slectionns. 8. Ne vous arrtez pas ltape 4 de la mise en place de tris. 9. Conservez la colonne cl cache ltape 5. 10. Nommez ltiquette de la zone de liste droulante Choix dun lve la dernire tape. 11. En mode cration, nommez le contrle de Zone de liste droulante Choix_eleve dans les proprits (ce point est important car le nom du contrle sera ncessaire par la suite). Cration de la requte la source de ltat La requte qui appelle les informations ncessaires ltat est conue pour renvoyer toutes les donnes (alors quun seul lve donnera lieu impression) et dpourvue de tout tri : ces oprations se feront en aval. 1. Dans le menu Crer , cliquez sur le bouton Cration de requte . 2. Afchez les tables ELEVE , MATIERE et NOTE . 3. Insrez les champs ID_ELEVE , NOM_ELEVE , PRENOM_ELEVE , NOM_MATIERE , NOTATION . 4. Cliquez sur le bouton Totaux . 5. Conservez lopration Regroupement pour tous les champs de la requte sauf pour NOTATION o la fonction Moyenne doit tre slectionne. 6. La requte, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN (ELEVE INNER JOIN [NOTE] ON ELEVE.ID_ELEVE=NOTE.ID_ELEVE) ON MATIERE.ID_MATIERE=NOTE.ID_MATIERE

Les tats 175

Exercices

GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE;, doit avoir la structure prsente la gure 6.9.

Figure 6.9
Requte Req3_ Moyennes de lexercice 6-1.

Enregistrez la requte sous le nom Req3_Moyennes (si les exercices des chapitres prcdents ont t faits, il existe dj une requte Req1_Moyennes et une requte Req2_ Moyennes). Cration de ltat 1. Fermez toutes les fentres en cours et positionnez la surbrillance du volet de navigation au-dessus de la requte source Req3_Moyennes. 2. Dans le menu Crer , cliquez sur licne Assistant tat. 3. la premire tape, dplacez tous les champs du pav champs disponibles au pav champs slectionns. 4. la deuxime tape, indiquez Access un niveau de regroupement en cliquant sur la che vers la droite pour insrer le champ ID_ELEVE comme niveau. Lassistant doit avoir la conguration indique la gure 6.10. Figure 6.10
Niveaux de regroupement dans lassistant tats.

176

Access 2007 et VBA

Chapitre

5. Dans la troisime tape, nindiquez pas dordre de tri, mais cliquez sur le bouton Options de synthse . Cochez la case Moyenne pour demander programmer une moyenne gnrale pour llve. 6. Dans les deux tapes suivantes, choisissez le style de formulaire qui vous convient le mieux. 7. Indiquez le titre Rsultats pour ltat la dernire tape. Leffet obtenu nest pas totalement satisfaisant : Le regroupement est correct (ID_ELEVE par ID_ELEVE), mais ltat rpte le nom et le prnom de chacun autant de fois quil existe de matires : ceci est d au fait que le regroupement seffectue sur le seul ID et non pas sur le triplet ID-NOMPRENOM. Les moyennes par matire apparaissent sous la forme ########## car la zone nest pas sufsamment large. Le libell Synthse pour ID_ELEVE nest pas trs heureux. Procdons aux perfectionnements ncessaires en mode cration : 1. Slectionnez lensemble des tiquettes contenues dans len-tte de page, puis, dans le menu Rorganiser , cliquez sur Supprimer (les tiquettes se dsolidarisent des zones de texte places dans le Dtail). 2. Supprimez toutes les tiquettes de len-tte de page en appuyant sur Sup . 3. Rduisez la hauteur de la zone En-tte de page an quelle devienne invisible. 4. Dplacez le champ NOM_ELEVE de la zone Dtail la zone En-tte de groupe. 5. Dplacez le champ PRENOM_ELEVE de la zone Dtail la zone En-tte de groupe. 6. Mettez les deux champs prcdents en Gras. 7. Dplacez les champs MATIERE et MoyenneDeNOTATION pour les placer en milieu dtat. 8. largissez le champ MoyenneDeNOTATION. 9. Positionnez les proprits du champ MoyenneDeNOTATION Format et Dcimales respectivement Fixe et 2. 10. Dans le pied de groupe, supprimez le libell automatique de synthse pour ne conserver que la moyenne gnrale et son libell. 11. Modiez les proprits du champ de Moyenne gnrale dont la proprit Source est =Moyenne([MoyenneDeNOTATION]) : les proprits Format et Dcimales doivent tre respectivement Fixe et 2.

Les tats 177

Exercices

Ltat des rsultats doit avoir la structure dcrite la gure 6.11. Figure 6.11
Structure de ltat des rsultats aprs modications.

Mise en place du passage du formulaire ltat et du ltre La bote de dialogue modale et ltat tant prts, il ne reste plus qu lier les deux lments en insrant dans le mme temps la notion de ltre. 1. Ouvrez la bote de dialogue modale Frm_Choix_Eleve en mode cration (clic du bouton droit dans le volet de navigation sur llment et slection du Mode Cration ). 2. Ouvrez la feuille de proprit du contrle Bouton de commande nomm OK. 3. Slectionnez la proprit SurClic (qui contient dj une macro incorpore) et cliquez sur le bouton aux trois points de suspension. 4. La macro ne contient quune ligne avec le mot-cl Fermer pour action : nous allons insrer une ligne avant cette action. 5. Faites un clic droit gauche de la premire ligne et slectionnez Insrer des lignes : une ligne blanche se positionne au-dessus de laction Fermer. 6. Ouvrez la zone de liste droulante dans la colonne Action et slectionnez OuvrirEtat. 7. Dans la zone infrieure de lcran, prcisez le nom de ltat Rsultats en le pointant dans la zone de liste droulante Nom de ltat. 8. Toujours en bas dcran, insrez la condition WHERE suivante : [ID_ELEVE]=[Formulaires]![Frm_Choix_Eleve]![Choix_Eleve] . Dans cette expression, le premier ID_ELEVE entre crochets renvoie celui de ltat pendant que la partie droite de lquation utilise une structure dj tudie au chapitre prcdent : le mot-cl Formulaires entre crochets dsigne la collection dobjets de ce type, [Frm_Choix_ Eleve] dsigne le formulaire cibl (la bote de dialogue modale) et [Choix_Eleve] dsigne le contrle. 9. Prcisez les proprits de laction Fermer de la deuxime ligne : le type dobjet renseigner en bas dcran est un Formulaire et le nom de lobjet est Frm_Choix_Eleve.

178

Access 2007 et VBA

Chapitre

La macro doit avoir la structure dcrite la gure 6.12. Figure 6.12


Macro incorpore du contrle OK de la bote de dialogue modale.

10. Fermez la macro et enregistrez les modications. 11. Testez le programme : louverture de la bote de dialogue modale, slectionnez un lve et cliquez sur OK , ltat souvre automatiquement et nafche que llve slectionn : limpression peut tre lance. Remarque : la bote de dialogue se ferme automatiquement, ds que le paramtre de choix de llve a t renvoy ltat.

Les tats 179

Exercices

Chapitre

Les macros

1. Mise en uvre des macros..... 182 2. Le passage des macros Visual Basic........................ 189 Problmes et exercices 1. Macro insre dans une zone de liste.................................. 194 2. Macro denvoi de messages lectroniques......................... 199

Dj abordes rapidement, les macros dAccess permettent lautomatisation dactions successives, ventuellement sous condition. Fondamentalement diffrentes de celles dExcel, les macros Access nenregistrent pas les gestes faits par lutilisateur, mais doivent au contraire tre composes par lentre dactions et la mise en place de paramtres ces actions. Les macros Access ne sont pas traduites immdiatement en langage Visual Basic : il faut mettre en uvre un utilitaire spcifique pour effectuer cette traduction. Les macros nen restent pas moins un excellent moyen de passer graduellement dune automatisation partielle une utilisation du code de programmation.

181

(1)

Mise en uvre des macros


Les quelques macros qui ont t vues dans les chapitres prcdents, uniquement destines parachever un exercice particulier, ont t chaque fois incorpores dans le formulaire ou ltat, plus prcisment sous la proprit de lvnement partir duquel elles taient lances. prsent, notre tude va porter sur la conception de macros enregistres comme telles et non incorpores.

1.1 CRATION

DE MACRO

La premire succession dvnements programms que nous allons crire consiste afcher une bote de message puis ouvrir la table CODE_POSTAL de la base du mme nom et enn dexporter cette table vers un nouveau chier Excel. 1. Dans longlet Crer, cliquez sur le triangle plac dans licne Macro, droite, et slectionnez Macro (les deux autres lments, que nous verrons plus loin, accdent directement Visual Basic). 2. Une nouvelle fentre souvre, similaire celle de la gure 7.1. Figure 7.1
Grille de saisie des macros.

Commentaire de la grille de saisie : En haut dcran, un ruban dont on tudiera le dtail dans les pages qui viennent. Dans le corps du document, une liste de lignes pouvant contenir des Actions qui se drouleront successivement. En bas, et synchroniss avec la ligne active, les arguments de laction slectionne. Ces arguments varient suivant le type daction choisi. Dans la partie de droite, chaque action peut recevoir un commentaire : nous ne saurions que trop recommander la saisie de textes permettant de documenter lapplication en cours dlaboration.

182

Access 2007 et VBA

Chapitre

Louverture de la zone de liste droulante de laction permet de lire une trentaine dactions possibles, mais si lon clique sur le bouton du ruban Afcher toutes les actions, la palette complte comprend alors 70 types dactions programmables. 1. la premire ligne, slectionnez laction BoteMsg. 2. Dans la partie infrieure de lcran, renseignez le message par La table des codes postaux va souvrir ; conservez la proprit Bip Oui ; choisissez le Type comme Point dexclamation ; indiquez le Titre : Ma premire macro . 3. la deuxime ligne, slectionnez laction OuvrirTable. 4. Parmi les arguments, slectionnez la table CODE_POSTAL comme Nom de la table. 5. Prcisez largument Afchage en Feuille de donnes et largument Mode donnes en Lecture seule. 6. Sur une troisime ligne, insrez laction TransfrerFeuilleCalcul. 7. Largument Type de transfert doit tre positionn Exportation (au lieu de Importation par dfaut). 8. Largument Type de feuille de calcul doit tre positionn Excel Workbook (pour une exportation vers un chier Excel 2007). 9. Le nom de la table exporter est CODE_POSTAL (on remarquera quAccess ne propose pas de zone de liste droulante). 10. Le chemin complet et le nom du chier doivent tous tre indiqus pour une exportation valide ; on entrera un chemin du type C:\Users\Utilisateur1\Desktop\CODE_ POSTAL.XLSX 1. 11. Les deux derniers arguments de laction TransfrerFeuilleCalcul peuvent tre laisss en ltat. 12. Sur une quatrime et dernire ligne insrez une nouvelle BoteMsg avec pour Message, Le chier a t export vers Excel , pour Type, Aucun et Titre, Ma premire 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 bote de message souvre puis, aprs un clic sur OK, laisse la place la table en mode feuille de donnes et lecture seule. Lexportation se ralise sans mme quaucun effet visuel nen dcoule et le message de bon envoi safche pour terminer.

1.2 ASSOCIATION DUNE

MACRO UN BOUTON

La macro qui a t cre dans le paragraphe prcdent peut tre lance depuis le volet de navigation, mais il est frquent que les macros soient associes un formulaire et un bouton donns. 1. Dans le menu Crer , cliquez sur licne Cration de formulaires (une grille vierge de formulaire apparat). 2. Cliquez sur licne Bouton de commande du ruban et dessinez un carr en bas dcran.
1. Ce chemin, qui sapparente une structure de fichiers Windows Vista, permet de copier les donnes sur le bureau de lutilisateur appel Utilisateur1 dans un fichier Excel 2007. 2. Certains programmeurs prfixent leurs macros par Mac_xxx.

Les macros 183

3. Dans la premire tape de lassistant, slectionnez laction Excuter une macro parmi les options de la catgorie Divers. 4. Dans la deuxime tape, choisissez la macro Mcr_Visu_Codes. 5. Choisissez lapparence que vous prfrez dans la troisime tape. 6. Nommez le bouton Visu_codes dans la quatrime et dernire tape. 7. Testez ce bouton en passant en mode formulaire : les quatre oprations programmes plus haut se droulent de la mme manire.

1.3 UTILISATION

DE VARIABLES DANS LES MACROS

Avec Access 2007, il est dsormais possible de faire jouer des variables dans les macros, ce qui largit considrablement la porte de cet outil par rapport aux versions antrieures qui en taient dpourvues. Une variable est une donne (de type alphanumrique mais non de type date ou autres) conserve en mmoire jusqu ce quune commande prcise de macro ne la supprime. Le principe dAccess veut quon affecte simplement une valeur une variable pour quelle soit cre et utilisable. On se propose ici de crer une macro qui : Ouvre une bote de message pour demander lutilisateur un nom de ville. Recherche dans la table des codes postaux le code correspondant la ville demande. Afche une bote de message rponse. Dans la mesure o il existe plusieurs tapes cette opration (entre de la demande, recherche et afchage de la rponse), il est impossible de la raliser sans faire appel des informations stockes quelque part (valeur demande et valeur de rponse) : le support de stockage aurait pu tre un formulaire ou un tat mais, dans le cas prsent, toute lopration doit se drouler sans aucun support sinon la macro elle-mme ; ds lors, seules des variables peuvent rpondre cette attente. 1. Dans le menu Crer , cliquez sur Macro. 2. Sur la premire ligne, choisissez laction DnirVarTemp qui cre une variable et lui affecte une valeur. 3. Dans les arguments, nommez la variable VilleRecherche . 4. Dans les arguments, saisissez en Expression la formule : BEntre("De quelle ville voulez-vous connatre le code postal?") . La fonction BEntre cre une bote de dialogue qui permet lutilisateur de saisir la valeur de la variable. Le texte entre guillemets est le texte qui apparatra dans la bote de dialogue. 5. La deuxime ligne utilise la fonction RechDom, dj tudie, pour dterminer la valeur dune deuxime variable : choisissez laction DnirVarTemp une nouvelle fois sur cette ligne. 6. Dans les arguments, nommez la variable CodeTrouve . 7. Dans les arguments, saisissez en Expression la formule : RechDom("[CODE]";"CODE_ POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'") . On prendra garde la syntaxe de cette formule relativement complexe et frquemment retrouve. En premier lieu, la formule ne commence pas par le signe gal (=). Les trois parties de la fonction RechDom sont cernes par des guillemets ; le premier argument dsigne la colonne de la recherche et est cern par des crochets ; le deuxime argument dsigne

184

Access 2007 et VBA

Chapitre

la table cible et ne ncessite pas de crochets ; le troisime argument, qui dsigne les conditions de la recherche, concatne (signe & ou perlute) plusieurs parties : le champ VILLE est cit entre crochets et guillemets mais une apostrophe (quote simple) est insre en outre avant le dernier guillemet ; cette apostrophe sert citer la variable dcrite aprs comme une chane de caractre ; la variable VilleRecherche qui avait t initialise dans la ligne prcdente est dsigne par le mot-cl VarTemp entre crochets, suivi dun point dexclamation et du nom de variable encore une fois entre crochets ; une dernire partie comprend une apostrophe entre deux guillemets pour fermer la chane de caractres ouverte aprs VILLE. En admettant que la valeur de la variable soit PARIS, la formule scrirait RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='PARIS') . 8. Sur une troisime ligne de macro, slectionnez laction BoteMsg. 9. Parmi les arguments, entrez pour message la formule ="Le code de " & [VarTemp]![VilleRecherche] & " est " & [VarTemp]![CodeTrouve] . Ici, le message doit tre prcd du signe = pour que la concatnation soit effective (un texte littral apparatrait si le signe = tait omis). 10. Une quatrime et dernire ligne supprime les variables et leur contenu (mesure indispensable pour viter des problmes en cas de rutilisation des variables) : insrez laction SupprimerToutesVarTemp qui ne comprend aucun argument. Au total, la macro, quon enregistra sous le nom Mcr_Recherche_Code , aura laspect de la gure 7.2. Figure 7.2
Macro de recherche de code postal en mode cration.

Lexcution de la macro provoque le scnario suivant : tape 1 : une bote de dialogue demande lutilisateur de nommer la ville dont le code postal est recherch, comme il apparat la gure 7.3. Figure 7.3
Premire tape de la macro de recherche de code postal.

Les macros 185

tape 2 : une deuxime bote de dialogue donne la rponse lutilisateur, comme indiqu sur la gure 7.4. On notera que la recherche proprement dite na pas donn lieu un afchage particulier. Figure 7.4
Deuxime tape de la macro de recherche de code postal.

1.4 LES

MACROS CONDITIONNELLES Dans lapplication prcdente, le programme ne prvoit pas le cas o la ville entre dans la bote de dialogue initiale nexiste pas. Si par exemple, et la suite dune faute dorthographe, la ville de PAROS est demande, la place de PARIS, le programme rpond simplement Le code de PAROS est sans plus de commentaire. Pour viter ce problme, on peut crire une macro conditionnelle, qui prvoira cette ventualit. 1. Ouvrez nouveau, si ncessaire, la macro en mode cration. 2. Dans le ruban, cliquez sur le bouton Conditions : une colonne Condition apparat dans le corps de la macro, gauche des Actions. 3. Faites un clic droit dans la marge de la troisime ligne et slectionnez Insrer des lignes : une ligne blanche se cre en dessous de la deuxime dnition de variable. 4. Dans la colonne Condition de la nouvelle ligne, insrez la formule : EstNull([VarTemp]![CodeTrouve]) qui signie littralement Si la variable CodeTrouve est vide (autrement dit : si la recherche na pas abouti). 5. Dans la colonne Action de la mme ligne, slectionnez laction BoteMsg avec pour argument Message : Cette ville nest pas rpertorie dans la table , pour argument Type : le point dexclamation et pour argument Titre : Recherche de code postal. Cette nouvelle ligne de programme, qui contourne la trajectoire directe de la macro initiale, nest pas sufsante. Si les modications se limitent cette seule ligne, le programme va effectivement renvoyer le message erreur si ce dernier sapplique, mais il va continuer en donnant tout de mme une rponse courte et inexacte (testez ce cas de gure). Il faut donc non seulement renvoyer le message erreur mais aussi obliger le programme sarrter en cas derreur. 6. Insrez une nouvelle ligne en dessous du message erreur. 7. Saisissez trois points dans la colonne Condition de la nouvelle ligne : cette syntaxe indique Access que la condition de la ligne prcdente continue sappliquer. 8. Slectionnez laction SupprimerToutesVarTemp. 9. Insrez une nouvelle ligne en dessous. 10. Saisissez trois points dans la colonne Condition.

186

Access 2007 et VBA

Chapitre

11. Slectionnez laction ArrtMacro dans la colonne Action. Dans cette nouvelle rdaction, la macro implique bien deux voies possibles (voir gure 7.5) : Soit la variable est vide et donc le programme renvoie un message erreur, sarrte et dtruit les variables en cours ; Soit la variable nest pas vide, les trois lignes du milieu ne sont pas excutes, la rponse est afche puis le programme dtruit les variables. Figure 7.5
Macro conditionnelle.

1.5 LES

ENCHANEMENTS DE MACROS Les macros peuvent tre chanes entre elles, de manire conditionnelle ou non ; on peut alors mettre en place des programmes complets, rutilisables en divers endroits de lapplication. An dillustrer cette fonctionnalit, nous emploierons de nouveau les macros Mcr_Visu_ Codes et Mcr_Recherche_Code dveloppes prcdemment. 1. Dans le menu Crer , cliquez sur le bouton Macro. 2. Sur la premire ligne, dnissez une variable nomme Choix et dont lexpression est la formule : BEntre("Tapez 1 pour visualiser les codes, 2 pour en rechercher un prcis"). Le choix entre loption 1 et loption 2 orienteront le programme vers lune ou lautre des deux macros dj cres. 3. Cliquez sur le bouton Conditions. 4. Sur la deuxime ligne, insrez la condition [VarTemp]![Choix]=1. 5. Sur la mme deuxime ligne, slectionnez laction ExcuterMacro et citez Mcr_Visu_ Codes dans largument du Nom de macro. 6. Sur la troisime ligne, insrez la condition [VarTemp]![Choix]=2. 7. Slectionnez laction ExcuterMacro et citez Mcr_Recherche_Code dans largument du Nom de macro 1. 8. Enregistrez la nouvelle macro sous le nom Mcr_Choix (voir gure 7.6).

Figure 7.6
Macro appelant dautres macros.

1. On notera que laction ExcuterMacro comporte un argument de rptition. Il est possible, avec cette option, dinsrer une notion de boucle dans les programmes.

Les macros 187

1.6 LA

GESTION DES ERREURS DANS LES MACROS Une procdure particulire est prvue pour grer les erreurs systme qui peuvent intervenir dans les macros. Dans le programme de recherche dun code postal, une erreur intervient coup sr (et provisoirement) si le nom de la ville recherche comporte une apostrophe. Avant de rparer ce problme, tentez par exemple de rechercher le code postal de CAP DAIL (qui se trouve bien dans la liste) avec la macro Mcr_Recherche_Code : le programme renvoie le message erreur de la gure 7.7.

Figure 7.7
Message erreur d une mauvaise syntaxe SQL.

An dviter lafchage de ce message, incomprhensible pour lutilisateur, nous modions la macro Mcr_Recherche_Code de la manire suivante : 1. Ouvrez la macro en mode cration. 2. Cliquez dans le ruban sur le bouton Noms de macro : le corps de la macro compte dsormais 5 colonnes. 3. Insrez une nouvelle premire ligne. 4. Slectionnez laction SurErreur avec pour argument Atteindre : Nom Macro et pour argument Nom de Macro : Gestion_Erreurs. On notera que ce nom de macro ne respecte pas le sufxe habituel Mcr_ donn jusqu maintenant. En effet, ce nom de macro restera compltement interne la macro en cours et ne donnera pas lieu enregistrement en tant que tel. Laction SurErreur a t volontairement pose en dbut de programme pour intercepter toutes les erreurs qui suivront. 5. En bas de macro (9e ligne), saisissez Gestion_Erreurs dans la premire colonne des Noms de macro. 6. Dans la colonne Action, slectionnez BoteMsg avec pour argument Message : Le nom de la ville ne doit pas comporter dapostrophe . La macro a, au nal, les proprits indiques la gure 7.8. Figure 7.8
Macro avec gestion des erreurs.

188

Access 2007 et VBA

Chapitre

Le programme, dsormais, intercepte lerreur avant quelle ne renvoie le message de la gure 7.7 et dtourne le programme vers la gestion derreurs situe en bas.

Note
En fait, lerreur est due une imperfection de la syntaxe de la fonction RechDom() dans la troisime ligne du programme. La syntaxe actuelle est RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'"). Dans cette tournure, et pour simplier les explications, on a employ des apostrophes pour cerner le nom de la ville recherche dans la requte SQL. Or, si la ville recherche, justement, comprend elle aussi une apostrophe, il sensuit forcment une erreur car SQL ne sait plus o se trouve la chane de caractres recherche. Dans labsolu, il faut remplacer chaque apostrophe par un double guillemet ("") pour solutionner le problme. La formule devient alors RechDom("[CODE]";"CODE_POSTAL";"[VILLE]= """ & [VarTemp]![VilleRecherche] & """").

(2)

Le passage des macros Visual Basic


Avant dtudier les rudiments de Visual Basic, nous abordons ici un moyen trs convivial de glisser du monde des macros la programmation VBA proprement dite. Access est dot, en effet, dun utilitaire qui permet de traduire les macros dans le langage commun toutes les applications Ofce, Visual Basic pour Applications.

2.1 LA

CONVERSION DES MACROS EN

VISUAL BASIC

La procdure de conversion que nous allons tudier savre dune simplicit extrme et peut tre utilise massivement dans un premier temps, avant que le langage VBA ne soit compltement assimil. Dans de nombreux cas, il sera judicieux de passer par cette voie lorsque des syntaxes seront mconnues ; on gagnera par l un temps prcieux. 1. Fermez tous les onglets Access actifs et mettez en surbrillance la macro Mcr_Visu_ Codes (sans la dmarrer ou louvrir en mode cration !). 2. Cliquez dans le menu sur Outils de base de donnes . 3. Cliquez sur le bouton du ruban Convertir les macros en Visual Basic . 4. Le programme de conversion passe par une bote message proposant dajouter une gestion des erreurs et des commentaires au programme (voir gure 7.9) : conservez les deux cases cocher dans leur tat et cliquez sur Convertir . Figure 7.9
Options de la conversion des macros en Visual Basic.

5. Immdiatement, le code qui avait t conu sous forme graphique devient un texte pur ouvert dans la fentre bien particulire de Visual Basic. La conversion ne comporte pas plus de difcults !

Les macros 189

6. Lorsque la bote message Conversion termine est ferme, linterface est celle de Visual Basic : fermez le programme en cliquant sur la croix suprieure droite (ou Fichier > Fermer et retournez Microsoft Ofce Access).

2.2 LA

PRSENTATION 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 dcouverte, mais ne devrait pas tre insr, en ltat, dans une application. Gnralement, on donnera aux modules des noms plus courts et sans espaces. Un simple clic sur le module provoque tout la fois le dmarrage du programme VBA et louverture la page du module slectionn. Il est galement possible de cliquer sur licne Visual Basic dans le menu Outils de base de donnes . Lagencement gnral de Visual Basic est dcrit la gure 7.10. Pour afcher les proprits de lobjet, slectionner le menu Afchage > Fentre Proprits . Figure 7.10.
Fentre douverture de Visual Basic.

La fentre nest plus celle dAccess, mais celle de Microsoft Visual Basic. Un bouton en haut gauche permet de retourner Access, qui reste actif en permanence. Cette interface est la mme pour Access, Excel, Word et tous les produits de la gamme Ofce. Dans la partie suprieure gauche de lcran apparat une sous-fentre des projets ; il peut exister un certain nombre de projets prchargs qui correspondent des assistants (ACWZTOOL) ou complments spciques : gnralement, ils ne peuvent pas tre ouverts. En dessous, dans la mme zone, se trouvent les lments du chier Access ouvert. Au premier dmarrage de VB, vous ne verrez probablement que des modules comme sous-lments du chier, mais rapidement, la structure sera celle montre sur la gure 7.10 avec : des Microsoft Ofce Access Objets de classe (et des formulaires en dessous) ; des modules. Il est donc possible dinsrer du code : soit dans les formulaires, ceux-l mme qui ont t tudis prcdemment, et dont le code se rfrera tous les vnements pouvant survenir dans ces formulaires ; soit dans des modules spars : le code sera alors appel par une syntaxe spcique. Un double-clic dans lun de ces lments permet de le visualiser dans la partie droite de lcran.

190

Access 2007 et VBA

Chapitre

Dans la partie infrieure gauche sont afches les proprits de lobjet actif. Ici, on peut lire (et modier le cas chant) le nom du module. Les deux pavs de gauche (projets et proprits) peuvent tre supprims de lafchage ou remis en place par des options du menu gnral Afchage. Le pav de droite contient le code Visual Basic proprement dit comme il apparat la gure 7.11. Nous allons le dtailler. Figure 7.11
Code Visual Basic de la macro convertie Mcr_ Visu_Codes .

La premire ligne de code Option Compare Database est une ligne particulire, systmatiquement ajoute dans Access pour indiquer que les options dordre de tri seront ceux slectionns dans les paramtres rgionaux. Cette partie, termine par un trait, pourrait comprendre dautres options gnrales 1. Les quatre lignes suivantes commencent chacune par une apostrophe (') ; le texte qui se trouve droite se colore en vert : il sagit de commentaires et ces lignes ne seront pas excutes par le programme. La conversion de la macro les a gnres automatiquement. Le texte du module proprement dit commence par le mot-cl Function et se termine par le mot-cl End Function (ils sont en bleu) ; entre ces deux limites, nous sommes dans une fonction, soit un ensemble de lignes de code constituant un programme qui pourra tre excut. Le mot-cl Function est suivi par le nom de fonction Mcr_Visu_Codes(): ce nom est directement issu de la macro originelle et devrait tre modi ; les parenthses qui suivent, et qui pourraient contenir des paramtres sont obligatoires. La fonction (Function) dclare ici possde des proprits bien particulires que nous verrons plus loin ; elle peut tre remplace par une simple procdure (dclare par les mots-cls Sub et End Sub). Le code proprement dit, qui sera excut, est crit en noir. La premire ligne ne contient quune simple commande Beep, qui effectue un bip sonore. La deuxime ligne contient une commande de Bote de message (MsgBox), suivie de ses paramtres. On verra bientt que Visual Basic aide lutilisateur rdiger son code et numre les paramtres entrer au fur et mesure de la saisie. Ces paramtres sont spars par des virgules ; ici ils comprennent, par ordre, le message afch dans la bote ellemme, le type de bote de message (vbExclamation) et le titre de la bote.
1. Option Explicit, par exemple et quon recommande, oblige le programmeur dclarer toutes ses variables.

Les macros 191

Le texte de la troisime ligne se retrouve souvent en programmation : Lexpression DoCmd lance une commande Access. Cette expression ne peut pas tre utilise seule : elle est toujours suivie dun point et dun autre objet membre de la classe DoCmd 1. Dans le cas prsent, DoCmd est suivi de lobjet OpenTable (ouvrir la table). De la mme manire, on pourra manipuler dautres lments Access avec laction OpenForm (ouvrir un 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 deuxime argument est la manire douvrir la table, acViewNormal signiant mode feuille de donnes, par opposition acViewDesign (mode cration). Le dernier argument prcise une ouverture en lecture seule (acReadOnly au lieu de acEdit). Pour bien vrier que tous ces arguments sont directement modiables dans le code, procdez de la manire suivante : 1. Dans la fonction tudie, cliquez dans le texte tout de suite aprs lexpression OpenTable. 2. Appuyez sur la touche BackSpace (marche arrire) pour faire disparatre lexpression jusque et y compris le point sparateur. 3. Tapez de nouveau un seul point : vous voyez que Visual Basic vous propose tous les objets possibles par ordre alphabtique (AddMenu, ApplyFilter). 4. Redescendez jusqu lexpression OpenTable, slectionnez-la et utilisez la touche de tabulation, lexpression est reprise dans le texte. 5. Procdez de la mme manire en supprimant largument acViewNormal et la virgule qui le prcde puis retapez la virgule : VB propose plusieurs modes de visualisation (acViewLayout, acViewNormal, etc.). 6. Enn, faites de la mme manire pour le dernier argument acReadOnly. Il est clair, ds lors, que la frappe directe de code VB nest pas aussi ardue que les noninitis se limaginent. Un bon moyen de dmarrer consiste, justement, gnrer du code en utilisant les macros, le rviser et laugmenter. Grce cette dmarche, on ira graduellement vers une rdaction directe du code. La fonction cre comprend, comme on la prvu au moment de la conversion de la macro, une gestion des erreurs. Cette structure demande une explication particulire. La premire ligne de programme comporte le code On Error GoTo Mcr_Visu_Codes_ Err; plac au tout dbut, ce code prvoit lhypothse dune erreur. Dans cette ventualit, le pointeur de programme sera renvoy au label Mcr_Visu_Codes_Err la dixime ligne et sautera la totalit des lignes entre celle qui a provoqu lerreur et ce quon appellera la rcupration de lerreur. Le mot-cl GoTo constitue un branchement sur une tiquette de ligne. Ltiquette de ligne est signale par le mot-cl employ dans le renvoi GoTo suivi du signe deux-points (:).

1. Avec la touche F2 dans Visual Basic ou en cliquant sur Affichage > Explorateur dobjets, on accde la bibliothque des objets constituant le modle objet VB et grce auquel on retrouvera tous les outils ncessaires la rdaction du code.

192

Access 2007 et VBA

Chapitre

Sil survient une erreur dans le programme, le contrle programme passe donc directement ltiquette de ligne Mcr_Visu_Codes_Err et poursuit en lisant la ligne suivante : la commande MsgBox Error$ ouvre une bote de message dcrivant lerreur dtecte. La ligne suivante se sert de la syntaxe Resume pour oublier lerreur et aller vers une nouvelle tiquette de ligne nomme Mcr_Visu_Codes_Exit. Enn, la ligne de programme Exit, situe sous ltiquette, permet de sortir de la fonction. Cette gestion des erreurs peut paratre lourde et complexe, mais savre indispensable dans le code. Dune part, elle est compltement gnre sans lintervention du programmeur mais elle a, dautre part, limmense avantage dviter lutilisateur de recevoir des messages incomprhensibles. En admettant que toute la structure de gestion derreur soit supprime, le message afch par Access serait celui de la gure 7.12. Figure 7.12
Message Access en cas dabsence de gestion derreurs.

Dans ce message, dot dun numro derreur inutile pour lutilisateur nal, il est possible de cliquer sur le bouton Dbogage et daccder directement au code VB. Si une application complte et acheve doit tre livre des utilisateurs, un tel message est donc prohiber absolument !

Rsum
Les macros dAccess, contrairement celles dExcel, scrivent en enregistrant des actions raliser, dotes de paramtres. Les manipulations seffectuent dans un environnement graphique prvoyant tous les cas de gure possibles. Les macros dAccess 2007 permettent lutilisation de variables, qui tendent considrablement leur champ daction, et autorisent les conditions et les boucles de programmes. Toute macro peut tre trs facilement convertie en code an dtre rutilise sous lenvironnement Visual Basic. Ce dernier, totalement intgr Access, permet la mise au point de programmes beaucoup plus labors et sera donc prfr, terme, lutilisation des macros. Les programmes VBA sont intgrs dans des fonctions (Function) ou des procdures (Sub). La rdaction du code en est facilite par linterface graphique qui propose, au fur et mesure de la saisie, linsertion de tous les mots-cls et paramtres du modle objet de VBA. La conversion des macros en code cre automatiquement une gestion des erreurs qui vite aux utilisateurs daccder aux programmes eux-mmes.

Les macros 193

Problmes et exercices
Les exercices proposent de crer des macros dans la base ECOLE_INTERNATIONALE. On transformera ensuite ces macros en code Visual Basic sur lequel on fera quelques ajouts et mises au point.

EXERCICE 1
nonc

MACRO

INSRE DANS UNE ZONE DE LISTE

1. partir dun formulaire vierge, crez une zone de liste (simple) choix unique, prsentant tous les lves ; un clic sur lun des items de la liste doit ouvrir une bote de message prsentant la moyenne de llve. 2. La macro, incorpore dans le formulaire sera ensuite convertie en code VB. On ajoutera une nouvelle bote de message interrogative demandant la matire calculer pour donner nalement la seule moyenne de llve dsign dans cette seule matire. 3. Cette bote de dialogue rappellera le nom et le prnom de ltudiant suivi de sa note.

* Solution

1. Cration du formulaire, de la macro et gnration du code VB Lexercice reprend tous les lments dj vus dans les chapitres prcdents : 1. Dans le menu Crer , cliquez sur Cration de formulaires (pour obtenir un formulaire vierge). 2. Cliquez sur le bouton Zone de liste (Contrle de formulaire). 3. Dessinez un large rectangle dans le corps du formulaire. 4. ltape 1 de lassistant Zone de liste, conservez loption par dfaut de recherche dans une table. 5. ltape 2, slectionnez la table ELEVE . 6. ltape 3, insrez les trois champs ID_ELEVE , NOM_ELEVE et PRENOM_ ELEVE dans le pav des champs slectionns. 7. Sautez ltape 4 des tris ajouter. 8. Conservez les options par dfaut de ltape 5 (colonne cl cache). 9. Dans la dernire tape, nommez ltiquette Liste des lves . 10. Enregistrez votre formulaire sous le nom Frm_Liste_Eleves . Vous devez obtenir un rsultat similaire la gure 7.13.

194

Access 2007 et VBA

Chapitre

Figure 7.13
Zone de liste de lexercice 1.

Les macros 195

Exercices

1. Dans la feuille de proprits de la zone de liste, modiez la proprit Nom par Choix_ Eleve au lieu de Liste0. 2. Vriez que la proprit Slection multiple est bien Aucun (cest loption par dfaut) : lutilisateur ne pourra donc pas toper plusieurs lves simultanment. 3. la ligne de la proprit SurClic, cliquez sur le bouton aux trois points de suspension droite. 4. Slectionnez Gnrateur de macro : linterface des macros souvre. 5. Slectionnez laction BoteMsg. 6. Dans largument Message, insrez la formule = MoyDom("[NOTATION]";"NOTE";"ID_ ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]) que nous allons dcomposer : La fonction MoyDom() est une fonction de regroupement de domaine qui calcule une moyenne pour un champ dune table prciser dans les paramtres. Le premier paramtre est celui du champ NOTATION, cit entre guillemets et crochets. Le deuxime paramtre est celui de la table NOTE, cite entre guillemets. Le troisime paramtre pose la condition de calcul : lID de llve sur lequel porte le calcul doit tre celui qui correspond la valeur prise par le contrle Zone de liste. ID_ELEVE = est cit entre guillemets pour respecter la syntaxe de la fonction. La deuxime partie de lquation, concatne avec la premire par le signe & nest pas cite entre guillemets an quAccess ne le prenne pas pour une valeur littrale, mais traduise la valeur. La valeur du contrle de Zone de liste est renvoye par la formule [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve] qui prcise respectivement et spars par des points dexclamation le type de source (formulaire), le nom du document source et le nom du contrle source. 7. Modiez largument Bip par Non. 8. Pour largument Type, choisissez Information.

9. Pour largument Titre, entrez RESULTATS. 10. Fermez les fentres de la macro pour raliser les tests. 11. Testez votre macro : la bote message doit afcher un simple chiffre, dot de beaucoup de dcimales. 12. On amliorera donc le rsultat nal en utilisant la formule suivante : ="Moyenne gnrale: " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]);"Fixe") (voir gure 7.14). Le libell Moyenne gnrale a t ajout en dbut de formule, cit entre guillemets. La fonction Format() a servi calculer un arrondi deux chiffres aprs la dcimale ; ici, elle est de la forme Format(<expression> ; "Fixe"). Figure 7.14
Premier message renvoy dans lexercice 1.

La macro est incorpore dans le formulaire Frm_Liste_Eleves ; elle nest donc pas convertissable en ltat en code Visual Basic. Il faut donc lenregistrer au pralable : 1. Retournez en mode cration dans la macro et cliquez sur le bouton Enregistrer Sous. 2. Renommez le libell propos par dfaut Frm_Liste_Eleves par Mcr_Liste_Eleves et cliquez OK , puis fermez la fentre de la macro : la proprit SurClic du contrle de Zone de liste napparat plus le terme Macro incorpore, mais le terme Mcr_Liste_Eleves. 3. On remarque que la macro a t enregistre comme telle et apparat dans le volet de navigation ; restez sur la proprit SurClic de la zone de liste. 4. prsent, il est possible daccder au bouton Convertir les macros de formulaire en code Visual Basic dans longlet Outils de base de donnes : activez-le. 5. Acceptez la gestion derreurs et les commentaires, la macro est immdiatement traduite. 6. La proprit SurClic de la Zone de liste Choix_Eleve nest plus nomme Mcr_Liste_ Eleves mais Procdure vnementielle. Un clic sur le bouton aux trois points de suspension permet un accs direct VB. Dsormais, le code est bien implment sous le formulaire : La seule ligne de programme proprement dit contient le code MsgBox "Moyenne gnrale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_Liste_ Eleves!Choix_Eleve), "Fixed"), vbInformation, "RESULTATS" qui correspond trs exactement ce qui avait t entr sous forme de macro. La procdure commence par les mots-cls Private Sub : le mot Private indique que la procdure qui suit ne sera accessible que dans le module o elle est place ; on touche ici la notion de porte des fonctions et procdures, applicable aussi aux variables. Le mot Sub (auquel correspond un End Sub en n de procdure) initialise une procdure (en lieu et place dune fonction).

196

Access 2007 et VBA

Chapitre

2. Cration de la bote de message demandant la matire Pour raliser la deuxime partie de lexercice, il faut prsent mettre en uvre une nouvelle bote de message, saisie cette fois directement dans VB, et deux variables. En effet, le programme doit demander lutilisateur une matire (ANGLAIS ou MATHEMATIQUES par exemple), retrouver le numro correspondant cette matire, tenir compte de llve slectionn, et donner le rsultat correct au moyen dune formule qui prcise la recherche en fonction du numro dlve et du numro de matire. On dclare deux variables dans le programme nommes VARLIBMATIERE initialise comme une chane de caractres et VARNOMATIERE initialise comme une valeur entire. 1. Au-dessus de la ligne MsgBox existante (mais aprs le OnError), crivez : Dim VARLIBMATIERE As String. Cette ligne dclare une variable en tant que chane de caractres. 2. En dessous, crivez : Dim VARNOMATIERE As Integer. Cette ligne dclare une variable en tant que valeur entire. 3. En dessous, saisissez : VARLIBMATIERE=InputBox("Indiquez la matire recherche", "Calcul de moyenne"). Cette ligne, dont la fonction InputBox() est lquivalent de la fonction BEntre() tudie dans les macros, ouvre une bote de message interrogative et passe la variable VALIBMATIERE, la valeur saisie par lutilisateur. 4. La formule suivante, insre ensuite, permet de retrouver le numro de la matire recherche : VARNOMATIERE=DLookup("ID_MATIERE", "MATIERE", "NOM_ MATIERE=' " & VARLIBMATIERE & " ' ")1. La fonction DLookup(), quivalente en VB de la fonction RechDom(), recherche le numro de matire correspondant la matire cite en toutes lettres. 5. Insrez une ligne plus bas et provisoirement une ligne MsgBox VARNOMATIERE qui nous permettra de tester le programme arriv ce stade. Au total, le programme est le suivant (provisoirement).
Private Sub Choix_Eleve_Click() On Error GoTo Choix_Eleve_Click_Err Dim VARLIBMATIERE As String Dim VARNOMATIERE As Integer VARLIBMATIERE=InputBox("Indiquez la matire recherche", "Calcul de moyenne") VARNOMATIERE=DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" & VARLIBMATIERE & "'") MsgBox VARNOMATIERE MsgBox "Moyenne gnrale: " & 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

1. Lenchanement des guillemets scrit avec la mme syntaxe que celle tudie dans le cours concernant les macros. Les apostrophes (quotes simples amricaines), destines faire comprendre la dmarche du programmeur, doivent tre remplaces par des doubles guillemets pour faire reconnatre les chanes de caractres contenant elles-mmes des apostrophes.

Les macros 197

Exercices

ce stade, testez le programme : cliquez sur un lve de la liste, une bote message demande la matire recherche ; si vous choisissez MATHEMATIQUES, par exemple, le programme renvoie la rponse 2 ; la moyenne calcule ensuite est inexacte puisquil sagit

encore de la moyenne gnrale. Si cette partie fonctionne correctement, vous pouvez poursuivre le travail. 1. Supprimez le MsgBox renvoyant le numro de matire, devenu inutile. 2. Modiez la formule de rsultat nal de la manire suivante : MsgBox "Moyenne gnrale: " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_ Liste_Eleves!Choix_Eleve & " AND ID_MATIERE=" & VARNOMATIERE), "Fixed"), vbInformation, "RESULTATS". On a ajout une deuxime condition dans la fonction DAvg(), qui concatne loprateur AND et pose la deuxime quation ID_MATIERE=VARNOMATIERE. 3. Prsentation du nom et du prnom dans la bote de dialogue An de parachever cet exercice et approfondir les proprits des Zones de liste, il faut amliorer la qualit du renvoi de valeur de la dernire bote de message. Le nom et le prnom de llve slectionns ne sont pas intgrs, pour le moment, dans le programme ; seul le numro de llve est rcupr parce que la colonne lie de la Zone de liste renvoie la valeur de ce numro au moment du clic ; cest la valeur de Forms!Frm_ Liste_Eleves!Choix_Eleve. La fonction Column() de VB va nous permettre de rcuprer nom et prnom de llve. 1. En haut de programme, dclarez deux nouvelles variables de chanes de caractres Dim VARNOM as String, Dim VARPRENOM as String . 2. En bas de programme (avant le MsgBox nal), insrez le code VARNOM=Me.Choix_ Eleve.Column(1). 3. Juste en dessous, saisissez MsgBox VARNOM et testez le programme : la bote de message renvoie effectivement le nom de llve. Lexpression utilise ncessite plusieurs explications : Pour la premire fois, on emploie lobjet Me. Me, suivi dun point et dautres objets dpendants, dsigne le formulaire en cours : on aurait pu crire Forms!Frm_Liste_ Eleves mais cette formule est beaucoup moins rapide daccs dans le programme et plus longue saisir ! Me.Choix_Eleve dsigne la zone de liste nomme Choix_Eleve dans le formulaire en cours. Me.Choix_Eleve.Column dsigne une colonne dans la zone de liste cite du formulaire en cours. Cette expression ncessite un paramtre de numro de colonne entre parenthses. La numrotation des colonnes commence 0. Dans la zone de liste prsente, la colonne 0 est celle de lID_ELEVE, la colonne n 1 est celle de NOM_ELEVE et la colonne n 2 celle 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 matire recherche", _ "Calcul de moyenne") VARNOMATIERE=DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" _ & VARLIBMATIERE & "'") VARNOM=Me.Choix_Eleve.Column(1)

198

Access 2007 et VBA

Chapitre
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 bote de message sapparente au libell de la gure 7.15. Figure 7.15


Dernier message renvoy dans lexercice 1.

EXERCICE 2
nonc

MACRO DENVOI

DE MESSAGES LECTRONIQUES

Crez un formulaire listant les numros, prnoms et noms des lves. Un bouton doit y excuter une macro qui envoie un message lectronique chacun dentre eux en lui indiquant quelle est sa moyenne. On imaginera que ladresse internet des lves est systmatiquement de la forme <prnom>.<nom>@pearson.net. Au courrier dont le texte sera simplement Votre moyenne gnrale est de . , on joindra le dtail des notes sous format Excel. Traduisez ensuite les macros gnres en code Visual Basic.

* Solution

Les macros 199

Exercices

1. Cration de la requte la source du formulaire La premire dmarche consiste crer une requte qui appelle les quatre champs ncessaires ID_ELEVE, PRENOM_ELEVE, NOM_ELEVE et la moyenne gnrale de chacun dentre eux ; cette requte servira lincrmentation du formulaire partir duquel sera lance la macro. 1. Dans le menu Crer , cliquez sur Cration de requte . 2. Insrez les tables ELEVE et NOTE . 3. Placez les champs ID_ELEVE , PRENOM_ELEVE , NOM_ELEVE , NOTATION parmi les champs slectionns. 4. Cliquez sur le bouton Totaux . 5. Conservez lopration de regroupement aux trois premiers champs et slectionnez lopration Moyenne pour le champ NOTATION. 6. Enregistrez la requte sous le nom Req_EnvoiMail . La requte, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, Avg(NOTE.NOTATION) 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; doit avoir la structure graphique de la gure 7.16.

Figure 7.16
Structure de la premire requte de lexercice 2.

2. Cration du formulaire Deuxime tape : construire le formulaire la base de lenvoi des courriers lectroniques. 1. Dans le volet de navigation, mettez la requte Req_EnvoiMail en surbrillance (sans louvrir). 2. Dans le menu Crer , cliquez sur le bouton Plusieurs lments (qui cre automatiquement un formulaire continu). 3. Enregistrez le formulaire sous le nom Frm_EnvoiMail . 4. Modiez les libells et formats pour obtenir un rsultat sensiblement voisin de la gure 7.17. Figure 7.17
Prsentation du formulaire de lexercice 2.

200

Access 2007 et VBA

Chapitre

3. Cration de la requte de calcul des notes par lve Troisime tape : crer la requte qui gnrera le carnet de notes de chaque lve, carnet envoy sous format Excel. 1. Dans le menu Crer , cliquez sur le bouton Cration de requte . 2. Slectionnez les tables NOTE et MATIERE . 3. Insrez les champs ID_ELEVE , NOM_MATIERE , NOTATION , DATE_ NOTE parmi les champs slectionns. 4. Indiquez un ordre croissant la colonne MATIERE. 5. Insrez le critre suivant dans la colonne ID_ELEVE : [Formulaires]![Frm_EnvoiMail]![ID_ELEVE]. Ce critre rservera les rsultats de la requte au seul lve actif dans le formulaire denvoi. 6. Enregistrez la requte sous le nom Req_EnvoiNotes . La requte, 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 structure graphique de la gure 7.18. Figure 7.18
Structure de la deuxime requte de lexercice 2.

Les macros 201

Exercices

4. Cration de lenvoi des courriers Quatrime tape : crer la macro denvoi des courriers. 1. Dans le menu Crer , cliquez sur Macro . 2. Slectionnez laction EnvoyerObjet. 3. Slectionnez Requte pour le premier argument de TypeObjet de laction EnvoyerObjet. 4. Choisissez Req_EnvoiNotes dans la liste des requtes disponibles dans largument Nom dobjet. 5. Prenez le format Excel dsir dans largument Format de sortie, Excel 2003 ou Classeur Excel (pour Excel 2007). 6. Dans largument , crivez la formule =[Formulaires]![Frm_EnvoiMail]![PRENOM_ ELEVE] & "." & [Formulaires]![Frm_EnvoiMail]![NOM_ELEVE] & "@pearson.net". Cette formule concatne le prnom, le nom et ladresse de destination du

mail. Les rfrences cites font allusion au premier enregistrement en cours dans le formulaire ; il faudra plus tard ritrer lopration pour le deuxime et ainsi de suite, jusqu la n du chier. 7. Dans largument Objet, une simple mention Vos rsultats 1 sufra. 8. Largument Texte du message peut tre plus labor : saisissez la formule ="Bonjour," & Car(13) & Car(10) & "Votre moyenne gnrale est de " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_EnvoiMail]![ID_ELEVE]);"Fixe"). Dans cette formule, la dtermination de la moyenne gnrale est effectue avec les mmes paramtres (Format() et MoyDom()) que ceux du premier exercice. On y a ajout la formule Car(13) & Car(10) qui gnre un saut de ligne 2. La formule de politesse Bonjour, sera donc suivie dun passage la ligne avant le libell suivant. 9. Largument Modier le message, enn, sera conserv Oui pour vrier la qualit des rsultats. 10. Sauvegardez cette macro sous le nom Mcr_EnvoiMail . Pour commencer tester la macro, il faut que le formulaire Frm_EnvoiMail soit ouvert et quil soit positionn au dbut de la liste des lves, il renverra les coordonnes du premier lve de la liste. Laction EnvoyerObjet de la macro ouvre une session MAPI Windows (Mail Application Program Interface) qui mule loutil de messagerie choisi par dfaut (Outlook Express, Outlook ou autres). Le message obtenu est similaire celui de la gure 7.19. Figure 7.19
Mail automatique envoy par Access.

Quand la macro sera fonctionnelle, il restera prvoir le glissement dun lve au suivant et lenvoi en chane de chacun des mails. 1. Modiez largument Modier le message de laction EnvoyerObjet dans la macro Mcr_EnvoiMail : positionnez-le Non an que lexcution se ralise en bloc 3. 2. Ajoutez une deuxime action AtteindreEnregistrement la macro Mcr_EnvoiMail. 3. Largument Type dObjet est Formulaire. 4. Largument Nom dobjet est Frm_EnvoiMail.
1. Dans la mesure o il ne sagit pas dune formule, le libell ne ncessite pas de signe gal au dbut suivi dune chane de caractres entre guillemets. 2. Lquivalent Visual Basic de Car(13) & Car(10) est vbCrLF (Carriage Return Line Feed) que nous verrons plus loin. 3. Il est recommand, pour cet exercice, de dconnecter provisoirement la machine de son accs Internet : il sera ainsi plus facile de supprimer les messages rests dans la Bote denvoi (de toute faon, tous les messages seraient signals avec une adresse invalide).

202

Access 2007 et VBA

Chapitre

5. 6. 7. 8. 9. 10.

11. 12. 13. 14. 15. 16. 17.

Largument Enregistrement est Suivant. Enregistrez les modications et fermez cette macro. Dans le menu Crer , cliquez sur le bouton Macro . Dans la nouvelle macro ouverte, slectionnez laction ExcuterMacro. Largument Nom de macro doit tre Mcr_EnvoiMail. Largument Nombre de rptitions est la formule =CpteDom("[ID_ ELEVE]";"ELEVE")-1, qui compte le nombre dlves de la table et retire 1 (le premier enregistrement dj trait). Enregistrez la macro sous le nom Mcr_EnvoiGroupe . Ouvrez, si ncessaire, le formulaire Frm_EnvoiMail en mode cration. Dans len-tte de formulaire, insrez un bouton de commande. ltape 1 de lassistant Bouton de commande, choisissez Divers dans le pav des Catgories et Excuter une macro dans le pav des Actions. Slectionnez la macro Mcr_EnvoiGroupe dans la deuxime tape. Choisissez loption Texte dans la troisime tape, avec pour libell Lancer un envoi group. Nommez le bouton Envoi dans la dernire tape.

Attention
Les tests, partir de cet instant, portent sur les 26 enregistrements de la table et ne peuvent tre interrompus. Le plus souvent, lenvoi automatique de mails depuis Access gnre dans loutil de messagerie une fentre dalerte prvenant quun programme externe tente daccder la messagerie : il est ncessaire alors de modier les options de la messagerie (Centre de gestion de la condentialit dans Outlook par exemple) an dautoriser les envois automatiques.

La traduction en code Visual basic de la macro Mcr_EnvoiGroupe donne le rsultat afch la gure 7.20. Figure 7.20
Code de la macro denvoi group.

Les macros 203

Exercices

La traduction en code Visual basic de la macro Mcr_EnvoiMail donne le rsultat afch la gure 7.21. Figure 7.21
Code de la macro denvoi dun mail.

Pour mettre en place dune boucle de rptition des envois, deux macros ont t ncessaires. En fait, et dans un code Visual Basic bien mont, il est plus judicieux de runir ces deux morceaux de code en un seul sous la tournure suivante :
Function Mcr_EnvoiGroupe() On Error GoTo Mcr_EnvoiGroupe_Err Dim i As Integer For i=1 To DCount("[ID_ELEVE]", "ELEVE") DoCmd.SendObject acQuery, "Req_EnvoiNotes", "ExcelWorkbook(*.xlsx)", Forms!Frm_EnvoiMail!PRENOM_ELEVE & "." & Forms!Frm_EnvoiMail!NOM_ELEVE & "@pearson.net", "", "", "Vos rsultats" , "Bonjour," & Chr(13) & Chr(10) & "Votre moyenne gnrale 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

Lexpression For i=1 To DCount("[ID_ELEVE]", "ELEVE") dmarre une boucle qui tournera depuis la valeur 1 jusquau nombre total dlves de la table. Elle est ferme par lexpression Next situe avant la gestion derreurs 1. Entre ces deux lignes, la totalit du code de la macro Mcr_EnvoiMail peut tre rcupre.

1. Il nest pas possible, ici, dexpliquer longuement le fonctionnement des boucles. Pour plus de dtails, se rfrer aux chapitres sur VBA dans le livre Excel 2007 du mme auteur dans la mme collection.

204

Access 2007 et VBA

Chapitre

Le langage VBA sous Access


1. Le lancement de requtes SQL sous VBA ............................... 206 2. Lutilisation de la notion de RecordSet......................... 208 3. Lautomation ......................... 215 Problmes et exercices 1. Un programme de notation .... 219 2. Travail sur jeu denregistrements .................. 224 3. Une automation Access/Word........................ 231

Lutilisation du code VBA donne Access des performances et des capacits trs suprieures celles qui sont disponibles sous linterface graphique, tant dans laffichage des donnes que dans leur traitement. Ce chapitre prsente lexcution de requtes SQL crites avec le programme VBA, puis une mthode pour charger des donnes en mmoire afin de les traiter sans mme les afficher. Enfin, nous tudierons les rudiments de lautomation, permettant dexcuter des applications Office depuis Access.

205

(1)

Le lancement de requtes SQL sous VBA


La commande DoCmd.RunSQL de VBA excute une requte SQL crite dans le langage que nous avons tudi en mme temps que les requtes elles-mmes. Cette commande est rarement utile quand il sagit de requtes Slection (utilisant le mot-cl SELECT du langage SQL), mais elle devient trs efcace lorsquil sagit dexcuter des requtes SQL telles que INSERT, UPDATE ou DELETE. Voici un exemple daction de cette commande pour insrer puis supprimer un enregistrement de la table CODES_POSTAUX. Les premires actions gnrent le code SQL de la requte partir de linterface graphique dACCESS. 1. Ouvrez la base de donnes CODES_POSTAUX . 2. Crez une nouvelle requte dinsertion (Crer, puis Cration de requte, ne slectionner aucune table, puis choisir Ajout dans le ruban et slectionner la table CODES_ POSTAUX) pour ajouter un enregistrement la table CODES_POSTAUX dont le code est 99999 et la ville MONCLOCHER ; la requte, dont le code SQL est INSERT INTO CODE_POSTAL ( CODE, VILLE ) SELECT "99999" AS CODE, "MONCLOCHER" AS VILLE; se retrouve dans la structure graphique de la gure 8.1. La table CODE_POSTAL nest pas prsente dans la fentre suprieure (an dviter une insertion dautant de lignes que nen compte la table elle-mme) 1.

Figure 8.1
Requte dinsertion.

On peut ensuite slectionner le code SQL gnr et linsrer dans un programme Visual Basic. 3. Cliquez sur le mode dafchage SQL de la requte et copiez son texte (Ctrl + C). 4. Accdez Visual Basic au moyen de la combinaison des touches Alt + F11. 5. Dans la fentre des projets, cliquez du bouton droit sur Modules et Slectionnez Insertion > module . 6. Dans la fentre des proprits (si elle nest pas prsente slectionner Afchage > Fentre Proprits ou F4), en bas gauche, renommez le module Module1 par Essais . 7. Entrez le dbut de code suivant :
Sub Insertion_CodePostal() DoCmd.RunSQL " End Sub

1. La syntaxe INSERT INTO CODE_POSTAL ( CODE, VILLE ) VALUES ("99999","MONCLOCHER"); est galement valide.

206

Access 2007 et VBA

Chapitre

La structure de la procdure Insertion_CodePostal() est en place. Il faut maintenant modier son contenu pour y crire le code de la requte SQL prcdemment copie. 8. Collez (Ctrl + V) le texte du presse-papier entre les guillemets de la commande RunSQL. 9. Doublez les guillemets qui cernent dj les chanes 99999 et MONCLOCHER. 10. Veillez ce que la chane SQL tout entire soit galement entre guillemets de sorte dobtenir le code suivant :
Sub Insertion_CodePostal() DoCmd.RunSQL "INSERT INTO CODE_POSTAL ( CODE, VILLE ) _ SELECT ""99999"" AS CODE, ""MONCLOCHER"" AS VILLE;" End Sub

11. Excutez le code en appuyant sur F5 (ou en cliquant sur le triangle vert de la barre dicnes, ou en slectionnant loption de menu Excution > Excuter Sub/UserForm). 12. Access renvoie un message davertissement, prvenant quun enregistrement va tre ajout : validez-le. 13. Si le code est rexcut une seconde fois, Access donnera le mme message davertissement, mais refusera dans une deuxime fentre de raliser linsertion en raison de lexistence dun doublon parmi les codes postaux. An de supprimer cet enregistrement fantaisiste, nous allons crer une nouvelle procdure Visual Basic faisant appel un procd voisin. Il est possible, ds lors que la syntaxe SQL est bien assimile, dcrire directement le code suivant, la suite de la procdure prcdente :
Sub Suppression_CodePostal() Dim strSQL As String strSQL="DELETE FROM CODE_POSTAL WHERE CODE=""99999""" DoCmd.RunSQL strSQL End Sub

Dans cette deuxime prsentation, la dmarche met en uvre une variable de type chane de caractres. On affecte la variable strSQL (pour String SQL) le texte de la requte SQL, puis on cite la variable aprs la commande RunSQL. Cette prsentation est particulirement utile lorsque la requte contient de nombreux paramtres (on peut alors activer le mode dbogage pour vrier la valeur des variables) et lorsquelle est longue (on dcoupe alors en autant de variables quil existe, par exemple, de lignes de requte : une variable pour la ligne INSERT, une pour la ligne FROM, une pour la ligne WHERE, etc.). Ce code est particulirement intressant car il permet au programmeur de ne pas obligatoirement afcher des donnes pour procder des manipulations sur la base. Cette organisation sadapte surtout aux environnements client/serveur, dans lesquels il nest pas toujours ncessaire (et mme dconseill) de charger des masses de donnes importantes sur le poste client. On peut imaginer, par exemple, un simple formulaire dpourvu de toute source de donnes natives, qui charge le minimum dinformations indispensables lutilisateur, procde tous les contrles de forme et gnre une seule commande de mise jour (Insert, Update, Delete). Ce processus savre videmment trs lointain de la dmarche conventionnelle dAccess o tout formulaire charge toutes les donnes de plusieurs tables gres en monoposte.

Le langage VBA sous Access 207

(2)

Lutilisation de la notion de RecordSet


Lorsquun formulaire est ouvert avec une source de donnes (proprit RecordSource du formulaire), il charge dans le mme temps un jeu denregistrements, RecordSet en amricain. Le jeu denregistrements se constitue des enregistrements chargs, avec leur ordonnancement et leurs colonnes, provenant dune table ou dune requte. Ils sont monts en mmoire an de les afcher plus rapidement. Ce chargement en mmoire seffectue galement via linterface de programmation nomme DAO (Data Access Objects). Ds lors, le programmeur peut jouer avec ces enregistrements, les afcher ou les mettre jour comme il lentend, sans quaucune interface homme/machine nintervienne. On a adjoint DAO, depuis sa cration, une autre interface, ADO (ActiveX Data Objects). Les deux interfaces de programmation sont dotes chacune dobjets RecordSet dont la manipulation diffre lgrement. On dclarera donc un RecordSet en prcisant toujours linterface utilise. De plus, DAO et ADO ne sont pas ncessairement chargs sur la machine, il est ncessaire de sen assurer en faisant les vrications suivantes : 1. Accdez Visual Basic en utilisant la combinaison des touches Alt + F11. 2. Dans le menu gnral, cliquez sur Outils > Rfrences . 3. Cochez les options (si elles ne le sont pas dj) Microsoft Ofce 12.0 Access Data Engine Library (DAO) et Microsoft ActiveX Data Objects 6.0 Library (ADO) comme le montre la gure 8.2.

Figure 8.2
Paramtrage des interfaces charges sous Visual Basic pour Access.

2.1 CHARGEMENT

DES

RECORDSET

Au lieu douvrir un formulaire afchant les codes postaux, nous allons les charger en mmoire et les afcher grce un programme que nous nous proposons dcrire. La premire procdure sappellera Lecture_Recordset().

208

Access 2007 et VBA

Chapitre

1. Saisissez le code suivant dans un module Visual Basic : Sub Lecture_RecordSet(); VB insre automatiquement un End Sub avant lequel sera saisi le code. 2. Entrez la dclaration Dim db as DAO.Database; cette ligne dclare une variable nomme db de type objet, lobjet tant une base de donnes connecte sous linterface DAO. 3. Entrez la dclaration Dim rst as DAO.RecordSet; cette ligne dclare une variable nomme rst de type objet, lobjet tant un jeu denregistrements. Ces deux lignes de dclarations sont obligatoires (contrairement aux autres variables VB qui sont le plus souvent facultatives). 4. Saisissez Set db=Application.CurrentDb ; le mot-cl SET attribue une rfrence dobjet la variable qui avait t dclare auparavant. Ici, db fera rfrence dsormais la base de donnes courante de lapplication en cours (en loccurrence la base Access CODES_POSTAUX). 5. Entrez Set rst=db.OpenRecordSet("CODE_POSTAL") : la variable rst fera rfrence au jeu denregistrements constitu par la table CODE_POSTAL. On notera que la table est cite entre guillemets ; on aurait tout aussi bien pu citer entre guillemets une requte SQL SELECT tout entire ou bien une variable string contenant le texte de la requte. Le mot-cl OpenRecordSet ouvre le jeu denregistrements, cest--dire quil le charge en mmoire vive 1. 6. Saisissez le code suivant, qui permettra un afchage en boucle jusqu ce que lutilisateur ne linterrompe.
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 dabord attribue la variable i. La ligne suivante dmarre une boucle qui ritrera les lignes suivantes (jusquau Loop), jusqu ce que la valeur i ne soit plus gale 1. La variable variable i, la troisime ligne, prend la valeur renvoye par une bote de message dote de deux boutons : OK et Annuler. Si lutilisateur clique sur OK, la valeur renvoye par la bote de message i est 1 ; si lutilisateur clique sur Annuler, la bote renvoie la valeur 2 et le programme sort de la boucle. Le contenu de la bote (prompt) est constitu des deux colonnes de la table CODE_POSTAL, exprimes volontairement de manires diffrentes : Lexpression rst.Fields(0).value renvoie la valeur du premier champ de la table. Attention ! la numrotation commence 0 et non 1. rst fait rfrence au RecordSet, Fields dsigne le champ et Value sa proprit de contenu.
1. La commande OpenRecordSet() comprend galement un paramtres de mode douverture du recordset qui na pas t prcis. Si la source est une table non lie (prsente dans la base), par dfaut louverture se fait en mode table ; si la source est une requte ou une table lie, par dfaut louverture se fait en mode Dynaset. Il existe deux autres modes douverture (SnapShot ou Instantan et ForwardOnly) qui grent le curseur diffremment.

Le langage VBA sous Access 209

Lexpression rst("VILLE") dsigne directement le contenu du champ VILLE pour lenregistrement en cours. Les deux notations sont quivalentes, mais la premire sera choisie de prfrence si lindice de colonne (ici 0) est prcis avec des variables. Lexpression rst.MoveNext, enn, dplace le curseur dune position vers lavant, notion que nous verrons dans le paragraphe suivant. La commande rst.Close ferme le jeu denregistrements. Elle est indispensable dans un code bien crit, de mme que lannulation des rfrences des deux lignes suivantes (Set rst=Nothing et Set db=Nothing). Le code crit donne globalement la rdaction 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 lexcution, on verra safcher successivement tous les codes postaux et les villes associes jusqu ce que lutilisateur clique sur Annuler.

2.2 DCOMPTE

DES ENREGISTREMENTS DANS UN

RECORDSET

ET DPLACEMENTS

La notion de curseur doit tre nement apprhende car elle est primordiale dans les jeux denregistrements. A priori et en premier lieu, il est quasi indispensable dinsrer un ordre prcis dans la requte la base dun jeu denregistrements (une clause ORDER BY dans SQL) : lordre des enregistrements est totalement imprvisible dans la table. Il faut donc en prescrire un an dtre sr des rsultats escompts en cas de mises jour. Au moment de louverture, le curseur se trouve en dbut de jeu denregistrements 1. Lenregistrement lu est le premier et la commande rst.MovePrevious (aller lenregistrement prcdent) gnre un message erreur. La commande MoveNext positionne le curseur lenregistrement suivant, la commande MoveLast le positionne immdiatement sur le dernier. Ces commandes peuvent tre combines avec les proprits BOF (Beginning Of File) et EOF (End Of File) dont il faudra apprhender les subtilits. Lorsque le jeu denregistrements est ouvert, le curseur est positionn sur le premier enregistrement, mais la proprit rst.BOF est positionne FALSE (faux) ; ainsi, dans lexemple du paragraphe prcdent, si la condition suivante est pose :
If Not rst.BOF Then
1. Mais il nest pas inutile dinsrer une commande MoveFirst pour sen assurer dans tous les cas de figure.

210

Access 2007 et VBA

Chapitre
rst.MovePrevious End If

Le programme renverra assurment une erreur. De la mme manire, lorsque le curseur arrive sur le dernier enregistrement, la proprit EOF est positionne FALSE et ce nest quaprs une commande MoveNext que la proprit passera TRUE (vrai), trop tard pour viter un message erreur. Ces proprits ne seront donc utilises qu bon escient, par exemple dans le cadre du dcompte des enregistrements dun jeu. Au moment o un RecordSet est charg, le systme, en effet, ne connat pas le nombre denregistrements quil contient : la proprit RecordCount nest pas oprationnelle. Il est ncessaire de balayer tous les enregistrements du jeu pour en connatre la taille. Ci-aprs, un exemple de code qui compare deux dcomptes denregistrements avant et aprs balayage du jeu 1 :
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 "Dcompte avant balayage : " & rst.RecordCount, , "Dcompte 1" If Not rst.EOF Then rst.MoveLast End If MsgBox "Dcompte aprs balayage : " & rst.RecordCount, , "Dcompte 2" rst.Close Set rst=Nothing Set db=Nothing End Sub

La premire bote de message, avant balayage, ne dcompte quun seul enregistrement alors que la seconde en compte 8 009.

2.3 RECHERCHE

DES ENREGISTREMENTS DANS UN

RECORDSET

Les mthodes FindFirst, FindLast, FindNext, FindPrevious et NoMatch sont les outils de base des recherches dans un jeu denregistrements. On se propose, ici, dafcher au fur et mesure les prfectures qui commencent par ST. Le programme suivant va ouvrir un jeu denregistrements contenant tous les codes postaux puis balayer le recordset en sarrtant chaque fois quune occurrence est trouve.
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), , "Prfectures commenant par ST" rst.FindNext "CODE LIKE '*000' AND VILLE LIKE 'ST*'" Wend
1. Ici, louverture en mode Dynaset (le plus frquent) a t prcis pour viter une ouverture en mode table, dont la gestion de curseur est diffrente.

Le langage VBA sous Access 211

rst.Close Set rst=Nothing Set db=Nothing End Sub

On prtera une attention particulire la tournure de la boucle et son ordonnancement : Le RecordSet est ouvert et le curseur se trouve positionn au premier enregistrement. Une premire ligne de code lance une recherche : le curseur se positionne sur le premier enregistrement concordant (ST BRIEUC). La boucle dmarre avec une condition de concordance (Not et NoMatch quivalent Match ). La proprit NoMatch tant positionne FALSE, lexpression Not Nomatch quivaut TRUE : lenregistrement en cours safche. Une nouvelle recherche est lance (FindNext). Et ainsi de suite jusqu la n du jeu denregistrements. Cette structure est rendue obligatoire par la logique : si la premire ligne de code comprenant le FindFisrt est supprime, lafchage commence par celui du code 01000 de BOURG EN BRESSE (qui ne rpond pas aux critres demands) et se poursuit par les quatre autres (respectant les critres). Dans cet exemple, cest volontairement que le RecordSet initial contenait tous les enregistrements de la table et quune recherche slective y tait applique. Naturellement, une autre solution consiste ne slectionner dans le jeu denregistrements que les enregistrements respectant les critres pour, ensuite, les afcher tous. Ci-aprs le code de cette seconde formulation, utilisant la proprit 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), , "Prfectures+ commenant par ST" rst.MoveNext Wend rst.Close Set rst=Nothing Set db=Nothing End Sub

2.4 MODIFICATION

DES ENREGISTREMENTS DUN

RECORDSET

Jusqu prsent, les enregistrements dun RecordSet ont t simplement lus sans aucune modication. Sil est ncessaire de modier des donnes, il faut prendre en compte le fait que les donnes sont charges en mmoire vive et que les modications ne vont toucher que ces donnes en mmoire et non celles qui sont enregistres sur le disque. Il faut donc procder en deux tapes : modier les donnes dans le RecordSet puis appliquer ces modications aux donnes crites sur le disque. Cette problmatique touche galement la manire dont le jeu denregistrements a t ouvert. En environnement multi-utilisateurs, il faut empcher un utilisateur de modier

212

Access 2007 et VBA

Chapitre

des donnes dj en cours de modication par un autre. On prcisera donc le mode douverture dans laction OpenRecordSet (paramtre que nous navons pas encore tudi) en indiquant quel type de verrou (lock) est pos sur les donnes ; trois cas de gure sont envisageables : La mthode OpenRecordSet est paramtre avec le verrou dbReadOnly (valeur VB : 4) et le jeu denregistrements nest pas modiable. Louverture du jeu est opre avec le type de verrou dbPessimistic (valeur VB : 2) et toutes les donnes de la base concernes sont verrouilles ds la commande douverture jusqu la commande de fermeture : aucun autre utilisateur ne peut y faire de mises jour. Cest loption par dfaut prise par Access si aucun paramtre nest prcis. Louverture du jeu est opre avec le type de verrou dbOptimistic (valeur VB : 3) et les donnes concernes ne sont verrouilles que lorsque la premire mise jour (Update) a t effectue. Le programme ci-aprs ouvre la table CODE_POSTAL en mode ReadOnly (le dernier paramtre de la mthode OpenRecordSet est 4), positionne le curseur au niveau du code 75001 et modie le libell PARIS par PARIS 1er. La mise jour ventuelle est conditionne par la proprit UpDatable (possibilit de modication) du jeu denregistrements.
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", , "Contrle daccs" End If rst.Close Set rst=Nothing Set db=Nothing End Sub

Comme le paramtre 4 de la cinquime ligne de programme nouvre le jeu denregistrement quen lecture seule, le message erreur programm constitue le choix logique de la procdure. Si, en revanche, le paramtre 2 ou 3 (ou aucun) vient en remplacement, le RecordSet est modiable (UpDatable) et lexcution sopre de la manire suivante : la commande rst.Edit copie lenregistrement en cours dans une mmoire tampon ; la ligne rst("VILLE")="PARIS 1er" affecte la valeur Paris 1er au champ VILLE de lenregistrement stock dans la mmoire tampon. Lenregistrement sur le disque, ce stade, nest donc pas ralis. Cest la commande rst.Update de la ligne suivante qui met jour la table.

2.5 AJOUT

ET SUPPRESSION DENREGISTREMENTS Lajout denregistrements respecte une syntaxe voisine de la modication. On prendra garde au fait que le contrle de valeur des donnes sopre de la mme manire que si

Le langage VBA sous Access 213

linsertion tait faite manuellement, la diffrence prs que le programme sinterrompt en cas dinsertion non valide. Dans lexemple suivant, on cherchera insrer un code 123456 qui ne respecte pas la longueur maximum de code postal, ce qui occasionnera une erreur dexcution.
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 excut pas pas (F8), on peut vrier que linterruption du programme intervient non pas au moment du rst.Update final , mais ds la ligne rst("Code")="123456" : le contrle est ralis ds laffectation de la valeur la mmoire tampon car le RecordSet contient dj les caractristiques des champs de la table. En revanche, il est clair que le programme ne peut pas contrler immdiatement lexistence de doublons : si le code postal insrer existe dj dans la table source, la procdure sera interrompue au moment du rst.Update et non avant. De la mme manire, il ne peut pas exister de contrle sur la valeur de cls trangres : si une valeur de cl trangre inexistante dans la table mre est insre dans une table lie par une contrainte dintgrit rfrentielle, le message erreur ninterviendra quau moment du rst.Update. Plus grave: sil nexiste pas de contrainte dintgrit rfrentielle, une insertion errone aura lieu. La suppression denregistrements via un RecordSet, enn, est relativement peu employe. Il est plus cohrent et plus direct dexcuter sous VB une requte SQL comportant la syntaxe DELETE. On trouvera, ci-aprs, un exemple dans lequel sont supprims tous les enregistrements 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, neffectuera aucune suppression car il nexiste aucune ville rpondant au critre prcis. On notera surtout quici la commande rst.Update est interdite : la suppression est immdiate.

214

Access 2007 et VBA

Chapitre

(3)

Lautomation
Comme tous les produits de la gamme Ofce, Access comprend, via VBA, tous les outils pour pratiquer lautomation, en dautres termes la manipulation distance dautres applications simultanment Access. Nous avons dj tudi, dans le chapitre 3, comment importer des donnes Excel vers Access et comment exporter des donnes Access vers Excel. Dans lexemple qui suit, nous allons mettre en uvre un procd qui dmarre distance Excel, cre un tableau, insre des valeurs partir dun recordset et referme le chier Excel. Il sagit l dun nouveau procd dexportation qui possde de nombreux avantages car il autorise tous les paramtrages imaginables. Avant de commencer cette partie, il est ncessaire de vrier que la bibliothque ncessaire est charge. Cliquez dans VBA sur Outils > Rfrences et cochez, le cas chant, la bibliothque Microsoft Excel 12.0 Object Library comme le montre la gure 8.3.

Figure 8.3
Chargement de la bibliothque des objets Excel.

Dcomposons le programme dchange Access/Excel ligne par ligne. 1. Dans un module dj cr, crez une procdure : Sub Echange_xlsx_accdb(). 2. Entrez la dclaration Dim prog_xlsx As Excel.Application : cette dclaration prpare un objet application Excel. Il ne sagit que dune simple dclaration dont les effets immdiats sont nuls. 3. Entrez la dclaration Dim fic_xlsx As Excel.Workbook : cette dclaration prpare un objet chier Excel. Il ne sagira pas du chier lui-mme, mais dune rfrence lobjet. 4. Entrez les dclarations dj connues, aptes grer un jeu denregistrements, Dim db as DAO.Database et Dim rst As DAO.Recordset. 5. Une dernire dclaration Dim i as Integer dnit un compteur. 6. La ligne Set db=Application.CurrentDb affecte pour rfrence lobjet db la base de donnes active.

Le langage VBA sous Access 215

7. La ligne Set rst=db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE LIKE '*000' ") cre un jeu denregistrements contenant les codes postaux et villes de toutes les prfectures. 8. Louverture du jeu denregistrements est suivi des deux commandes rst.MoveLast et rst.MoveFirst. Ces dernires sont destines balayer le jeu et assurer que son dcompte sera exact. 9. La onzime ligne de programme dmarre distance Excel : Set prog_xlsx=New Excel.Application. Lobjet tant dclar au pralable, cette commande quivaut exactement aux gestes de lutilisateur qui cliquerait sur Dmarrer > Programmes > Microsoft Excel. 10. La ligne suivante rend lapplication visible prog_xlsx.Visible=True. En effet, lorsque la ligne prcdente est excute, une session Excel dmarre (on peut le vrier en consultant les processus en cours dans le Gestionnaire des tches Windows), mais tout ce qui va suivre pourrait tre excut en tche de fond, sans visualisation graphique. 11. Set fic_xlsx=prog_xlsx.Workbooks.Add . quivaut la manipulation Fichier > Nouveau dans Excel. partir de cet instant, lapplication Excel est pilote distance : tous les objets seront rfrencs partir du prxe c_xlsx pour dsigner cet objet et non pas un autre chier ouvert simultanment par exemple. 12. La commande fic_xlsx.Sheets(1).Name="Prfectures" donne au premier onglet du classeur Excel le nouveau nom de Prfectures en lieu et place de Feuil1, cr par dfaut. La syntaxe Sheets(1).Name = xxxx , bien connue des programmeurs sous Excel, est simplement prxe par la rfrence lobjet cr dans le mme programme. 13. Les commandes fic_xlsx.Sheets(1).Range("A1").Value="CODE" et fic_ xlsx.Sheets.Range("B1").Value="PREFECTURE" attribuent aux cellules A1 et B1 les noms des colonnes. Ici lobjet Range dExcel qui dsigne une cellule a t utilis. Remarque : la notation doit comprendre la rfrence au classeur, puis celle de la feuille 1, puis celle de la cellule, et enn les coordonnes cartsiennes de la cellule. 14. La ligne For i=2 To rst.RecordCount dmarre une boucle avec pour valeur de i le chiffre 2 correspondant la deuxime ligne du tableau Excel (la premire est occupe par les noms de colonnes). Les lignes de commandes suivantes, et jusqu la ligne Next, seront ritres autant de fois quil y a denregistrements dans le RecordSet. 15. fic_xlsx.Sheets(1).Cells(i, 1).Value=rst("CODE") attribue la ligne i du tableur la valeur du champ CODE dans lenregistrement en cours. Ici, on a choisi la syntaxe Cells(x,y) dExcel et non celle de Range() car la rfrence numrique se conjugue avec la variable i. 16. fic_xlsx.Sheets(1).Cells(i, 2).Value=rst("VILLE") fait la mme opration avec la deuxime colonne. 17. Le curseur est avanc dune position par la commande suivante rst.MoveNext. 18. La 21e ligne de programme ne comprend quun simple Next qui ferme la boucle ouverte au point 14. 19. Le chier Excel est enregistr automatiquement par la commande fic_xlsx.SaveAs "C:\PREFECTURES.XLSX" qui est copi ici la racine du disque dur. 20. Le chier Excel (et non lapplication) est ferm par la commande fic_xlsx.Close.
1. Sheets(1) dsigne la premire feuille du classeur quon aurait aussi pu appeler Sheets ("Prfectures").

216

Access 2007 et VBA

Chapitre

21. Lapplication Excel est ferme par la commande prog_xlsx.Quit. 22. La rfrence lobjet Excel est supprime par la commande Set prog_ xlsx=Nothing. 23. Les trois dernires lignes de programme ferment les rfrences au RecordSet, comme on la dj vu prcdemment. Au total, le programme scrit donc :
Sub Dim Dim Dim Dim Dim Echange_xlsx_accdb() prog_xlsx As Excel.Application fic_xlsx As Excel.Workbook db As DAO.Database rst As DAO.Recordset 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="Prfectures" 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 lchange de donnes : Il existe galement une mthode CopyFromRecordSet qui transfre directement des donnes selon une procdure sensiblement quivalente celle qui vient dtre dveloppe. Cette mthode livre en bloc les donnes, et donc de manire un peu htive, alors que le procd qui vient dtre montr a lavantage de pouvoir supporter de multiples paramtres. De la mme manire que lchange de donnes est possible, toutes les oprations de pilotage distance (formatage, mise en place de calculs, etc.) sont imaginables. La proprit Visible de lapplication destination peut tre supprime de sorte que les oprations se droulent en tche de fond et le chier Excel se constitue linsu mme de lutilisateur.

Le langage VBA sous Access 217

Rsum
Lutilisation de Visual Basic permet la mise au point de programmes complets, passant par tous les systmes dentres/sorties (MsgBox(), InputBox()), toutes les gestions de variables et organisations en boucle (WhileLoop, UntilLoop, ForNext) quun langage de programmation fournit classiquement. VB supporte galement lexcution de commandes SQL programmes (DoCmd.RunSQL) et non pas seulement lances via linterface graphique dAccess. Les mises jour, insertions ou suppressions de donnes sont ds lors contrles et automatises dans des procdures dont le programmeur a la totale matrise. Dtache des formulaires, la notion de RecordSet recouvre le chargement en mmoire vive de donnes extraites des tables Access et leur manipulation avant recopie ventuelle sur le disque. Une syntaxe particulire sy attache, qui prvoit lutilisation dun curseur parcourant les donnes. Dans Access, enn, et comme dans tout programme Ofce, toutes les fonctionnalits dautomation permettent au programmeur de piloter distance dautres applications installes sur la machine client. Ainsi, les changes Excel/Access, par exemple, peuvent-ils tre grs depuis Access en utilisant le langage objet quest VBA.

218

Access 2007 et VBA

Chapitre

Problmes et exercices
EXERCICE 1
nonc

UN

PROGRAMME DE NOTATION

On se propose de crer un formulaire qui permettra aux professeurs de noter les lves de la base de donnes ECOLE_INTERNATIONALE. Dans la mesure o il y a plusieurs matires (donc plusieurs professeurs), le programme sera install en rseau. En consquence, le formulaire ne sera bas sur aucune source de donnes ; la dmarche de notation sera la suivante : Le professeur ouvre une zone de liste droulante et choisit sa matire. Une zone de liste, en dessous, safche et montre la liste des lves ayant dj eu une note pour cette matire (elle se ractualise chaque choix de matire). Le professeur peut slectionner un et un seul lve. Au moment du choix, safchent lcran une zone de texte avec la date du jour (modiable), une zone de texte rappelant le nom de llve choisi (non modiable), une zone de texte vide pour entrer la note, un bouton pour valider la note et un bouton pour annuler lopration. Aux diffrences prs de prsentation, le formulaire doit avoir la structure de la gure 8.4 au moment de la validation dune note.

Figure 8.4
Formulaire de notation des lves.

Le langage VBA sous Access 219

Exercices

* Solution

Lexercice met en uvre toutes les connaissances acquises sur les formulaires et y ajoute le lancement dune requte SQL. Les assistants seront invalids ; on utilisera de prfrence le code VBA et non pas les macros. 1. Dessin des deux contrles dafchage des matires et des lves 1. Dans le menu Crer , cliquez sur Cration de formulaires . 2. Enregistrez tout de suite le formulaire sous le nom Frm_InsertionNotes . 3. Dans le ruban du menu Cration, dcochez le bouton de licne (forme de baguette magique) Utiliser les assistants contrles. 4. Dans le ruban du menu Cration, cliquez sur le bouton Zone de liste droulante et dessinez un rectangle en haut de formulaire. Si les assistants ont t invalids, la zone est immdiatement cre avec des valeurs par dfaut ; dans le cas contraire, cliquez sur Annuler pour obtenir le mme rsultat. 5. Les proprits de la zone de liste droulante sont directement entres comme suit : Nom du contrle : Choix_Matiere (au lieu de Modiable0). 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 proprits sont a priori correctes (non compris la prsentation). 6. Dans le menu Cration, cliquez sur le bouton Zone de liste et dessinez un large rectangle en dessous du premier contrle. 7. Les proprits de la zone de liste sont directement entres comme suit : Nom du contrle : 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 proprits sont a priori correctes (non compris la prsentation). 8. Revenez la zone de liste droulante et cliquez sur le bouton aux trois points de suspension droite de la proprit Aprs MAJ. 9. Slectionnez Gnrateur de code (et non plus gnrateur de macro). 10. VB a cr une procdure Choix_Matiere_AfterUpdate(). Ajoutez-y la simple ligne de code Me.Choix_Matiere.Requery o Me dsigne le formulaire en cours et Choix_ Matiere le contrle de zone de liste. La mthode Requery relance la requte du contenu de la zone et actualise les rsultats. Enregistrez et testez ds maintenant votre formulaire qui doit dj fonctionner pour les deux contrles crs. La requte du contenu de la zone de liste tant un peu complexe

220

Access 2007 et VBA

Chapitre

(prsence dun DISTINCT aprs le SELECT !), elle est reproduite graphiquement sur la gure 8.5. Figure 8.5
Requte dafchage unique des lves de lexercice 1.

2. Dessin des contrles de la squence de saisie des notes 1. Cliquez sur le bouton Zone de texte et dessinez un nouveau contrle dans la partie droite du formulaire. Ce contrle est destin afcher le nom de llve en cours de notation. Nommez-le Eleve_encours . La valeur de cette zone et sa visibilit seront gres plus loin grce du code VBA. 2. Cliquez sur le bouton Zone de texte et dessinez un contrle destin entrer la note de llve. Nommez-le Note_encours , donnez-lui un Format xe et un nombre de dcimales de 2. Cette zone sera un contrle de saisie pour lutilisateur. 3. Cliquez sur le bouton Zone de texte et dessinez un contrle destin afcher (et ventuellement modier) la date du jour. Le nom du contrle est Date_encours ; la valeur par dfaut de la zone est =Date(). 4. Cliquez sur le bouton Bouton de commande et dessinez ce contrle dans le formulaire en bas droite. Renommez la lgende et le nom du contrle par Validation (deux modications). Sous ce bouton se trouvera le code Visual Basic qui lance la commande SQL dinsertion de la note. 5. Cliquez nouveau sur le bouton Bouton de commande et dessinez ce contrle dans le formulaire en bas droite. Renommez la lgende et le nom du contrle par Annulation (deux modications). 3. Cration du code Visual Basic louverture du formulaire, les boutons et zones de texte de saisie des notes doivent tre invisibles :

Me.Eleve_encours.Visible=False Me.Note_encours.Visible=False Me.Date_encours.Visible=False

Le langage VBA sous Access 221

Exercices

Dans la feuille de proprits du formulaire lui-mme (et non pas dun autre contrle), cliquez sur le bouton aux trois points de suspension de la proprit Sur Ouverture et slectionnez le gnrateur de code pour y entrer les commandes suivantes, incluses dans une procdure nomme Form_Open :

Lors du clic sur un lve, les vnements suivants doivent survenir : les contrles relatifs la saisie doivent devenir visibles ; le nom de llve choisi doit apparatre dans le champ correspondant. En consquence : 1. Dans la feuille de proprits du contrle Choix_Eleve, entrez le code suivant dans la proprit 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 prcdemment pourra avantageusement tre copi/coll en inversant simplement les valeurs boolennes des proprits. Grce au code de la quatrime ligne, le contrle Eleve_encours prend la valeur du nom de llve et le contrle Date_encours prend la valeur de la date en cours. On notera que lors de louverture, la proprit de valeur par dfaut de ce contrle est xe la date en cours mais que par la suite, il est ncessaire de le repositionner. Lors du clic sur le bouton de validation, les vnements suivants doivent survenir : vrications de la validit de la saisie ; insertion de la note dans la table adquate ; disparition des contrles de la saisie. Le code insr sous la procdure Validation_Click() (proprit SurClic du bouton Validation) est le suivant :
If Not IsNumeric(Me.Note_encours) Then MsgBox "Vous devez entrer une note valide", , "Contrle de saisie" Exit Sub End If If Not IsDate(Me.Date_encours) Then MsgBox "La date doit tre renseigne", , "Contrle 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", , "Contrle 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 mrite les commentaires suivants : Les vrications de validit couvrent le minimum envisageable : la condition If Not IsNumeric() assure que linsertion SQL ne comprendra pas un champ vide (chane

222

Access 2007 et VBA

Chapitre

vide), ou une valeur Null, ou une chane de caractres (auquel cas le programme renverrait un message erreur). La condition If Not IsDate() applique les mmes rgles au champ date. La troisime vrication vise la validit de la note elle-mme. La commande DoCmd.SetWarnings False vite que le programme nafche le message Vous allez insrer un enregistrement ; elle est annule en n de procdure. La chane de caractres de la commande SQL tant trs longue, elle est libelle sur plusieurs lignes mais vous devrez la saisir sur une seule ligne. Dune manire plus gnrale, on peut insrer des signes souligns (underscore) en n de ligne pour permettre un changement de ligne sans que Visual Basic ninterprte la ligne suivante comme une nouvelle commande ; mais cette rgle nest pas valide lorsque le texte coup est une chane littrale entre guillemets. Les expressions Me.Choix_Eleve et Me.Choix_Matiere renvoient des valeurs numriques (les ID) ; en consquence, il est inutile de les cerner par des apostrophes ou des doubles guillemets. La note entre dans le contrle Note_encours peut comporter des dcimales ; or, le langage SQL exige que les valeurs numriques soient prsentes au format anglo-saxon avec le point comme sparateur de dcimales. Cest la raison pour laquelle la fonction Replace est utilise, qui remplace toutes les virgules par des points dans la chane de caractres dsigne. La date, dans SQL, doit tre cerne par des signes dise (#). Les trois contrles relatifs la saisie redeviennent invisibles aprs la validation de la note ; le contrle de date reprend la valeur du jour en cours et le contrle de note prend la valeur dune chane vide. Cette prcaution assure que llve suivant nhrite pas de la note du prcdent. Le code insr sous la procdure Annulation_Click() (proprit SurClic du bouton Annulation) reprend la n 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 ralis avec lassistant de bouton de commande (plus rapide) : 1. Le formulaire tant en mode cration, cliquez sur licne Utiliser les assistants contrle (reprsente par une baguette magique). 2. Cliquez sur licne Bouton. 3. Dessinez un carr en bas droite. 4. Dans la premire tape de lassistant, choisissez les options Oprations sur formulaires et Fermer un formulaire . 5. Cliquez directement sur Terminer. Laspect gnral du formulaire (slecteur denregistrements, boutons de dplacements, barres de dlement, etc.) ne sera pas nglig.

Le langage VBA sous Access 223

Exercices

EXERCICE 2
nonc

TRAVAIL

SUR JEU DENREGISTREMENTS

On considre que les lves natifs dun pays tranger et qui suivent un cours de langue dans leur langue maternelle sont avantags par rapport aux autres. Il convient donc de crer une procdure automatique pour retirer deux points aux notes dj donnes par les professeurs ; cette procdure fait appel la notion de RecordSet.

* Solution

1. Modication de la structure de la table En premier lieu, ce travail sur les notes ncessite une modication de structure de la table des notes. En effet, la nouvelle procdure modiera certaines notes, slectivement : si, par erreur, elle est applique deux fois sur la mme srie, le handicap des lves concerns ne sera plus de deux points, mais de quatre ! Il faut donc insrer un champ NOTEPONDEREE qui stockera la note rvalue alors que la colonne des notes initiales restera vierge de toute modication. 1. Insrez manuellement un champ NOTEPONDEREE dans la table NOTE. 2. Reprenez les caractristiques du champ NOTATION pour en dterminer les proprits. 3. Crez un nouveau module dans le projet ECOLE_INTERNATIONALE en effectuant un clic droit sur les modules dans Visual Basic Editor puis Insertion. Laccs Visual Basic est obtenu par Alt-F11 ou Outils de base de donnes > Visual Basic. 4. Nommez le module Pondration. Il existe, comme toujours en informatique, un grand nombre de solutions au problme pos. Nous en indiquerons deux, faisant appel des procds diffrents et se distinguant surtout par la vitesse dexcution. La premire mthode met simultanment en uvre deux jeux denregistrements (ce qui renforcera les notions acquises dans le cours ) ; la seconde comporte la notion nouvelle de variable tableau. Nous verrons alors que la seconde mthode tourne peu prs quatre fois plus vite que la premire. 2. Version avec deux jeux denregistrements Le problme le plus immdiat de cet nonc rside dans le fait que la nationalit des lves est indique dans la table ELEVE par des caractres alphabtiques alors que les matires sont identies par des ID numriques ; de plus, plusieurs pays pratiquent la mme langue (UK et USA par exemple). Il faut donc constituer, dune manire ou dune autre un tableau dquivalence pour envisager ensuite la pondration automatique. La premire ide, ici, consiste procder de la manire suivante : On charge un jeu denregistrements contenant toutes les notes. On charge un jeu denregistrements contenant les ID et les pays des lves (les autres champs sont inutiles). On vient lire le premier enregistrement des notes et dabord lID de llve. Dans le jeu des lves, on recherche la nationalit. On traduit dans une simple numration de cas les nationalits en ID de matire. On compare lID matire de lenregistrement en cours avec celui obtenu aprs la traduction de la ligne prcdente.

224

Access 2007 et VBA

Chapitre

Sil y a identit entre les deux ID de matires, on applique une soustraction et on crit la note pondre (update). On passe lenregistrement suivant du jeu de notes. Et ainsi de suite jusqu la n du chier des notes. La partie dclarative comprend les alinas 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 dclare comme une date entre dans le calcul du temps de ralisation du programme tout entier. Un peu plus bas, la ligne vardebut=Timer attribue la variable le nombre de secondes coules depuis le jour en cours 00:00h. Il est dclar deux jeux denregistrements : rst_eleves et rst_notes; le premier contient les ID des lves et leur pays, le second contient les quatre seules colonnes de la table NOTE qui seront utiles : ID_ELEVE, ID_MATIERE, NOTATION et NOTEPONDEREE. Le dbut de la boucle de lecture de toutes les notes scrit 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 mthode FindFirst fait avancer le curseur du recordset des lves jusqu la ligne o se trouve lID de llve qui a t not. Lexpression rst_notes(0) fait rfrence la premire colonne de lenregistrement en cours, qui contient lID_ELEVE. Le curseur du recordset des lves tant bien positionn, le pays de celui-ci peut tre rcupr grce lexpression rst_eleves.Fields(1). La tournure conditionnelle IfElseIfEndIf est remplace par lemploi de la syntaxe SelectCase, plus adapte. La premire ligne donne une valeur comparer aprs

Le langage VBA sous Access 225

Exercices

lexpression SelectCase; chaque valeur de comparaison est prcde dun simple Case et lnumration sachve avec un EndSelect. Les cas de gure regroupent les pays la langue identique (France et Belgique, par exemple). Pour chacun dentre eux, la variable varmatiere prend une valeur numrique correspondant la table MATIERE. lissue de ces lignes, le programme connat lID de llve tudi pour un enregistrement de la table des notes et sa langue dorigine, traduite en code matire. Le traitement de la note sopre alors grce 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 matire dans la table des notes concide avec la nationalit de llve, alors il est ncessaire de passer en mode modication (rst_notes.Edit). Deux cas de gure se prsentent : soit la note est infrieure deux et la note pondre sera gale 0 (il nest pas prvu davoir une note ngative !), soit elle est suprieure et peut donc se voir pondre. Cest la condition pose par la formulation If rst_notes(2).Value < 2 dont la rfrence rst_ notes(2) correspond la note actuelle non pondre. La commande rst_notes.update lance la mise jour de la colonne rst_notes(3) qui correspond la note pondre ; elle na lieu que lorsque les conditions prcdentes sont runies. La commande rst_eleves.MoveFirst oblige le curseur du jeu lves retourner en dbut de chier (pour quun prochain rst_eleves.FindFirst puisse balayer la totalit des enregistrements). La commande rst_notes.MoveNext fait passer le programme lenregistrement suivant du jeu notes avant que le mot-cl Wend ferme la boucle. Le programme scrit enn ainsi pour fermer lensemble 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 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

226

Access 2007 et VBA

Chapitre
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 lindique la bote de message nale, et avec une machine courante du march, le programme demande 2,10 secondes pour lire et traiter les 19 000 enregistrements de la table NOTATION. Si ce traitement peut paratre rapide certains, il savre pourtant relativement lent : si le chier contient non pas des milliers mais des millions denregistrements, il pourra tre considr comme non performant. Le problme provient du fait que, pour chacun des enregistrements de la table des notes, le curseur du recordset des lves reparcourt toute ou partie de la table des lves et rvalue chaque fois le pays dorigine alphabtique en code ID matire. Il y a, dans cette partie du programme, une grande conomie de temps processeur gagner. 3. Version avec un tableau La deuxime formulation de la rponse pourrait donc emprunter une autre voie en imaginant la solution suivante : On charge un jeu denregistrements contenant tous les lves. Pour chacun des lves lus, on traduit sa nationalit en code quivalent un ID matire et on stocke lID de llve et son ID matire dans une variable tableau. Une variable

Le langage VBA sous Access 227

Exercices

tableau est, comme son nom lindique, une variable qui peut contenir plusieurs colonnes de valeurs pour un mme indice. Lindice de cette variable sera lID de llve et la seule colonne de la variable tableau contiendra lID matire. Ce traitement tant termin, on a en mmoire vive tous les lves et leurs quivalents nationalit (avec une vitesse daccs beaucoup plus rapide que celle dun recordset). On peut donc fermer le premier recordset. On charge un autre jeu denregistrements contenant toutes les notes. Pour chacune des notes lues, si lID matire du recordset correspond celui de la variable tableau, alors on applique une soustraction et on crit la note pondre (update). On passe lenregistrement suivant du jeu de notes. Et ainsi de suite jusqu la n du chier des notes. Lavantage de cette deuxime formulation tient surtout au fait que la translation entre les nationalits alphabtiques et les ID matire numriques nest opre quune seule fois : le temps de traitement descend 0,54 seconde, soit quatre fois moins que dans la procdure prcdente. 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

228

Access 2007 et VBA

Chapitre
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 quatrime ligne, la variable tableau est dclare par la syntaxe Dim vartableau(99, 0) As Integer. Cette variable pourra contenir 100 lignes (99 lignes plus la ligne 0) et une colonne (la colonne 0). Le programme prend lindice de ligne pour y stocker lID de llve et la seule colonne disponible pour y stocker lquivalent ID matire. Un seul RecordSet est ouvert : pendant la premire partie du programme, il contient les ID des lves et leur nationalit. Une boucle (While Not rst.EOF) fait lire tous les enregistrements ; pour chacun deux, la variable tableau est charge des deux valeurs ID_ ELEVE en indice et quivalent matire en premire colonne. La dtermination des quivalents matire est effectue avec la syntaxe Select Case de la mme manire que dans la premire solution. Lorsque toutes les quivalences sont charges en mmoire dans la variable tableau, le mme RecordSet est repris pour lire toutes les notes. Chaque fois que le numro de matire contenu dans la variable tableau concide avec lID_MATIERE du RecordSet, la note pondre est mise jour. 4. Version SQL Lnonc de lexercice exigeait lactivation dun ou plusieurs jeux denregistrements pour oprer la pondration des notes des lves. Cest la raison pour laquelle les deux solutions proposes se rfrent ce procd. Il existe une troisime solution, ni plus ni moins performante que la deuxime, et qui utilise uniquement SQL pour faire la mme opration. Pour la mettre en uvre, Vous devez crer une table EQUIVALENCE, dont le contenu est prsent la gure 8.6. Cette table ne contient que deux colonnes, reprenant les champs ID_MATIERE et PAYS_ELEVE, et tablissant les quivalences. Figure 8.6
Table dquivalence de lexercice 2.

Le langage VBA sous Access 229

Exercices

Ds lors, la requte mise jour, dont la structure graphique est prsente la gure 8.7, permet de faire la mme opration en une seule fois. Elle est construite en slectionnant dans longlet Crer, licne Cration de requte. Choisissez ensuite les tables NOTE, ELEVE, EQUIVALENCE et MATIERE, puis dans le ruban, slectionnez Mise jour. Par un glisser/dposer, mettez en relation le champ PAYS_ELEVE des tables ELEVE et EQUIVALENCE. Dans la zone Champ de la premire colonne choisissez NOTEPONDEREE de la table NOTE. Dans la zone Mise jour inscrivez VraiFaux([NOTATION]<2;0;[NOTATION]2). Figure 8.7
Requte de lexercice 2.

Excute sous le code Visual Basic suivant, elle demande 0,50 seconde : Le code SQL de cette requte 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 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 =If([NOTATION] <2,0,[NOTATION]-2);" MsgBox Format(Timer - vardebut, "Fixed") DoCmd.SetWarnings True End Sub

230

Access 2007 et VBA

Chapitre

EXERCICE 3
nonc

UNE

AUTOMATION

ACCESS/WORD

Mettez en place un formulaire prsentant la liste des lves et leur moyenne. Lors dun double-clic sur lun des items de la liste, le programme rdige, distance, une courte lettre sous Word qui annonce le passage la classe suprieure ou le redoublement suivant que la moyenne est suprieure ou non 10.

* Solution

Il ne sagit pas, ici, de faire un mailing partir de Word en utilisant le chier dAccess ; au contraire, lutilisation de Word est occasionnelle et ne touche quun seul lment ; lutilisateur est positionn sur son application Access et naccde Word que provisoirement. Cet exemple peut tre appliqu dans un grand nombre de cas de gures.

Attention
Pour raliser cet exercice, il est ncessaire que la bibliothque Microsoft Word 12.0 Library soit charge dans Outils > Rfrences de Visual Basic Editor. Pour raliser le chargement de cette nouvelle bibliothque, procdez de la mme manire que pour celle concernant Excel dcrite dans le paragraphe 3 du cours de ce mme chapitre.

1. Dans le menu Crer , cliquez sur Cration de formulaires . 2. Enregistrez tout de suite le nouvel lment sous le nom Frm_EnvoiLettre . 3. Les assistants de cration de contrles tant dsactivs, dessinez une zone de liste dans le formulaire vierge. 4. Les proprits de la zone de liste modier 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.NOTATION) 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;

Le langage VBA sous Access 231

Exercices

La requte, dote dun regroupement (GROUP BY), est prsente graphiquement la gure 8.8. Figure 8.8
Requte de lexercice 3.

5. la ligne de proprit Sur double-clic, cliquez sur le bouton aux trois points de suspension puis Gnrateur 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

232

Access 2007 et VBA

Chapitre
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 suprieure" End If docword.Selection.TypeParagraph docword.Selection.TypeText Text:="Veuillez agrer, " & Civilite & _ ", lexpression de nos salutations distingues" 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 particularits suivantes sont souligner : La mthode CreateObject a t choisie ici, contrairement lexemple prsent dans la partie thorique de ce chapitre qui faisait appel la syntaxe Set prog_xlsx = New Excel.Application. Dans la pratique, les deux tournures ont les mmes proprits. Lobjet Me.Choix_Eleve.Column(numro de colonne) est systmatiquement slectionn pour rcuprer dans Word toutes les coordonnes utiles. On rappelle que la numrotation commence 0. La colonne lie, numrote 0 et contenant lID de llve est masque. Les syntaxes faisant allusion au document Word comportent toutes un vocabulaire spcique Word quil est possible dapprofondir en utilisant les macros de Word et lexplorateur dobjets. Elles sont toutes prxes par lexpression docword.Selection dsignant le document en cours et pilot distance. Il suft dsormais de passer en mode formulaire pour voir la liste des lves. Un doubleclic sur lun dentre eux gnre automatiquement, sous Word, un courrier qui lui est adress et qui linforme de sa note.

Le langage VBA sous Access 233

Exercices

Chapitre

La nalisation, monter une application


1. Le dmarrage dune application .................. 2. La gestion des utilisateurs ....... 3. Le volet de navigation ............ 4. La gestion des rubans ............

236 237 238 239

Lorsque tous les lments sont runis, tables, requtes, formulaires et tats, il devient possible de monter une vritable application destination de futurs utilisateurs. La problmatique essentielle, ds lors, porte sur les points suivants : lergonomie ; la gestion des utilisateurs ; la scurit. Les aspects ergonomiques ont dj t largement abords dans le montage des formulaires. Il sagira donc, dans ce dernier chapitre, daborder la partie concernant leur pourtour : le volet de navigation, la barre de menus et les rubans. La scurit concernera essentiellement les prcautions prendre pour viter que lutilisateur ne puisse accder certains lments, soit pour des raisons de confidentialit, soit pour des raisons de prudence.

235

(1)

Le dmarrage dune application


Lors du dmarrage dune base Access, si aucun paramtrage nest effectu, tous les objets de la base sont lisibles et modiables volont. Une fentre spcique gre les conditions gnrales dexploitation de la base : 1. 2. 3. 4. Dmarrez la base de donnes ECOLE_INTERNATIONALE des exercices. Cliquez sur le bouton Ofce . Cliquez sur le bouton Options Access . Dans le pav de gauche, slectionnez Base de donnes active pour accder la fentre de la gure 9.1.

Figure 9.1
Fentre de dmarrage.

Paramtrer une application revient slectionner ou non chacune des options proposes dans la fentre de dmarrage. Une fois slectionnes, ces options deviennent oprationnelles aprs fermeture et ouverture de la base. Voici une description du rle de chaque option : Le titre de lapplication indiqu apparatra dans la barre suprieure (sans ne plus faire allusion Microsoft Access !) Licne choisie pour lapplication sera constamment applique dans les formulaires et les barres de menu Le formulaire dsign dans la zone Afcher le formulaire souvrira automatiquement au dmarrage. Trs souvent, le formulaire choisi sera celui didentication de lutilisateur (comme dans la base Northwind). Il est possible dintercaler du code dans ce premier formulaire pour ouvrir dautres formulaires ou procder des oprations spciques. Les Options de la fentre Document ont une grande importance ergonomique : soit Access ouvrira plusieurs documents avec autant donglets (mode Access 2007), soit les fentres se superposeront (mode Access 2003).

236

Access 2007 et VBA

Chapitre

Les touches spciales (Alt + F11 par exemple) doivent tre dsactives si le programmeur ne veut pas que les utilisateurs accdent des parties sensibles de lapplication. Le compactage automatique la sortie de lapplication nest pas indispensable : il ralentit notablement les procdures de fermeture et ne se justie que si les volumes de donnes manipules savrent trs importants. En revanche, il est recommand de pratiquer manuellement ce compactage en n de dveloppement et priodiquement grce loption Bouton Ofce > Grer > Compacter la base de donnes. Le gain de place disque peut tre considrable. Les options concernant le volet de navigation, les barres de menus et les rubans seront tudies plus loin. Ici, elles seront simplement invalides ou mises en place. Loption Autoriser les menus contextuels par dfaut doit tre dsactive si le programmeur veut interdire le clic sur le bouton droit de la souris (dangereux certaines occasions). La partie concernant la correction automatique de nom ne gre pas, contrairement ce que lon pourrait croire, lorthographe, mais les erreurs de noms des objets dAccess. Elle pourra tre conserve en standard. Il sera parfois utile, en revanche, dinvalider la correction automatique dans le chapitre Vrications des Options dAccess. En effet, la saisie du mot FRANCE en majuscules, par exemple, est automatiquement modie par lorthographe France en minuscules, ce qui peut induire des difcults dans la rdaction dune table des pays. La plupart des options cites ici sont invalides lorsque lapplication est dmarre en conservant le doigt sur la touche Majuscule pendant le dmarrage : on accde alors la base comme son programmeur 1.

(2)

La gestion des utilisateurs


Jusqu Access 2003, le programme contenait des options permettant de grer les accs des utilisateurs avec un mot de passe par utilisateur. Access 2007 a compltement supprim cette notion 2. Il nest plus possible que de crer un mot de passe gnral un chier .accdb (option Outils de base de donnes > Chiffrer avec mot de passe). La gestion des utilisateurs est donc totalement reporte sur les programmes dvelopps, leur code Visual Basic et leurs formulaires. Pour reprendre lexemple de la base Northwind, tudie au dbut de cet ouvrage, il existe une table Employs et une table Privilges qui grent quelques droits particuliers des utilisateurs compte tenu de leur position hirarchique. Il nexiste pas, en revanche, de menu particulier pour telle ou telle catgorie demploys. Linsertion dun formulaire modal didentication au dmarrage de lapplication a pour principal avantage, ici, de crer et dincrmenter une variable publique qui pourra tre utilise comme valeur par dfaut dans tous les formulaires et tats. Cest la dmarche qui a t choisie par les concepteurs de la base Northwind. Pour une gestion plus ne des droits des utilisateurs, il nest donc envisageable que de crer une base de donnes SQL Server laquelle sera connecte la base Access. En effet,

1. Cette fonctionnalit est elle-mme supprimable au moyen de la proprit AllowBypassKey de la base grce Visual Basic. 2. La gestion des utilisateurs est encore utilisable pour les fichiers .mdb fonctionnant en mode de compatibilit sous Access 2007.

La finalisation, monter une application 237

SQL Server gre parfaitement les droits des utilisateurs, table par table, fonctionnalit par fonctionnalit. Quant aux menus, il sera excessivement lourd de les faire varier selon la catgorie dutilisateur. On se contentera, le plus souvent de code Visual Basic ou autres macros qui bloqueront telle ou telle option si les privilges requis ne sont pas atteints par lutilisateur en cours. On mesure l lune des limites du programme Access.

(3)

Le volet de navigation
Le volet de navigation peut tre choisi comme menu gnral dune application : on y trouve tous les lments formulaires qui fondent la base de donnes pour linterface utilisateur. Si tous les exercices des chapitres prcdents ont t raliss, la base de donnes ECOLE INTERNATIONALE comprend sept formulaires qui peuvent servir de menu gnral lapplication. La dmarche de mise en place sera la suivante : Faites un clic droit sur le premier lment : Frm_ChoixEleve. Cliquez sur Ajouter un groupe > Nouveau groupe . En haut, nommez le nouveau groupe ECOLE (au lieu de Personnalis1). Inscrivez les autres formulaires dans ce nouveau groupe par un clic droit sur chaque lment puis en cliquant sur ECOLE. On doit obtenir les lments suivants : Choix dun lve. Envoi lettre de n danne. Envoi mail des rsultats. Notation des lves Liste des lves. Moyennes des lves 1. Visualisation des lves. 5. Faites un clic droit sur chacun des lments lists ci-dessus puis cliquez sur Renommer le raccourci 2 : mettez un nom bien orthographi comme dans la liste (et non plus les noms techniques de formulaires tel Frm_ChoixEleve). 6. Cliquez du bouton droit sur tous les lments que vous ne voulez pas faire apparatre et slectionnez loption Masquer dans ce groupe. Pour oprer plus rapidement, vous pouvez faire un clic droit sur un groupe dlments (Tables par exemple) et slectionner Masquer 3. 1. 2. 3. 4.

1. Les sous-formulaires de ce formulaire nont pas besoin dtre libells. 2. Les lments ne peuvent tre renomms que sils sont inscrits un groupe. Il est vivement recommand, dans les options de navigation, dopter pour le double-clic sur les lments de navigation : les actions sur les noms de raccourcis sont en effet trs difficiles raliser lorsque le simple clic est choisi. On peut, le cas chant, retourner au simple clic ensuite. 3. Pour rendre nouveau visibles les lments masqus, accdez aux Options de navigation par le menu du dmarrage (voir paragraphe prcdent) ou en faisant un clic droit sur la barre suprieure du volet de navigation, et cochez nouveau les lments masqus.

238

Access 2007 et VBA

Chapitre

Il est envisageable de crer autant de groupes personnaliss que de besoin (maximum 10) pour sadapter aux utilisateurs. lissue de ces manipulations, la limitation des menus prendra le dessin de la gure 9.2. Figure 9.2
Volet de navigation personnalis.

Ces mises au point ralises, lutilisateur peut encore personnaliser son volet de navigation. Pour empcher une telle dmarche, le passage par les macros ou la programmation sera ncessaire. Il sufra de crer la macro Mcr_VerrouillageVolet prsente la gure 9.3 et, le cas chant, de la traduire en code Visual Basic (voir chapitre 7). Figure 9.3
Macro destine verrouiller le volet de navigation.

La macro (ou le code) sera lance avec lapplication, par exemple sur laction Sur ouverture dun formulaire de dmarrage.

(4)

La gestion des rubans


Les menus et des rubans sont grs de manire toute fait nouvelle avec Access 2007. Si une application avait t dveloppe sous Access 2003 avec des barres de menus personnalises, celles-ci sont rcupres sous Access 2007, mais dans un menu Complments peu esthtique et qui laisse toute sa place aux rubans dans lesquels de nombreuses fonctionnalits peuvent tre considres comme dangereuses par le programmeur. Il devient ds lors ncessaire de les concevoir nouveau compltement. Avant mme de dbuter la construction dun ruban, il est ncessaire de crer les macros ou le code Visual Basic aptes ouvrir les formulaires auxquels on veut associer un bouton de ruban. 1. Dans le menu Crer , cliquez sur Macros . 2. Dans la colonne Action, slectionnez Ouvrir formulaire. 3. Dans le Nom du formulaire, entrez Frm_EnvoiMail .

La finalisation, monter une application 239

4. Enregistrez la macro sous le nom Mcr_Ouv_EnvoiMail . 5. Ritrez la mme opration pour obtenir une macro nomme Mcr_Ouv_EnvoiLettre , destine ouvrir le formulaire denvoi dune lettre personnalise. Ces deux macros, qui pourraient tre traduites en langage Visual Basic, seront invoques lors de la cration des boutons du ruban. Alors quAccess 2003 disposait dun assistant graphique trs rapide pour mettre en place des barres de menu, Access 2007 nen dispose plus, alors que la conception, totalement nouvelle, se fonde sur XML (eXtensible Markup Language). Il est souhaitable, ds lors, de disposer dun diteur XML pour rdiger ses menus et rubans, bien quun simple diteur de texte puisse sufre. XML est un langage utilisant des balises pour dcrire des structures de donnes. Une balise se signale par les signes < et >. Gnralement, il existe une balise ouvrante, note <ribbon> par exemple et une balise fermante note </ribbon>. Les balises peuvent tre dotes dattributs du type <balise attribut1 ="valeur1" attribut2 = "valeur2">. Dans un chier 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 Gnral"> </tab> </tabs> </ribbon> </customUI>

La premire balise <customUI> (Customized User Interface ou Interface utilisateur personnalise) est ferme en n de chier par la mme balise dmarre avec une barre de fraction (</ribbon>). Elle fait appel une adresse constante. La deuxime balise <ribbon> porte lattribut startFromScratch positionn vrai. Cette commande va supprimer le ruban standard et le remplacer par le ruban personnalis. Si cet attribut est omis (ou positionn faux), le menu personnalis sajoutera au menu standard. La troisime balise <tabs> vise les onglets suprieurs des rubans. Il na t cr ici quun seul onglet <tab> nomm tabMenuGeneral et dont le libell visible sera Menu Gnral . Ce texte pourrait tre conserv au format XML et charg sparment au moment du dmarrage dAccess, mais nous ntudierons que la facult dAccess de stocker ce code dans une table spcique. 1. 2. 3. 4. Dans le menu Crer , cliquez sur Cration de table . Nommez le premier champ RibbonName 1 (type texte de longueur 255). Nommez le second et dernier champ RibbonXml (type mmo). Enregistrez la table sous le nom exact USysRibbons sans cl primaire (rpondez Non la demande de cration de la cl).

1. Les noms cits sont obligatoires.

240

Access 2007 et VBA

Chapitre

5. USysRibbons tant une table systme, elle est normalement non visible : pour la faire apparatre, dans les Options Access, cliquez sur Base de donnes active > Options de navigation et cochez la case Afcher les objets systme. 6. Ouvrez la table USysRibbons . 7. Au premier enregistrement, champ RibbonName, entrez le libell Ruban1 . 8. Dans le deuxime champ, faites un copier/coller du code XML indiqu plus haut an dobtenir le rsultat prsent la gure 9.4, puis fermez la table 1. Figure 9.4
Code XML insr dans la table USysRibbons.

9. Cliquez sur les Options Access. 10. Slectionnez la rubrique Base de donnes active. 11. Dans la zone Options de la barre doutils et du ruban, crivez Ruban1 pour renseigner le nom du ruban (la zone de liste droulante nest pas oprationnelle). 12. Fermez la base, puis ouvrez-la nouveau : il ny a plus que longlet Menu Gnral. Rappel : on peut outrepasser ce dmarrage en gardant le doigt sur la touche Maj pendant louverture de la base. Nous nous proposons prsent de crer un simple ruban, comme prsent la gure 9.5, dans lequel apparatront : Un groupe nomm Gestion des courriers et dans lequel sont placs deux boutons denvoi mail et envoi courrier. Un groupe nomm Application et contenant un bouton de fermeture de la base. Figure 9.5
Ruban personnalis.

Il faut donc ouvrir une nouvelle fois la base de donnes en gardant le doigt sur la touche Maj (pour avoir le ruban complet), puis affecter le champ RibbonXml de la table

1. On prendra garde parfaitement orthographier le fichier XML, qui est sensible la casse (caractres minuscules et majuscules). Toute erreur renverra un problme au dmarrage.

La finalisation, monter une application 241

USysRibbons avec le code XML suivant, qui pourra tre saisi au pralable dans un diteur de texte :
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon startFromScratch="true"> <tabs> <tab id="tabMenuGeneral" label="Menu Gnral"> <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> cre des pavs dans le ruban : le premier groupe sappelle grpEnvois et le second grpApplication. Elle est chaque fois ferme par </group>. Chaque pav est dot des attributs id (nom unique) et label (tiquette). La balise <button> cre des boutons dots des proprits suivantes : Une identit qui peut tre soit personnalise, cest--dire dote dun attribut nomm (id = xxx ), soit standard et nomme idMso 1. La fermeture de la base, en bas du code, en est un exemple. Un label, qui safchera sur le bouton. Une taille, qui peut tre normal ou large. Une image 2. Une bulle daide ou screentip. Une sous-bulle daide (au texte plus long) ou supertip. Une proprit onAction, qui lance le code ou la macro nomme dans lattribut. La fermeture puis louverture de la base font apparatre le nouveau ruban.

1. Les noms des idMso peuvent tre retrouvs 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 manire suivante : depuis le Download Center de Microsoft, tlchargez (gratuitement) le 2007 Office System Add-In: Icons Gallery. Aprs installation, un fichier nomm Excel Office2007IconsGallery.xlsm pourra tre ouvert sous Excel (dans le ruban Dveloppeur dExcel).

242

Access 2007 et VBA

Chapitre

Il existe de nombreuses autres prsentations des lments qui peuvent apparatre dans un ruban (sparateurs, zones de liste droulante, menus droulants) ; il serait trop long de les numrer ici.

Rsum
Par dfaut, le programme Access met disposition de lutilisateur tous les lments dune base de donnes : tables, formulaires et autres. Cette libert peut tre conserve dans le cadre dune organisation o lutilisateur et le programmeur ne font quun. Ds que la base de donnes est mise disposition de plusieurs personnes, il devient indispensable de grer les accs tous ces lments. Cette ncessit nat non seulement dimpratifs dintgrit des donnes, mais galement dun besoin dergonomie destination dutilisateurs non avertis. Access donne la possibilit dorganiser le volet de navigation pour ne plus faire apparatre que les lments achevs et protgs du systme tout entier, les formulaires en particulier. Dune certaine manire, il peut donc devenir une forme de menu, limage de la barre horizontale des anciennes versions. Mais le volet de navigation nest pas obligatoire et peut tre remplac (ou augment) par une gestion complte des rubans. Dpourvu de concepteur graphique, le gestionnaire de ruban dAccess 2007 exige lcriture en code XML dune arborescence donglets (tabs), de pavs (groups) et de boutons (buttons). Ceux-ci peuvent employer tout ou partie des lments standards des menus Access.

La finalisation, monter une application 243

Index
Symboles
& 185 .accdb 3, 23 .csv 77 .dsn 72 .laccdb 23 .mdb 3, 23 Bouton de commande 183 de dplacement 155 Branchement 192 Curseur 210

D
DAO 208 Date() 119 DfinirVarTemp (action) 184 Delete 97 Dlimite (structure de fichier) 69 Dmarrage, paramtres 236 Diagramme dactivit 32 dtat 32 Dim (VB) 197 Distinct 88 Distinctes, valeurs 107 Diviseur denregistrements 136 DoCmd 192 Domaine 149 Donnes externes 69 Doublon 94

C
Case cocher 139 Champ 47 Champ-pre 158 Cl trangre 51, 94 primaire 40, 54 Coller 66 par ajout 66 Colonne lie 135 Column (VB) 198, 232 Coma Separated Values 77 Comme 87, 104 Commit transaction 100 Compactage 237 Compte() 149 CompteDom() 150 Concatnation 185 Conditions 186 Continu (formulaire) 127 Contrainte rfrentielle 50, 80 Contrle 22, 125 ActiveX 143 Bouton de commande 137 Cadre dobjet dpendant 138 Case cocher 139 Etiquette 133 Onglet 141 zone de liste 135 droulante 133 zone de texte 131 Conversion (en Visual Basic) 189 Copier 66

A
Acrobat 169 Actions (macros) 182 ActiveX (contrle) 143 ADO 208 Afficher le slecteur 155 Ajout copier par 66 formulaire 128 Alias 89, 96 And 88 Apercu avant impression 168 ArrtMacro (action) 187 As 89 Assistant Masque de saisie 35 Attache 71 Automation Excel 215 Word 231

E
Edit (VB) 213 Enregistrement, ligne 18 En-tte de formulaire 124 de ligne ou colonne 114 Entier Long 76 Entre de donnes (formulaire) 129 EnvoyerObjet (action) 201 EOF 210 Et 88 tats 12, 167 Etiquette 133 de ligne 192 Excel 67 automation 215

B
Balise 240 Barre de synchronisation 32 de dfilement 155 Begin transaction 99 Bentre 184 BOF 210 Bote de dialogue modale 174 BoteMsg (action) 185

Index 245

ExcuterMacro (action) 187 ExtracChane() 91

L
Label 192 Largeurs colonnes 56 Lecture seule 154 Lgende 48 Liaisons de donnes 71 Lien hypertexte 143 Like 87 Limiter liste 56, 133 Longueur fixe (structure de fichier) 69

F
Facture, crer 27 Fen indpendante 174 Modale 174 Feuille (de donnes) 16 Fields 209 Filtre 15, 87, 103 Find 211, 225 Fonction 90 Compte() 149 CompteDom() 150 Date() 119 de domaine 149 ExtracChane() 91 Format() 196 Gauche() 90 MoyDom() 195 RechDom() 184 Round() 112 SommeDom() 150 VB 191 VraiFaux() 90, 148 Format() 196 Formulaire 12 ajout 128 continu 127 entre de donnes 129 unique 127

Processus 32 Produit cartsien 94 Projet 191 Proprit (de formulaire) 126

R
RechDom() 184 RecordCount 211 RecordSet 208 Rectangle (contrle formulaire) 136 Rel Double 76 Regroupement 91, 108, 170, 175 Regrouper et trier 171 Relation 38 de plusieurs plusieurs 42 de un plusieurs 42 icne 34 rflexive 45, 61 Rorganiser (onglet) 153 Requte ajout 95, 118 cration 100 dfinition de donnes 101 mise jour 98 paramtre 89 Slection 12, 84 suppression 97, 120 Round() 112 Ruban 11, 21, 239 RunSql 206

M
Macro 12, 164, 178, 181 conditionnelle 186 incorpore 137 Mail 201 Mailing 172 Masque de saisie 18, 63 Me 222 Merise 38 Mise jour en cascade 51 Mise en forme conditionnelle 169 Mise en page 168 Modle physique 38 Module 12, 190, 206 Move 210 MoyDom() 195 MsgBox 191 MySQL 4, 72

N
Non-correspondance 95 Not 88, 105 Null interdit 48

S
Select Case 226 Slecteur 125 afficher 155 Slection tendue (zone de liste droulante) 136 multiple (zone de liste droulante) 135 simple (zone de liste droulante) 136 Sparateur 70 SetWarnings 222 SommeDom() 150 Source de donnes (formulaire) 129 Sous-formulaire 144, 155 SQL Server 4, 72, 238 Structure de fichier 69 Sub (VB) 191 Suppression en cascade 45, 52, 97 SurClic (proprit) 196, 222 SurErreur (action) 188

G
Gauche() 90 Gnrateur dexpressions 90, 140 de code 220 GoTo 192 Graphique 142 Groupe doptions 139

O
Objet graphique 142 ODBC 71 Onglet 141 OpenRecordSet 210 Opration 91, 108 Options Access (bouton) 236 Or 87 Ou 87, 105 O 87, 103

I
Icne 236 Identifiant 40 Importation de donnes 66 Index 48 Intgrit rfrentielle 50 IsDate 222 IsNumeric 222

P
Paramtres dimportation 70 de dmarrage 236 Pas 88, 105 PDF 169 Pice (jointe) 18 Pied de formulaire 125 Points-virgules 78

J
Jeu denregistrements 208 Jointure 93, 108 droite ou gauche 94

T
Table 12 cration 46

246

Access 2007 et VBA

Tableau 227 crois dynamique 113 Tabulaire, mode 153 Temps, notion de 44 Titre de lapplication 236 Totaux (icne) 91 Trac denregistrement 70 Transaction 98 TransfrerFeuilleCalcul (action) 183 Tri 15, 86, 103

Unique (formulaire) 127 Update (VB) 214 USysRibbon 240

W
Where 87

V
Valeurs distinctes 88, 107 Variable tableau 227 VarTemp 185 VBA 205 vbCrLF 202 Verrouillage volet 239 Volet de navigation 4, 12, 238 VraiFaux() 90, 148

X
XML 4, 240

Z
Zone de liste 135, 194 droulante 39, 56, 76, 133, 153, 161 de texte 131, 221

U
UML (Unified Modeling Language) 31

Index 247

Informatique

Microsoft

Synthse de cours

& exercices
corrigs

Access 2007

et VBA

L'auteur :
Bernard Minot est professeur associ en informatique luniversit Paris-Est. Il y enseigne lutilisation des tableurs, laudit informatique et la gestion des bases de donnes sous Oracle. Il est galement auditeur informatique dans le cabinet quil dirige.

Ce livre, qui porte sur la dernire version dAccess, prsente toutes les tapes de la conception de bases de donnes de taille moyenne. Il explique galement comment raliser des interfaces graphiques de saisie et de visualisation. Les premiers chapitres traitent de la modlisation des donnes, de la conception de tables grce linterface graphique dAccess, et de lchange de donnes avec dautres applications, telles quExcel. Les chapitres suivants prsentent les requtes SQL, les formulaires et les tats, ainsi que les macros et la programmation en langage VBA. Le livre comprend de nombreux exemples et exercices dont les donnes peuvent tre rcupres sur le site www.pearsoneducation.fr. Les exercices sont tous intgralement corrigs. Ce livre sadresse en premier lieu aux tudiants de premier cycle, aux tudiants en IUT et en BTS. Il sera galement utile aux PME dsirant crer leurs propres bases de donnes. La collection Synthex informatique propose de dcouvrir les fondements thoriques et les applications pratiques des principales disciplines de science informatique. partir dune synthse de cours rigoureuse et dexercices aux corrigs dtaills, le lecteur, tudiant ou professionnel, est conduit au cur de la discipline, et acquiert une comprhension rapide et un raisonnement solide.

Dans la mme collection :


Excel et VBA, B. Minot Le langage C, J.-M. Lry Le langage C++, M. Vasiliu Java 5 et 6, R. Chevallier UML 2, deuxime dition, B. Charroux et al Cration de bases de donnes, N. Larrousse SQL, F. Brouard, C. Soutou LaTeX, J.-C. Charpentier, D. Bitouz Algorithmique, applications en C, J.-M. Lry Algorithmique en C++, J.-M. Lry Algorithmique en Java 5, J.-M. Lry Mathmatiques discrtes appliques linformatique, R. Haggarty Architecture de lordinateur, E. Lazard Systmes dexploitation, B. Lamiroy et al Linux, J.-M. Lry Architecture des rseaux, D. Seret, D. Dromard XML, G. Chagnon, F. Nolot

Pearson Education France 47 bis, rue des Vinaigriers 75010 Paris Tl. : 01 72 74 90 00 Fax : 01 42 05 22 17 www.pearson.fr

ISBN : 978-2-7440-4014-6

Вам также может понравиться