Access 2007 Et VBA

January 27, 2017 | Author: Mohamed Rédha Mazighi | Category: N/A
Share Embed Donate


Short Description

Download Access 2007 Et VBA...

Description

Informatique

Synthèse de cours

& exercices corrigés

Access 2007 Microsoft®

®

et VBA

Les fonctionnalités pour créer des bases de données performantes Des dizaines d’exemples et d’exercices avec leurs corrigés détaillés Les fichiers sources des exercices disponibles à l’adresse www.pearson.fr

collection

Synthex

Bernard MINOT

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

Informatique

Synthèse de cours

&

exercices corrigés

Access 2007 et VBA ®

Bernard Minot université Paris-Est

Avec la relecture de Jean-Michel Léry université Paris-Est

collection

Synthex

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

ISBN : 978-2-7440-4014-6 ISSN : 1768-7616 Copyright© 2009 Pearson Education France Tous droits réservés

Composition sous FrameMaker : TyPAO

Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚ et 3˚ a) du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson Education France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.

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

Sommaire Introduction

1

Chapitre 1



Les objets d’Access

Chapitre 2



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

37

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

65 83

Chapitre 3



9

Chapitre 4



Les requêtes

Chapitre 5



Les formulaires

123

Chapitre 6



Les états

167

Chapitre 7



Les macros

181

Chapitre 8



Le langage VBA sous Access

205

Chapitre 9



La finalisation, monter une application

235

Sommaire III

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

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

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

Base de données ou produit intermédiaire ? Access n’est pas qu’une base de données au sens strict du terme, mais un ensemble d’outils permettant de gérer complètement une base de données, ce qui s’avère très différent. Au-delà des tables et de leur organisation relationnelle (fonction essentielle des bases de données), Access met à disposition un outil permettant de monter des formulaires et de mettre en place une interface graphique avec l’utilisateur ; cet outil ne fait pas partie des fonctions classiques d’une base de données. De la même manière, Access possède un générateur d’états qui offre au programmeur la possibilité de construire des impressions de bonne qualité : deuxième exception. Enfin, et comme tous les produits de la gamme Office, Access fait appel au langage VBA (Visual Basic for Application) pour la programmation. Ces fonctionnalités ne nous permettent plus de placer Access dans la catégorie « base de données » au sens strict. Et pourtant, on ne peut pas classer Access parmi ce qu’il est convenu d’appeler les ateliers de génie logiciel (AGL) qui offrent, par exemple, des fonctions d’aide à la modélisation plus développées. Produit intermédiaire, donc, Access

Introduction 1

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

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

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

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

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

2

Access® 2007 et VBA

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

mieux bien connaître la palette des outils à disposition (les types de contrôles dans le jargon du métier) afin de choisir à bon escient celui qui sera le plus pertinent pour l’utilisateur. L’esthétique des formulaires, qui peut être relativement poussée si le dessinateur veut s’en donner la peine, comptera ici beaucoup moins que l’efficacité dans la présentation et le traitement des données.

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

Nouveautés d’Access 2007 Les nouveautés d’Access 2007 par rapport à ses versions antérieures ne sont pas négligeables. Si les principes fondamentaux de la théorie relationnelle restent constants (comment pourrait-il en être autrement !), les changements sur la forme et le fond sont conséquents. En premier lieu, mais l’utilisateur ne le verra pas, le moteur de base de données Microsoft Jet des versions 2003 et antérieures a été remplacé par ADE (Access Data Engine) ; l’une des conséquences de cette évolution se constate dans le changement de type de fichier (« .accdb » à la place de « .mdb »), qui rend toutes les versions antérieures incompatibles. Access 2007 peut lire les fichiers « .mdb » mais Access 2003 ne lit pas les fichiers « .accdb ». L’utilisateur aura donc tout intérêt à transférer ses bases au nouveau format, avec les nombreuses implications visuelles que cela entraîne. À l’image d’Excel et de Word, en effet, Access 2007 se singularise par un changement radical du haut de l’écran. Le ruban, large zone remplie d’icônes, prend la place des sousmenus que l’utilisateur connaissait depuis toujours. Avec la base de données, cette évolution a une double portée, qui nécessitera des adaptations : non seulement l’utilisateur devra s’habituer à ce nouveau cadre de travail (comme dans les autres produits Office), mais le programmeur Access, quant à lui, devra réécrire toutes les procédures de menus et sous-menus pour mettre à jour les applications déjà développées.

Introduction 3

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

Et sur ce point, les concepteurs d’applications Access ne seront pas aidés par le nouveau produit : alors que la version 2003 était dotée d’un assistant graphique fort commode pour réaliser rapidement des menus complets, le nouvel outil, qui utilise désormais le langage XML, nécessite la saisie manuelle du code sur un éditeur externe à Access ! Autre innovation, le volet de navigation, à gauche de l’écran, présente tous les objets de la base et peut, le cas échéant, devenir une forme de menu général (en plus de la barre de menu et des rubans). L’ergonomie générale des applications développées s’en trouvera donc fortement modifiée, même si ce volet peut être rétractable. Alors qu’Access 2003 présentait toujours ses éléments en pleine page, la version 2007 offre la possibilité d’ouvrir simultanément de nombreux documents et de les présenter sous forme d’onglets supérieurs, un peu à la manière des onglets bas d’Excel. Le graphisme général a ainsi été profondément modifié, le plus souvent en mieux : les zones de date, par exemple, sont désormais systématiquement associées à un petit calendrier, alors que toutes les colonnes peuvent être triées et filtrées avec les mêmes menus contextuels que sous Excel. Les assistants à la création d’objets (requêtes, formulaires, états) ont été poussés à tel point qu’un simple clic suffit désormais à une génération immédiate, sans même d’étapes de conception, devenues seulement optionnelles. Microsoft insiste là sur la capacité d’Access à monter très vite de petits projets d’entreprise : il s’agit du créneau essentiel d’utilisation du produit. Tout au contraire, Microsoft n’insiste plus sur la mise en ligne sur Internet des projets Access, secteur dans lequel d’autres concurrents, notamment du monde libre avec des produits comme MySQL, ont largement pris de l’avance. En revanche, tous les produits Office peuvent désormais partager des données 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 d’une petite entreprise. La taille maximale d’un fichier « .accdb », enfin, est maintenue à 2 Go, comme dans les versions antérieures, limitant par là les velléités de projets inadaptés. À l’inverse d’Excel, qui a multiplié par 1 000 le nombre de cellules d’une feuille, Access reste donc contraint dans son ancienne volumétrie : les projets plus ambitieux devront passer à SQL Server !

Structure de l’ouvrage Le dessin général du livre reprend, très classiquement, l’ordre dans lequel est construite une base de données. Mais nous avons inséré des points sur lesquels il nous semble indispensable d’insister. Le premier chapitre part à la découverte du produit via une base de données fournie par Microsoft pour répondre aux questions du néophyte. Quels sont les éléments constituant une base de données ? Comment lie-t-on tous ces éléments entre eux ? À la découverte du vocabulaire se joint une réflexion sur la manière dont se construit un système d’information.

4

Access® 2007 et VBA

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

Fondamentale, la modélisation couvre une bonne partie du deuxième chapitre avec de multiples exemples et un fort accent mis sur la méthode, sans pour autant tomber dans une abstraction excessive. L’expérience montre, en effet, que d’innombrables bases de données sont créées dans les PME (qui constituent, rappelons-le, l’essentiel du tissu économique du pays) avec de nombreuses erreurs de conception qui les rendent peu exploitables. Il y a, sur ce point, de réels efforts à fournir pour pouvoir mieux stocker l’information et mieux la faire circuler. Création et utilisation des tables, des requêtes, des formulaires et des macros forment la suite logique et l’essentiel de l’ouvrage. À chaque fois, la synthèse de cours fait appel à des exemples rapidement fournis, au détriment du discours mandarinal : suffisamment simples, ils visent directement le thème du cours sur un mode démonstratif ; suffisamment volumineux, ils montrent en grandeur nature la problématique rencontrée en entreprise. Reprenant l’objectif ouvertement affiché par Access de RAD (Rapid Application Development), l’exposé est conçu pour permettre des mises au point rapides sur des solutions « légères ». L’informaticien professionnel n’y trouvera donc pas son compte de… complexité. On préférera passer plus de temps à réfléchir sur le papier dans le cadre d’un échange utilisateur/concepteur sur les éléments de base (tables, relations, maquettes d’écrans et d’états), et moins de temps sur le clavier et la souris. Le chapitre entièrement consacré à VBA se base, initialement, sur la conversion automatique des macros. Considérant que le lecteur a déjà, au moins, une petite expérience des autres produits de la gamme Office, il aborde le sujet comme si la même approche a déjà été pratiquée avec Excel, par exemple. Cela permet de découvrir des sujets peu étudiés dans les courts ouvrages publiés en la matière, mais qui ouvrent des voies très larges pour des projets plus ambitieux. Le dernier chapitre, enfin, décrit rapidement la démarche à adopter pour mettre en place une application : les changements dans la nouvelle version d’Access n’épargneront donc pas un détour par XML. Tous les chapitres sont divisés en deux parties à parts égales, les exercices et leur correction prenant donc une proportion considérable. Chaque exercice reprend une partie du cours et l’applique dans un contexte différent, mais de nouvelles manières de procéder sont également introduites. L’ensemble des exercices porte sur une même base de données mise à disposition sur le site des éditions Pearson : www.pearsoneducation.fr.

Périmètre de l’ouvrage Toutes les fonctionnalités et tous les détails d’Access ne sont pas passés en revue. Il ne s’agit pas d’une encyclopédie inventoriant l’exhaustivité des possibilités offertes : il faudrait pour cela un ouvrage beaucoup plus volumineux, que d’autres ont déjà fait, qui servirait plus de référentiel occasionnel que de livre de travail et d’études. Tout au contraire, il nous a été difficile de ne pas aborder certains sujets un peu moins importants : après arbitrage, le livre contient l’essentiel des fonctions utilisées généralement et, parmi celles-ci, de très simples comme d’assez complexes.

Introduction 5

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

Dans la partie relative à la programmation en langage Visual Basic, il nous a paru plus important d’insister sur l’utilisation du langage SQL via VBA et sur la notion de jeu d’enregistrements qui ouvre la voie à de nombreux programmes, plutôt que sur la partie boucles ou gestion des entrées/sorties.

À qui s’adresse ce livre Au premier chef, les étudiants de tous niveaux trouveront ici les bases nécessaires pour démarrer d’un bon pied la conception et la création d’un petit système d’information. La partie relative à la modélisation leur permettra d’éviter les pièges les plus répandus et celle portant sur VBA confortera leur initiation à la programmation. Le reste de l’ouvrage leur donnera un large panorama des fonctionnalités du produit. De nombreux professionnels liront aussi ces lignes avec intérêt, et en particulier : • ceux qui pratiquent déjà Access et profitent de la version 2007 pour approfondir leurs connaissances ; • ceux qui pratiquent déjà Access et ressentent le besoin d’un appui pour passer à la nouvelle version, en particulier pour mettre à jour les bases de données déjà conçues ; • tous les professionnels qui, de près ou de loin, ont besoin de mettre en place de petites bases de données dans le cadre de leur métier de gestionnaire, dans la plus large acception du terme.

Les suppléments Les fichiers des exercices et des exemples, au format source « .accdb », sont téléchargeables sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr. Le lecteur pourra les mettre en œuvre pour son apprentissage, mais aussi les compléter et se constituer ainsi sa propre base d’exemples.

L’auteur Bernard Minot est professeur associé (PAST) à l’université Paris-Est. Docteur en histoire économique, diplômé d’audit informatique et Certified Information Systems Auditor, il dirige également un cabinet d’audit informatique. Sa mission à l’université consiste à rapprocher les mondes universitaire et professionnel ; dans ce cadre, il assure un enseignement sur la mise en pratique des tableurs et des bases de données, ainsi que sur l’audit informatique.

6

Access® 2007 et VBA

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

Remerciements Remerciements à Jean-Michel Léry, relecteur méthodique et efficace, pour son assistance. Une attention toute particulière pour Caroline Rimbault-Minot et sa constante complicité.

Introduction 7

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

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

1

Chapitre

Les objets d’Access

1. Les éléments essentiels de la base............................... 10 Problèmes et exercices 1. Créer un client et une commande .................... 25 2. Pratiquer un réassort................ 28 3. Analyser les processus et les états ............................... 31 4. Analyser les données ............... 33 5. Retoucher un formulaire en mode création .................... 35

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

9

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

(1)

Les éléments essentiels de la base Quelle que soit la manière d’aborder la base de données, il est indispensable, en premier lieu, d’identifier chacun des objets qu’elle contient afin d’accéder rapidement à l’outil voulu. En vue d’énumérer et d’exposer brièvement la nature de chacun d’entre eux, la base exemple de Microsoft « Northwind » est employée ici après avoir été mise en place. Pour ce faire, démarrez Access (Démarrer > Tous les programmes > Microsoft Office > Microsoft Office Access 2007). La grille-écran représentée à la figure 1.1 apparaît.

Figure 1.1 Démarrage d’Access.

• Le pavé central permet de choisir parmi des bases de données « prêtes à l’emploi » concernant des domaines variés (Contacts, Etudiants, etc.). • L’icône en haut à gauche du pavé central permet de créer un fichier vide qui contiendra ultérieurement tous les objets que l’on créera. • La partie droite de l’écran permet d’ouvrir des fichiers déjà créés ou des bases récemment utilisées. La base de données à sélectionner se trouve sous le libellé « Exemple » de la partie de gauche de l’écran et s’appelle « Northwind ». 1. Cliquez sur « Exemple » à gauche. 2. Cliquez sur « Northwind ». 3. Cliquez sur le bouton « Créer » en bas à droite après avoir noté le chemin où sera créé le fichier Northwind.accdb 1. 4. Une boîte message propose la connexion sous un nom d’utilisateur : prendre celui par défaut et cliquer sur Connexion.

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

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

10

Access® 2007 et VBA

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

1

Chapitre

L’accueil dans la base de données se visualise comme à la figure 1.2. Figure 1.2 Principaux éléments de l’organisation d’Access.

Barre de menu

Volet de navigation

1.1 LA

Ruban

Barre d’outils d’accès rapide

Formulaire d’accueil

BARRE D’OUTILS D’ACCÈS RAPIDE ET LE BOUTON

OFFICE

Comme pour l’ensemble de la gamme Office, la présentation de la partie supérieure de l’écran a largement évolué entre la gamme des produits Excel, Word et Access de 2003 et celle de 2007. La barre bleue supérieure s’appelle désormais une barre d’outils d’accès rapide et comporte en standard les raccourcis les plus utilisés : Enregistrer, Annuler ou Répéter Frappe, Imprimer ou Faire un aperçu avant impression. Il est possible d’ajouter à cette barre tous les autres raccourcis de l’application Access. Chaque option de la barre de menu (Accueil – Créer – Données Externes – Outils de base de Données) ne comporte plus de sous-menus comme dans les versions antérieures, mais ouvre ce qu’on appelle un « ruban » dans lequel on trouvera de très nombreuses icônes. Chaque ruban est composé de groupes d’icônes, tel que « Affichages – Presse-papier, etc. » contenant chacun les icônes elles-mêmes. On lira dans le dernier chapitre comment personnaliser les rubans, soit en les augmentant avec des boutons personnalisés, soit en créant soi-même des menus et rubans complètement nouveaux. Avant toute personnalisation, l’exhaustivité des commandes disponibles est regroupée dans les quatre options du menu général 1. Le bouton « Office », en haut à gauche, remplace en partie le menu « Fichier » des applications antérieures. Outre les items classiques « Ouvrir – Fermer – Enregistrer – Quitter », il contient les options d’impression, de gestion des propriétés, d’ouverture des fichiers récents et surtout l’accès aux options d’Access, particulièrement importantes. 1. Il n’existe pas, comme dans Word ou Excel, d’option de menu supplémentaire et spécifique « Développeur ».

Les objets d’Access 11

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

1.2 LE

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

Figure 1.3 Types et logos des objets Access.

• Les tables contiennent les données stockées ; leur nombre est illimité. Ces tables peuvent être en relation les unes avec les autres, d’où l’expression de base de données relationnelle. • Les requêtes mémorisent des instructions d’interrogation des tables. On parlera dans d’autres bases de données de « Vues ». Une requête peut être lancée à tout moment pour obtenir des résultats soit de visualisation, soit de manipulation des données (ajout, modification, suppression). • Les formulaires génèrent des masques de visualisation des données. Alors que l’affichage des tables n’a pour rendu qu’une grille de données (un peu comme dans un tableur), les formulaires procurent une interface homme/machine agréable. Un formulaire peut être basé directement sur une table mais aussi sur une requête ; il permet toutes les manipulations de données. • Les états permettent les impressions ; paramétrables, ils autorisent des tris et totalisations des données à imprimer. • Les macros, fondamentalement différentes de celles d’Excel, mémorisent des actions présélectionnées. Elles peuvent être lancées directement ou bien à partir de boutons créés dans des formulaires. • Les modules sont des containers de code Visual Basic. Ils peuvent être écrits directement ou résulter de la traduction de macros. Le volet de navigation peut être caché pour laisser plus de place et de visibilité aux formulaires et autres objets ouverts. Cliquez sur le double chevron tourné vers la gauche pour le faire disparaître ; il sera possible de le faire réapparaître à tout moment.

12

Access® 2007 et VBA

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

1

Chapitre

Alors que cette partie gauche de l’écran était constante dans les versions d’Access antérieures à 2007, elle est maintenant devenue paramétrable. L’idée consiste à permettre de construire une sorte de menu en utilisant cette partie de l’écran et non plus la barre de menus supérieure comme par le passé. Le volet de navigation comprend la mention « Les Comptoirs » en haut : il s’agit d’un libellé et d’un menu 1 créés par le programmeur pour afficher les objets voulus. En dessous, « Clients et commandes », « Inventaires et achats » sont de grandes rubriques contenant elles-mêmes les objets Access. Ainsi, l’objet « Les dix premières commandes » compris dans la rubrique « Clients et commandes » est une requête, alors que l’objet immédiatement en dessous est un formulaire. Un double-clic sur l’un de ces objets en permet l’ouverture dans la partie droite de l’écran. 1. Cliquez sur le triangle tourné vers le bas, situé en haut à droite du Volet de Navigation. Une zone de liste déroulante permet d’ordonner différemment les objets de la liste. 2. Cliquez sur « Type d’objet » : le volet de navigation n’affiche plus que les grandes classes d’objets Access vues plus haut. 3. Développez les tables en cliquant sur le double chevron tourné vers le bas : vous listez la totalité des tables contenues dans la base (voir figure 1.4). Figure 1.4 Visualisation des seules tables dans le volet de navigation.

Un clic sur le triangle à droite de « Tous les objets Access » suivi du choix de « Les Comptoirs » permet de revenir à la situation de départ. Cette manipulation montre que le travail sur la base Northwind peut s’opérer de deux manières : • soit en qualité de simple utilisateur grâce aux menus de gauche tels qu’ils ont été conçus par le programmeur ; 1. Et plus précisément une « catégorie » du volet de navigation comme on le verra plus loin.

Les objets d’Access 13

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

• soit en qualité de développeur, en affichant tous les objets, même ceux qui ne sont pas inclus dans le volet de navigation préparamétré. Outre ces deux approches, il est possible d’afficher les objets sous divers autres ordonnancements comme les dates de création ou de modification, l’association d’objets (tables et formulaires liés par exemple) et d’autres critères encore. Il est inutile, au moins dans un premier temps, de multiplier les affichages sous peine de se disperser dans différentes voies d’accès aux objets. Un clic droit sur la catégorie « Les Comptoirs », en haut à gauche, ouvre une fenêtre déroulante qui présente, en sus des options déjà vues : • Les « Options de navigation », qui permettront plus tard de monter des menus personnalisés. • Un « Volet de recherche » ouvrant une petite fenêtre de recherche en haut du volet de navigation. Les recherches se feront par mot-clé, l’établissement de la liste résultante se réalisant au fur et à mesure de la saisie.

1.3 LA

FENÊTRE PRINCIPALE D’AFFICHAGE En ouvrant la base de données Northwind, un formulaire d’accueil apparaît automatiquement dans la fenêtre principale. Il a été conçu pour être le plus ergonomique possible ; avec les menus présentés dans le volet de navigation, il constitue l’environnement général de l’utilisateur final. Le fait qu’il s’agisse d’un formulaire est attesté par la présence du logo contenu dans l’onglet supérieur : ce formulaire a pour nom « Interne ». Il se ferme en cliquant sur la croix placée au même niveau à droite de l’écran ; la fenêtre 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 l’objet « Interne ». 1. Faites un double-clic dans le volet de navigation sur « Les dix premières commandes », un deuxième onglet apparaît à droite de « Interne » et vient recouvrir le contenu du menu d’accueil. 2. Faites un double-clic sur « Liste commandes » : un troisième onglet se surajoute. 3. Faites un double-clic sur « Détail commande » : cette fois une fenêtre s’ouvre au-dessus de l’ensemble, sans incrustation dans la fenêtre des onglets. Il s’agit dans ce cas d’une fenêtre « indépendante ». 4. Fermez la fenêtre « Détail commande » en cliquant sur la croix supérieure droite. 5. Fermez tous les onglets successivement, chacun avec sa croix de fermeture. Tous ces effets visuels ont été préparés par le programmeur et s’inscrivent dans une démarche logique d’enchaînement des tâches.

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

14

Access® 2007 et VBA

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

1

Chapitre

En bas à gauche de l’écran apparaissent les « boutons de déplacement » qui permettent de naviguer rapidement parmi les lignes (ou enregistrements) de la liste résultant d’une requête. Le libellé « 1 sur 49 » indique que l’utilisateur pointe à ce moment sur le premier enregistrement d’une série de 49. Il est plus rapide d’employer les boutons de déplacement que les flèches directionnelles du clavier. Ces boutons permettent respectivement, et de gauche à droite, d’aller au premier, au précédent, au suivant et au dernier de la liste. Parmi les champs affichés, certains ont des caractéristiques bien particulières : • le champ Date de commande, quand il est actif, s’accompagne d’un petit calendrier à droite qui devrait permettre le choix d’une date ; • le champ Représentant est une zone de liste déroulante qui affiche tous les représentants présents dans la base ; • le champ Client est une autre zone de liste déroulante. Là encore, toutes ces commodités de saisie sont des artifices créés par le programmeur pour simplifier ou guider la tâche de l’utilisateur. Nous apprendrons à les créer dans les prochains chapitres. En haut de chaque colonne, chaque nom de champ s’accompagne d’un petit triangle à sa droite, dont l’ouverture donne la possibilité de trier et filtrer la liste suivant de nombreux critères (voir figure 1.5). Figure 1.5 Tris et filtres sur une liste de formulaire.

• Les deux premières lignes proposent de trier par ordre alphabétique : Access sait que la colonne concernée est alphabétique et suggère d’emblée un critère de tri logique. • La ligne Filtres de texte propose de nombreux critères de filtres comme Est égal à, Commence ou Ne commence pas par, etc.

Note On rappelle ici la distinction fondamentale entre tri et filtre : un tri réordonne une liste en conservant tous les arguments, un filtre ne fait plus apparaître dans une liste que les enregistrements correspondant aux critères préétablis.

Les objets d’Access 15

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

• Le dernier encart, plus bas, énumère des cases à cocher correspondant aux occurrences trouvées dans la colonne. Le fait de décocher l’une de ces cases provoque la disparition de la liste des items cités. Cette présentation des tris et filtres est exactement similaire à celle des autres produits de la gamme Office 2007. Elle s’adapte à la nature de chaque colonne visée : un clic sur le triangle voisin du champ Date d’expédition propose des critères de filtre très raffinés sur la base de dates, alors que celui portant sur les colonnes de chiffres de droite ne sélectionne que des filtres numériques. Enfin, nous pouvons remarquer que le bouton « Afficher la facture » est un bouton contextuel qui affiche la facture correspondant exactement à la ligne de commande active au moment du clic. Là encore, il s’agit d’un mécanisme créé de toutes pièces par le programmeur.

Manipulation d’une requête de visualisation Après avoir fermé le formulaire « Liste des commandes », faites un double-clic dans le volet de navigation sur la première option « Les dix premières commandes » pour ouvrir la requête correspondante. Comme dans le premier cas de figure, la requête est paramétrée pour ne permettre que la visualisation et non pas la modification. L’effet graphique obtenu est moins raffiné que dans un formulaire : il ne s’agit que d’un affichage en mode Feuille de Données, en tous points comparable à un tableau Excel. Le raccourci clavier Ctrl + A, ou un clic droit dans le coin supérieur gauche du tableau, puis un « Coller » permettent de placer l’ensemble des données dans le presse-papiers. Un simple « Coller » dans une feuille Excel nouvelle (ou Word, ou toute autre application graphique) reportera les données copiées dans le nouveau document. Toutes les commandes de tris et de filtres s’emploient de la même manière qu’avec un formulaire. Dans le cas précis du formulaire « Les dix premières commandes », le programmeur a créé une requête spécifique qui n’affiche que les dix plus importantes commandes enregistrées dans la base. Il n’est pas possible d’afficher toutes les commandes par cette option. Si ce besoin est impératif, l’utilisateur peut ouvrir une autre requête, plus bas, nommée « Commande de produits », qui montre toutes les commandes. À ceci près que, dans ce dernier tableau, les commandes se décomposent en lignes éparses (une commande, numérotée comme telle, comporte plusieurs lignes de commandes) ; de plus, pour chacune des lignes éditées, il n’est indiqué que le prix unitaire et la quantité de produits commandés, non le montant de la ligne (sa multiplication d’une quantité par un prix). Cette décomposition provient du caractère relationnel de la base de données sur lequel nous reviendrons longuement.

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

16

Access® 2007 et VBA

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

1

Chapitre

2. Cliquez sur « Imprimer ». 3. Choisissez « Aperçu avant impression 1 ». Le rendu visuel de l’état permet une impression soignée.

Manipulation directe d’une table L’ouverture des objets cités plus haut, requêtes, formulaires et états, a été prévue et paramétrée par le programmeur ; elle ne risque donc en aucune manière d’endommager la base de données. De la même manière, il existe des options écrites par le développeur, que nous verrons plus loin, permettant de créer 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 données déjà entrées. Si le programme Northwind était parfaitement « bouclé », il serait impossible à l’utilisateur de faire les manipulations que nous allons maintenant mettre en œuvre pour découvrir l’univers des bases de données. 1. Dans le volet de navigation, ouvrez les « Catégories » et choisissez « Types d’objet » : la liste fait apparaître les classes d’objets. 2. Développez, le cas échéant, la classe « Tables » (doubles chevrons vers le bas). 3. Double-cliquez sur « Clients ». La table des clients apparaît telle qu’à la figure 1.6 ; on peut l’élargir en masquant le volet de navigation (doubles chevrons vers la gauche). Figure 1.6 Table des clients.

La table des clients s’affiche comme une feuille de données, identique à celle d’Excel. • Les noms de champ se présentent en en-têtes. • Les clients apparaissent en liste ; il existe apparemment un ordre par numéro d’ID, mais il ne s’agit que d’un artifice dû au fait que les clients ont été entrés dans la base dans l’ordre présenté ici : l’ordre de saisie des clients n’influe pas sur la présentation à l’écran. Il est possible que les numéros se retrouvent ultérieurement en désordre et il reviendra à l’utilisateur de présenter ses éditions avec des critères de tri.

1. Le même résultat peut être obtenu par un clic droit sur l’état et en sélectionnant « Aperçu avant impression ».

Les objets d’Access 17

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

• À l’ouverture, le curseur se positionne sur la cellule la plus en haut à droite : les flèches directionnelles ou le taquet de tabulation du clavier permettent de naviguer dans les champs ou les enregistrements, à l’horizontale ou à la verticale. • Un carré contenant le signe + débute chaque ligne ; cette présentation dépend des relations établies entre les tables. Dans le cas présent, il existe un lien permanent entre la table des clients et celles des commandes : à un client donné correspond 0 ou plusieurs commandes. Si l’on clique sur le signe plus, en décalé et en dessous de la ligne du client, les lignes de commandes que celui-ci a déjà émises apparaissent. Un clic sur le signe moins rétablit l’affichage d’origine. Presque toutes les zones de cette table sont modifiables directement, avec tous les dangers que de telles manipulations entraînent. Seule la première colonne de la table, contenant le numéro identifiant de chaque client, n’est pas modifiable. Le nom de la première société, par exemple, se modifie sans difficulté ; pire, on peut le remplacer par le nom d’une autre société existant déjà dans le fichier. Il est donc possible de créer des doublons apparents, mais l’on ne peut pas en faire reproche au programmeur : il est tout à fait envisageable que deux clients portent le même nom (DUPONT par exemple) tout en étant domiciliés à deux adresses différentes ! En modifiant une quelconque donnée dans cette source d’informations qu’est la table, l’impact du changement se répercutera sur tous les objets de la base en aval : les requêtes, les formulaires et les états. La saisie des données prend donc une importance toute particulière : • Toutes les modifications opérées sur une ligne d’enregistrement ne sont définitivement prises en compte que lorsque l’utilisateur passe sur un autre enregistrement ou ferme la table ; la touche « Echap » rétablit toutes les données (même sur plusieurs champs) dans l’état où elles se trouvaient initialement tant qu’un autre enregistrement n’est pas atteint. Inversement, il n’existe aucun bouton de validation : dès qu’un nouvel enregistrement est atteint les changements deviennent définitifs dans le précédent. • Il n’existe pas nécessairement de masque de saisie dans la table : par exemple, tous les numéros de téléphone affichés ont le format international standard, mais il est possible de saisir un numéro non conforme (1234 par exemple). Le masque de saisie existe probablement dans le formulaire de saisie ou de modification d’un client, non dans la table source. • Contrairement à Excel, ou d’autres programmes bureautiques, les modifications apportées dans les données sont définitivement enregistrées sur le disque dur : il n’est pas nécessaire de manipuler le bouton « Office » et l’option « Enregistrer ». En faisant défiler la fenêtre de la table vers la droite, on notera une colonne particulière dotée de « trombones » et d’un type tout nouveau dans Access 2007. Un double clic sur l’un de ces trombones permet de joindre une pièce externe à un enregistrement précis. Dans le cas présent, on pourrait joindre à l’enregistrement du client n˚ 1 des pièces comme sa photo ou le document Word contenant le contrat signé.

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

18

Access® 2007 et VBA

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

1

Chapitre

1. Dans le volet de navigation, développez la classe « Requêtes ». 2. Double-cliquez sur la première requête nommée « Achats de produits ». La liste des données qui s’affiche reprend, de manière non exhaustive, des informations issues de trois tables (que l’on pourra consulter si nécessaire) : • une table des fournisseurs ; • une table des bons de commande ; • une table de détail des bons de commande. Parmi les champs affichés, la date de création du bon de commande, par exemple, est tout à fait modifiable : tout changement affectera l’affichage en cours, mais aussi, et surtout, la donnée de base contenue dans la table des bons de commande. Dans ce cas de figure, la requête sert de masque de saisie pour intervenir sur la table d’origine. Il est clair que le programmeur doit interdire aux utilisateurs de telles interventions en mettant en place des méthodes contrôlées d’accès aux données.

Manipulation directe d’un formulaire Dans la base Northwind et dans le cadre de son exploitation par des utilisateurs, les formulaires s’ouvrent normalement à l’occasion d’un clic sur un bouton créé par le programmeur. Souvent, cette ouverture correspond à une démarche bien précise : l’utilisateur, par exemple, consulte d’abord la liste générale des clients puis clique sur un bouton pour consulter le détail des commandes en cours émises par celui-ci. On peut également ouvrir un formulaire en dehors de ce contexte, pour sa mise au point par le développeur, par exemple. 1. Dans le volet de navigation, développez la classe « Formulaires ». 2. Faites un double-clic sur le deuxième formulaire nommé « Boîte de dialogue États ventes ». Comme son nom l’indique, ce formulaire n’est pas destiné à afficher des données stockées dans la base, mais à servir de boîte de dialogue pour que l’utilisateur choisisse des options d’édition (voir figure 1.7). Figure 1.7 Formulaire de dialogue.

Les objets d’Access 19

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

Un clic sur le bouton « Imprimer » ou « Aperçu » permet le lancement de procédures d’impression commandées via une macro ou du code Visual Basic. L’utilisateur doit préalablement choisir un type d’état et sa périodicité, qui deviendront autant de paramètres à l’édition. Il est également possible d’ouvrir directement des formulaires qui ciblent des tables ou des requêtes de la base. Dans le cas présent, nous ouvrons le formulaire destiné à modifier les clients ou à en créer de nouveaux. 1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ». 2. Double-cliquez sur le formulaire « Détail du client ». La fenêtre qui apparaît affiche les coordonnées du premier client de la base (voir figure 1.8). Figure 1.8 Formulaire d’accès aux données.

Ici, Access ne liste pas l’ensemble des clients (formulaire dit continu), mais présente les clients les uns après les autres (formulaire dit unique). Les boutons de déplacement, en bas, permettent non seulement de faire défiler les clients, mais aussi, à droite, d’accéder directement à la création d’un nouveau client. Le programmeur a également prévu des boutons « Enregistrer » et « Nouveau », en haut, pour faire la même opération ; on verra, en effet, qu’il existe souvent de nombreuses manières de faire la même opération dans la même grille-écran. La saisie des données est régie par des règles identiques à celles qui sont applicables dans les tables : appuyer sur la touche « Echap » annule toute l’opération. En revanche, le formulaire peut être assorti de masques de saisie ou de conditions de validation qui auront été posées par le programmeur. On peut, par exemple, imaginer qu’un contrôle de validation prohibe une adresse e-mail si la chaîne de caractères entrée ne comporte pas de signe arobase (@).

20

Access® 2007 et VBA

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

1

Chapitre

1.4 LA

BARRE DE MENUS ET LES RUBANS Dans la base Northwind, le programmeur a laissé à l’utilisateur le loisir d’accéder à la barre de menu, laquelle peut avoir été masquée par l’option de la barre d’outils d’accès rapide « Réduire le ruban ». Le cas échéant donc, rétablissez-la en cliquant sur le petit triangle à droite des raccourcis de la barre supérieure et en décochant « Réduire le ruban ». La barre de menu d’Access 2007 ne comporte qu’un petit nombre d’options (quatre en standard) qui font apparaître chacune un ruban différent, particulièrement riche en icônes. • Le menu « Accueil » regroupe les fonctions principales d’édition (polices de caractères par exemple), de traitement des listes (tris et filtres) et de recherche. On notera, à gauche, un bouton destiné au mode d’affichage qui sera traité dans le paragraphe suivant. • Le menu « Créer » comprend les icônes de création de tous les objets de la base. • Le menu « Données externes » inclut la mise en place de toutes les formes de liaisons avec toutes les sources de données qu’Access peut établir. • Le menu « Outils de base de données », enfin, permet l’ouverture de Visual Basic et gère les « utilitaires » comme la documentation de la base ou l’établissement des relations entre les tables, par exemple. D’une manière générale, la manipulation du clic droit sur les objets ou éléments à modifier permet, tout comme les icônes, d’accéder à la majeure partie des actions possibles. On choisira donc très souvent le clic droit au détriment des options du menu.

1.5 LES

MODES D’AFFICHAGE DES OBJETS D’ACCESS Jusqu’à présent, nous avons ouvert les objets contenus dans la base et créés par le programmeur en mode formulaire. Ce mode, le plus naturel, est celui de l’utilisateur. En double-cliquant sur un objet, quel qu’il soit, on accède aux objets dans ce mode. Pour le programmeur qui dessine les objets (tables, requêtes et autres formulaires), l’affichage propre à la mise en œuvre doit se faire en mode création. Au cours des manipulations qui suivent, nous passerons alternativement du mode formulaire au mode création, pour en découvrir les différences fondamentales : 1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ». 2. Cliquez du bouton droit sur le formulaire « Boîte de dialogue États ventes » (notez que dans le ruban du menu « Accueil », l’icône Affichage de droite est grisée et ne peut pas être sélectionnée). 3. Dans la fenêtre contextuelle qui s’ouvre, cliquez sur « Mode création ».

Les objets d’Access 21

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

Le formulaire, que nous avions précédemment ouvert en mode normal par un doubleclic, s’affiche maintenant sous une tout autre présentation, propre au concepteur du formulaire (voir figure 1.9). Figure 1.9 Exemple de formulaire ouvert en mode création.

Chaque carré, chaque bouton présent dans l’objet formule se nomme contrôle. Ils sont modifiables en toute liberté, ce qu’on se gardera bien de faire pour le moment ! Vous aurez peut-être remarqué que l’icône du ruban d’Accueil est devenue active lors de l’ouverture en mode création : 1. Cliquez sur le bouton « Affichage » du menu « Accueil ». 2. Repositionnez l’affichage en mode formulaire : vous constatez que la « Boîte de dialogue États des ventes » a repris l’apparence que nous lui connaissions auparavant. 3. Fermez la fenêtre avec la croix du coin supérieur droit. 4. Si Access demande l’accord pour enregistrer les modifications dans la structure du formulaire, répondez bien évidemment : « Non » ; le formulaire conçu par le programmeur ne doit pas être modifié. 5. Fermez toutes les fenêtres de la partie droite de l’écran. De la même manière, vous pouvez ouvrir tous les autres objets de la base : • soit en mode création pour le concepteur de la base ; • soit en mode utilisateur, celui-ci étant variable suivant la nature de l’objet ; il existe différents modes que nous étudierons plus tard : le mode feuille de données, le mode formulaire, le mode tableau croisé dynamique, et d’autres encore. Vous pouvez constater encore cette distinction fondamentale entre les deux modes d’ouverture avec une table : 1. Dans le volet de navigation, si nécessaire, développez la classe « Tables ». 2. Cliquez du bouton droit sur la table « Clients ». 3. Ouvrez cette table en mode création.

22

Access® 2007 et VBA

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

1

Chapitre

La table « Clients » s’ouvre avec l’apparence de la figure 1.10. Figure 1.10 Exemple de table ouverte en mode création.

1.6 CONVERSION

DES FICHIERS

ACCESS

DES VERSIONS ANTÉRIEURES

Comme on l’a vu, la base Northwind est tout entière contenue dans le seul fichier « Northwind.accdb ». L’extension de ce fichier correspond au nouveau format des bases de données Access 2007. Les anciens fichiers des versions antérieures étaient, eux, suffixés « .mdb ». Une base de données sous l’ancien format peut s’ouvrir avec Access 2007 en mode compatibilité ; en revanche, une base de données accdb ne peut pas s’ouvrir avec Access 2003. Il sera préférable, dès que possible, de transformer les anciennes bases au nouveau format ; la procédure en est un peu spécifique : 1. Créez une nouvelle base de données vide. 2. Cliquez dans le menu « Données Externes » sur le bouton « Access ». 3. À l’aide du bouton « Parcourir », pointez la base de données au format mdb. 4. Dans la fenêtre « Importer », cliquez sur le bouton « Sélectionner tout » (si vous souhaitez récupérer la totalité des objets de l’ancienne base). 5. Cliquez sur « OK » 1. Lorsqu’une base de données « .accdb » est ouverte, le système d’exploitation Windows crée provisoirement un autre fichier, suffixé « .laccdb », destiné à contrôler le partage de la base. Au moment où tous les utilisateurs simultanés d’une base ferment l’application, le système supprime automatiquement ce fichier « laccdb ».

1. Si des barres de menus avaient été programmées dans l’ancienne base, elles seront déplacées dans une nouvelle option du menu général « Compléments ».

Les objets d’Access 23

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

Résumé Le programme Access génère une base de données, mais aussi un ensemble d’outils permettant de créer des applications entières. Ces éléments sont : • des tables, contenant les données ; • des requêtes, permettant d’interroger les structures de tables mises en place ; • des formulaires présentant les données dans une interface homme/machine adaptée ; • des états destinés à imprimer des résultats ; • un langage de programmation, VBA. Le volet de navigation peut servir de générateur de menus afin d’aider l’utilisateur à atteindre les objets de la base en mode formulaire ou feuille de données, c’est-à-dire en tant que gestionnaire quotidien de la base et non pas de concepteur. À tout moment, et pourvu que le concepteur n’ait pas fermé l’accès au mode création, tous les objets s’affichent soit en mode création pour le concepteur, soit en mode normal pour les utilisateurs.

24

Access® 2007 et VBA

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

1

Chapitre

Problèmes et exercices Ces premiers exercices ont pour objectif de familiariser le lecteur avec l’environnement d’Access en mode utilisateur final. On insistera sur l’effet des choix du programmeur sur le déroulement des actes de l’utilisateur : cette démarche ouvrira la voie aux développements des chapitres suivants. Les exercices choisis permettront de montrer que la maîtrise d’Access ne passe pas seulement par une bonne connaissance des options du logiciel et de ses fonctionnalités. Il est nécessaire aussi (voire d’abord) de dominer le sujet par une vue d’ensemble de l’application qui sera conçue. Pour plus de clarté, on dissociera toujours les données stables de l’application (tables), d’une part, et les processus modifiant ou augmentant les données stockées, d’autre part. Cette division, toute théorique, est à la base d’une analyse solide de l’objet global à concevoir et à mettre en œuvre.

EXERCICE 1

CRÉER

• Énoncé

Dans cet exercice, vous devez vous placer en tant qu’utilisateur de la base Northwind, c’est-à-dire un professionnel de la vente.

UN CLIENT ET UNE COMMANDE

1. À l’aide des outils déjà existants dans cette base, créez un nouveau client (libellé au choix). 2. Puis, créez une commande sur la base de produits déjà existants et en stock. Vérifiez votre travail et allez jusqu’à la facturation des produits commandés.

• * Solution

1. Création d’un nouveau client 1. Fermez la base Northwind et ouvrez-la à nouveau pour vous assurer de votre qualité d’utilisateur (et non de concepteur). Dans le volet de navigation, retournez à la catégorie « Les Comptoirs » afin de visionner les formulaires et états créés par le concepteur. Logiquement, la création d’un nouveau client passe par l’option « Liste des clients » du volet de navigation : l’utilisateur doit d’abord consulter cette liste afin de vérifier que le client n’existe pas.

1. Il n’existe pas, d’emblée, de formulaire de création d’un nouveau client : c’est un choix délibéré du concepteur qui, d’une certaine manière, se justifie.

Exercices

2. Double cliquez sur « Liste des clients » dans le volet de navigation et déroulez la liste des clients déjà existants. Au besoin, vous pourrez cliquer en bas d’écran sur la zone « Rechercher » pour retrouver toute occurrence similaire 1. 3. Dans la barre grise supérieure du formulaire, cliquez sur le bouton « Nouveau client ».

Les objets d’Access 25

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

4. Remplissez correctement les zones (ou contrôles) du formulaire pour obtenir un résultat satisfaisant, à l’image de la figure 1.11. Figure 1.11 Remplissage du formulaire de création d’un nouveau client.

Le bouton « Enregistrer et nouveau », en haut à droite, permet d’enchaîner la création de nouveaux clients. Le bouton « Fermer », tout à fait à droite, suffit pour : • valider la saisie (donc valider le nouvel enregistrement dans la table « Clients ») ; • fermer le formulaire. Immédiatement, le nouveau client apparaît dans la liste des clients. On remarquera que les numéros de téléphone saisis à l’image de ceux de la figure 1.11 ne sont pas listés comme les autres, dotés des préfixes internationaux. On peut en conclure que le concepteur n’a pas mis en place de masque de saisie en vue de formater correctement ces numéros : ici commence l’audit de la conception du programme. Un clic sur le numéro identificateur du client, en bleu à gauche, permet de réviser la fiche du client et, le cas échéant, de la mettre à jour. 2. Création d’une commande et facturation De la même manière que l’insertion d’un nouveau client passait par la liste des clients, 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 supérieure grise sur « Ajouter une nouvelle commande » : l’encart supérieur affiche le libellé « Commande n˚ (Nouveau) », sans indiquer encore de numéro précis. L’incrémentation du nouveau numéro se réalisera lorsque ladite commande sera validée et seulement à ce moment.

26

Access® 2007 et VBA

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

1

Chapitre

3. Ouvrez la liste déroulante des clients en haut à gauche et choisissez le nouveau client créé. Les onglets qui apparaissent à ce moment permettent de commencer la saisie de la commande. 4. Dans l’onglet « Détail commande » et la zone de liste déroulante « Produit », choisissez le produit « Olive Oil » ; l’huile d’olive a été choisie dans ce premier exemple car il en existe en stock. Le prix unitaire, enregistré dans la base, s’affiche automatiquement ; saisissez la quantité 2. 5. Cliquez sur le bouton « Ordre d’expédition ». Il semble naturel, puisque le produit est en stock, d’expédier maintenant la marchandise. Or, une boîte de message apparaît, qui prévient l’utilisateur que le produit ne peut pas être envoyé sans avoir été facturé au préalable. On voit, par cet exemple, que le programmeur a conçu le logiciel dans le respect des choix de procédures jugés indispensables par les commanditaires. 6. Cliquez sur le bouton « Créer une facture » : une deuxième boîte de message refuse de valider la facture sans avoir saisi tous les renseignements nécessaires. 7. En parcourant les trois onglets du bon de commande, saisissez un transporteur, une date de livraison, un type et une date de paiement. Vérifiez que tous les champs sont remplis (l’adresse de livraison en particulier) pour ne plus générer de message d’erreur. Dans le cas présent, on peut estimer que les contrôles de saisie sont un peu excessifs (la zone du département, par exemple, est obligatoire alors qu’il en existe une autre pour le code postal). 8. Lorsque la saisie est valide, le programme affiche la facture sous forme d’aperçu avant impression. Un clic droit dans la fenêtre permet d’accéder à une option d’impression. Ce clic permet également de passer en mode création : il s’agit là d’une faiblesse du programme dans son état actuel. Fermez la fenêtre. 9. Cliquez de nouveau sur le bouton « Créer une facture » : bien évidemment, cette opération n’est pas autorisée car la facture a déjà été générée. Une boîte de dialogue propose de l’imprimer et renvoie à l’étape précédente. 10. Cliquez sur « Ordre d’expédition » ; si nécessaire, remplissez les zones obligatoires jusqu’à ce que l’opération soit valide. Enfin, cliquez sur le bouton « Terminer la commande » pour générer le message « La commande est désormais marquée comme fermée ». 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 qu’il n’y paraît. • un client ; • un fournisseur ; • un produit ; • un représentant ; • un transporteur. En second lieu, l’événement de la commande (imaginons par exemple l’appel téléphonique du client) déclenche une cascade d’actions obligatoirement successives. La commande, prise dans le sens d’un document, va passer par des états successifs, et dans le cas présent, par les états : • nouveau ;

Exercices

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

Les objets d’Access 27

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

• facturé ; • expédié ; • fermé. Au plan de la base de données Access, tous ses objets vont être mis à contribution : • Les données relatives aux clients, fournisseurs, produits, représentants et transporteurs sont stockés dans des tables différentes. • Les commandes sont stockées dans d’autres tables qui, nécessairement, seront en relation avec les tables précédentes. On y adjoindra des notions d’état. • Des requêtes permettent d’afficher, au moment voulu, les données nécessaires, reconstituées en croisant les informations des deux types de tables évoqués précédemment. • Des formulaires présentent, de manière cohérente et compréhensible, des données issues des requêtes. • Des états, éventuellement à caractère légal comme la facture, matérialisent l’acte commercial en utilisant d’autres requêtes. • Un programme présente, logiquement et au moment voulu, les formulaires, et contrôle en permanence le respect des procédures.

EXERCICE 2 • Énoncé

* Solution

28

PRATIQUER

UN RÉASSORT

1. En utilisant la base Northwind, effectuez une commande client en choisissant un article dont le stock est épuisé (prenez l’article Beer). Observez l’effet 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 réception.

1. 1. 2. 3. 4.

Réalisation d’une 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 l’exercice 1. Parmi les produits de la zone de liste déroulante, sélectionnez l’article Beer dont la quantité disponible est égale à 0. 5. La saisie d’une quantité commandée de 20 articles provoque l’ouverture d’une fenêtre de message particulière. Le programme a consulté l’inventaire du stock et constaté qu’il était insuffisant pour satisfaire la commande. Malgré tout, il est possible de valider la commande en l’état (quitte, plus tard à pratiquer un réassort de ce produit). 6. Justement, le logiciel gère ce qu’on appelle le système de contremarque : une commande client, quand elle ne peut être satisfaite, génère automatiquement une commande fournisseur à hauteur des mêmes quantités. C’est la raison pour laquelle le logiciel ouvre automatiquement une fenêtre « Inventaire insuffisant. Voulez-vous créer un bon de commande ? ». Il s’agit là d’un bon de commande fournisseur ; les

Access® 2007 et VBA

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

1

Chapitre

puristes pourront reprocher au concepteur de n’avoir pas précisé cela dans la fenêtre en question ni dans les encarts supérieurs de chacun des formulaires. 7. Le bon de commande fournisseur qui s’ouvre est déjà numéroté (à la différence du précédent). Son état initial est « soumise » (en haut à gauche). Le fournisseur est déjà renseigné. La quantité commandée est identique à celle de la commande client. L’approbation de cette commande n’est ni signée ni datée. Il n’y a pas de date prévue de livraison. Vous pouvez fermer les deux fenêtres des bons de commande Client et Fournisseur. 8. Dans le volet de navigation, cliquez sur « Liste bon de commande » dans la catégorie « Inventaire et achats » pour obtenir la liste des commandes fournisseur telle qu’à la figure 1.12. Figure 1.12 Liste des commandes fournisseur en cours.

1. Double-cliquez sur la commande la plus récente, en haut, celle que vous venez de générer. 2. Cliquez sur le bouton « Approuver l’achat » : automatiquement, Access appose la date du jour dans la zone de date d’approbation et « colle » le nom de l’utilisateur en cours dans la zone « Approuvé par ». 3. Fermez la fenêtre et constatez que la liste n’est pas mise à jour immédiatement : il faut appuyer sur la touche F5 (ou fermer et rouvrir le formulaire) pour rafraîchir la liste.

1. Il n’existe pas de commande fournisseur déclarée « fermée ». En fait, le programme est inachevé et il n’existe pas de moyen de fermer une commande fournisseur, même lorsque tous les champs sont correctement remplis.

Exercices

Dans cette liste, les commandes fournisseurs ont, suivant les cas, deux états possibles : Soumise ou Approuvé. Celles qui ne sont pas approuvées ne comportent ni nom d’approbateur, ni date (ni, a fortiori, de date de paiement) 1.

Les objets d’Access 29

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

Note Ces dernières manipulations nous conduisent à déceler trois imperfections dans le programme : Imperfection sur le fond, tout d’abord : il n’est pas logique que la même personne ait à la fois le droit de soumettre une commande fournisseur et simultanément le droit de l’approuver. La séparation des fonctions, liée au contrôle interne dans l’entreprise, n’est pas opérationnelle. Au pire, et en admettant qu’il ne soit pas utile d’approuver une commande, le passage par une étape d’approbation ne sert dès lors informatiquement à rien*. Dans la mesure où le bouton « Approuver l’achat » vient coller automatiquement le nom de l’utilisateur dans la zone, il n’y a nul besoin de créer à cet endroit une zone de liste déroulante qui affiche tous les utilisateurs ; une simple zone de texte eût suffi. Il manque une ligne de programme pour provoquer un rafraîchissement de la liste au moment de la fermeture du bon de commande.

* En fait, le programmeur a bien prévu une notion de privilège d’approbateur dans la base mais ne l’a pas mise en œuvre. Le représentant Cencini, premier de la liste, et sous le nom duquel on se connecte par commodité a tous les droits.

2. Réception d’une commande fournisseur Lorsque la commande de 20 bouteilles de bière parvient à l’entreprise, le réceptionniste doit procéder de la manière suivante : 1. Double-cliquez sur la ligne de commande fournisseur correspondante. 2. Cliquez dans l’onglet « Réception » dans l’inventaire. 3. Cochez la case « Ajouter à l’inventaire » : une fenêtre vous informe que « Le produit a été correctement entré dans l’inventaire » 1. 4. Immédiatement après, une deuxième fenêtre s’ouvre : « Voici les commandes contenant ce produit en livraison différée. Voulez-vous les remplir maintenant ? » En d’autres termes, voulez-vous traiter les commandes clients en attente ? Répondez « Non ». Dans le cas contraire, vous accéderiez à la saisie des livraisons telle que nous l’avons pratiquée à l’exercice précédent. Le fait qu’il n’existe pas d’état Réceptionné à un bon de commande fournisseur n’est pas choquant : un bon de commande peut comprendre plusieurs articles dont certains ont été réceptionnés et d’autres non. À la rigueur on pourrait imaginer un état Réceptionné lorsque tous les articles d’un bon sont reçus. La synthèse des opérations réalisées peut se lire dans l’inventaire, lequel nous conduit aux produits. 1. Dans le volet de navigation, cliquez sur « Inventaire » dans la catégorie « Inventaire et achats ». 2. La liste de tous les produits et différentes quantités d’inventaire apparaît : il ne s’agit que d’une synthèse, et il n’est pas possible, à ce niveau, de vérifier les mouvements de stock.

1. La case à cocher a ici une double vocation un peu particulière : d’une part, elle est une case à cocher simple qui indique un état (on constatera à tout moment que le produit est entré en inventaire), d’autre part, le simple fait de cocher lance une action précise, celle d’ajouter l’article à l’inventaire. Cette double utilisation simultanée du même objet est relativement peu orthodoxe.

30

Access® 2007 et VBA

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

1

Chapitre

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

Comme on l’a vu plus haut, l’affichage en mode formulaire unique des articles de la table s’adjoint, en bas d’écran, de boutons de déplacement, d’un filtre et d’un mode Recherche. En haut, le formulaire comprend deux onglets « Détail du produit » et « Historique des achats/commandes ». En cliquant sur ce deuxième onglet, on lit tous les mouvements du produit en entrée et en sortie. On comprend donc que le même formulaire, au travers de deux onglets, vise deux domaines bien distincts pour nous maintenant : d’une part, le produit lui-même, d’autre part, la synthèse des commandes clients/fournisseurs du même produit.

EXERCICE 3

ANALYSER

• Énoncé

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

* Solution

Il existe de nombreuses manières de représenter graphiquement des processus et des états. Dans la mesure où le lecteur n’est pas spécialiste de ce type de représentation, on prendra des schémas de type UML (Unified Modeling Language), tout en gardant une certaine liberté dans le formalisme.

Exercices

LES PROCESSUS ET LES ÉTATS

Les objets d’Access 31

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

Un diagramme d’activité représente les actions successives, de haut en bas, de gestion des bons de commande fournisseur et client (voir figure 1.14). L’important, ici, consiste à montrer l’ordonnancement des actions et les deux cas de figure, si l’article commandé par le client est disponible ou non. Figure 1.14 Représentation de la gestion des commandes sous forme de diagramme d’activité.

Dans la figure 1.14, la possibilité de passer du circuit client au circuit fournisseur a bien été représentée, bien qu’un peu abusivement : l’utilisateur a le droit d’arrêter la commande au moment où il est informé qu’un article est non disponible et n’est pas obligé de passer aux actions de la partie gauche du schéma. Au contraire, la possibilité de passer au traitement des commandes clients, lorsqu’un article est réceptionné, n’est pas dessinée. Le trait noir épais de la partie gauche, appelé barre de synchronisation par les professionnels, exprime la nécessité de présence des deux actions, commande fournisseur et approbation, pour pouvoir continuer le fil des actions. Les cercles noirs, en haut de figure, représentent le point d’entrée dans le processus, les doubles cercles, en bas, les points finaux. Un autre type de représentation appelé « diagramme d’état », plus statique, synthétise les différents états par lesquels passe le bon de commande client. Il n’est pas indispensable de procéder à des représentations graphiques très poussées lorsque l’application à développer avec Access conserve des objectifs modestes et une portée limitée. Toutefois, ces illustrations permettent de faciliter le débat nécessaire entre le(s) développeur(s) et les utilisateurs, qui doit avoir lieu lors de la conception du produit logiciel. Elles peuvent servir de base, en partie, à l’amorce d’un cahier des charges et permettent au développeur, surtout, d’avoir une idée bien claire de la problématique et des objectifs à poursuivre.

32

Access® 2007 et VBA

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

1

Chapitre

Figure 1.15 Représentation de la gestion des commandes client sous forme de diagramme d’état.

EXERCICE 4

ANALYSER

• Énoncé

En reprenant les deux premiers exercices, énumérez graphiquement les données, regroupées par grands ensembles, entrant dans le cadre de l’application.

* Solution

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

LES DONNÉES

Figure 1.16 CLIENT N° de client Raison sociale Adresse

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

FOURNISSEUR N° de fournisseur Raison sociale Adresse

PRODUIT N° de produit Désignation Prix unitaire

TRANSPORTEUR N° de transporteur Raison sociale Adresse

EMPLOYE N° d’employé Nom Prénom Fonction Rôle

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

Quantité Etat C.Fournisseur

Dans la réalité, la base de données est plus complexe : ne sont représentées ici que les données essentielles qui seront décomposées par la suite. En revanche, le dessin général est incontournable. • Clients, fournisseurs, transporteurs et employés regroupent des entités bien distinctes qui ne peuvent en aucun cas constituer un seul fichier des « partenaires » de l’entreprise. • Chacun des ensembles mis en place dispose d’une numérotation qui lui est propre : à l’intérieur d’un même ensemble, chaque client, par exemple, a un numéro propre qui lui sert d’identifiant. Par commodité, on parlera d’ID (pour l’IDentity américain).

Exercices

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

Les objets d’Access 33

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

• Certains libellés, et en particulier les identifiants, se retrouvent dans d’autres tables que dans leur propre univers : le numéro de client dans la commande client, le numéro de fournisseur dans la table des commandes fournisseur. • Il n’existe qu’une seule table « Produit » dont les numéros se retrouvent dans les tables des commandes, aux fournisseurs comme aux clients : s’agissant de négoce, les produits à l’achat sont bien les mêmes que ceux qui seront revendus (sans transformation). • Les deux tables des commandes fournisseurs et clients ont chacune une notion d’état (soumis, fermé, facturé, expédié) qui reprend les aspects abordés lors de l’analyse des processus. • Les deux tables des commandes ne comportent pas le prix de la commande ou tout autre information inutile : la quantité commandée suffit puisque l’information du prix unitaire est stockée dans la table des produits. On notera que le pluriel n’est jamais utilisé dans la figure 1.16 : on parle de la notion de client et non pas du fichier des clients (au pluriel). Une démarche correcte consiste à manipuler le concept et non la réalité finale : il est évident qu’il existera des centaines de clients, fournisseurs et autres éléments dans la base. Une propriété affirmée pour vraie concernant un élément doit nécessairement rester vraie pour tous les éléments de la même classe ; voilà pourquoi le concept n’a pas à s’appliquer au pluriel. Le concepteur de la base Northwind, en fait, a démultiplié certains ensembles, qui ont été synthétisés ci-dessus, pour en arriver au modèle de la figure 1.17. Pour visualiser ce modèle 1 : 1. Cliquez dans la barre de menu sur « Outils de base de données ». 2. Cliquez sur l’icône Relations. Figure 1.17 Modèle relationnel de la base Northwind.

1. Pour notre part, nous n’approuvons pas, dans la conception de la base, de nombreux points visibles sur ce modèle. Les tables sont notées au pluriel, ce qui est contraire aux standards en la matière. Les identifiants sont notés par le seul libellé « ID » sans préciser de quel ID il s’agit. De nombreux champs sont notés avec des espaces, ce qui complique passablement le travail des programmeurs dans les requêtes SQL. Le mot « Commandes » de la table du même nom sous-entend « Commande_Client » alors que le mot « Bons de commandes » sous-entend « Commande_Fournisseur », d’où des confusions syntaxiques très risquées. Et il ne s’agit là que des éléments les plus frappants !

34

Access® 2007 et VBA

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

1

Chapitre

EXERCICE 5

RETOUCHER

• Énoncé

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

* Solution

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

UN FORMULAIRE EN MODE CRÉATION

1. Dans le volet de navigation, cliquez du bouton droit sur le formulaire « Détails du client ». 2. Dans la fenêtre contextuelle, cliquez sur « Mode création » ; vous visualisez le formulaire tel qu’il apparaît à la figure 1.18. Figure 1.18

3. Cliquez au-dessus de la zone blanche « Téléphone professionnel » : le contrôle est mis en surbrillance. 4. Cliquez du bouton droit au même endroit, puis cliquez sur « Propriétés » (on peut également cliquer sur « Feuille des propriétés » dans le ruban du menu Création qui est apparu lors du passage en mode création) : la feuille des propriétés apparaît. 5. Seul l’onglet « Données » est accessible, mais il est préférable d’afficher toutes les propriétés en utilisant l’onglet « Toutes ». 6. Descendez jusqu’à l’item « Masque de saisie ». 7. Sur la même ligne, à droite, cliquer sur le carré muni de trois points.

Exercices

Formulaire de saisie des clients en mode création.

Les objets d’Access 35

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

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

9. Choisissez dans la liste le format « Numéro de téléphone », ou bien « Numéro de téléphone international » si la base commerciale est destinée à l’international. 10. Passez à l’étape suivante, qui permet de modifier partiellement ou totalement le masque choisi. 11. Passez à l’étape suivante, qui conditionne le stockage de la donnée entrée avec ou sans son masque. 12. Terminez l’assistant. 13. Testez la modification en repassant en mode formulaire (dans le ruban du menu Création, cliquez sur l’icône Affichage à gauche). 14. Quand les tests sont positifs, appliquez les mêmes modifications aux contrôles « Téléphone mobile » et « N˚ de télécopie ». 15. Passez alternativement du mode utilisateur au mode création jusqu’à ce que tous les contrôles soient opérationnels. Cette modification de la base Northwind n’a pas d’incidence sur les fonctionnalités du logiciel.

36

Access® 2007 et VBA

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

2

Chapitre

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

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

Problèmes et exercices 1. Créer la base de données d’une bibliothèque de prêt ....... 53 2. Gérer un organisme de formation ........................... 57 3. Créer la base de données du système télépéage............... 60

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

37

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

(1)

Merise, un outil méthodologique Merise (Méthode d’Étude et de Réalisation Informatique pour les Systèmes d’Entreprise), est une méthode, à présent ancienne, qui donne un cadre formel au développeur pour mettre en œuvre sa base de données. Merise, au départ, distingue plusieurs niveaux d’abstraction des modèles et plusieurs types de base de données. Pour l’exposé qui suit, nous ne retiendrons que les deux aspects suivants : • le modèle physique des données et plus précisément l’organisation des données dans des tables ; • la base de données relationnelle. Dans la mesure où nous n’aborderons pas la plus grande partie de la méthode Merise, très théorique, nous simplifierons l’approche en conservant les grands principes de base.

1.1 PRINCIPE D’UNICITÉ

DE L’INFORMATION

Le premier enseignement fondamental de la méthode touche l’unicité de l’information : toute information ne doit être stockée qu’une et une seule fois dans une base 1. Un exemple illustrera ce premier point, en réutilisant la base de données Northwind. Celle-ci comprend : • une table « Client » contenant toutes les coordonnées propres au client (nom, adresse, etc.) ; • une table « Commande client » comportant tous les bons de commande. La table « Commande » ne contient ni le nom, ni l’adresse du client, contrairement à toute attente. Pour imprimer le bon de commande, par exemple, il sera nécessaire de chercher les informations nécessaires dans la table « Client » par un lien à définir. La table commande client contient le numéro du client, qui, donc, servira de lien. On dit qu’il existe une relation entre la table client et la table commande ; le numéro de client, présent dans les deux tables, matérialise cette relation. Une telle organisation est d’abord économe en termes d’espace disque, mais, surtout, le système de gestion de base de données la gère complètement en interne. Nul besoin de contrôler le rapprochement des occurrences de part et d’autre des deux tables à l’aide de programmes lourds et complexes, le système contrôle en permanence l’intégrité de la base. Un second exemple, plus matériel encore, illustrera l’utilité d’une organisation en tables. Imaginons que vous ayez à créer un fichier complet de vos relations personnelles. Pour chaque enregistrement, c’est-à-dire chaque parent ou ami, vous voudrez évidemment commencer la saisie par la civilité Monsieur, Madame ou Mademoiselle. Si vous vous contraignez à opérer cette saisie, vous penserez probablement, après une dizaine de lignes, que cette frappe est fastidieuse et répétitive. Dans un premier temps, vous utiliserez un raccourci du type M., Mme, Mlle et plus loin encore vous finirez par écrire 1 (qui signifiera Monsieur), 2 (Madame) ou 3 (Mademoiselle), la forme la plus rapide de raccourci. C’est très exactement ce que fait une base de données, au travers de ce qu’un utilisateur 1. Ce principe peut être outrepassé si des obligations d’ordre légal, par exemple, contraignent au stockage de données validées et archivées (paie, facturation, etc.). Ceci ne remet pas en cause la théorie.

38

Access® 2007 et VBA

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

2

Chapitre

verra comme une zone de liste déroulante. Le dessin des deux tables mises en œuvre sera celui de la figure 2.1. Figure 2.1 Modèle relationnel simplifié CivilitéContact.

La notation utilisée dans la figure 2.1 est particulière, nous y reviendrons plus loin. Attachons-nous d’abord à comprendre le schéma général. Les deux carrés représentent des « containers » des données qui y seront stockées, non les données elles-mêmes. La table « CIVILITE » de gauche ne contiendra, en définitive, que trois enregistrements que l’on pourra décrire très exactement comme à la figure 2.2. Figure 2.2 Contenu de la table CIVILITE.

Dans la table « CIVILITE », il n’existe aucune allusion aux contacts du carnet d’adresses. En revanche, la table « CONTACT » comporte un champ nommé « ID_CIVILITE » ; ce dernier ne contiendra pas de données telles que M. ou Madame, mais uniquement les chiffres correspondants de la table « CIVILITE », et dans la pratique les chiffres 1 ou 2 ou 3. Le même champ « ID_CIVILITE » se retrouve dans les deux tables « CIVILITE » et « CONTACT ». On notera tout de suite qu’il n’existe pas dans la figure 2.1, pour le moment, de trait (de lien) entre les deux « ID_CIVILITE », celui de la table « CIVILITE » et celui de la table « CONTACT » ; cette présentation est volontaire. Il peut exister un lien réel, entré dans la base de données et que l’on traitera plus loin ; mais il peut aussi ne pas en exister. L’important, fondamentalement, réside dans la présence effective d’un champ ID dans la table « CONTACT » qui corresponde à une valeur contenue dans la table « CIVILITE ». Enfin, la figure 2.1 montre un libellé parfaitement identique du terme « ID_CIVILITE » dans les deux containers de droite et de gauche. Cette volonté sémantique n’est pas obligatoire, mais optionnelle : Access saurait rapprocher deux colonnes ne portant pas le même nom. En revanche, et pour des raisons évidentes de clarté dans la démarche, nous déconseillons fortement de nommer différemment les deux colonnes dans chacune des tables.

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

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

1.2 PRINCIPE D’IDENTIFIANT À l’intérieur d’une même table, chaque item de l’ensemble (en d’autres termes chaque enregistrement), doit pouvoir être identifié de manière unique et obligatoire. La réunion de ces deux conditions permet de considérer l’information d’identification comme une clé primaire de la table. En reprenant l’exemple de la table « CIVILITE », la colonne « ID_civilite » doit : • être obligatoire, le champ ne peut pas être vide (null) ; • contenir des valeurs parmi lesquelles ne se trouve aucun doublon. Dès lors que ces deux conditions sont respectées, on peut considérer que la colonne « ID_civilite » est l’identifiant des enregistrements qu’on ajoutera à la table. Un bon principe de base consiste à créer systématiquement un champ de clé primaire dans toutes les nouvelles tables, même lorsque le besoin immédiat n’en est pas évident. Inversement, il est possible qu’une table contienne une clé primaire constituée de plusieurs champs ; nous étudierons ce cas plus loin. La nature de cette clé primaire peut être variée et il n’existe pas d’obligation particulière sur ce point. La plupart du temps, on utilisera un code numérique, le plus simple, et pour lequel Access propose une solution d’incrémentation automatique. Mais une clé primaire peut aussi être constituée de lettres (pensons à la codification à trois lettres de tous les aéroports du monde : JFK pour l’un des aéroports de New York et CDG pour celui de Roissy) ou bien toute autre organisation. On évitera des clés primaires trop compliquées ou générant des problèmes légaux (le numéro de Sécurité sociale par exemple). Le choix d’une clé primaire étant primordial, on portera une attention particulière à sa validité dans tous les cas de figure à traiter ultérieurement. Par exemple, il est maladroit d’identifier les villes de France au moyen de leur code postal : un bureau de Poste peut couvrir plusieurs communes. S’il n’existe pas de besoin particulier d’identifier toutes les communes de France, ce choix portera la table à environ 8 000 enregistrements ; dans le cas contraire (et le plus général), il sera plus judicieux d’utiliser les codes Insee des communes (environ 36 000). On réfléchira également à l’étendue de la codification : pour reprendre l’exemple des aéroports, la codification choisie à trois lettres permet d’enregistrer 263 aéroports soit 19 604 au maximum.

1.3 ASPECT

DE LA PRÉSENTATION UNIFORME DES DONNÉES. Dès qu’une donnée peut se répéter plusieurs fois sous diverses formes, il devient nécessaire de mettre en place un système permettant d’adopter un référentiel. Imaginons une table « ETUDIANT » contenant les coordonnées de ceux-ci. Si un champ de cette table doit contenir le dernier diplôme obtenu par les étudiants, il est maladroit de créer une simple zone de texte dans laquelle l’utilisateur aura toute liberté de saisir les valeurs qui lui semblent les plus adéquates. Dans ce cas précis, il y a fort à craindre qu’une personne saisira « Baccalauréat scientifique mention Bien », pendant qu’une deuxième mettra « Bac S Mention B », et une dernière « Bac S ». Nul doute qu’il ne sera pas possible de faire des

40

Access® 2007 et VBA

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

2

Chapitre

requêtes structurées sur de pareils libellés. Il devient donc indispensable d’établir un système relationnel entre les étudiants et leurs diplômes, à l’image de la figure 2.3. Figure 2.3 Modèle relationnel simplifié EtudiantDiplôme.

1.4 PRINCIPE

DE LA RÉDUCTION ÉLÉMENTAIRE Imaginons maintenant que la volonté du développeur consiste à enregistrer tous les diplômes obtenus par les étudiants. Il ne peut pas exister, parmi les champs de la table, un champ DIPLOMES au pluriel, destiné à recevoir la liste des diplômes déjà obtenus par l’étudiant. En admettant que le programmeur ait prévu 255 caractères de long pour remplir le champ de données, la saisie « au kilomètre » de diplômes variés ne constituera qu’un ensemble totalement inexploitable par la suite. Chaque champ ne doit donc comporter qu’une et une seule information : cette information doit être réduite à son expression élémentaire. Certes, une solution bâtarde consisterait à multiplier les champs DIPLOME1, DIPLOME2, etc., mais on imagine aisément que le procédé est excessivement limité : un étudiant brillant dépassera nécessairement, tôt ou tard, le nombre de diplômes prévus. De plus, les requêtes qui seront faites pour compter les diplômes par étudiant, par exemple, s’avéreront très compliquées à mettre en place. Le système relationnel de la figure 2.3 ne suffit dès lors plus et il est nécessaire de passer à une forme plus élaborée telle que celle de la figure 2.4.

Figure 2.4 Modèle relationnel Etudiant_Diplôme.

Dans le modèle détaillé de la figure 2.4, il est possible d’insérer un infinité de diplômes à une infinité d’étudiants, grâce à l’insertion d’une table intermédiaire dont nous verrons le fonctionnement dans le point suivant. Notons tout de suite que cette présentation permet aussi d’insérer des informations nouvelles telles que la mention au diplôme ou la date d’obtention.

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

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

1.5 PRINCIPES

RELATIONNELS

Les relations entre les tables doivent être conjuguées logiquement avant d’être mises en place. On focalisera l’attention sur le rapport quantifiable entre les deux tables à relier. La conjugaison s’exprime, pour reprendre les exemples précédents, de la manière suivante : Un contact porte une et une seule civilité (on ne peut être simultanément Monsieur et Madame) ; une civilité s’applique à plusieurs contacts (le carnet d’adresses peut comporter plusieurs Monsieur et plusieurs Madame). Un bon de commande client correspond à la commande d’un et un seul client (si un autre client fait une autre commande, y compris portant sur les mêmes articles, un autre bon de commande sera rédigé) ; un client peut faire zéro, une, ou une infinité de commandes. Un bon de commande fournisseur est soumis par un et un seul représentant (celui qui s’est connecté initialement à la base) ; un représentant peut rédiger zéro, un ou plusieurs bons de commande fournisseur. Dans ces trois énoncés, la conjugaison semble naturelle et logique ; elle intègre d’emblée une relation de un à plusieurs. En revanche, il arrivera fréquemment que la mise face-àface de deux tables induise des conjugaisons diverses. Étudions donc les cas de figure possibles, qui se limitent logiquement à trois : les relations de 1 à plusieurs, déjà vues ; les relations de 1 à 1 ; les relations de plusieurs à plusieurs.

Les relations de 1 à 1 Nous supposons la présence de deux tables contenant des données relatives, par exemple, à vos contacts professionnels, d’une part, et à vos contacts personnels, d’autre part. La conjugaison de ces deux tables peut se décliner ainsi : • un contact professionnel correspond soit à zéro, soit à un et au plus un contact personnel (un partenaire commercial peut aussi être un ami !) ; • un contact personnel correspond soit à zéro, soit à un et au plus un contact personnel (même raison). Nous sommes ici devant une relation de un à un. A priori, et pourvu que les uns et les autres n’aient pas de rôle particulier à jouer dans le système d’information à mettre en place, il n’y a aucune raison pour ne pas fusionner purement et simplement les deux fichiers. La seule opération à mettre en place avant ladite fusion consiste à créer une propriété particulière à la table qui fusionne les deux fichiers pour distinguer les « commerciaux » des « amis personnels ». Cet exemple peut être généralisé : les relations de un à un dans une base bien conçue n’existent pas 1.

1. Seul cas de figure possible : si la table doit compter plus de 255 colonnes, il sera nécessaire de créer une table « fille ».

42

Access® 2007 et VBA

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

2

Chapitre

Les relations de plusieurs à plusieurs Le cas inverse est beaucoup plus fréquent. Imaginons que la base de données à créer concerne des élèves qui apprennent des langues vivantes au lycée. La conjugaison des relations serait, en première analyse, la suivante : • un lycéen apprend plusieurs langues ; • une langue est apprise par plusieurs lycéens. La relation semble plurielle dans les deux sens. En l’état, elle ne sera pas gérable par une base de données, et il s’avère obligatoire de développer cette relation plurielle dans les deux sens en deux relations de un à plusieurs. Dans le cas des lycéens, cela nous conduira à la proposition suivante : • un lycéen fait un choix pour une langue ; • un choix de langue s’applique à plusieurs lycéens ; et • un choix de lycéen porte sur une langue ; • une langue donne lieu à plusieurs choix. En d’autres termes, on intercale une table intermédiaire entre les deux tables des lycéens et des langues (voir figure 2.5). Figure 2.5 Modèle relationnel Lycéen-Langue.

Ici, la table « OPTION_LINGUISTIQUE » comporte non seulement sa propre clé primaire mais les identifiants des deux tables « LYCEEN » et « LANGUE » : on parle de clés étrangères. Le contenu effectif des tables sera semblable à celui de la figure 2.6. Figure 2.6 Contenu des tables du modèle relationnel LycéenLangue.

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

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

On lit dans la table « OPTION_LINGUISTIQUE » les inscriptions suivantes aux langues : • Bertrand DUPOND, lycéen n˚ 2 est inscrit en Anglais, langue n˚ 1 ; • Claude MARTIN, lycéen n˚ 3 est inscrit en Anglais, langue n˚ 1 ; • Bertrand DUPOND, lycéen n˚ 2 est inscrit en Allemand, langue n˚ 2. En résumé, toute relation de plusieurs à plusieurs doit être décomposée pour ne gérer avec Access que des relations de un à plusieurs. C’est d’ailleurs exactement la reprise du cas de figure des clients et des produits. Au départ, il peut être affirmé : • un client commande un ou plusieurs produits ; • un produit est commandé par un ou plusieurs clients. Présentée ainsi, cette relation apparaît comme une relation de plusieurs à plusieurs. En fait, et dans le modèle Northwind, elle a été décomposée ainsi : • un client fait une ou plusieurs commandes ; • une commande relève d’un et un seul client ; et • un produit rentre dans une ou plusieurs commandes ; • une commande (pris dans le sens d’une ligne de commande) concerne un et un seul produit.

La problématique du temps Il est toujours nécessaire de réfléchir sur la notion de temps. La conjugaison de la relation doit être vraie à un instant t et à tous les instants t’, t’’, etc. Si l’évolution dans le temps doit changer la nature de la relation, alors le modèle relationnel doit en tenir compte. Imaginons un salarié nouvellement embauché ; aux premiers jours de son emploi, il sera placé à un certain niveau de la Convention Collective Nationale (CCN) de laquelle il relève. Or, il est probable que le même salarié, avec l’ancienneté et de nouvelles qualifications, progressera dans l’échelle de la Convention collective. Si l’échelon est simplement porté comme un champ parmi d’autres dans la table « SALARIE », la valeur contenue dans ce champ devra être modifiée dans la table « SALARIE » au moment de sa promotion. Malheureusement, la valeur précédente disparaîtra définitivement et il ne sera plus possible de faire une reconstitution de carrière et connaître la vitesse de promotion du salarié dans l’entreprise. Aussi, la panoplie complète des outils relationnels doit être mise en œuvre pour arriver au modèle présenté à la figure 2.7. Figure 2.7 Modèle relationnel Salarié-Convention Collective Nationale.

44

Access® 2007 et VBA

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

2

Chapitre

Dans ce modèle, la notion de date d’affectation à un niveau de Convention collective s’insère dans la table intermédiaire « AFFECTATION_CCN ». C’est précisément cette table qui permettra de faire l’historique de carrière du salarié. La proposition littérale de relation est la suivante : • un salarié a une ou plusieurs affectations dans sa carrière ; • une affectation correspond à un et un seul salarié ; et • une affectation vise un et un seul niveau de CCN ; • les échelons de la CCN peuvent porter sur zéro, une ou plusieurs affectations.

Le cas particulier des relations réflexives Une table peut comporter des relations avec elle-même. C’est le cas, par exemple, d’une table des salariés dans laquelle on veut faire intervenir une notion de parenté. Initialement, la proposition de relation peut s’exprimer ainsi : • un salarié est le parent (frère ou sœur ou autre) de plusieurs salariés ; • un salarié a pour parents plusieurs salariés ; Le modèle à générer sera celui de la figure 2.8. Figure 2.8 Modèle relationnel Salarié-Lien de parenté.

Ici, Access créé fictivement une table « SALARIE_1 », qui représente la même table que « SALARIE » et permet de représenter la relation d’un salarié à un autre. Dans la table « PARENTE », on mettra le libellé des parentés possibles (frère, sœur, cousin, père, etc.). Dans la table « LIEN_DE_PARENTE », on insérera le lien entre un salarié et un autre. Pour parfaitement exprimer le lien de parenté frère/sœur entre Anatole et Zoé, deux enregistrements seront nécessaires dans la table « LIEN_DE_PARENTE » : • le premier avec un « ID_SALARIE1 » sur Anatole et un « ID_SALARIE2 » sur Zoé (l’« ID_PARENTE » étant positionné à Frère) ; • le second avec un « ID_SALARIE1 » sur Zoé et un « ID_SALARIE2 » sur Anatole (l’« ID_PARENTE » étant positionné à Sœur) 1.

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

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

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

1.6 LA

CRÉATION DES TABLES Cette première approche théorique étant bien assimilée, des cas pratiques peuvent être abordés. Nous allons créer une base « de travail » et y créer des tables et autres objets Access. Vous aurez donc à conserver en permanence ce fichier. 1. 2. 3. 4.

Fermez toutes les applications éventuellement ouvertes. Démarrez Access. Cliquez sur l’icône Base de données vide. En bas à droite, indiquez le nom de base « BASE_DE_TRAVAIL.ACCDB » en lieu et place du libellé « Base de Données1.accdb » donné par défaut. 5. Le répertoire de classement est par défaut le répertoire « Mes Documents » ; changezle si nécessaire (retenez alors le nouveau chemin !). 6. Cliquez sur le bouton « Créer ». 7. Immédiatement, la table « Table1 » de la nouvelle base est créée, qui contient déjà une nouvelle table, nommée Table1, laquelle est déjà ouverte en mode saisie. 8. Cliquez sur la croix en haut à droite pour fermer ce premier objet (et apprendre ainsi, dès le démarrage, à créer une table). 9. Dans la barre de menus, cliquez sur « Créer », puis sur l’icône Table. Immédiatement une nouvelle table est créée, ouverte en mode saisie. Il est déconseillé d’utiliser ce mode pour créer la nouvelle table (ses propriétés ne seront pas accessibles et les champs seront nommés Champ1, Champ2, etc.). 10. Cliquez sur l’icône Affichage en haut à gauche. 11. Access propose d’enregistrer la table sous un nouveau nom : saisissez « SALARIE » 1. La fenêtre de création de table apparaît sous l’apparence de la figure 2.9. Figure 2.9 Fenêtre de création de table.

1. Dans la totalité de l’ouvrage, nous utilisons des conventions de noms que nous recommandons : les noms de tables et noms de champs sont entrés en majuscules (non accentués), sans aucun espace. L’absence d’accentuation limite les possibilités d’erreurs, l’absence d’espace évite au programmeur de cerner les noms de champ par des crochets ([ ]) dans la saisie des requêtes SQL. On verra plus loin que l’aspect « esthétique » de la présentation des tables peut être retrouvé grâce à la notion de « Légende ».

46

Access® 2007 et VBA

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

2

Chapitre

La partie supérieure comporte tous les champs de la table pendant que la partie inférieure affiche les propriétés de chacune des lignes, ligne par ligne, au fur et à mesure et suivant le positionnement du pointeur du pavé supérieur. Access propose d’emblée de commencer la table par un champ de clé primaire symbolisé dans la colonne de gauche par une petite clé jaune. Ce premier point étant conforme aux recommandations énoncées dans la partie théorique, nous le maintiendrons. Le premier champ s’appelle par défaut « N˚ » : ce début de libellé peut être conservé et continué par une précision sur le type de numéro ; le champ pourra être nommé « N˚SALARIE », par exemple. Malheureusement, le signe « ˚ » du « N˚ » peut poser des problèmes par la suite : c’est la raison pour laquelle de nombreux programmeurs utilisent plutôt « ID_SALARIE » (sans espace), mais avec un soulignement (underscore) entre « ID » et « SALARIE ». La faute à ne pas commettre, à l’inverse, consiste à nommer le champ « ID » ou « N˚ » sans autre précision. Access accepte ce type de confusion alors que d’autres bases ne l’acceptent pas ; dans tous les cas de figure, cette démarche maladroite exposera ultérieurement à de forts risques de confusion entre les tables. Le type de données de la future colonne de la table, indiqué à droite, est « NuméroAuto » : en clair, cela signifie qu’Access incrémentera d’une unité chaque nouvel enregistrement. Cette présentation, bien que peu pratique dans certains cas, est conservée ici. Dans le pavé inférieur, les zones à vérifier sont les suivantes : • Le type de données « NuméroAuto » est de la forme d’un entier long (à retenir pour la création des clés étrangères ultérieurement). • Les nouvelles valeurs seront sous la forme d’incrément et non pas des valeurs aléatoires (sans doublon). • Le format, ici, n’a pas à être précisé. • La légende peut être renseignée en respectant parfaitement l’orthographe ; nous suggérons donc par exemple « Numéro de salarié » (avec les espaces et l’accentuation). La légende apparaîtra automatiquement en lieu et place du code « ID_SALARIE » dans tous les formulaires et états. • L’index est positionné à « Oui Sans doublon » : cette disposition est obligatoire pour un champ de clé primaire. • Balises actives et Aligner le texte seront abordés plus loin. Sur la deuxième ligne de la colonne Nom de champ, saisissez le libellé « NOM_SALARIE » : encore une fois, cette convention de nom peut paraître lourde, mais elle entre dans une démarche logique. Il peut exister un grand nombre de tables dans lesquelles le vocable NOM sera employé ; dans une petite base, on peut déjà imaginer NOM_CLIENT, NOM_ FOURNISSEUR, NOM_SALARIE, par exemple. C’est la raison pour laquelle il est utile de préciser de quel nom il s’agit afin que le Dictionnaire des données, c’est-à-dire l’ensemble des noms de champs, ne comporte pas de doublons. Access propose par défaut (à droite du nom de champ) que le format des données soit de type Texte, ce qui, pour le cas présent, est valide. La longueur par défaut, indiquée en bas, est de 255 caractères, mais peut être réduite (un nom de salarié excédera rarement

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

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

50 caractères). Nous préciserons, à ce stade, quelques autres propriétés du champ NOM_SALARIE : • La légende sera « Nom du salarié », correctement orthographié pour une bonne lisibilité ultérieure dans les formulaires. • La zone Null interdit sera positionnée à « Oui » (quand l’utilisateur crée un nouveau salarié, la zone du nom doit être impérativement remplie, sinon l’enregistrement ne sera pas validé). • La Chaîne vide autorisée sera positionnée à « Non » (l’utilisateur ne peut pas tricher en remplaçant l’absence de nom par une simple chaîne vide). • La zone Indexé peut éventuellement être positionnée à « Oui avec doublon » (il peut y avoir plusieurs Dupont ou plusieurs Martin, donc les doublons doivent être autorisés). La mise en place d’un index accélérera les recherches sur le nom, si elles sont fréquentes ; en revanche, la création d’un index multipliera par deux l’espace disque nécessaire pour stocker les données et la saisie de nouveaux enregistrements sera ralentie. En conséquence, les index ne doivent être mis en place que sur les colonnes sur lesquelles sont effectuées de nombreuses recherches et uniquement pour les tables dont le nombre de créations ou mises à jour est faible. Le troisième champ, nommé PRENOM_SALARIE sera traité de la même manière que le précédent, de même que le quatrième champ ADRESSE1_SALARIE (longueur de texte poussée à 100 toutefois). Le cinquième champ ADRESSE2_SALARIE, destiné à indiquer un nom de bâtiment ou une précision sur un lieudit ne sera pas obligatoire (zone Null interdit positionnée à « Non »). Le sixième champ, indiquant le code postal et nommé CP_SALARIE, mérite quelques développements : • Contrairement aux apparences, il ne s’agit pas d’une zone numérique : le code postal de Bourg-en-Bresse est le 01000, avec un zéro en première position, et non pas 1000. Si le champ de code postal est formaté en numérique, tous les zéros à gauche ne seront pas pris en compte. Il s’agit donc bien d’une zone Texte, qu’on positionnera à 5 caractères de long (si la base de données n’a pas pour vocation de gérer des codes postaux internationaux). • Le masque de saisie peut être précisé : cliquez sur les trois petits points à droite de la zone Masque de saisie ; le cas échéant, enregistrez provisoirement la table, et visualisez l’assistant à la création de masque de saisie. Parmi les différentes présentations proposées, celle des codes postaux français est énumérée : validez-la. • Le champ Null interdit peut être positionné à « Non ». Terminez la saisie des champs de la table de la manière suivante : • Le champ VILLE_SALARIE est une zone de texte (50 caractères), obligatoire. • Le champ SALAIRE_BRUT_SALARIE est une zone numérique (réel double), non obligatoire.

48

Access® 2007 et VBA

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

2

Chapitre

La description des champs, à droite, peut être remplie, aux seules fins de documenter l’application ; la table doit avoir les caractéristiques précisées à la figure 2.10 Figure 2.10 Table SALARIE en fin de création.

Dans la mesure où la table a déjà été nommée « SALARIE » antérieurement, il n’est plus utile de repréciser ce paramètre. Il suffit de fermer l’onglet en cours et d’accepter l’enregistrement des modifications. En procédant de la même manière, créez une nouvelle table nommée « CCN » (pour Convention Collective Nationale) et dotée des champs suivants : • « ID_CCN », clé primaire, à incrémentation automatique ; • « LIBELLE_CCN », zone de texte de 100 caractères, obligatoire. Toujours de la même manière, créez une troisième et dernière table nommée « AFFECTATION_CCN » et dotée des champs suivants : • « ID_AFFECTATION_CCN », clé primaire, à incrémentation automatique ; • « ID_SALARIE », zone numérique au format nombre entier, obligatoire ; • « ID_CCN », zone numérique au format nombre entier, obligatoire ; • « DATE_AFFECTATION_CCN », zone au format date obligatoire à laquelle on ajoutera la valeur par défaut Date() (qui mettra automatiquement la date du jour à chaque nouvel enregistrement).

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

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

Les deux nouvelles tables auront les caractéristiques de la figure 2.11. Figure 2.11 Tables CCN et AFFECTATION_CCN en fin de création.

Il est souhaitable d’effectuer la saisie de ces renseignements avec un soin extrême pour épargner au développeur de fastidieux retours en arrière. Il faut prévoir tous les cas de figure avant d’avancer dans les opérations ; il est toujours possible d’ajouter des champs, d’en supprimer ou de les renommer, mais ces démarches sont hasardeuses.

1.7 L’INTÉGRITÉ

RÉFÉRENTIELLE

Jusqu’à maintenant, toutes les relations explicitées entre des tables n’ont eu qu’un fondement sémantique. C’est parce que nous avons utilisé le vocable « ID_SALARIE », par exemple, à la fois dans la table « SALARIE » et dans la table « AFFECTATION_CCN » que le lecteur a fait le rapprochement, se doutant que les valeurs contenues dans ces champs de la table devaient pouvoir être appariées. Au-delà de cette démarche intellectuelle, il n’y a rien dans la base de données, à ce stade, pour contrôler si les appariements des valeurs vont effectivement se réaliser. En d’autres termes, et au stade où se trouve la création de la base, il est possible d’attribuer le coefficient 250 de la Convention Collective au premier salarié venu alors même que ce coefficient n’existe pas dans la table « CCN » ; de la même manière, il est possible de créer une ligne d’affectation dans la table « AFFECTATION_CCN » alors que le salarié n’existe pas ! Une base de données peut très bien fonctionner ainsi 1 : le contrôle de la saisie des valeurs est alors reporté sur le programme informatique d’interface homme/machine qui, en conséquence, s’alourdit considérablement. Il est infiniment plus efficace d’utiliser les contraintes d’intégrité référentielle que comporte toute base de données relationnelle afin de garantir la cohérence des valeurs contenues dans chacune des tables. En reprenant le premier exemple des deux tables « CONTACT » et « CIVILITE », il est possible de poser une contrainte d’intégrité référentielle via le champ « ID_CIVILITE » qui se trouve simultanément dans les deux tables : 1. C’est malheureusement trop souvent le cas, même sur des bases de données plus puissantes qu’Access. Seules des problématiques de répartition des tables dans les environnements client/serveur, ou bien des impératifs de migrations de données peuvent légitimer l’absence d’intégrité référentielle dans la base.

50

Access® 2007 et VBA

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

2

Chapitre

• En qualité de clé primaire pour la table « CIVILITE » ; • En qualité de clé étrangère dans la table « CONTACT ». Dès lors, il sera impossible d’insérer une valeur différente de 1, ou 2, ou 3 (équivalentes 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 référentielles s’opère avec une option des outils de base de données : • Dans le menu « Outils de base de données », cliquez sur « Relations ». • Dans le ruban, cliquez sur le bouton « Relations ». • Double-cliquez sur les tables « SALARIE », « CCN » et « AFFECTATION_CCN » (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 affiche un signe +) et relâchez. La fenêtre de la figure 2.12 apparaît, permettant de créer les paramètres de la relation. Figure 2.12 Paramétrage d’une relation.

La contrainte entre les deux tables peut comporter plusieurs niveaux : • Le seul fait de cliquer immédiatement sur « Créer » (sans avoir coché la case « Appliquer l’intégrité référentielle ») crée un simple lien entre les deux tables : lorsqu’une requête appelant ces deux tables sera faite, Access proposera ce lien qui aura été mémorisé. Mais il n’existe pas d’intégrité référentielle. • À l’inverse, en cochant l’option « Appliquer l’intégrité référentielle », on établit une relation forte entre les deux tables : il sera impossible d’ajouter une affectation dans la table « AFFECTATION_CCN » si l’« ID_SALARIE » invoqué n’existe pas dans la table « SALARIE ». Ce contrôle sera permanent. Une intégrité référentielle étant posée, les deux options en dessous deviennent manipulables. La première permet de « Mettre à jour en cascade les champs correspondants ». Dans la pratique cela signifie que si la valeur 1 dans le champ ID_SALARIE de la table « SALARIE » est changée par la valeur 10, par exemple, toutes les anciennes valeurs 1 de la table des affectations seront changées en 10 1. 1. Dans le cas présent, cette modification est impossible dans la mesure où le champ « ID_SALARIE » de la table « SALARIE » est un « NuméroAuto ». La validation de l’option de mise à jour en cascade n’a donc aucun intérêt dans cette configuration.

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

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

La dernière option ouvre la voie à la « Suppression en cascade ». Dans la pratique, cela signifie que si un salarié est supprimé de la table « SALARIE », tous les enregistrements le concernant seront supprimés de la table « AFFECTATION_CCN ». Naturellement cette option est à utiliser avec circonspection. 1. Cochez la case « Appliquer l’intégrité référentielle » et cliquez sur « Créer ». La fenêtre des relations contient désormais un « fil de liaison » entre les deux « ID_SALARIE ». Le fait d’avoir coché l’intégrité référentielle montre le symbole 1 du côté Un de la relation de Un-à-plusieurs et le symbole ∞ du côté Plusieurs de la relation de Un-à-plusieurs. 2. Procédez de la même manière avec la table « CCN » pour obtenir le résultat de la figure 2.13 qui présente la contrainte d’intégrité référentielle entre « ID_CCN » de la table « CCN » (clé primaire) et « ID_CCN » de la table « AFFECTATION_CCN » (clé étrangère). 3. Fermer ensuite la fenêtre de mise en relation en appuyant sur le bouton « Fermer » et en validant les modifications. Figure 2.13 Modèle relationnel Salarié-CCN.

On ne saurait que trop recommander la mise en place des contraintes d’intégrité référentielle dès les premiers instants de la création de la base de données ; il sera toujours très ardu d’ajouter ces contraintes lorsque des données auront déjà été enregistrées. En effet, Access refusera cette mise en place si tous les enregistrements ne respectent pas la nouvelle règle.

Résumé La création des objets fondamentaux que sont les tables dans une base Access doit procéder d’une réflexion méthodique préalable sur la conception et l’organisation des informations à gérer. Cette réflexion s’appuiera sur Merise comme base méthodologique. Toutes les tables créées comporteront systématiquement un identifiant, tous les champs créés ne contiendront que des données élémentaires, non décomposables. Des relations seront impérativement mises en place entre toutes les tables, en reportant la clé primaire des tables principales sur un champ de clé étrangère dans la table à mettre en relation. Toutes les relations seront unifiées dans un rapport d’Un-à-plusieurs, sauf exceptions. Les relations ne doivent pas seulement être possibles, mais formalisées par l’établissement de contraintes d’intégrité référentielle.

52

Access® 2007 et VBA

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

2

Chapitre

Problèmes et exercices Les exercices ci-après permettent de mettre en place les fondements d’une base de données dans divers systèmes d’information. Chaque fois, les modèles demandés se limitent à l’essentiel de la base, sans entrer dans le détail qu’exigerait un véritable développement logiciel. Dans tous les cas, il s’agit : • de réfléchir sur l’architecture du système d’information ; • de créer les tables nécessaires ; • d’établir les relations.

EXERCICE 1

CRÉER

LA BASE DE DONNÉES D’UNE BIBLIOTHÈQUE DE PRÊT

• Énoncé

Vous devez concevoir le système d’information d’une petite bibliothèque municipale qui prête des livres.

* Solution

1. Conception du modèle Les premières tables qui peuvent être mises sur papier sont : • une table qu’on appellera « ADHERENT », pour désigner l’emprunteur du livre ; • une table « LIVRE ». La conjugaison de la relation, en première analyse, donnerait : • un adhérent emprunte un ou plusieurs livres (surtout dans le temps) ; • un livre est emprunté par un ou plusieurs adhérents (successivement, par nécessité). Cette première énonciation fait apparaître une relation de plusieurs-à-plusieurs qui doit être développée en plusieurs relations de un-à-plusieurs. La solution serait : • un adhérent effectue un ou plusieurs emprunts ; • un emprunt est fait par un et un seul adhérent ; et • un livre donne lieu à plusieurs emprunts ; • un emprunt concerne un et un seul livre ; L’insertion de la table intermédiaire « EMPRUNT » solutionnera donc ce premier aspect de la problématique. En première analyse, le schéma relationnel ne devrait donc comporter que les trois tables suivantes : • une table « ADHERENT » qui contient la clé primaire « ID_ADHERENT » et tous les champs nécessaires à la fiche de celui-ci (nom, prénom, adresse, etc.) ;

Exercices

1. Commencez par porter sur le papier vos premières approches. Pensez à dissocier la gestion des adhérents et celle des livres, et définissez les relations entre ces deux entités. 2. Créez les tables nécessaires. 3. Mettez en place les contraintes d’intégrité référentielle.

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

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

• une table « LIVRE » qui contient la clé primaire « ID_LIVRE » et tous les champs relatifs à la fiche du livre ; • une table « EMPRUNT » qui contient une clé primaire, la clé étrangère « ID_LIVRE » et la clé étrangère « ID_ADHERENT ». Un champ supplémentaire « DATE_ EMPRUNT » permet de connaître la date de l’emprunt. Réfléchissons à présent sur le choix des clés primaires : • Dans la table « ADHERENT », l’ID pourra être constitué d’un simple numéro incrémentiel : le premier aura le numéro 1, le suivant 2, etc. Il suffira de prévoir, dans le programme, un contrôle pour éviter qu’un adhérent déjà inscrit ne soit pas recréé une deuxième fois. • Dans la table « EMPRUNT », pour les mêmes raisons, une numérotation incrémentielle suffira. • En revanche, la clé primaire de la table « LIVRE » pose un nouveau problème ; admettons qu’une numérotation incrémentielle soit choisie, l’achat de deux exemplaires d’un même livre va aller à l’encontre du principe merisien de l’unicité de l’information : la fiche d’un livre sera remplie deux fois sous deux numéros. Or, une telle possibilité est quasi certaine : une bibliothèque de prêt, même modeste, risque fort d’acheter au moins trois ou quatre exemplaires des Quatre Mousquetaires d’Alexandre Dumas pour répondre à la demande des collégiens. Une autre idée pourrait consister à prendre pour identifiant du livre son ISBN (International Standard Book Number), mais dans ce cas, si deux livres identiques sont achetés, le deuxième ISBN sera vu comme un doublon et rejeté. Le modèle initial est donc faux et nécessite de nouveaux développements. L’insertion d’une nouvelle table « EXEMPLAIRE » s’avère indispensable, pour désigner non pas la notion de livre, mais celle du volume qui sera rangé sur une étagère. L’étude de la relation entre un livre et un exemplaire s’exprime par les postulats suivants : • Un livre est acheté en un ou plusieurs exemplaires ; • Un exemplaire correspond à un et un seul livre. Ici, la relation s’exprime immédiatement comme étant de un-à-plusieurs. La table « EXEMPLAIRE » contient une clé primaire « ID_EXEMPLAIRE » à incrémentation automatique, à laquelle on pourra ajouter une notion de date d’achat et d’état du volume (neuf, bon état, médiocre, à mettre au pilon). Il faut ajouter à ces champs la clé étrangère « ID_LIVRE » correspondant au livre concerné. La table « LIVRE » contient une clé primaire « ISBN » et tous les champs utiles à un fichier bibliographique (titre, auteur, éditeur, etc.). Naturellement, il serait possible maintenant d’étendre la base de données à un classement bibliographique plus large en créant des tables des auteurs, des éditeurs, etc. Toutefois, et s’agissant d’une petite bibliothèque, on considérera ces extensions non indispensables.

54

Access® 2007 et VBA

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

2

Chapitre

2. Création des tables La réflexion sur la structure de la base étant achevée, il est possible de passer à la création physique. Créez la base de données « Bibliothèque ». Créez ensuite la table « ADHERENT » à l’image de la table « SALARIE » du cours et avec les champs suivants : • ID_ADHERENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • NOM_ADHERENT, Texte, 50 caractères, Null interdit, Indexé avec doublons. • PRENOM_ADHERENT, Texte, 50 caractères, Null interdit, non indexé. • ADRESSE1_ADHERENT, Texte, 100 caractères, Null interdit, non indexé. • ADRESSE2_ADHERENT, Texte, 100 caractères, Null autorisé, non indexé. • CP_ADHERENT, Texte, 5 caractères, Null interdit, non indexé. • VILLE_ADHERENT, Texte, 50 caractères, Null interdit, non indexé. Pour chaque champ, n’omettez pas de compléter la zone « Légende » afin de rendre compréhensibles les intitulés techniques des noms de champ. Créez la table « LIVRE » avec les items suivants : • ISBN_LIVRE, clé primaire, Texte, 18 caractères, Indexé sans doublons. La création de la clé donnera lieu à l’insertion d’un masque de saisie déjà existant (masque ISBN). • TITRE_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon. • AUTEUR_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon. • EDITEUR_LIVRE, Texte, 50 caractères, Null autorisé, non indexé. • DATE_LIVRE, Numérique, Entier, Null autorisé, non indexé (on indiquera seulement l’année de parution). • NB_PAGES_LIVRE, Numérique, Entier, Null autorisé, non indexé. • PRIX_LIVRE, Numérique, Réel double, Null autorisé. Créez la table « EMPRUNT » avec les caractéristiques suivantes : • ID_EMPRUNT, clé primaire, NuméroAuto, Entier long, Indexé sans doublon. • ID_ADHERENT, Numérique, Entier Long, Null interdit, non indexé. • ID_EXEMPLAIRE, Numérique, Entier Long, Null interdit, non indexé. • DATE_EMPRUNT, Date, Format « Date, Général » (date et heure complets). • RETOUR_EMPRUNT, Date, Format « Date, Général ». La création de la table « EXEMPLAIRE » va nous permettre de découvrir une nouvelle fonction.

• Créez le champ « ISBN_LIVRE », texte, 18 caractères, non indexé (clé étrangère). • Créez un champ « ETAT_LIVRE », Numérique, Entier, Null interdit, non indexé. • Le champ « ETAT_LIVRE » étant actif, cliquez dans le pavé inférieur sur l’onglet Liste de choix.

Exercices

• Créez la table et son identifiant « ID_EXEMPLAIRE », clé primaire, NuméroAuto, Entier long, Indexé sans doublon.

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

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

• Dans « Afficher le contrôle », choisissez « Zone de liste déroulante ». • Dans « Origine source », choisissez « Liste Valeurs ». • Dans « Contenu », insérez les valeurs suivantes, séparées par des points-virgules 1;"Neuf ";2;"Bon état";3;"Médiocre";4;"A pilonner". • La colonne liée est la 1 (par défaut). • Le nombre de colonnes est de 2. • Dans « En-tête colonne », choisissez « Non ». • Dans « Largeurs colonnes », insérez les valeurs suivantes, séparées par des points-virgules 0;3 (présentation des largeurs en centimètres : la première colonne sera cachée). • Dans « Lignes affichées », indiquez « 4 ». • Dans « Limiter à liste », choisissez « Oui ». • Laissez les autres paramètres à leur valeur par défaut. Pour éviter de créer une table supplémentaire désignant l’état des livres, le champ « ETAT_LIVRE » a été paramétré pour montrer les quatre valeurs possibles et n’autoriser que l’une des quatre (la zone étant obligatoire). Il est important de comprendre que la table va effectivement stocker les valeurs numériques 1, 2, 3 ou 4 et non les textes « Neuf », « Médiocre » et autres. Il reviendra au développeur d’interpréter cette colonne numérique au moment de faire des requêtes pour synthétiser, par exemple, l’état général de la bibliothèque. N’hésitez pas à tester, par la suite, les effets visuels de la saisie d’une valeur dans ce champ. On pourrait, de la même manière, faire appel à des zones de liste déroulante pour afficher le contenu d’une table au moment de la saisie d’une autre. Par exemple, la zone « ID_ ADHERENT » de la table « EMPRUNT » peut comporter une zone de liste déroulante appelant la table « ADHERENT » : nous verrons plus loin dans la création des formulaires cette faculté de liaison. 3. Mise en place de l’intégrité référentielle • Ouvrez la fenêtre des relations. • Ajoutez les tables « ADHERENT », « LIVRE », « EXEMPLAIRE ». • Par un glisser-déplacer, liez les deux champs « ID_ADHERENT » présents. • De la même manière, liez les deux champs « ID_LIVRE ». • Liez enfin les deux champs « ID_EXEMPLAIRE » afin d’obtenir le modèle de la figure 2.14. Figure 2.14 Modèle relationnel d’une bibliothèque de prêt.

56

Access® 2007 et VBA

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

2

EXERCICE 2

GÉRER

• Énoncé

Vous devez concevoir le système d’information d’un organisme de formation. Les clients de cette société, spécialisée dans la formation informatique, sont tous eux-mêmes des sociétés commerciales qui envoient leurs salariés à des formations. L’organisme salarie (en CDD) des formateurs en free-lance pour assurer des sessions de formation portant sur divers sujets. Vous devez donc mettre en relation les notions de société cliente, salarié, formateur, cours, session de formation et salle de formation, puis créer les tables nécessaires. 1. Première approche conceptuelle. Pour vous aider, nous vous indiquons le processus opérationnel : • Relation client, salarié, embauche. • Relation salarié, session, inscription. • Relation session et formateur. • Relation cours et session. • Relation session et salle de formation. 2. Création des tables de la base.

* Solution

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

UN ORGANISME DE FORMATION

1. La relation établie ici recouvre une approche « puriste » du modèle relationnel. Dans bien des systèmes d’information, on considèrera que les cas de multi-employeurs ou de salariés qu’on retrouve dans plusieurs entreprises clientes est trop marginal pour mériter une table intermédiaire « EMBAUCHE ». En effet, l’introduction de cette table alourdit singulièrement les procédures d’inscription d’un nouveau salarié à une nouvelle session de formation. Dans bien des cas, les concepteurs préféreront les solutions dans lesquelles un même salarié est entré plusieurs fois dans la base de données au titre de plusieurs employeurs.

Exercices

Chapitre

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

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

La table intermédiaire « INSCRIPTION » servira, par exemple, à établir la base des listes d’émargement de la formation. La session se conjugue avec le formateur de la manière suivante : • une session est assurée par un et un seul formateur ; • un formateur assure une ou plusieurs formations. Il n’y a donc pas lieu de développer cet aspect. On notera toutefois que, dans cette organisation, la session ne peut être assurée que par un seul formateur : on exclut par là une session où plusieurs intervenants sont nécessaires. Le cours (la matière enseignée) s’associe à la session par la relation : • une session concerne un et un seul cours ; • un cours donne lieu à plusieurs sessions. La salle de formation se lie avec la session ainsi : • une session a lieu dans une et une seule salle ; • une salle reçoit plusieurs sessions (dans le temps). Ici encore, nous excluons le cas où une session de plusieurs jours pourrait avoir lieu dans plusieurs salles. Le dessin global (et réduit à ses seules clés du modèle relationnel) sera celui de la figure 2.15. Figure 2.15 Première approche du modèle relationnel d’un organisme de formation.

2. Création des tables Créez la table « CLIENT » avec les champs suivants : • • • •

58

ID_CLIENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null interdit, Indexé avec doublons. ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé. ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé.

Access® 2007 et VBA

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

2

Chapitre

• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé. • VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé. Créez la table « SALARIE » avec les champs suivants : • ID_SALARIE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • NOM_SALARIE, Texte, 50 caractères, Null interdit, Indexé avec doublons. • PRENOM_SALARIE, Texte, 50 caractères, Null interdit, Non indexé. Notez qu’il n’est pas utile, à moins d’une demande formelle du commanditaire de l’application, d’insérer les coordonnées du salarié : l’organisme de formation n’a pas à écrire, par exemple, au salarié. Tous les rapports avec les stagiaires s’effectuent via le client. Créez la table « EMBAUCHE » avec les champs suivants : • ID_EMBAUCHE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit, Non indexé. • ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit, Non indexé. • DATEDEBUT_EMBAUCHE, Date, Format Abrégé, Null interdit, Non indexé. • DATEFIN_EMBAUCHE, Date, Format Abrégé, Null autorisé, Non indexé. Créez la table « INSCRIPTION » avec les champs suivants : • ID_INSCRIPTION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • ID_SESSION, (clé étrangère de la table SESSION), Numérique, Entier long, Null interdit, Non indexé. • ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit, Non indexé. Créez la table « FORMATEUR » avec les champs suivants : • ID_FORMATEUR, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • NOM_FORMATEUR, Texte, 50 caractères, Null interdit, Indexé avec doublons. • ADRESSE1_FORMATEUR, Texte, 100 caractères, Null interdit, non indexé. • ADRESSE2_FORMATEUR, Texte, 100 caractères, Null autorisé, non indexé. • CP_FORMATEUR, Texte, 5 caractères, Null interdit, non indexé. • VILLE_FORMATEUR, Texte, 50 caractères, Null interdit, non indexé. Créez la table « SALLE » avec les champs suivants :

• ID_COURS, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • NOM_COURS, Texte, 50 caractères, Null interdit, non indexé. • DUREE_COURS, Numérique, Entier, Null interdit, non indexé. Créez la table « SESSION » avec les champs suivants : • ID_SESSION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

Exercices

• ID_SALLE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • ETAGE_SALLE, Numérique, Entier, Null interdit, non indexé. • NUMERO_SALLE, Numérique, Entier, Null interdit, non indexé. Créez la table « COURS » avec les champs suivants :

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

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

• ID_COURS, (clé étrangère de la table COURS), Numérique, Entier long, Null interdit, Non indexé. • ID_SALLE, (clé étrangère de la table SALLE), Numérique, Entier long, Null interdit, Non indexé. • ID_FORMATEUR, (clé étrangère de la table FORMATEUR), Numérique, Entier long, Null interdit, Non indexé.

EXERCICE 3

CRÉER

• Énoncé

Imaginez que vous êtes le responsable informatique du système télépéage. Les grands principes : un groupement d’intérêt économique nommé Télépéage réunit toutes les sociétés d’autoroute françaises (Sanef, APRR, Escota, etc.). Chaque société d’autoroute possède des péages. Les particuliers ou les entreprises peuvent louer un ou plusieurs badges à coller sur le pare-brise du véhicule (mais le badge n’est pas nécessairement associé à un véhicule précis). Le passage à un péage est automatiquement détecté, à l’entrée comme à la sortie, de sorte que les voyages sont facturés en fin de mois et en bloc pour tous les passages d’un badge. Vous devez concevoir le système d’information de Télépéage, en vous limitant aux tables essentielles du modèle.

LA BASE DE DONNÉES DU SYSTÈME TÉLÉPÉAGE

1. Commencez par mettre sur papier vos premières approches conceptuelles. 2. Créez les tables nécessaires et les contraintes d’intégrité référentielle.

* Solution

Bien que relativement simple, le modèle relationnel du système télépéage demande un niveau d’abstraction assez élevé et recèle quelques pièges si ses éléments fondamentaux ne sont pas bien dissociés. 1. Conception du système En premier lieu, la notion de péage doit être précise : par péage, on entend, non pas un groupement de passages, tous abrités par une grande arche, mais un couloir de péage par lequel ne peut passer qu’un seul véhicule en même temps. Cette distinction revêt la plus haute importance pour arriver à bien conjuguer les relations à mettre en place, en particulier considérant le facteur temps. La notion de péage comporte donc les caractéristiques suivantes : • un numéro d’ordre ; • un nom générique (Chartres nord, Chartres centre, Chartres sud par exemple) ; • un n˚ de couloir dans la station de péage. Cette seule énumération nous conduit à penser qu’il serait judicieux de créer deux tables, l’une pour les stations, l’autre pour les couloirs en les liant ainsi : • une station comporte un ou plusieurs couloirs ; • un couloir est situé dans une et une seule station. Il s’agit là d’une relation de un-à-plusieurs ne nécessitant pas de développements supplémentaires.

60

Access® 2007 et VBA

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

2

Chapitre

La présence de deux types de clients, les particuliers et les entreprises, pourrait induire en erreur et pousser le concepteur à créer deux tables distinctes. Cette dissociation n’est pas nécessaire et compliquerait beaucoup le modèle pour un faible avantage. La seule problématique de la fusion des deux types de clientèle concernera les zones obligatoires de la fiche client, différentes pour les uns et les autres. Dans les deux cas, particulier ou entreprise, un client peut louer un ou plusieurs badges (un particulier peut très bien louer 3 badges, pour lui-même et ses deux enfants). Le badge apparaît donc comme un élément indispensable du modèle : ce n’est pas le client qui passe le péage, mais son badge, ce qui est très différent (le locataire peut très bien prêter son badge à un ami). La relation à mettre en place pourrait donc se conjuguer ainsi : • un client possède un ou plusieurs badges ; • un badge appartient à un et un seul client. Mais cette dernière affirmation est-elle exacte à tous les instants ? Certainement non. Il est envisageable qu’un client rende son badge au système télépéage, pour beaucoup de motifs valables, et que ce dernier soit mis en location auprès d’un autre et nouveau client. En d’autres termes, si le badge est considéré comme une non-valeur et qu’il est jeté après usage, alors l’affirmation précédente est juste ; dans le cas contraire (qui est le cas actuel), la relation doit s’exprimer ainsi : • un client possède un ou plusieurs badges ; • un badge est loué par plusieurs clients (dans le temps). Étant plurielle dans les deux sens, la relation doit se développer selon le modèle suivant : • un client contracte une ou plusieurs locations ; • une location concerne un et un seul client ; et • une location concerne un et un seul badge ; • un badge peut donner lieu à plusieurs locations. La notion de passage au péage, elle, traduit la relation qui existe entre un badge et un couloir de péage ; elle donne lieu à l’affirmation suivante : • un badge passe par plusieurs couloirs de péage (évidemment pas au même moment !) ; • un couloir de péage voit passer plusieurs badges (évidemment pas ensemble, le couloir étant trop étroit !) ; Laquelle doit être développée ainsi :

• un passage correspond à un couloir et un seul ; • un couloir enregistre plusieurs passages. Le prix qui sera facturé au client doit être incorporé dans le modèle. Assurément, il ne peut pas être intégré directement dans la table des stations de péage puisqu’il est fonction non pas d’une seule station mais du degré de proximité avec une autre station. Il s’agit donc bien d’une relation réflexive de la table « STATION » avec elle-même.

Exercices

• un badge effectue plusieurs passages dans un couloir (dans le temps) ; • un passage correspond à un badge et un seul ; et

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

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

• une station de départ correspond à un prix pour joindre une autre station d’arrivée (il n’est pas possible de faire demi-tour sur une autoroute !) ; • une station d’arrivée correspond à un prix pour être jointe à une station de départ. Cette affirmation laisse entendre que le modèle permet d’intégrer des prix différents pour l’aller et le retour depuis une station vers une autre. On peut également ajouter une date de tarif qui permettra de gérer dans le temps les augmentations inéluctables. Pour terminer, les sociétés d’autoroute doivent être liées aux stations de péage : • une société d’autoroute possède une ou plusieurs stations ; • une station est possédée par un et un seul concessionnaire. Cette première étape de réflexion bénéficiera d’un premier brouillon sur le papier, où l’on se contentera de jeter les petits carrés des tables, les identifiants et les clés étrangères, et les relations. Le brouillon devrait donner un résultat voisin de la figure 2.16. Figure 2.16 Première approche du modèle relationnel du système télépéage.

C’est volontairement que ce modèle ne représente pas les tables contenant, par exemple, les éléments de la réalisation de la facturation. En revanche, toutes les informations sont en place pour réaliser ladite facturation tant au profit des sociétés d’autoroutes (qui perçoivent, au final, les droits de péage) et les clients (qui paient leurs passages). La table « PASSAGE », la plus sollicitée de toutes, sera automatiquement incrémentée par les systèmes de barrières. Sa lecture mensuelle sera à la base de la facturation.

Table « CLIENT » :

62

2. Création des tables Voici la liste des tables avec leurs différents champs. • ID_CLIENT, Clé primaire, NuméroAuto, Entier long. • TYPE_CLIENT, Numérique, Entier, Obligatoire, non indexé, pourvu d’une liste de choix en forme de zone de liste déroulante et dont la liste des valeurs est 1 pour Entreprise et 2 pour Particulier (la liste doit être limitée à ces deux seules valeurs, le format est 1;"Entreprise";2;"Particulier"). • RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null autorisé, non indexé. La zone ne peut pas être obligatoire puisque certains clients sont des particuliers. Il faudra donc prévoir des contrôles particuliers dans les formulaires de saisie pour vérifier que l’un

Access® 2007 et VBA

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

2

des deux champs « NOM_CLIENT » ou « RAISON_SOCIALE_CLIENT » est effectivement rempli. • NOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé 1. • PRENOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé. • SIRET_CLIENT (SIRET signifiant Service d’Inscription au Registre des Établissements et constituant l’identifiant de toute société commerciale). Le champ est de type « Texte » avec 15 caractères, le « Null » est autorisé, mais la colonne est « indexée sans doublon » afin de garantir l’absence de double inscription d’une entreprise. Le champ est doté d’un masque de saisie déjà existant, nommé « N˚Siret ». • NO_INTRACOM_CLIENT : il s’agit du n˚ intracommunautaire, obligatoire pour la facturation des clients européens non français. Comme le SIRET, la colonne est en « Null autorisé » mais « indexée sans doublon ». Le masque de saisie n’existant pas, il faut le créer, il est de la forme « CC 99 000 000 000 » où CC désigne le pays (FR, BE, IT, etc.), 99 est une clé et les 9 chiffres suivants les 9 premiers chiffres du numéro de Siret (il faudra prévoir dans le formulaire de saisie un contrôle pour vérifier que les deux numéros concordent, ce type de contrôle n’étant pas possible au niveau de la table elle-même). Pour créer un nouveau masque de saisie :

Table « STATION » :

1. Le curseur supérieur 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 Modifier la liste. 3. Créez un nouvel enregistrement en cliquant sur le point jaune voisinant les boutons de déplacement. 4. Dans « Description », indiquez « N˚Intracommunautaire ». 5. Dans « Masque de saisie », saisissez la chaîne de caractères > CC 00 000 000 000 (le signe supérieur > oblige à une saisie en majuscules, le CC indique qu’il s’agit de caractères, les zéros suivants obligent à la saisie de chiffres, les espaces décomposent logiquement la codification). 6. Dans l’exemple, recopiez la chaîne de caractères « CC 99 000 000 000 ». 7. Fermez la fenêtre et choisissez le nouveau masque (testez-le en saisie pour vérifier sa conformité). • ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé. • ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé. • CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé. • VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé. • ID_STATION, Clé primaire, NuméroAuto, Entier Long, Obligatoire, Indexé sans doublon. • ID_STE_AUT, (clé étrangère de la table « STE_AUT »), Numérique, Entier long, Null interdit, non indexé. • NOM_STATION, Texte, 50 caractères, Null interdit, non indexé.

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

Exercices

Chapitre

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

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

Table « PEAGE » :

Table « PASSAGE » :

Table « TARIF » :

Table « BADGE » :

Table « LOCATION » :

Table « STE_AUT » :

Il ne faut évidemment pas créer de table « STATION_1 » comme l’indique le modèle relationnel de la figure 2.15 : cette présentation est fictive et Access gérera automatiquement la relation réflexive de la table « STATION » sur elle-même. • ID_PEAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon. • ID_STATION, (clé étrangère de la table « STATION »), Numérique, Entier long, Null interdit, non indexé. • NO_PEAGE, Numérique, Entier, Null interdit, non indexé (pour indiquer le numéro du couloir dans la station de péages). • ID_PASSAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon. • ID_PEAGE, (clé étrangère de la table PEAGE), Numérique, Entier long, Null interdit, non indexé. • ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit, non indexé. • DATE_PASSAGE, Date, Null interdit, non indexé. Il est très important, ici que le format de la date soit de type Général, indiquant aussi l’heure exacte de passage. • ID_TARIF, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon. • ID_STATION1, (première clé étrangère de la table « STATION »), Numérique, Entier long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage de départ. • ID_STATION2, (deuxième clé étrangère de la table « STATION »), Numérique, Entier long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage d’arrivée. • PRIX_TARIF, Numérique, Réel Double, Null interdit, Non indexé. • DATE_TARIF, Date au format Général, Null interdit, Non indexé. • ID_BADGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons. • CODEBARRE_BADGE, Texte, 13 caractères, Null interdit, Indexé sans doublon. • ID_LOCATION, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons. • ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit, Non indexé. • ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit, Non indexé. • DATEDEBUT_LOCATION, Date au format abrégé, Null interdit, Non indexé. • DATEFIN_LOCATION, Date au format abrégé, Null autorisé, Non indexé. La table « STE_AUT » sera en tous points identique à celle des clients. Il est néanmoins dangereux de pratiquer la création de cette table en effectuant un copier/coller de la table des clients. Les noms de champs, en particulier, doivent tous être suffixés « _STE_AUT » et non plus « _CLIENT ». Vous terminerez l’exercice en mettant en place toutes les relations grâce au bouton « Relations des Outils de base de données ». N’oubliez pas de cocher l’option d’intégrité référentielle ; la mise à jour ou la suppression en cascade ne sont pas indispensables.

64

Access® 2007 et VBA

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

3

Chapitre

Les différentes formes d’acquisition de données, importer et attacher 1. Les importations de données..... 66 2. Les liaisons de données ............ 71 Problèmes et exercices 1. Importer des données au format Excel ....................... 75 2. Importer des données au format CSV ........................ 77 3. Importer des données d’une autre base Access........... 79 4. Établir les contraintes référentielles............................ 80

Il existe de multiples manières d’acquérir des données dans Access. On peut les importer complètement dans une base déjà existante, mais, au-delà de cette première approche, on peut attacher des sources de données à une base sans avoir à les manipuler dans Access. Ces données acquises, le logiciel offre un puissant assistant pour créer des requêtes propres à interroger la masse d’informations et réaliser aisément de lourds traitements. Le même outil peut servir à insérer de nouvelles données, à les modifier ou à les supprimer.

65

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

(1)

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

1.1 LE

SIMPLE COPIER-COLLER Dans la mesure où les produits Microsoft sont intégrés les uns aux autres, la manière la plus aisée de récupérer des données dans Access consiste simplement à les copier et les coller, mais avec une option spécifique. 1. Créez une nouvelle base de données nommée « MesContacts » et rangée dans vos documents favoris. 2. Créez une table nommée « CP », dotée de deux colonnes nommées « CODE » et « VILLE », toutes deux de type texte de 255 caractères de long (valeur par défaut). Supprimez toute clé primaire créée par défaut de sorte que la table ne comporte que deux colonnes. 3. Ouvrez la table « CP » en mode Feuille de données en double-cliquant sur le nom de la table. 4. Ouvrez le fichier « Codes_Postaux_France.xlsx ». 5. Mettez en surbrillance la totalité des deux colonnes A et B. 6. Appuyez sur Ctrl + C (copier). 7. Sans nécessairement fermer Excel, repassez sur la feuille Access vierge de la table « CP ». 8. Dans la barre de menu « Accueil », cliquez sur le petit triangle en bas de l’icône Coller. 9. Cliquez sur « Coller par ajout ». Access affiche un message d’insertion identique à celui de la figure 3.1. Cette manipulation appelle quelques commentaires : • L’emploi du simple « coller » (Ctrl+V) aurait généré un message d’erreur : si Access cherche à coller l’ensemble des 8 004 enregistrements dans un seul champ, il n’y parviendra évidemment pas (« texte trop long pour être modifié » dit le message erreur). C’est donc bien un « Coller par ajout » qu’il faut utiliser.

66

Access® 2007 et VBA

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

3

Chapitre

Figure 3.1 Ajout des codes postaux dans la table CP.

• Access cherchera à coller les données dans la mesure du possible : les deux colonnes qui réceptionnent les données sont au format texte et d’une très grande largeur, le collage sera donc effectif. Mais en supposant que la colonne « Ville » soit initialement au format numérique, l’importation ne se fera pas, car les données ne sont pas conformes. Access proposera de créer une table des erreurs d’importations qui contiendra tous les enregistrements en erreur. • Le collage étant réalisé, on remarque que la première ligne, qui contenait dans Excel les libellés de colonne n’a pas été collée, alors qu’elle aurait pu être importée, puisque les colonnes destinataires ont un format texte conforme. Le copier/coller par ajout sera toujours possible, qu’il s’agisse d’une feuille Excel, d’un tableau dans Word, d’un fichier texte ou de toute autre source, à condition que les formats source et destination soient compatibles.

1.2 L’IMPORTATEUR EXCEL Access dispose d’outils destinés à importer ou lier des données externes. • Dans le menu « Données externes », cliquez sur l’icône Excel du ruban.

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

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

Le programme ouvre une fenêtre de dialogue présentée à la figure 3.2. Figure 3.2 Ajout des codes postaux dans la table CP.

Cette grille-écran propose : • Soit d’importer les données dans une nouvelle table. • Soit d’importer les données dans une table existante (c’est l’équivalent exact du copier/ coller par ajout du paragraphe précédent). • Soit d’établir un lien, comme on le verra plus loin. Dans un premier temps, nous importerons les données dans une nouvelle table : 1. Cliquez sur le bouton « Parcourir », choisissez le chemin et le nom du fichier à importer (Codes_Postaux_France.xlsx), puis cliquez sur « OK ». 2. L’assistant d’importation ouvre une fenêtre de première étape permettant de choisir la feuille où se trouvent les données à importer. Le nom de l’onglet deviendra le nom de la table (qu’il sera toujours possible de renommer ultérieurement). Cliquez sur « Suivant ». 3. La deuxième étape demande à l’utilisateur si l’en-tête des colonnes est indiqué sur la première ligne Excel : cochez la case puisque c’est effectivement le cas, puis cliquez sur « Suivant ». 4. La troisième étape ouvre la fenêtre présentée à la figure 3.3. • Les en-têtes de colonnes du fichier Excel ayant été reconnus, ils sont incorporés aux noms de champ (s’ils n’existaient pas, il serait alors possible de les indiquer dans la zone supérieure gauche). • Le type de données est reconnu d’après les caractéristiques Excel, mais il peut être modifié.

68

Access® 2007 et VBA

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

3

Chapitre

• Access adapte le mieux possible le niveau d’index. Toutefois, il ne lit pas la totalité de la colonne et propose un niveau moyen : ici, l’index sans doublon peut être choisi puisqu’il n’y a pas de doublon. • La case inférieure droite permet de ne pas importer des colonnes exclues. Figure 3.3 Étape 3 d’une importation Excel.

L’étape suivante concerne la clé primaire de la table ; par défaut, Access propose d’ajouter une colonne qui servira de clé primaire à incrémentation automatique. Dans le cas présent, la colonne « CODE » n’ayant pas de doublon peut très bien constituer une clé primaire. Il est possible ensuite de renommer l’onglet Excel par un nom de table non existant dans la base importatrice : nommez la table « CODE_POSTAL ». À ce stade, tous les paramètres de l’importation sont en place et il serait possible de cliquer sur « Terminer » ; toutefois Access permet d’enregistrer ces paramètres pour reproduire la même opération ultérieurement. Il suffira alors de cliquer dans le ruban du menu « Données externes » sur l’icône Importations enregistrées pour exécuter le même type d’importation de nouvelles fois.

1.3 L’IMPORTATEUR

DE FICHIER TEXTE

Comme Excel, Access peut importer tous types de fichier texte : • fichier à structure délimitée, dans lequel chaque champ est séparé par un caractère particulier, le point-virgule, la virgule ou tout autre ; • fichier à structure de longueur fixe, dans lequel chaque champ a une position et une longueur de caractères prédéfinies.

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

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

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

Dans le pavé inférieur, la lecture du texte permet de bien identifier la nature du fichier et la définition du séparateur, ici le point-virgule. L’étape qui suit validera le choix du séparateur et la présence des en-têtes de colonnes. Toutes les étapes suivantes sont identiques à celles qui ont été décrites dans la section 1.2 des importations depuis Excel.

Les fichiers texte de longueur fixe Les procédures d’importation d’un fichier texte de longueur fixe ne varient pas des autres à ceci près que le positionnement des champs sera déterminé par un tracé d’enregistrement fourni par le concepteur du fichier source. La détermination des largeurs de champ est réalisée grâce à l’utilisation d’une réglette visible lors de la deuxième étape. Il est vivement recommandé d’utiliser le bouton « Avancé » de cette étape et de mémoriser les paramètres d’importation. Cette phase étant délicate et longue à mettre en œuvre, il est

70

Access® 2007 et VBA

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

3

Chapitre

plus prudent de l’intégrer à l’importation elle-même suivant la démarche montrée à la figure 3.5. Figure 3.5 Étape 2 d’une importation de fichier texte de longueur fixe et mémorisation des paramètres.

(2)

Les liaisons de données Contrairement aux importations, qui intègrent définitivement les données dans la base active et doivent être reproduites à chaque mise à jour du fichier source, les liaisons de données permettent une mise à jour permanente du résultat affiché dans Access. En revanche, sauf en cas de connexion ODBC (Open DataBase Connectivity) ou de liaison avec une autre base de données, toute modification dans la base active des données source est impossible : les données attachées à Access sont en lecture seule. Les liaisons avec Excel, une autre table Access ou un fichier texte se mettent en place de la même manière que pour une importation, à la différence près que l’option « Importer les données » est remplacée par l’option « Lier à la source de données » en créant une « table attachée ». Pour ce nouveau cas de figure, procédez aux opérations suivantes : 1. Dans le ruban du menu « Données Externes », cliquez sur l’icône Access. 2. Pointez le fichier « Codes_Postaux_France.accdb » et cochez l’option « Lier la source de données ».

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

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

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

4. Cliquez sur le bouton « Sélectionner tout » puis sur « OK » : toutes les tables sont attachées. Il est fréquent de lier une base Access à une base Microsoft SQL Server (ou une autre base : Oracle, DB2, MySQL, etc.) ; cette liaison nécessite une procédure particulière : 1. Dans le ruban du menu « Données externes », cliquez sur l’icône Plus dans le pavé « Importer ». 2. Cliquez sur « Bases de données ODBC ». 3. Cliquez sur « Lier à la source de données » en créant une « table attachée » puis sur « OK ». 4. Vous devez créer un fichier « .dsn » qui contiendra vos paramètres de connexion : cliquez sur « nouveau ». 5. Sélectionnez le pilote correspondant à la base à laquelle vous voulez vous connecter (Oracle, SQL Server). 6. Cliquez sur « Parcourir » pour préciser le chemin et le nom du fichier « .dsn » à créer. 7. Donnez un nom à votre fichier puis cliquez sur « Suivant » pour voir la grille-écran que montre la figure 3.7. Figure 3.7 Paramétrage de la connexion ODBC.

72

Access® 2007 et VBA

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

3

Chapitre

Contrairement aux liens avec Access, l’accès à la base de données via ODBC est conditionné par la mise au point des moyens d’accès à cette base : le paramétrage représenté à la figure 3.8 est donc primordial. Figure 3.8 Paramétrage du login à la base de données.

Deux cas de figure peuvent se présenter : • Soit des procédures de single sign-on ont été mises en place dans l’entreprise : celles-ci permettent de coupler l’identification et l’authentification à la base de données avec l’identification au niveau du login réseau Windows ; la connexion est immédiate si l’utilisateur est déjà reconnu sur le réseau. • Soit les paramètres de login/mot de passe sont spécifiques à la base ciblée. Dans ce cas, l’administrateur de la base de données doit impérativement vous communiquer ces coordonnées. Suivant le type de base sur laquelle se fait la liaison, deux grilles-écran proposent éventuellement de peaufiner la connexion ; il s’agit surtout des connexions avec SQL Server. À l’issue de ces opérations, le serveur SQL (ou toute autre base) liste toutes les tables accessibles, à l’image de celles présentées à la figure 3.9. Figure 3.9 Tables, vues et autres objets disponibles sous SQL Server.

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

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

La mise en place de ce type de liaison ouvre la porte à des développements conséquents dans lesquels les tables, vues et autres objets sont stockés dans une grosse base de données centrale gérant avec précision et sécurité les accès aux informations (contrairement à Access). Au total, les différents types de liens sont représentés à la figure 3.10, chacun avec son logo particulier. Pendant que la simple table affiche le logo classique déjà étudié, chaque liaison se signale par la présence d’une petite flèche et un dessin particulier. Figure 3.10 Logos des liaisons.

Pour retrouver l’emplacement des fichiers source (sauf connexion ODBC), cliquez du bouton droit sur la « table attachée » puis sélectionnez le « Gestionnaire de tables liées ». Cette option permet également de mettre à jour les liaisons.

Résumé Access dispose de tous les outils nécessaires pour importer des données de toute provenance, fichiers Excel, tables d’un autre fichier Access, fichiers texte délimités ou fichiers texte de largeur fixe. Les paramètres d’importation peuvent être mémorisés et permettre ainsi la reproduction de ces importations. Toutes les caractéristiques de l’importation sont applicables de la même manière pour créer des attaches avec les mêmes objets sources. Contrairement aux importations, les attaches offrent une mise à jour constante des données de destination dans Access. Les bases Access se connectent via ODBC (Open Date Base Connectivity) à des bases de données d’entreprise telles qu’Oracle, MS-SQL Server, MySQL ou autres.

74

Access® 2007 et VBA

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

3

Chapitre

Problèmes et exercices Les exercices de ce chapitre visent à importer de diverses manières des données externes pour mettre en place une base de données qui servira pour tous les travaux ultérieurs. Après les importations effectuées dans les exercices ci-après, ceux des chapitres suivants exploiteront les données chargées via de nombreuses requêtes.

IMPORTER

DES DONNÉES AU FORMAT

EXCEL

• Énoncé

1. Téléchargez le fichier « ELEVE.xlsx » sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr, puis importez-le dans une nouvelle base nommée « ECOLE_INTERNATIONALE.accdb ». 2. Après importation, mettez au point tous les champs pour une utilisation optimale des données.

* Solution

1. Importation du fichier Le fichier « ELEVE.xlsx » est un fichier au format Excel 2007. Son importation nécessite la création préalable de la future base de données. 1. Démarrez Access. 2. Cliquez sur le bouton « Base de données vide ». 3. En bas à droite, précisez le chemin de création de cette base en cliquant sur l’icône de dossier Windows. 4. En bas à droite, nommez la nouvelle base « ECOLE_INTERNATIONALE.accdb ». 5. Cliquez sur le bouton « Créer ». 6. Pour plus de clarté, fermez la table qui a été créée automatiquement. 7. Dans le ruban du menu « Données externes », cliquez sur Excel. 8. Dans la fenêtre qui s’est ouverte, pointez le fichier « ELEVE.xlsx ». 9. Vérifiez que le bouton, en dessous, concerne bien une importation et non une attache puis validez par « OK ». 10. Cliquez sur « Suivant » à la première étape d’importation (il n’y a qu’une seule feuille dans le fichier Excel, nommée elle aussi « ELEVE »). 11. À la deuxième étape, cochez la case « Première ligne contient les en-têtes de colonne », puis « Suivant ». 12. Lorsque tous les paramètres de la troisième étape sont corrects (vérifiez-les colonne par colonne !), cliquez sur « Suivant ». 13. À la quatrième étape, cochez l’option « Choisir ma propre clé primaire » et laissez la colonne « ID_ELEVE » proposée ; cliquez sur « Suivant ». 14. À la cinquième étape, laissez le nom « ELEVE » pour la future table, ne cochez pas l’option « Je souhaite que l’assistant… » (nous ferons nous-mêmes l’analyse proposée).

Exercices

EXERCICE 1

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

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

15. Ne cochez pas l’option de mémorisation de cette importation (elle ne se reproduira pas). 2. Paramétrage de la table La table est importée. Analysons ses caractéristiques : 1. Cliquez du bouton droit sur la table « ELEVE » et sélectionnez « Mode création ». 2. Le champ « ID_ELEVE » a été créé de type Numérique avec une taille Réel Double : cette présentation peut être gênante par la suite pour les relations entre les tables. Positionnez la taille de ce champ à « Entier Long » (on remarquera qu’il n’est plus possible de modifier le type et de le faire passer en « NuméroAuto »). 3. Mettez une légende correcte et compréhensible au champ « ID_ELEVE » comme « N˚ de l’élève » par exemple. 4. La propriété « Null Interdit » du champ « ID_ELEVE » est positionnée à « Non », ce qui paraît étonnant puisque la colonne est une colonne primaire. Vous pouvez modifier cette propriété en « Oui », mais il n’y aura pas d’incidence sur la table. 5. Cliquez immédiatement sur la petite disquette d’enregistrement dans la barre supérieure de l’écran, Access avertit que certaines données peuvent être perdues. Cela provient du fait que la colonne « ID_ELEVE » est passée de Réel Double à Entier Long ; aucune donnée ne sera altérée puisque le plus grand ID porte le n˚ 26 : cliquez sur « Oui ». 6. Le champ « NOM_ELEVE » est positionné à 255 caractères (valeur par défaut), réduisez-le à 50. 7. Le champ « NOM_ELEVE » n’a pas de légende : indiquez simplement « Nom ». 8. Le champ « NOM_ELEVE » n’est pas obligatoire : modifiez cette option en mettant la propriété « Null interdit » à « Oui » et la propriété « Chaîne vide autorisée » à « Non ». 9. Les champs « PRENOM_ELEVE » et « ADRESSE1_ELEVE » seront modifiés de la même manière que le nom. 10. Le champ « ADRESSE2 » peut être vide (« Null interdit » à « Oui »). 11. Le code postal est réduit à 5 caractères, obligatoire. 12. La ville est réduite à 50 caractères, obligatoire. 13. Le pays est réduit à 5 caractères, obligatoire. 14. Le numéro de téléphone est réduit à 10 caractères (effectivement en type Texte), obligatoire. 15. Le format Date/heure du champ « DATENAISSANCE_ELEVE » est correct, mais doit devenir obligatoire. 16. Le champ « SEXE_ELEVE » peut être réduit à un caractère et doté d’une liste de choix : cliquez sur l’onglet correspondant. Choisissez « Zone de liste déroulante » pour la zone « Afficher le contrôle », « Liste valeurs » pour la zone « Origine source », « M;Masculin;F;Féminin » pour la zone « Contenu », la valeur « 2 » pour la zone « Nombre de colonnes », « 1;3 » pour la zone « Largeur des colonnes ». 17. Fermez et validez les messages d’avertissement.

76

Access® 2007 et VBA

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

3

Chapitre

EXERCICE 2 • Énoncé

IMPORTER

DES DONNÉES AU FORMAT

CSV

1. Téléchargez le fichier « NOTE.csv » et importez-le dans la base « ECOLE_INTERNATIONALE.accdb ». 2. Après importation, mettez au point tous les champs pour une utilisation optimale des données.

* Solution

1. Importation Le fichier « NOTE.csv » est un fichier texte, et plus précisément un fichier délimité à séparateur point-virgule (csv étant l’abréviation de Coma Separated Values). Il est possible d’ouvrir directement ce fichier avec Excel, mais pour bien en comprendre la structure, il est préférable de l’ouvrir avec un simple éditeur de texte : 1. Cliquez sur le bouton « Office » en bas d’écran. 2. Cliquez sur « Tous les programmes > Accessoires > Bloc-Notes » : la fenêtre de l’éditeur NotePad s’ouvre. 3. Cliquez sur « Fichier > Ouvrir ». 4. Dans la fenêtre d’ouverture de fichier, cliquez sur le type « Tous les fichiers » et pointez le fichier « NOTE.csv » récupéré. Ce fichier apparaît tel qu’à la figure 3.11.

Figure 3.11

Exercices

Fichier CSV lu sous NotePad.

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

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

Chaque ligne comprend 4 champs séparés chacun par des points-virgules : • Le premier champ est le numéro (l’ID) de l’élève. • Le deuxième champ est le numéro de la matière enseignée. • Le troisième champ est la note de l’élève. • Le dernier champ est la date d’attribution de la note. Fermez le fichier pour pouvoir l’importer : 1. Ouvrez à nouveau, si nécessaire, la base de données « ECOLE_INTERNATIONALE.accdb ». 2. Dans le menu « Données externes », cliquez sur « Fichier texte ». 3. Dans la fenêtre d’importation, pointez le fichier « NOTE.csv » et cliquez sur « Ouvrir ». 4. Optez pour une importation et non pas une attache ou l’ajout à une table existante. 5. La première étape de l’importation détecte à juste titre un fichier délimité, cliquez sur « Suivant ». 6. La deuxième étape détecte à juste titre le point-virgule comme séparateur. 7. La troisième étape ne reconnaît pas de noms de champ puisque, par définition, il n’en existe pas : Le champ1 doit être renommé « ID_ELEVE », le type de données et l’index sont corrects. Cliquez dans le corps des données présentées et dans la deuxième colonne : le champ2 doit être renommé « ID_MATIERE », le type de données et l’index sont corrects. Le champ3 doit être renommé « NOTATION », le type de données doit être modifié en réel simple (les notes ne sont pas toujours des valeurs entières, même si, ici, il n’existe que des notes arrondies à l’unité). Le champ4 doit être renommé « DATE_NOTE », le type de données Date/heure est correct. 8. Cliquez sur « Suivant ». 9. Dans l’étape suivante, laissez Access ajouter une clé primaire, puis cliquez sur « Suivant ». 10. À la dernière étape, nommez la table « NOTE » (valeur reprise par défaut). 11. N’enregistrez pas les étapes d’importation. La table importée doit avoir l’apparence de la figure 3.12.

78

Access® 2007 et VBA

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

3

Chapitre

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

2. Révision des caractéristiques de la table • La clé primaire insérée par Access porte le nom « ID » par défaut : renommez-la « ID_ NOTE ». • Déclarez tous les champs en « Null interdit ». • Insérez des légendes à tous les champs. • Au moment de la fermeture de la table en mode modification, Access avertit que les règles d’intégrité ont été modifiées (les champs ont été déclarés en Null interdit). Il propose de tester les données existantes avec les nouvelles règles : répondez par « Oui », puisque les nouvelles règles sont conformes.

EXERCICE 3

IMPORTER

DES DONNÉES D’UNE AUTRE BASE

ACCESS

• Énoncé

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

* Solution

La base « ECOLE_INTERNATIONALE » étant ouverte, procédez de la manière suivante : 1. Dans le menu « Données externes », cliquez sur le bouton « Access » du ruban. 2. Dans la fenêtre d’importation, pointez le fichier « MATIERE.accdb » puis « Suivant ».

Exercices

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

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

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

3. Sélectionnez la table « MATIERE » (la seule), de la base et cliquez « OK ». 4. Ne mémorisez pas les paramètres. Vous devez vérifier tous les paramètres, mais les caractéristiques de la table sont conformes aux normes qui ont été exposées auparavant.

EXERCICE 4

ÉTABLIR

• Énoncé

À partir des trois tables qui ont été intégrées à la base « ECOLE_INTERNATIONALE », mettez en place toutes les contraintes d’intégrité référentielles possibles. Sachant que trois matières (ANGLAIS, ALLEMAND, ITALIEN) doivent être considérées comme un ensemble nommé LANGUES VIVANTES, mettez en place la solution relationnelle.

* Solution

La première partie du problème met en application les principes étudiés au chapitre 2.

LES CONTRAINTES RÉFÉRENTIELLES

1. Dans le ruban du menu « Outils de base de données », cliquez sur le bouton « Relations ». 2. Ajoutez les trois tables en présence. 3. Liez, avec intégrité référentielle, les clés primaires avec leur clé étrangère de sorte d’obtenir le modèle relationnel de la figure 3.13. Figure 3.13 Premier modèle relationnel de la base ECOLE_ INTERNATIONALE.

Le regroupement des différentes langues en une seule matière « Langues Vivantes » oblige à la création d’une table « GROUPE » destinée à lister tous les groupes de matières : d’une part, les matières non regroupées et, d’autre part, les langues vivantes. En généralisant, on peut imaginer que chaque matière peut être « dégroupée » en plusieurs ; par exemple, l’histoire-géographie pourrait être scindée en histoire, d’une part, et géographie, d’autre part. Il faut donc créer une table « GROUPE », mais aussi une table « REGROUPEMENT » pour mettre en place une sorte de tableau d’équivalence. 1. Vous devez créer une nouvelle table nommée « GROUPE », pour cela : 2. Dans le ruban du menu « Créer », cliquez sur « Table ».

80

Access® 2007 et VBA

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

3

Chapitre

3. Cliquez immédiatement sur le bouton du « Mode modification » : Access demande le nom de la nouvelle table « GROUPE ». 4. La clé primaire sera nommée « ID_GROUPE ». 5. Créez un champ « NOM_GROUPE », type Texte, 50 caractères, obligatoire, non indexé. Opérez de même avec la table « REGROUPEMENT », dotée des champs suivants : • ID_REGROUPEMENT, clé primaire, NuméroAuto, Indexé sans doublon. • ID GROUPE (clé étrangère), Numérique, Entier long, obligatoire, non indexé. • ID_MATIERE (clé étrangère), Numérique, Entier long, obligatoire, non indexé. Établissez les relations avec ces nouvelles tables : 1. Ouvrez à nouveau, le cas échéant, la fenêtre des relations. 2. Cliquez sur le bouton du ruban « Afficher la table ». 3. Ajoutez les tables « GROUPE » et « REGROUPEMENT ». 4. Établissez les contraintes référentielles de sorte d’obtenir le modèle relationnel de la figure 3.14. Figure 3.14 Second modèle relationnel de la base ECOLE_ INTERNATIONALE.

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

Exercices

Conservez ces travaux, qui resserviront dans les chapitres suivants.

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

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

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

4

Chapitre

Les requêtes

1. Les requêtes Sélection .............. 84 2. Les requêtes Insertion, Suppression et Mise à jour ....... 95 3. Les requêtes création.............. 100 Problèmes et exercices 1. 2. 3. 4. 5. 6.

Affichage par ordre alphabétique .. 103 Affichage sur critère de prénom ..... 104 Affichage sur critère excluant un pays 104 Affichage sur critères multiples ....... 105 Affichage sur critère de date .......... 105 Affichage sur critères de date et de pays .......................................... 7. Affichage avec valeurs distinctes .... 107 8. Affichage des premiers éléments .... 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 requêtes multiples ........... 110 13. Affichage de la moyenne générale . 111 14. Affichage de la moyenne par matière......................................... 112 15. Tableau croisé dynamique ............. 113 16. Tableau croisé avec regroupement . 114 17. Regroupement et coefficient ........... 115 18. Requête Ajout ............................... 118 19. Requête Suppression ..................... 120 20. Requête Mise à jour ...................... 121

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

83

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

(1)

Les requêtes Sélection Cette section présente l’assistant de requêtes d’Access et les requêtes de sélection à partir du fichier des codes postaux. 1. Ouvrez le fichier « CODES_POSTAUX.accdb ». 2. Dans la barre de menu « Créer », cliquez sur l’icône Création de requête, sur la droite du ruban. Access ouvre une fenêtre dans laquelle apparaissent toutes les tables présentes ; un autre onglet propose aussi d’afficher les requêtes (il est possible, voire indispensable parfois, de faire une requête sur une requête). 3. Cliquez sur la table « CODE_POSTAL » puis sur « Ajouter » (un double-clic aboutit au même résultat). 4. Fermez cette fenêtre d’appel des sources. L’écran, présenté à la figure 4.1, se divise en deux parties : 1. Une partie supérieure qui montre la ou les tables et requêtes appelées Une partie inférieure présentant un tableau, pour le moment vide, où l’on paramétrera : • Les champs que l’on veut voir retournés dans la feuille des résultats ; • Le ou les ordres de tris attendus ; • Le ou les filtres sur les données.

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

1. Faites un double-clic sur l’étoile se trouvant au-dessus de la clé primaire « CODE ». 2. Dans le pavé inférieur, première colonne, la zone « Champ » contient le libellé « CODE_POSTAL.* » signifiant « Tous les champs de la table CODE_POSTAL » ; la zone « Table » contient elle aussi le même nom de table. 3. Dans le ruban, cliquez sur Affichage (l’icône apparaît sous forme d’une grille, ce qui signifie affichage sous forme de feuille de données). 4. La nouvelle fenêtre fait apparaître les données dans un état exactement similaire à celui de la table d’origine. 5. Dans le ruban, cliquez sur le petit triangle situé dans l’icône Affichage puis sur « Mode SQL ». 6. Une feuille blanche présente la requête SQL, écrite dans le langage original SQL.

84

Access® 2007 et VBA

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

4

Chapitre

La syntaxe complète est SELECT CODE_POSTAL.* FROM CODE_POSTAL; qui signifie littéralement : sélectionnez tous les champs dans la table CODE_POSTAL. On notera que la requête se termine obligatoirement par un point-virgule qui, dans le langage SQL, signale la fin d’instruction. L’assistant requêtes permet donc de présenter une requête sous au moins trois formes : • un mode création destiné à rédiger la requête avec un outil graphique ; • un mode feuille de données présentant les résultats ; • un mode SQL permettant de rédiger directement ou de voir simplement la requête sous la forme du langage SQL ; ce dernier mode nous servira ultérieurement pour copier/ coller du code SQL et l’introduire dans du code Visual Basic. L’accès à ces trois modes est obtenu grâce à la flèche située au-dessous de l’icône Affichage du ruban. On y accède également grâce aux petites icônes situées en bas à droite de la fenêtre. 1. Revenez en mode création (flèche sous Affichage et « Mode création », ou bouton « Mode création » en bas de la fenêtre). 2. Placez la souris au-dessus de la première colonne, de sorte que le pointeur apparaisse comme une flèche noire vers le bas. 3. Appuyez sur la touche « Sup. » : la colonne est supprimée. L’assistant est prêt pour une nouvelle requête. 4. Dans la partie supérieure présentant les tables, cliquez sur le mot « CODE » de la table « CODE_POSTAL » et, sans relâcher la souris, faites glisser cette zone dans la ligne Champ de la première colonne située dans la partie inférieure de la fenêtre. Le même résultat est obtenu en double-cliquant sur le mot « CODE » de la table. 5. Faites de même avec le mot « VILLE » en le faisant glisser vers la zone Champ de la deuxième colonne, ou bien en double-cliquant dessus. 6. Le code SQL associé (obtenu via la flèche sous l’icône Affichage du ruban, ou la petite icône en bas droite) est SELECT CODE_POSTAL.CODE, CODE_POSTAL.VILLE FROM CODE_POSTAL; qui pourrait être simplifié dans le cas présent en SELECT CODE, VILLE FROM CODE_POSTAL;. 7. Le résultat est obtenu en passant en mode feuille de données (via la flèche sous Affichage ou la première petite icône en bas de la fenêtre). Il est exactement similaire au précédent, à la différence près que les champs ont été appelés séparément. L’affichage en mode feuille de données permet, comme pour les tables, de présenter provisoirement les données de différentes manières. En cliquant sur la zone de liste déroulante, accessible par le triangle pointé en bas, situé à droite du nom de colonne, il est possible d’effectuer des tris et des filtres. Ces opérations sont totalement « accompagnées » par des choix d’option adaptés au type de colonne (texte, numérique ou date). On peut, par exemple, ne montrer que les villes commençant par PARIS, ou les codes postaux finissant par 000 (préfectures). Ces assistants ne mémorisent pas la présentation obtenue. Il ne s’agit ici que d’une modification temporaire de l’affichage, qui n’affecte en rien la requête initiale. Les explications qui suivent montrent comment réaliser des tris et des filtres de plus en plus élaborés, et comment enregistrer les requêtes ainsi obtenues.

Les requêtes 85

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

1.1 LES

TRIS Le fichier livré est déjà trié par ordre de code postal, nous voulons à présent le trier par ville. 1. Repassez en « Mode création » sur la requête précédente afin de pouvoir la modifier (soit par la flèche sous Affichage du ruban, soit par les icônes en bas de la fenêtre). Cliquez sur la ligne « Tri » de la colonne VILLE, puis ouvrez la zone de liste déroulante qui apparaît sur la droite de cette zone. 2. Sélectionnez « Croissant ». 3. Repassez en « Mode feuille de données » pour visualiser le résultat (petite icône en bas de la fenêtre). La requête renvoie tous les enregistrements triés par ville. Si l’on consulte la liste à la lettre P comme Paris, on constate que les codes postaux pour tous les items de la capitale sont à présent désordonnés La deuxième requête visera donc à trier le fichier par VILLE puis par CODE. 1. Repassez en « Mode création » pour effectuer une nouvelle modification de la requête. Placez la souris au-dessus de la colonne VILLE pour faire apparaître la flèche noire pointée vers le bas. 2. Cliquez sur la colonne « VILLE ». 3. En gardant le clic enfoncé, déplacez la colonne vers la gauche pour l’amener à gauche de la colonne CODE puis relâchez 4. Sur la ligne Tri, dans la colonne CODE, sélectionnez aussi le « tri croissant ». 5. Affichez les données en sélectionnant le « Mode feuille de données ». Le tri est désormais correct et s’applique aux villes puis, à l’intérieur d’une même ville, par code postal. L’assistant requête se lit de gauche à droite et les tris s’effectuent successivement de gauche à droite. En supposant que la liste attendue doive présenter malgré tout les codes avant les villes, le procédé suivant devra être utilisé : 1. Repassez en « Mode création ». Cliquez sur le champ « VILLE » (pour placer le curseur à cette colonne). 2. Dans le ruban, cliquez sur « Insérer des colonnes ». Une nouvelle colonne vient se mettre à gauche. 3. Glissez de nouveau le champ « CODE » dans cette nouvelle colonne, n’y ajoutez pas de notion de tri. 4. Décochez la zone « Afficher » de la colonne CODE de droite pour obtenir la structure de la figure 4.2.

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

86

Access® 2007 et VBA

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

4

Chapitre

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

1.2 LES

FILTRES Cette section aborde les requêtes de filtrage. Il est préférable d’annuler les consignes de tri précédentes, situées dans les colonnes VILLE et CODE en remplaçant « croissant » par « non trié » grâce à la liste déroulante de la zone tri. Nous désirons maintenant ne consulter que les items concernant Paris : 1. 2. 3. 4.

Dans la zone Critères de la colonne VILLE, saisissez le mot « PARIS » et validez. Des guillemets se positionnent automatiquement pour cerner ce mot. Affichez en « Mode feuille de données ». La requête renvoie 29 enregistrements qui contiennent tous et exactement le seul mot PARIS. Cherchons à présent à afficher tous les enregistrements commençant par le mot Paris : 1. Repassez en « Mode création ». Dans la zone critère, remplacez le libellé actuel par « Comme "PARIS*" ». 2. La requête renvoie cette fois 152 enregistrements dont le libellé de ville commence par Paris. L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE "PARIS*"; 1. L’astérisque qui suit le mot Paris fonctionne comme un « joker » qui sélectionne toutes les occurrences possibles après le mot Paris. Le positionnement de l’astérisque en début de chaîne de caractères renverrait toutes les villes dont le libellé se termine par Paris (30 enregistrements et non 29 car il existe une ville nommée DAMPARIS). Un autre type de joker, le point d’interrogation, désigne un et un seul caractère qui peut prendre toutes les valeurs possibles ; ainsi la requête SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE "P???S*"; renvoie 30 enregistrements car, outre la ville de Paris, la ville de Poses commence par un P et finit aussi par un S tout en comptant 5 caractères. Nous cherchons maintenant à afficher les enregistrements relatifs à Paris OU à Bordeaux. On portera une attention particulière à la terminologie : en utilisant le mot « OU », exact, nous désirons voir tous les codes postaux parisiens et tous les codes postaux bordelais (addition des deux natures d’items). 1. Repassez en « Mode création ». Dans la première ligne des critères, colonne VILLE, insérez le mot « PARIS ». 2. Dans la deuxième ligne des critères, même colonne, insérez le mot « BORDEAUX ». 3. La requête renvoie 34 enregistrements.

1. L’approche volontaire et directe du code SQL réalisée ici ne doit pas être appliquée à la lettre à toutes les bases de données. Des différences syntaxiques importantes sont à déplorer ; sous Oracle, la même requête se terminerait par WHERE VILLE LIKE ‘PARIS%’;

Les requêtes 87

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

D’une manière différente, on peut également choisir la clause « ET » (AND en anglais). Si l’on désire voir toutes les préfectures (les villes dont le code postal finit par 000) et commençant par le mot « ST », on procédera de la manière suivante : 1. Repassez en « Mode création ». Dans la première ligne des critères, colonne CODE, insérez « Comme "*000" ». 2. Dans la première ligne des critères, colonne VILLE, insérez « Comme "ST*" ». 3. La requête renvoie 4 enregistrements : St-Brieuc, St-Étienne, St-Lo, Strasbourg. Dans ce nouveau cas de figure, et pour cumuler les conditions, les critères sont disposés sur la même ligne. On peut exclure des enregistrements par l’instruction « Pas » (NOT en anglais). 1. En « Mode création », tous les critères antérieurs étant effacés, insérez le libellé « Pas PARIS » dans le premier critère de la colonne VILLE. 2. Le résultat 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 caractères, l’assistant requête peut faire jouer de nombreux autres opérateurs : 1. En « Mode création », effacez les critères de filtre précédents. 2. Dans la zone Critères de la colonne CODE, insérez le libellé « >=75000 ». 3. La requête renvoie 1 818 enregistrements et plus précisément tous les codes postaux supérieurs ou égaux à 75000. On notera que l’opération fonctionne alors même que la colonne est déclarée comme de type texte : Access effectue une conversion implicite des données pour interpréter la requête. La requête appelant tous les enregistrements relatifs à la ville de Paris sur la base du code postal s’écrira comme l’indique la figure 4.3 (101 enregistrements renvoyés). Figure 4.3 Requête cumulant des critères à opérateur arithmétique.

L’équivalent SQL de cette requête s’écrit SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE>="75000" AND CODE Requêtes actions. On peut aussi utiliser la commande Visual Basic DoCmd.SetWarnings False. 2. Si l’insertion concerne une ville représentée plusieurs fois dans la table source, il y aura autant de lignes ajoutées que de lignes sources.

96

Access® 2007 et VBA

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

4

Chapitre

Dans cette requête, on ajoute une ligne d’adresse avec le code postal dont la ville est Gex, code postal retrouvé grâce à la table des codes postaux. Sa présentation SQL est INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE) SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des Vinaigriers" AS MON_ADRESSE, CODE_POSTAL.CODE FROM CODE_POSTAL WHERE (((CODE_POSTAL.VILLE)="Gex")); 8. Enregistrez cette requête sous le nom Req_Ajout_Perso car celle-ci nous resservira ultérieurement.

2.2 LES

REQUÊTES

SUPPRESSION

La requête suppression qui correspond à l’instruction SQL DELETE, réalise la suppression d’enregistrements. Avec Access, elle se met en œuvre de la manière suivante : 1. 2. 3. 4.

Le cas échéant, fermez les requêtes et tables actives. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête. Sélectionnez la table « ADRESSE » puis fermez. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la première colonne. 5. Cliquez sur l’icône Suppression du ruban, représenté par un X rouge avec un point d’exclamation (la zone Supprimer s’incrémente automatiquement du mot-clé « Où »). 6. Dans la zone Critères, saisissez votre nom (celui que vous avez inséré dans l’exercice précédent). 7. Dans le ruban, cliquez sur le bouton « Exécuter ». 8. Un message de service vous indique que vous allez supprimer un enregistrement ; répondez « Oui ». Si l’indication de votre nom avait comporté une faute d’orthographe, Access aurait simplement dit que vous alliez supprimer 0 enregistrement. L’équivalent SQL de cette manipulation donne DELETE NOM FROM ADRESSE WHERE NOM="MINOT";. Tous les opérateurs de comparaison déjà vus (LIKE, par exemple) peuvent être utilisés pour préciser l’étendue des suppressions désirées. On prendra garde au fait qu’une requête suppression sans opérateur de comparaison supprime tous les enregistrements de la table source (DELETE NOM FROM ADRESSE;) 1. Rappelons enfin que si une contrainte d’intégrité référentielle avec suppression en cascade a été mise en place au niveau relationnel, la suppression d’un enregistrement dans la table mère provoque la suppression de tous les enregistrements correspondants dans les tables filles.

1. Access ne prend pas en charge la commande TRUNCATE qui, dans beaucoup de bases de données, permet de vider très rapidement le contenu entier d’une table.

Les requêtes 97

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

2.3 LES

REQUÊTES

MISE

À JOUR

Ces requêtes, qui correspondent à l’instruction SQL UPDATE, réalisent la mise à jour de tout ou partie d’un ou plusieurs enregistrements. L’assistant requêtes d’Access la propose sous la forme graphique suivante : 1. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête. 2. Sélectionnez la table « ADRESSE » puis fermez. 3. Cliquez sur l’icône Mise à jour dans le ruban, symbolisé par un petit crayon sur une grille, suivi par un point d’exclamation. 4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la première colonne. 5. Faites un glisser/déplacer du champ CODE depuis la table « ADRESSE » vers la seconde colonne. 6. Dans la zone Critères du champ NOM, saisissez « DUPONT » (il s’agit d’un des contacts de la table « ADRESSE » dont le code postal, avant mise à jour est 01000). 7. Dans la zone Mise à jour du champ CODE, saisissez un code postal quelconque (mais existant !). L’assistant requêtes sera donc disposé comme à la figure 4.10. Figure 4.10 Paramétrage d’une requête mise à jour.

L’équivalent SQL de cette requête est UPDATE ADRESSE SET CODE = "75010" WHERE NOM="DUPONT";. S’il existe plusieurs contacts nommés Dupont dans la table ADRESSE, tous seront dotés, après la mise à jour, du code postal saisi. Comme pour toutes les requêtes actions, Access informe l’utilisateur du nombre de mises à jour qu’il effectue lorsqu’il exécute cette requête.

2.4 LA

NOTION DE TRANSACTION Toute requête action (ajout, suppression, mise à jour) s’inclut dans une transaction. Cette notion est particulièrement importante lorsque la base de données est partagée par plusieurs utilisateurs. La démarche générale d’une transaction se traduit par les événements successifs suivants : • Un utilisateur (numéroté 1) démarre explicitement une transaction (par une commande qu’on verra plus loin).

98

Access® 2007 et VBA

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

4

Chapitre

• L’utilisateur 1 procède à une ou plusieurs requêtes action. • Pendant ce temps, et jusqu’à ce que l’utilisateur 1 ait achevé sa transaction, les autres utilisateurs ne voient pas les ajouts, mises à jour ou modifications apportés à la base. • Dans ce même temps, les enregistrements impactés par les actions de l’utilisateur 1 sont bloqués (LOCK), c’est-à-dire qu’un utilisateur 2 ne peut pas y porter une autre requête action. • L’utilisateur 1 clôt sa transaction. • Les autres utilisateurs voient les nouvelles données et peuvent intervenir. La notion de transaction est opérationnelle : • avec les tables d’une base de données active ; • avec les tables d’une base de données connectée sous ODBC 1. Elle n’est pas opérationnelle avec les tables Access ou autres objets (feuille Excel, fichier texte, etc.) attachés à la base active.

Attention Pour que le mode transactionnel soit utilisable, il faut que la base de données utilise une syntaxe compatible avec SQL Server : cliquez sur le bouton Office > Options Access > Concepteurs d’objets et cochez la case Syntaxe compatible SQL Server pour cette base de données. Il faudra s’assurer ensuite d’annuler ce paramétrage car il comporte de lourds effets sur toutes les syntaxes SQL employées dans cette base.

Procédons à la mise en œuvre de cette notion : 1. Dans le menu « Créer », cliquez sur Création de requête. 2. Fermez immédiatement la fenêtre affichant toutes les sources de données sans sélectionner aucun objet. 3. Cliquez dans le ruban sur Définition des données (nous reviendrons plus loin sur ce passage en mode SQL de définition de données). 4. Dans la fenêtre blanche SQL ouverte, saisissez les mots-clés « BEGIN TRANSACTION » suivi par un point-virgule. 5. Cliquez dans le ruban sur le point d’exclamation Exécuter. 6. Il ne se passe apparemment rien : Access a seulement mémorisé que les requêtes actions à venir donnaient lieu à transaction, avec la possibilité de valider ou annuler toutes les commandes générées après le BEGIN TRANSACTION. 7. Rouvrez la requête « Req_Ajout_Perso » en mode SQL et copiez (Ctrl + C) la requête. 8. Retournez dans la requête en cours et collez la commande « INSERT » au complet (Ctrl + V) à la place du BEGIN TRANSACTION. 9. Cliquez sur Exécuter (à partir de l’onglet « Créer « situé à droite) : SQL vous informe qu’un enregistrement va être ajouté. Validez cet ajout.

1. À condition que la base de données connectée sous ODBC supporte elle-même la notion de transaction.

Les requêtes 99

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

10. Ouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez deux fois sur Affichage à gauche dans le ruban) : elle ne contient apparemment pas votre enregistrement. Refermez-la. 11. Effacez le texte d’insertion dans la requête en cours et remplacez-le par les mots-clés « COMMIT TRANSACTION » (avec le point-virgule de fin), et exécutez cette requête. Si le symbole Exécution n’apparaît plus dans le ruban, cliquez sur le second onglet « Créer » situé sur la droite. 12. Rouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez deux fois sur Affichage dans le ruban) : le nouvel enregistrement est bien présent. Si la commande « ROLLBACK TRANSACTION » avait été utilisée en lieu et place du « COMMIT TRANSACTION », l’insertion aurait été purement et simplement annulée. Quelques derniers points essentiels sont à retenir sur cet aspect : • Access oblige à un BEGIN TRANSACTION explicite, contrairement à d’autres bases. • La notion de transaction s’applique exclusivement aux commandes DML (Data Management Language) comme INSERT, DELETE ou UPDATE, non sur les commandes DDL (Data Definition Language) qui permettent de créer des objets. • L’utilisation du mode transactionnel ralentit les procédures. • La fermeture d’Access effectue un COMMIT implicite.

Attention N’oubliez pas de remettre les options qui étaient actives avant cette manipulation. Pour cela supprimez la requête transactionnelle en cours, si cela n’est pas déjà fait, puis cliquez sur le bouton Office > Options Access > Concepteurs d’objets et décochez la case Syntaxe compatible SQL Server pour cette base de données.

(3)

Les requêtes création Les tables et autres objets créés jusqu’à maintenant ont donné lieu à des interventions « manuelles ». Ces dernières peuvent être automatisées, soit par une option spécifique de création de table, soit directement avec la palette complète du langage SQL.

3.1 LES

REQUÊTES CRÉATION DE TABLE Il est toujours aisé de copier un objet comme une table vers le même objet en le renommant : le nouvel objet hérite alors de presque toutes les propriétés de l’original. Cette manipulation s’opère de la manière suivante : 1. Cliquez du bouton droit sur la table « ADRESSE » dans le volet de navigation. 2. Sélectionnez « Copier ». 3. Cliquez à nouveau du bouton droit et sélectionnez « Coller ».

100

Access® 2007 et VBA

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

4

Chapitre

4. Access propose de créer un objet « Copie de ADRESSE » (qu’on peut nommer différemment) et suggère, soit la copie de la structure seule, soit celle de la structure et des données. 5. Optez pour une copie complète : deux tables sont désormais disponibles 1. Cependant, le copier/coller n’a pas réalisé de choix sélectif des données à transmettre : c’est l’avantage des requêtes création de tables que d’y parvenir : 1. Dans le ruban du menu « Créer », cliquez sur Création de requête. 2. Sélectionnez la table « ADRESSE » dans la fenêtre d’affichage des tables puis refermezla. 3. Cliquez dans le ruban sur le bouton « Création de table ». 4. Dans la fenêtre qui s’ouvre, nommez la nouvelle table « NEW_ADRESSE » et validez par « OK ». 5. Insérez tous les champs de la table « ADRESSE » dans les colonnes du pavé inférieur. 6. Dans la zone Critères de la première colonne, saisissez « =01/01/1960 ». Dans la zone Critères de la seconde colonne DATENAISSANCE_ELEVE, inscrivez « Zone de liste déroulante ». 2. La zone de liste déroulante est effective mais non paramétrée : elle n’affiche aucune liste. Dans la propriété Contenu du contrôle (et non pas Source du contrôle), cliquez sur le bouton à points de suspension. 3. Affichez la table « ELEVE » et refermez la fenêtre des sources disponibles. 4. Insérez le champ « PAYS_ELEVE » dans la première colonne du bas. 5. Cliquez sur Feuille de propriétés dans le ruban (feuille de la requête et non du formulaire).

Exercices

Création de la zone de liste déroulante des nationalités Il serait possible de créer de toutes pièces la zone de liste déroulante demandée, mais Access permet aussi de transformer un contrôle d’un type à un autre :

Les formulaires 153

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

6. Positionnez la propriété Valeurs distinctes à Oui. 7. Refermez la feuille de propriétés ; la requête doit afficher dix enregistrements seulement et son code SQL doit être SELECT DISTINCT ELEVE.PAYS_ELEVE FROM ELEVE; (on affiche tous les pays contenus dans la table ELEVE, mais une seule fois). 8. Fermez la fenêtre de la requête et répondez « Oui » au message d’enregistrement. 9. La zone de liste déroulante est fonctionnelle. Mode lecture seule du formulaire 1. En mode création, cliquez sur l’icône Feuille de propriétés. 2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire. 3. Positionnez les propriétés Entrée données, Ajout autorisé, Suppression autorisée, Modification autorisée à Non : le formulaire est entièrement « bridé ». Bouton de commande de sortie du formulaire 1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande. 2. Dessinez un carré en bas à droite, de la taille d’un pavé du quadrillage. 3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Opérations sur formulaires > Fermer un formulaire ». 4. Laissez les options par défaut de la deuxième étape. 5. Nommez le bouton « Fermer » à la troisième étape (ne laissez pas le libellé automatique car le nom du bouton pourra être utilisé ultérieurement en code Visual Basic), puis cliquez sur « Terminer ». Boutons de commande de défilement du formulaire 1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande. 2. Dessinez un carré en bas, de la taille d’un pavé du quadrillage. 3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Déplacements entre enregistrements > Enregistrement suivant ». 4. Laissez les options par défaut de la deuxième étape. 5. Nommez le bouton « Suivant » à la troisième étape. 6. Refaites la même opération mais en prenant à la première étape les options « Déplacements entre enregistrements > Enregistrement précédent ». 7. Testez les trois boutons de commande. Très normalement, Access renvoie un message erreur lorsque l’utilisateur clique sur « Suivant » alors qu’on a atteint la fin de fichier ou qu’il clique sur « Précédent » lorsque le pointeur est en début de fichier. Suppression du sélecteur d’enregistrement, des boutons de déplacements système et des barres de défilement 1. En mode création, cliquez sur l’icône Feuille de propriétés.

154

Access® 2007 et VBA

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

5

Chapitre

2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire. 3. Positionnez la propriété Afficher le sélecteur à Non. 4. Positionnez la propriété Boutons de déplacement à Non. 5. Positionnez la propriété Barres de défilement à Aucune. Finalement, le formulaire a l’aspect de la figure 5.20, la zone de liste déroulante étant ouverte. Figure 5.20 Résultat du premier exercice.

EXERCICE 2

FORMULAIRE

ET SOUS-FORMULAIRE DES ÉLÈVES ET DE LEURS MOYENNES

• Énoncé

Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans la table ELEVE et simultanément leur moyenne dans chacune des matières. Le formulaire montrera également la moyenne générale.

* Solution

Assurément, cette problématique évoque immédiatement le besoin d’associer un formulaire principal, affichant l’identité de l’élève, et un sous-formulaire affichant les moyennes correspondantes. Le procédé de construction automatique vu dans le cours ne pourra malheureusement pas s’appliquer car la notion de regroupement et de moyenne appliquée à la table NOTE empêche Access de repérer la structure en sous-formulaire. Il nous faut donc : • Créer une requête source de données du formulaire. • Créer un formulaire. • Insérer un sous-formulaire dans le premier.

Exercices

• Créer une requête source de données du sous-formulaire.

Les formulaires 155

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

Création des requêtes 1. La première requête, nommée « Req1_Moyennes », contient le code SQL SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE; (les seuls numéro, nom et prénom des élèves suffisent). Elle a la structure de la figure 5.21. Figure 5.21 Structure de la première requête Req1_Moyennes.

2. La deuxième requête, nommée « Req2_Moyennes », contient le code SQL SELECT NOTE.ID_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS 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 figure 5.22. Figure 5.22 Structure de la deuxième requête Req2_Moyennes.

156

Access® 2007 et VBA

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

5

Chapitre

Mise en œuvre du formulaire principal 1. Dans le volet de navigation, mettez la requête Req1_Moyennes en surbrillance. 2. Dans le ruban du menu « Créer », cliquez sur l’icône Formulaire. 3. Le formulaire est immédiatement créé en mode unique avec une large place vers le bas pour insérer le sous-formulaire. 4. Enregistrez le formulaire sous le nom « Frm_Moyennes ». Mise en œuvre du sous-formulaire 1. En mode création, positionnez la souris en bas du corps du formulaire, juste au-dessus de la barre libellée Pied de formulaire afin d’obtenir un pointeur en forme de flèche Nord-Sud. Tirez vers le bas en vue d’agrandir le corps du formulaire. 2. Dans le ruban du menu « Créer », cliquez sur l’icône Sous-formulaire/Sous-état. 3. Dessinez un large rectangle dans la partie vide du corps de formulaire. 4. L’assistant sous-formulaire propose, dans une première étape, les deux différents types de sources de données, requêtes/tables ou formulaires : gardez l’option de requêtes prise par défaut. 5. Dans la deuxième étape, sélectionnez la requête Req2_Moyennes et déplacez les trois champs disponibles dans le pavé des champs sélectionnés. 6. La troisième étape, représentée à la figure 5.23, consiste à établir le lien entre formulaire principal et sous-formulaire. Le texte affiché en bas est le plus clair : il propose d’établir le lien sur le champ ID_ELEVE, ce qui est exact ; nous le vérifierons plus tard. Cette étape est essentielle dans ce travail : sans elle, les affichages seraient fantaisistes et difficilement vérifiables. Validez en cliquant sur « Suivant ». Figure 5.23

7. Dans la dernière étape, renommez le sous-formulaire « Frm_Moyennes1 ». 8. Testez le formulaire : en faisant défiler les élèves, les moyennes par matière varient. 9. Vérifiez la relation entre les deux documents : dans le formulaire principal, cliquez sur Feuille de propriétés, sélectionnez le sous-formulaire Frm_Moyennes1 : les

Exercices

Établissement du lien entre formulaire et sous-formulaire.

Les formulaires 157

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

propriétés Champs Pères et Champs Fils sont bien toutes deux positionnées à ID_ ELEVE. La présentation des résultats du sous-formulaire en mode feuille de données et non formulaire n’est pas très heureuse : d’une part, on lit le numéro d’enregistrement de l’élève (ce qui devient inutile dès lorsque le lien formulaire/sous-formulaire est vérifié et fonctionnel) et, d’autre part, l’accès aux zones de listes déroulante des en-têtes de colonnes renvoie des messages erreurs. Nous suggérons donc de transformer le sous-formulaire en mode continu et affichage formulaire, tout en faisant disparaître pour l’utilisateur la zone ID_ELEVE. Initialement, le sous-formulaire a l’aspect représenté à la figure 5.24. Figure 5.24 Sous-formulaire avant modifications.

1. Positionnez la propriété Affichage par défaut du formulaire à Formulaires continus (à la place de Feuille de données). 2. Sélectionnez les trois contrôles (CTRL + A) et désolidarisez-les en cliquant sur « Supprimer » dans le menu « Réorganiser ». 3. Sélectionnez le seul contrôle ID_ELEVE et positionnez sa propriété Visible à Non. 4. Réduisez la taille du contrôle ID_ELEVE afin qu’il prenne le moins de place possible en haut à gauche du formulaire. 5. Modifiez la propriété Couleur fond de l’en-tête de formulaire, si elle est noire, pour qu’elle devienne blanche. Pour ce faire, cliquez sur le bouton à points de suspension de la propriété et choisissez la couleur désirée. 6. Dans l’en-tête de formulaire, insérez deux nouvelles étiquettes Matière et Moyenne. 7. Dans le corps de formulaire, modifiez la propriété Format du contrôle MoyenneDeNOTATION par Fixe (au lieu d’aucune propriété). 8. Modifiez la propriété Décimales du contrôle Moyenne DeNOTATION en sélectionnant 2 (au lieu d’aucune propriété) : la moyenne sera correctement présentée et non plus avec un trop grand nombre de décimales. 9. Modifiez la propriété Aligner le texte du contrôle MoyenneDeNOTATION en sélectionnant Droite (au lieu de Gauche). 10. Modifiez la propriété Afficher sélecteur du formulaire Frm_Moyennes1 en sélectionnant Non.

158

Access® 2007 et VBA

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

5

Chapitre

11. Modifiez la propriété Boutons de déplacements par Non. 12. Modifiez la propriété Barres de défilement par Aucune. 13. Insérez dans le Pied de formulaire une nouvelle zone de texte. 14. Modifiez l’étiquette par Moyenne générale. 15. Modifiez la propriété Source de données du nouveau contrôle par la formule : =Moyenne([MoyenneDeNOTATION]). 16. Modifiez les propriétés Format, Décimales, Aligner le texte et Epaisseur police respectivement par Fixe, 2, Droite et Gras. 17. Enregistrez le formulaire après ces modifications, afin qu’il ait l’aspect décrit à la figure 5.25. Figure 5.25 Sous-formulaire après modifications.

Déplacez et redimensionnez les zones de texte et le sous-formulaire afin de disposer l’ensemble de manière claire et harmonieuse. Les résultats, en mode création et en mode formulaire apparaissent aux figures 5.26 et 5.27. Figure 5.26

Exercices

Formulaire du deuxième exercice en mode création.

Les formulaires 159

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

Figure 5.27 Formulaire du deuxième exercice en mode formulaire.

EXERCICE 3

FORMULAIRE

• Énoncé

Élaborez un formulaire dépourvu de source de données ; une zone de liste déroulante doit permettre d’afficher tous les élèves et d’en sélectionner un. Au moment du choix de l’élève, l’utilisateur découvrira en dessous une zone de liste présentant les moyennes de l’élève.

* Solution

Cet exercice a le même objectif, apparemment, que le précédent : montrer la moyenne d’un élève. Il en diffère pourtant profondément. D’une part, les outils zone de liste déroulante et zone de liste ne sont pas les mêmes que les zones de texte et sous-formulaires utilisés précédemment mais, d’autre part, l’accès aux données s’opère par des voies totalement nouvelles. Dans l’exercice 2, l’utilisateur « remonte » du serveur de données la totalité des informations, table des élèves et table des notes : cette manière de faire, particulièrement lourde pour la charge réseau, n’est peut-être pas indispensable. Si l’utilisateur n’a besoin de connaître les résultats que d’un seul élève, à quoi bon lui livrer la totalité des données ?

AVEC ZONE DE LISTE ET RÉACTUALISATION

Il sera nécessaire, pour cet exercice, d’utiliser une macro, pour la première fois, mais de manière très limitée. Création du formulaire et de la zone de liste déroulante 1. Fermez toutes les fenêtres éventuellement ouvertes. 2. Dans le menu « Créer », cliquez sur « Création de formulaire » (on obtient une grille vierge, le formulaire étant dépourvu de toute source de données). 3. Enregistrez le formulaire sous le nom « Frm_Moyennes2 » avec pour légende Consultation des résultats. 4. Dans le menu « Réorganiser », cliquez sur l’icône du ruban tout à fait à droite en bas Afficher/masquer En-tête/Pied de formulaire.

160

Access® 2007 et VBA

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

5

Chapitre

5. Insérez une étiquette de titre Consultation des résultats. Pour cela revenez au menu « Création ». 6. Dans le menu « Création », cliquez sur le bouton « Zone de liste déroulante » et dessinez un rectangle en haut du formulaire. 7. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Je veux que la liste déroulante recherche les valeurs dans une table ou requête ». 8. À l’étape 2, choisissez la table « ELEVE ». 9. À l’étape 3, sélectionnez les trois champs « ID_ELEVE », « NOM_ELEVE » et « PRENOM_ELEVE » et insérez-les parmi les champs sélectionnés du pavé de droite. 10. À l’étape 4 choisissez le champ « NOM_ELEVE » pour établir un tri croissant. 11. À l’étape 5, laissez cochée la case colonne clé cachée et adaptez les largeurs de colonnes. 12. À l’étape 6 (dernière), nommez le contrôle ELEVE en lieu et place de NOM_ELEVE. 13. Modifiez la propriété Nom du contrôle par Choix_Eleve (au lieu de Modifiable0). Ce point est important car ce nom servira ultérieurement. 14. Testez le contrôle : il doit afficher les noms et prénoms de tous les élèves, sans les ID (la propriété Largeurs de colonnes du contrôle Zone de liste déroulante doit être à ). Le formulaire doit avoir l’aspect de la figure 5.28. Figure 5.28 Formulaire du troisième exercice avec la seule zone de liste déroulante.

• Le contenu du contrôle est une requête SQL dont le code est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE ORDER BY ELEVE.NOM_ELEVE; . À l’ouverture du formulaire, en conséquence, l’utilisateur ne génère aucune requête (ni donc de trafic réseau) ; à l’ouverture de la zone de liste déroulante, il lance une requête qui vise non pas la totalité de la table ELEVE, mais les seules données dont il a besoin. Il réduit par là le trafic réseau généré.

Exercices

Dans les propriétés de cette zone de liste déroulante, on notera les points suivants :

Les formulaires 161

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

• La propriété Colonne liée est fixée à 1, qui désigne la première colonne, non visible, de l’ID de l’élève. Quand l’utilisateur choisit un élève, le contrôle prend dès lors la valeur du numéro de l’élève désigné. Cette propriété nous sera utile. • La propriété Limiter à liste est positionnée à Oui : l’utilisateur ne peut pas entrer un nom qui n’existerait pas dans la liste. • La propriété Source de données est vide ; en d’autres termes, le contrôle n’est lié à aucune source de données indiquée dans le formulaire. Création de la zone de liste La zone de liste doit faire apparaître les moyennes des élèves : nous savons déjà comment créer une requête propre à effectuer ce calcul ; en revanche, il sera nécessaire, ici, d’ajouter une condition pour faire en sorte que les moyennes affichées correspondent à l’élève choisi dans la zone de liste déroulante supérieure. 1. En mode création, cliquez dans le ruban du menu « Création » sur le bouton « Zone de liste » puis dessinez un large rectangle sous la zone de liste déroulante déjà mise en place. 2. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Je veux que la liste déroulante recherche les valeurs dans une table ou requête ». 3. À l’étape 2, choisissez la table « NOTE » comme source des données : nous savons fort bien que cette table fournit l’intégralité des notes et non les moyennes, nous corrigerons ce point ultérieurement. 4. À l’étape 3, pointez les champs « ID_ELEVE », « ID_MATIERE » et « NOTATION », puis insérez-les dans le pavé des champs sélectionnés. Nous savons qu’il manque ici le libellé de la matière (qui se trouve dans une autre table), nous corrigerons ce point ultérieurement. 5. Négligez l’étape suivante qui permet de préciser d’éventuels tris. 6. À l’étape 5, maintenez la colonne clé cachée et les largeurs de colonnes définies par défaut. 7. Nommez à l’étape 6 l’étiquette du contrôle « Moyennes » puis cliquez sur « Terminer ». 8. Dans la feuille de propriété du contrôle qui vient d’être créé, modifiez la propriété Nom par Moyennes (et non Liste5). À ce stade d’avancement, le formulaire peut être visualisé ; on y constate que les deux contrôles sont fonctionnels, mais totalement indépendants l’un de l’autre : le premier montre tous les élèves mais un choix dans la liste n’a aucun effet particulier ; le second montre la liste intégrale de toutes les notes, tous élèves confondus. 1. Dans la feuille de propriétés du contrôle Moyennes, accédez à la requête de la propriété Contenu en cliquant sur le bouton aux trois points de suspension. 2. Ajoutez tout d’abord la table « MATIERE » manquante, grâce à l’icône Afficher table. 3. Supprimez la colonne « ID_MATIERE » inutile, ainsi que la colonne « ID_NOTE ». 4. Ajoutez le champ « NOM_MATIERE » avant la colonne NOTATION. 5. Cliquez sur le bouton « ∑ Totaux » pour faire apparaître la notion d’opération dans la requête et modifier l’Opération de la colonne NOTATION en Moyenne. Si on veut produire des moyennes avec un arrondi à la deuxième décimale, on peut affecter la zone Opération avec la valeur Expression (à la place de moyenne) et mettre

162

Access® 2007 et VBA

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

5

Chapitre

l’expression suivante dans la zone Champ : « MoyenneDeNOTATION:Round((Moyenne(NOTE.NOTATION));2) ». 6. Faites un clic droit sur la colonne NOTATION et sélectionnez Propriétés : la propriété Format de la colonne doit être mise à Fixe et la propriété Décimales à 2. 7. Testez la requête : elle doit renvoyer toutes les moyennes, élève par élève, ventilées par matières. 8. Dans la ligne Critères de la colonne ID_ELEVE, insérez la formule : [Formulaires]![Frm_Moyennes2]![Choix_Eleve] . Cette formule permet de préciser dans la requête la valeur de l’ID_ELEVE dont on veut afficher les moyennes. Elle est composée de trois parties séparées par des points d’exclamation et de la forme : [Formulaires]![Nom_du_formulaire]![Nom_du_contrôle]. 9. Le code SQL de la requête doit être, au final, SELECT NOTE.ID_ELEVE, MATIERE.NOM_ MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE GROUP BY NOTE.ID_ELEVE, MATIERE.NOM_MATIERE HAVING (((NOTE.ID_ELEVE)=[Formulaires]![Frm_ Moyennes2]![Choix_Eleve]));. La structure graphique doit être similaire à la figure 5.29. La requête ainsi générée par l’interface peut être sauvegardée et fermée pour revenir au formulaire. Figure 5.29 Requête de la zone de liste du troisième exercice.

Nouveau point sur le fonctionnement général du formulaire : apparemment le résultat est correct au premier affichage (si un élève était au préalable sélectionné). Malheureusement, le choix d’un autre élève ne provoque aucun changement dans la zone Moyennes en dessous. Pire, si le formulaire est fermé puis réouvert, le choix d’un élève laisse la zone Moyennes complètement vierge ! • À l’ouverture du formulaire, le contrôle Choix_Eleve ne comporte pas de valeur (aucun élève n’est sélectionné). • Simultanément, la requête du contrôle Moyennes est lancée : elle ne renvoie aucun enregistrement puisque la référence au contrôle Choix_Eleve est vide. • Au moment du choix d’un élève, la valeur du contrôle Choix_Eleve devient valide.

Exercices

Cette imperfection provient du déroulement des faits suivants :

Les formulaires 163

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

• En revanche, la requête qui détermine le contrôle Moyennes ayant déjà eu lieu, elle n’est pas relancée. Il ne manque donc plus qu’à monter un mécanisme pour relancer la requête à la source des données du contrôle Moyennes chaque fois que la zone de liste déroulante est mise à jour. Ce mécanisme doit s’associer à la zone de liste déroulante Choix_Eleve. 1. Sélectionnez la propriété Après MAJ du contrôle Choix_Eleve. 2. Cliquez sur le bouton aux trois points de suspension. 3. Choisissez « Générateur de Macros » et validez par « OK ». 4. À la première ligne, ouvrez la zone de liste déroulante et sélectionnez Actualiser. 5. En bas, dans la zone Nom du contrôle, saisissez « Moyennes ». Le résultat doit être conforme à la figure 5.30. Figure 5.30 Macro incorporée du troisième exercice.

6. Fermez et enregistrez la macro. 7. Testez le formulaire après l’avoir fermé puis réouvert : au départ, les deux contrôles doivent être vierges ; lors du choix d’un élève, les moyennes apparaissent. Finition du formulaire 1. La propriété Nombre de colonnes du contrôle Moyennes est fixé à 3. 2. La propriété Largeurs de colonnes du contrôle Moyennes est fixée à 1.

1. Vous aurez peut-être noté que, bien que la requête fixe explicitement le format des chiffres à deux décimales, la zone de liste subséquente ne tient pas compte de cette propriété. Il s’agit d’une erreur de programmation d’Access : le format des données dans les colonnes de la zone de liste ne sont pas déterminables. Nous utilisons donc ici la largeur de colonne comme subterfuge pour cacher le grand nombre de décimales des résultats.

164

Access® 2007 et VBA

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

5

Chapitre

3. La propriété Largeur du contrôle Moyennes est fixée à 4 cm. La grille finale aura un aspect similaire à celui représenté à la figure 5.31. Figure 5.31

Exercices

Résultat final du troisième exercice.

Les formulaires 165

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

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

6

Chapitre

Les états

1. Fonctionnement automatisé .... 168 2. Conception d’états, notion de regroupement ................... 170 Problèmes et exercices 1. État des notes des élèves ........ 174

Il est toujours possible d’imprimer des formulaires. Mais là n’est pas leur destination première. Les formulaires sont conçus pour la visualisation des données, non leur impression. Access dispose pour ce type d’édition d’une option spécifique, dotée d’outils particuliers, les états. Le programmeur ne doit pas négliger cet aspect fondamental des états imprimés lors de la mise en œuvre d’une application : même si la dématérialisation des documents devient de plus en plus courante, les impressions conservent une force probante.

167

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

(1)

Fonctionnement automatisé À l’image des formulaires, les états utilisent les mêmes sources de données : tables directes ou requêtes. Comme pour les formulaires, il sera préférable de monter des requêtes spécifiques à chaque état plutôt que d’utiliser les tables directement. En revanche, et à l’inverse des formulaires, un état nécessite impérativement des données dès l’ouverture de l’état : il n’est pas possible de faire intervenir des contrôles tels que les zones de liste. Pour un premier essai, nous utiliserons les automatismes d’Access afin de tester les fonctionnalités du programme : 1. Ouvrez la base de données des « Codes Postaux ». 2. Dans le volet de navigation, mettez la table « CODE_POSTAL » en surbrillance. 3. Dans le menu « Créer », cliquez sur l’icône Etat. 4. Le programme construit un état. Le document est présenté avec les standards de toute impression : en haut à droite apparaissent la date et l’heure de l’impression. Il est visualisable comme un formulaire, mais non pas comme une impression. 1. Cliquez sur le triangle en bas de l’icône Affichage. 2. Sélectionnez l’option Aperçu avant impression. 3. Le document apparaît tel qu’il sera imprimé, avec le montage des pages prévu (Access ne calcule pas immédiatement le nombre de pages à imprimer, ici 217). 4. Chaque page reprend l’intitulé des colonnes afin de rendre l’état compréhensible, quelle que soit la page. 5. La visualisation se fait sur une page et une seule : l’aperçu est donc différent de celui de Word ou Excel, qui regroupent l’état en un seul document. 6. Une nouvelle barre d’icône supérieure permet de régler les paramètres d’impression (voir figure 6.1).

Figure 6.1 Menu de l’aperçu avant impression.

Les boutons Taille, Portrait, Paysage et Marges sont des raccourcis du bouton Mise en page qui détaille précisément chacun de ces paramètres. • Les marges sont exprimées en millimètres. Il est maladroit de chercher à réduire excessivement les marges : outre des messages erreurs systématiques, l’impression est conditionnée de toute façon par les capacités de l’imprimante. Afin de s’adapter à toutes les imprimantes du marché, il est plus judicieux de ne pas descendre en deçà de 5 mm. • L’orientation dépendra du format des tableaux à présenter : tous les calculs d’impression se font sur la base du papier généralement utilisé : en Europe, il s’agit du format A4 alors qu’aux États-Unis le format Lettre US est le standard (réglages à préciser dans les Paramètres Régionaux du panneau de configuration Windows). • En vue d’économiser du papier, il est possible de multiplier les colonnes. Dans le cas présent, le nombre de colonnes est fixé à 1 mais dans la mesure où les seules données à

168

Access® 2007 et VBA

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

6

Chapitre

imprimer occupent peu de place en largeur, ce chiffre peut être monté à 2, réduisant de moitié le nombre de feuilles nécessaires ! 1. Sans même disposer d’Adobe Acrobat Writer, il est possible, avec la version 2007 d’Access, d’imprimer vers un fichier PDF. Il est nécessaire toutefois de télécharger un complément Microsoft en accédant au site www.microsoft.com/downloads/Search.aspx?displaylang=fr dans la famille des produits Office (voir figure 6.2). Figure 6.2 Téléchargement du complément Microsoft Office 2007.

Nativement, Access peut exporter les impressions vers Word (fichier RTF) ou vers un fichier XML ou HTML. 1. Fermez l’Aperçu avant impression. 2. Revenez au menu Format de l’état. Dans la partie droite du ruban, Access propose des mises en forme automatiques comme le montre la figure 6.3. Figure 6.3 Options de mise en forme automatique.

La mise en forme automatique peut être accompagnée de mises en forme conditionnelles, particulièrement utiles dans certains cas : 1. Cliquez sur le bouton « Mise en forme conditionnelle ». 2. Dans le pavé Condition 1 de la mise en forme conditionnelle, cliquez dans la zone de liste déroulante et sélectionnez Expression. 3. Dans la zone de l’expression insérez la formule : Droite([CODE];3)="000". 4. Cliquez sur le bouton « Gras » et la police de caractère coloriée en rouge, par exemple. Grâce à cette mise en forme, toutes les préfectures seront imprimées en rouge et en gras alors que les autres bureaux distributeurs resteront en police normale.

1. Un réglage de la largeur des zones à imprimer est à réaliser manuellement suivant des modalités que nous verrons plus loin.

Les états 169

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

(2)

Conception d’états, notion de regroupement Comme pour les formulaires, et à moins de particularités, il est plus rapide de générer automatiquement un état et de le modifier que de partir d’une matrice vierge. Afin d’illustrer la fonction de regroupement et d’étudier la conception des états, nous envisagerons d’imprimer un document qui fournit la liste des bureaux distributeurs, département par département. Commençons par créer la requête à la source de l’état : 1. Créez une requête appelant la table « CODES_POSTAUX ». 2. Insérez les champs « CODE » et « VILLE ». 3. Ajoutez une troisième colonne nommée « DEPARTEMENT » dont la formule est Gauche([CODE];2). 4. Ajoutez le critère suivant à la colonne DEPARTEMENT : « Comme[Indiquez un numéro de département ou tapez *] ». La requête, dont le code SQL est SELECT CODES_POSTAUX.CODE, CODES_POSTAUX.VILLE, Left([CODE],2) AS DEPARTEMENT FROM CODES_POSTAUX WHERE (((Left([CODE],2)) Like [Indiquez un numéro de département ou tapez *])); aura la structure graphique de la figure 6.4.

Figure 6.4 Requête paramétrée des codes postaux par département.

Rappel : la citation entre crochets dans la zone des critères génère une requête dite paramétrée qui ouvre une boîte de dialogue destinée à l’utilisateur. Le mot-clé « Comme » placé avant la citation entre crochets permet de faire intervenir le « joker » « * » pour montrer tous les départements. 5. Enregistrez la requête sous le nom « Req_Codes_Dpts ». 6. Fermez la requête tout en la laissant en surbrillance dans le volet de navigation. 7. Dans le menu « Créer », cliquez sur l’icône Etat : le message de demande du département apparaît, appuyez sur la touche *. 8. Le nouveau document est immédiatement généré. Cette impression n’est pas satisfaisante : on souhaite un état qui s’interrompe à chaque département, imprime un compte du nombre de bureaux distributeurs et n’imprime pas la troisième colonne. On veut en outre que, pour chaque département, les enregistrements soient triés par ordre alphabétique de ville.

170

Access® 2007 et VBA

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

6

Chapitre

9. Cliquez sur l’icône Affichage en haut à gauche et sélectionnez le « Mode Création » ; le document apparaît tel qu’à la figure 6.5. Figure 6.5 État en mode création.

Le dessin général de l’état en mode création ressemble beaucoup à celui des formulaires. On y retrouve les En-tête et Pied déjà vus, auxquels s’ajoutent ici un En-tête de page et un Pied de page. Ces deux derniers éléments contiennent les libellés (ou formules ou données) qui se répètent à chaque page imprimée ; dans le cas présent, les libellés CODE, VILLE et DEPARTEMENT sont inclus dans l’en-tête de page alors que le pied de page comprend une formule destinée à la pagination (sous la forme Page X sur Y pages). L’entête d’état, enfin, contient une formule destinée à imprimer la date et l’heure en cours. 1. Cliquez sur le bouton « Regrouper et Trier » du ruban : une fenêtre s’ouvre en bas d’écran. 2. Cliquez sur le bouton « Ajouter un groupe ». 3. Une nouvelle zone d’en-tête de groupe DEPARTEMENT dans l’état s’est insérée en dessous de l’en-tête de page. 4. Cliquez sur le champ DEPARTEMENT qui est apparu dans une nouvelle fenêtre en bas. 5. Dans la fenêtre inférieure, un bandeau jaune est apparu, cliquez sur Plus. 6. Cliquez sur la zone de liste déroulante voisine de Avec un total de CODE. 7. Le type Compter les valeurs sur cette zone CODE est par défaut le bon. 8. Cochez la case Afficher dans le Pied de page de groupe : un pied de page de groupe apparaît avec une formule de Compte(). 9. Cliquez sur le champ DEPARTEMENT dans la zone Détail. 10. Appuyez sur Ctrl + X (pour le couper). 11. Cliquez sur l’en-tête de groupe et utilisez la combinaison Ctrl + V (pour le coller). 12. Ajoutez une étiquette Département dans l’en-tête de groupe (l’étiquette d’origine a disparu lors du couper-coller). 13. Un « smart tag » ou message d’anomalie (triangle vert en haut à gauche de la zone d’étiquette) est apparu : cliquez sur le losange jaune et associez l’étiquette à la zone de texte voisine. 14. Dans le bandeau inférieur, cliquez sur Ajouter un tri.

Les états 171

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

15. Sélectionnez le champ VILLE pour que les villes soient triées par ordre alphabétique. La liste globale va donc afficher tous les départements en commençant par 01 pour finir par 98 mais, à l’intérieur de chaque département, les enregistrements seront triés par ordre alphabétique de ville. L’ordonnancement qui vient d’être mis en place n’est nullement le résultat de tris ou de sous-totalisations dans la requête source des données, mais bien l’effet de la structure de l’état lui-même. En définitive, il doit avoir la structure présentée à la figure 6.6. Figure 6.6 État avec sous-totaux.

Il est possible de créer autant de groupes qu’il existe de champs dans la source de données. On prendra garde, pourtant, à ne pas multiplier à l’infini cette notion de rupture dans les impressions. Toutes les formules, tous les mots-clés utilisés dans les contrôles Zone de texte des formulaires restent identiques dans les états. L’utilisation d’une étiquette comme d’un texte complet permet d’envisager le montage de publipostages dans Access même, sans autre outil : les coordonnées des destinataires seraient gérées comme tout autre champ en haut à droite de la page et le texte mis en place dans autant d’étiquettes qu’il y aurait de paragraphes. Mais cette démarche nous paraît hasardeuse : il serait impossible d’insérer des champs variables au sein même des textes et surtout, il serait impossible de gérer les largeurs de zones. Il est infiniment plus efficace de faire le mailing dans Word en appelant les données stockées dans la base Access. Inversement, Access s’adapte parfaitement bien à l’impression des documents à structure fixe comme les factures. Contrairement aux formulaires, enfin, les enregistrements imprimés dans un état peuvent être numérotés pour établir des références précises : 1. Dans l’état des codes postaux ci-dessus, en mode création, décalez les champs CODE et VILLE vers la droite de 2 carreaux (si les zones de texte sont restées solidaires, l’ensemble des zones se décale simultanément). 2. Dans l’en-tête de page, ajoutez une étiquette N˚ de ligne. 3. Dans le détail, ajoutez une zone de texte vierge et retirez le texte de son étiquette. 4. Dans la feuille de propriétés de la nouvelle zone, entrez la formule « =1 » à la propriété Source contrôle.

172

Access® 2007 et VBA

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

6

Chapitre

5. Dans la même feuille de propriétés, positionnez la propriété Cumul à Par Groupe (au lieu de Non). Le résultat final de l’état doit correspondre à celui de la figure 6.7. Figure 6.7 Résultat de l’état « Bottin des codes postaux » avec numérotation des lignes.

Résumé Access a conçu l’impression des données par la génération d’états dont l’essentiel des règles est régi de la même manière que les formulaires. La source des données sera, la plupart du temps, fournie par une requête spécifique dont on exclura tout tri ou sélection spécifique ; en effet, Access permet de mettre en place dans les états des ruptures d’édition (avec ou sans sous-totaux) et des tris qui font du générateur d’états un outil particulièrement performant. Inadapté aux mailings, l’état Access correspond très bien, en revanche, aux besoins des gestionnaires et commerciaux (listings, factures, etc.).

Les états 173

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

Problèmes et exercices EXERCICE 1

ÉTAT

DES NOTES DES ÉLÈVES

Le seul exercice de ce chapitre porte sur les données contenues dans la base ECOLE_ INTERNATIONALE. Il met en œuvre, simultanément, les connaissances acquises sur les formulaires et les états.

• Énoncé

Mettez en place un formulaire doté d’une zone de liste déroulante proposant tous les élèves ; un clic sur un bouton d’impression dans le même formulaire lancera l’aperçu avant impression du « carnet de notes » de l’élève choisi avec toutes les moyennes ; il doit apparaître, en sus, une moyenne des langues vivantes.

* Solution

Le formulaire demandé est un classique de la programmation : il s’agit d’une fenêtre de paramètres d’impression qui s’ouvre uniquement au moment d’une demande d’édition ; on parle de boîte de dialogue modale. La notion de filtre sur état servira à afficher l’élève sélectionné dans la zone de liste déroulante Création de la boîte de dialogue modale 1. Dans le menu « Créer », cliquez sur l’icône Plus de formulaires. 2. Sélectionnez Boîte de dialogue modale : un formulaire vierge est créé. En le passant en mode formulaire, on constate qu’il s’agit d’une fenêtre dépourvue de boutons de dimension en haut à droite (sauf la croix de fermeture) et que deux boutons d’actions sont déjà insérés en bas (OK et annuler). Les propriétés Fen Modale et Fen indépendante du formulaire sont positionnées à Oui, contrairement aux formulaires habituels où ces deux propriétés sont positionnées à Non. La fenêtre a l’aspect présenté à la figure 6.8. 3. Enregistrez la boîte de dialogue modale sous le nom « Frm_Choix_Eleve » et renseignez la propriété Légende du formulaire par « Choix d’un élève », libellé qui apparaîtra dans la barre bleue supérieure du formulaire 1. 4. Insérez une zone de liste déroulante dans le formulaire. 5. À l’étape 1, conservez l’option par défaut de source des données (table). 6. À l’étape 2, choisissez la table « ELEVE ».

1. On remarquera que l’affichage de la boîte de dialogue en mode création ne peut pas être obtenu avec le bouton haut gauche du ruban de création ; il est nécessaire de faire un clic droit sur l’objet dans le volet de navigation et de sélectionner « Mode Création ».

174

Access® 2007 et VBA

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

6

Chapitre

Figure 6.8 Boîte de dialogue modale vierge.

7. À l’étape 3, faites glisser les trois champs « ID_ELEVE », « NOM_ELEVE », « PRENOM_ELEVE » dans le pavé des champs sélectionnés. 8. Ne vous arrêtez pas à l’étape 4 de la mise en place de tris. 9. Conservez la colonne clé cachée à l’étape 5. 10. Nommez l’étiquette de la zone de liste déroulante « Choix d’un élève » à la dernière étape. 11. En mode création, nommez le contrôle de Zone de liste déroulante « Choix_eleve » dans les propriétés (ce point est important car le nom du contrôle sera nécessaire par la suite).

1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ». 2. Affichez les tables « ELEVE », « MATIERE » et « NOTE ». 3. Insérez les champs « ID_ELEVE », « NOM_ELEVE », « PRENOM_ELEVE », « NOM_MATIERE », « NOTATION ». 4. Cliquez sur le bouton « ∑ Totaux ». 5. Conservez l’opération Regroupement pour tous les champs de la requête sauf pour NOTATION où la fonction Moyenne doit être sélectionnée. 6. La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN (ELEVE INNER JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE) ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE

Exercices

Création de la requête à la source de l’état La requête qui appelle les informations nécessaires à l’état est conçue pour renvoyer toutes les données (alors qu’un seul élève donnera lieu à impression) et dépourvue de tout tri : ces opérations se feront en aval.

Les états 175

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

GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE;, doit avoir la structure présentée à la figure 6.9.

Figure 6.9 Requête Req3_ Moyennes de l’exercice 6-1.

Enregistrez la requête sous le nom « Req3_Moyennes » (si les exercices des chapitres précédents ont été faits, il existe déjà une requête Req1_Moyennes et une requête Req2_ Moyennes). Création de l’état 1. Fermez toutes les fenêtres en cours et positionnez la surbrillance du volet de navigation au-dessus de la requête source Req3_Moyennes. 2. Dans le menu « Créer », cliquez sur l’icône Assistant État. 3. À la première étape, déplacez tous les champs du pavé champs disponibles au pavé champs sélectionnés. 4. À la deuxième étape, indiquez à Access un niveau de regroupement en cliquant sur la flèche vers la droite pour insérer le champ ID_ELEVE comme niveau. L’assistant doit avoir la configuration indiquée à la figure 6.10. Figure 6.10 Niveaux de regroupement dans l’assistant États.

176

Access® 2007 et VBA

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

6

Chapitre

5. Dans la troisième étape, n’indiquez pas d’ordre de tri, mais cliquez sur le bouton « Options de synthèse ». Cochez la case Moyenne pour demander à programmer une moyenne générale pour l’élève. 6. Dans les deux étapes suivantes, choisissez le style de formulaire qui vous convient le mieux. 7. Indiquez le titre « Résultats » pour l’état à la dernière étape. L’effet obtenu n’est pas totalement satisfaisant : • Le regroupement est correct (ID_ELEVE par ID_ELEVE), mais l’état répète le nom et le prénom de chacun autant de fois qu’il existe de matières : ceci est dû au fait que le regroupement s’effectue sur le seul ID et non pas sur le triplet ID-NOMPRENOM. • Les moyennes par matière apparaissent sous la forme ########## car la zone n’est pas suffisamment large. • Le libellé « Synthèse pour ID_ELEVE… » n’est pas très heureux. Procédons aux perfectionnements nécessaires en mode création : 1. Sélectionnez l’ensemble des étiquettes contenues dans l’en-tête de page, puis, dans le menu « Réorganiser », cliquez sur Supprimer (les étiquettes se désolidarisent des zones de texte placées dans le Détail). 2. Supprimez toutes les étiquettes de l’en-tête de page en appuyant sur « Sup ». 3. Réduisez la hauteur de la zone En-tête de page afin qu’elle devienne invisible. 4. Déplacez le champ NOM_ELEVE de la zone Détail à la zone En-tête de groupe. 5. Déplacez le champ PRENOM_ELEVE de la zone Détail à la zone En-tête de groupe. 6. Mettez les deux champs précédents en Gras. 7. Déplacez les champs MATIERE et MoyenneDeNOTATION pour les placer en milieu d’état. 8. Élargissez le champ MoyenneDeNOTATION. 9. Positionnez les propriétés du champ MoyenneDeNOTATION Format et Décimales respectivement à Fixe et 2. 10. Dans le pied de groupe, supprimez le libellé automatique de synthèse pour ne conserver que la moyenne générale et son libellé.

Exercices

11. Modifiez les propriétés du champ de Moyenne générale dont la propriété Source est =Moyenne([MoyenneDeNOTATION]) : les propriétés Format et Décimales doivent être respectivement à Fixe et 2.

Les états 177

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

L’état des résultats doit avoir la structure décrite à la figure 6.11. Figure 6.11 Structure de l’état des résultats après modifications.

Mise en place du passage du formulaire à l’état et du filtre La boîte de dialogue modale et l’état étant prêts, il ne reste plus qu’à lier les deux éléments en insérant dans le même temps la notion de filtre. 1. Ouvrez la boîte de dialogue modale « Frm_Choix_Eleve » en mode création (clic du bouton droit dans le volet de navigation sur l’élément et sélection du « Mode Création »). 2. Ouvrez la feuille de propriété du contrôle Bouton de commande nommé OK. 3. Sélectionnez la propriété SurClic (qui contient déjà une macro incorporée) et cliquez sur le bouton aux trois points de suspension. 4. La macro ne contient qu’une ligne avec le mot-clé « Fermer » pour action : nous allons insérer une ligne avant cette action. 5. Faites un clic droit à gauche de la première ligne et sélectionnez Insérer des lignes : une ligne blanche se positionne au-dessus de l’action Fermer. 6. Ouvrez la zone de liste déroulante dans la colonne Action et sélectionnez OuvrirEtat. 7. Dans la zone inférieure de l’écran, précisez le nom de l’état Résultats en le pointant dans la zone de liste déroulante Nom de l’état. 8. Toujours en bas d’écran, insérez la condition WHERE suivante : [ID_ELEVE]=[Formulaires]![Frm_Choix_Eleve]![Choix_Eleve] . Dans cette expression, le premier ID_ELEVE entre crochets renvoie à celui de l’état pendant que la partie droite de l’équation utilise une structure déjà étudiée au chapitre précédent : le mot-clé Formulaires entre crochets désigne la collection d’objets de ce type, [Frm_Choix_ Eleve] désigne le formulaire ciblé (la boîte de dialogue modale) et [Choix_Eleve] désigne le contrôle. 9. Précisez les propriétés de l’action Fermer de la deuxième ligne : le type d’objet à renseigner en bas d’écran est un Formulaire et le nom de l’objet est Frm_Choix_Eleve.

178

Access® 2007 et VBA

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

6

Chapitre

La macro doit avoir la structure décrite à la figure 6.12. Figure 6.12 Macro incorporée du contrôle OK de la boîte de dialogue modale.

Exercices

10. Fermez la macro et enregistrez les modifications. 11. Testez le programme : à l’ouverture de la boîte de dialogue modale, sélectionnez un élève et cliquez sur « OK », l’état s’ouvre automatiquement et n’affiche que l’élève sélectionné : l’impression peut être lancée. Remarque : la boîte de dialogue se ferme automatiquement, dès que le paramètre de choix de l’élève a été renvoyé à l’état.

Les états 179

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

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

7

Chapitre

Les macros

1. Mise en œuvre des macros..... 182 2. Le passage des macros à Visual Basic........................ 189 Problèmes et exercices 1. Macro insérée dans une zone de liste.................................. 194 2. Macro d’envoi de messages électroniques......................... 199

Déjà abordées rapidement, les macros d’Access permettent l’automatisation d’actions successives, éventuellement sous condition. Fondamentalement différentes de celles d’Excel, les macros Access n’enregistrent pas les gestes faits par l’utilisateur, mais doivent au contraire être « composées » par l’entrée d’actions et la mise en place de paramètres à ces actions. Les macros Access ne sont pas traduites immédiatement en langage Visual Basic : il faut mettre en œuvre un utilitaire spécifique pour effectuer cette traduction. Les macros n’en restent pas moins un excellent moyen de passer graduellement d’une automatisation partielle à une utilisation du code de programmation.

181

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

(1)

Mise en œuvre des macros Les quelques macros qui ont été vues dans les chapitres précédents, uniquement destinées à parachever un exercice particulier, ont été chaque fois incorporées dans le formulaire ou l’état, plus précisément sous la propriété de l’événement à partir duquel elles étaient lancées. À présent, notre étude va porter sur la conception de macros enregistrées comme telles et non incorporées.

1.1 CRÉATION

DE MACRO

La première succession d’événements programmés que nous allons écrire consiste à afficher une boîte de message puis ouvrir la table CODE_POSTAL de la base du même nom et enfin d’exporter cette table vers un nouveau fichier Excel. 1. Dans l’onglet Créer, cliquez sur le triangle placé dans l’icône Macro, à droite, et sélectionnez Macro (les deux autres éléments, que nous verrons plus loin, accèdent directement à Visual Basic). 2. Une nouvelle fenêtre s’ouvre, similaire à celle de la figure 7.1. Figure 7.1 Grille de saisie des macros.

Commentaire de la grille de saisie : • En haut d’écran, un ruban dont on étudiera le détail dans les pages qui viennent. • Dans le corps du document, une liste de lignes pouvant contenir des Actions qui se dérouleront successivement. • En bas, et synchronisés avec la ligne active, les arguments de l’action sélectionnée. Ces arguments varient suivant le type d’action choisi. • Dans la partie de droite, chaque action peut recevoir un commentaire : nous ne saurions que trop recommander la saisie de textes permettant de documenter l’application en cours d’élaboration.

182

Access® 2007 et VBA

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

7

Chapitre

L’ouverture de la zone de liste déroulante de l’action permet de lire une trentaine d’actions possibles, mais si l’on clique sur le bouton du ruban Afficher toutes les actions, la palette complète comprend alors 70 types d’actions programmables. 1. À la première ligne, sélectionnez l’action BoîteMsg. 2. Dans la partie inférieure de l’écran, renseignez le message par « La table des codes postaux va s’ouvrir » ; conservez la propriété Bip à Oui ; choisissez le Type comme Point d’exclamation ; indiquez le Titre : « Ma première macro ». 3. À la deuxième ligne, sélectionnez l’action OuvrirTable. 4. Parmi les arguments, sélectionnez la table « CODE_POSTAL » comme Nom de la table. 5. Précisez l’argument Affichage en Feuille de données et l’argument Mode données en Lecture seule. 6. Sur une troisième ligne, insérez l’action TransférerFeuilleCalcul. 7. L’argument Type de transfert doit être positionné à Exportation (au lieu de Importation par défaut). 8. L’argument Type de feuille de calcul doit être positionné à Excel Workbook (pour une exportation vers un fichier Excel 2007). 9. Le nom de la table à exporter est « CODE_POSTAL » (on remarquera qu’Access ne propose pas de zone de liste déroulante). 10. Le chemin complet et le nom du fichier doivent tous être indiqués pour une exportation valide ; on entrera un chemin du type C:\Users\Utilisateur1\Desktop\CODE_ POSTAL.XLSX 1. 11. Les deux derniers arguments de l’action TransférerFeuilleCalcul peuvent être laissés en l’état. 12. Sur une quatrième et dernière ligne insérez une nouvelle BoîteMsg avec pour Message, « Le fichier a été exporté vers Excel », pour Type, Aucun et Titre, Ma première macro. 13. Fermez la macro et enregistrez-la sous le nom « Mcr_Visu_Codes »2. Testez votre macro, apparue dans le volet de navigation : la boîte de message s’ouvre puis, après un clic sur OK, laisse la place à la table en mode feuille de données et lecture seule. L’exportation se réalise sans même qu’aucun effet visuel n’en découle et le message de bon envoi s’affiche pour terminer.

1.2 ASSOCIATION D’UNE

MACRO À UN BOUTON

La macro qui a été créée dans le paragraphe précédent peut être lancée depuis le volet de navigation, mais il est fréquent que les macros soient associées à un formulaire et un bouton donnés. 1. Dans le menu « Créer », cliquez sur l’icône Création de formulaires (une grille vierge de formulaire apparaît). 2. Cliquez sur l’icône Bouton de commande du ruban et dessinez un carré en bas d’écran. 1. Ce chemin, qui s’apparente à une structure de fichiers Windows Vista, permet de copier les données sur le bureau de l’utilisateur appelé Utilisateur1 dans un fichier Excel 2007. 2. Certains programmeurs préfixent leurs macros par Mac_xxx.

Les macros 183

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

3. Dans la première étape de l’assistant, sélectionnez l’action Exécuter une macro parmi les options de la catégorie Divers. 4. Dans la deuxième étape, choisissez la macro Mcr_Visu_Codes. 5. Choisissez l’apparence que vous préférez dans la troisième étape. 6. Nommez le bouton « Visu_codes » dans la quatrième et dernière étape. 7. Testez ce bouton en passant en mode formulaire : les quatre opérations programmées plus haut se déroulent de la même manière.

1.3 UTILISATION

DE VARIABLES DANS LES MACROS

Avec Access 2007, il est désormais possible de faire jouer des variables dans les macros, ce qui élargit considérablement la portée de cet outil par rapport aux versions antérieures qui en étaient dépourvues. Une variable est une donnée (de type alphanumérique mais non de type date ou autres) conservée en mémoire jusqu’à ce qu’une commande précise de macro ne la supprime. Le principe d’Access veut qu’on affecte simplement une valeur à une variable pour qu’elle soit créée et utilisable. On se propose ici de créer une macro qui : • Ouvre une boîte de message pour demander à l’utilisateur un nom de ville. • Recherche dans la table des codes postaux le code correspondant à la ville demandée. • Affiche une boîte de message réponse. Dans la mesure où il existe plusieurs étapes à cette opération (entrée de la demande, recherche et affichage de la réponse), il est impossible de la réaliser sans faire appel à des informations stockées quelque part (valeur demandée et valeur de réponse) : le support de stockage aurait pu être un formulaire ou un état mais, dans le cas présent, toute l’opération doit se dérouler sans aucun support sinon la macro elle-même ; dès lors, seules des variables peuvent répondre à cette attente. 1. Dans le menu « Créer », cliquez sur Macro. 2. Sur la première ligne, choisissez l’action DéfinirVarTemp qui crée une variable et lui affecte une valeur. 3. Dans les arguments, nommez la variable « VilleRecherche ». 4. Dans les arguments, saisissez en Expression la formule : « BEntrée("De quelle ville voulez-vous connaître le code postal ?")  ». La fonction BEntrée crée une boîte de dialogue qui permet à l’utilisateur de saisir la valeur de la variable. Le texte entre guillemets est le texte qui apparaîtra dans la boîte de dialogue. 5. La deuxième ligne utilise la fonction RechDom, déjà étudiée, pour déterminer la valeur d’une deuxième variable : choisissez l’action DéfinirVarTemp une nouvelle fois sur cette ligne. 6. Dans les arguments, nommez la variable « CodeTrouve ». 7. Dans les arguments, saisissez en Expression la formule : « RechDom("[CODE]";"CODE_ POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'")  ». On prendra garde à la syntaxe de cette formule relativement complexe et fréquemment retrouvée. En premier lieu, la formule ne commence pas par le signe égal (=). Les trois parties de la fonction RechDom sont cernées par des guillemets ; le premier argument désigne la colonne de la recherche et est cerné par des crochets ; le deuxième argument désigne

184

Access® 2007 et VBA

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

7

Chapitre

la table ciblée et ne nécessite pas de crochets ; le troisième argument, qui désigne les conditions de la recherche, concatène (signe & ou perluète) plusieurs parties : • le champ VILLE est cité entre crochets et guillemets mais une apostrophe (quote simple) est insérée en outre avant le dernier guillemet ; cette apostrophe sert à citer la variable décrite après comme une chaîne de caractère ; • la variable VilleRecherche qui avait été initialisée dans la ligne précédente est désignée par le mot-clé VarTemp entre crochets, suivi d’un point d’exclamation et du nom de variable encore une fois entre crochets ; • une dernière partie comprend une apostrophe entre deux guillemets pour fermer la chaîne de caractères ouverte après VILLE. En admettant que la valeur de la variable soit PARIS, la formule s’écrirait RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='PARIS') . 8. Sur une troisième ligne de macro, sélectionnez l’action BoîteMsg. 9. Parmi les arguments, entrez pour message la formule « ="Le code de " & [VarTemp]![VilleRecherche] & " est " & [VarTemp]![CodeTrouve]  ». Ici, le message doit être précédé du signe = pour que la concaténation soit effective (un texte littéral apparaîtrait si le signe = était omis). 10. Une quatrième et dernière ligne supprime les variables et leur contenu (mesure indispensable pour éviter des problèmes en cas de réutilisation des variables) : insérez l’action SupprimerToutesVarTemp qui ne comprend aucun argument. Au total, la macro, qu’on enregistra sous le nom « Mcr_Recherche_Code », aura l’aspect de la figure 7.2. Figure 7.2 Macro de recherche de code postal en mode création.

L’exécution de la macro provoque le scénario suivant : Étape 1 : une boîte de dialogue demande à l’utilisateur de nommer la ville dont le code postal est recherché, comme il apparaît à la figure 7.3. Figure 7.3 Première étape de la macro de recherche de code postal.

Les macros 185

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

Étape 2 : une deuxième boîte de dialogue donne la réponse à l’utilisateur, comme indiqué sur la figure 7.4. On notera que la recherche proprement dite n’a pas donné lieu à un affichage particulier. Figure 7.4 Deuxième étape de la macro de recherche de code postal.

1.4 LES

MACROS CONDITIONNELLES Dans l’application précédente, le programme ne prévoit pas le cas où la ville entrée dans la boîte de dialogue initiale n’existe pas. Si par exemple, et à la suite d’une faute d’orthographe, la ville de PAROS est demandée, à la place de PARIS, le programme répond simplement « Le code de PAROS est » sans plus de commentaire. Pour éviter ce problème, on peut écrire une macro conditionnelle, qui prévoira cette éventualité. 1. Ouvrez à nouveau, si nécessaire, la macro en mode création. 2. Dans le ruban, cliquez sur le bouton « Conditions » : une colonne Condition apparaît dans le corps de la macro, à gauche des Actions. 3. Faites un clic droit dans la marge de la troisième ligne et sélectionnez Insérer des lignes : une ligne blanche se crée en dessous de la deuxième définition de variable. 4. Dans la colonne Condition de la nouvelle ligne, insérez la formule : « EstNull([VarTemp]![CodeTrouve]) » qui signifie littéralement « Si la variable CodeTrouve est vide » (autrement dit : si la recherche n’a pas abouti). 5. Dans la colonne Action de la même ligne, sélectionnez l’action BoîteMsg avec pour argument Message : « Cette ville n’est pas répertoriée dans la table », pour argument Type : le point d’exclamation et pour argument Titre : Recherche de code postal. Cette nouvelle ligne de programme, qui « contourne » la trajectoire directe de la macro initiale, n’est pas suffisante. Si les modifications se limitent à cette seule ligne, le programme va effectivement renvoyer le message erreur si ce dernier s’applique, mais il va continuer en donnant tout de même une réponse écourtée et inexacte (testez ce cas de figure). Il faut donc non seulement renvoyer le message erreur mais aussi obliger le programme à s’arrêter en cas d’erreur. 6. Insérez une nouvelle ligne en dessous du message erreur. 7. Saisissez trois points dans la colonne Condition de la nouvelle ligne : cette syntaxe indique à Access que la condition de la ligne précédente continue à s’appliquer. 8. Sélectionnez l’action SupprimerToutesVarTemp. 9. Insérez une nouvelle ligne en dessous. 10. Saisissez trois points dans la colonne Condition.

186

Access® 2007 et VBA

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

7

Chapitre

11. Sélectionnez l’action ArrêtMacro dans la colonne Action. Dans cette nouvelle rédaction, la macro implique bien deux voies possibles (voir figure 7.5) : • Soit la variable est vide et donc le programme renvoie un message erreur, s’arrête et détruit les variables en cours ; • Soit la variable n’est pas vide, les trois lignes du milieu ne sont pas exécutées, la réponse est affichée puis le programme détruit les variables. Figure 7.5 Macro conditionnelle.

1.5 LES

ENCHAÎNEMENTS DE MACROS Les macros peuvent être chaînées entre elles, de manière conditionnelle ou non ; on peut alors mettre en place des programmes complets, réutilisables en divers endroits de l’application. Afin d’illustrer cette fonctionnalité, nous emploierons de nouveau les macros Mcr_Visu_ Codes et Mcr_Recherche_Code développées précédemment. 1. Dans le menu « Créer », cliquez sur le bouton Macro. 2. Sur la première ligne, définissez une variable nommée « Choix » et dont l’expression est la formule : BEntrée("Tapez 1 pour visualiser les codes, 2 pour en rechercher un précis"). Le choix entre l’option 1 et l’option 2 orienteront le programme vers l’une ou l’autre des deux macros déjà créées. 3. Cliquez sur le bouton Conditions. 4. Sur la deuxième ligne, insérez la condition [VarTemp]![Choix]=1. 5. Sur la même deuxième ligne, sélectionnez l’action ExécuterMacro et citez Mcr_Visu_ Codes dans l’argument du Nom de macro. 6. Sur la troisième ligne, insérez la condition [VarTemp]![Choix]=2. 7. Sélectionnez l’action ExécuterMacro et citez Mcr_Recherche_Code dans l’argument du Nom de macro 1. 8. Enregistrez la nouvelle macro sous le nom « Mcr_Choix » (voir figure 7.6).

Figure 7.6 Macro appelant d’autres macros.

1. On notera que l’action ExécuterMacro comporte un argument de répétition. Il est possible, avec cette option, d’insérer une notion de boucle dans les programmes.

Les macros 187

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

1.6 LA

GESTION DES ERREURS DANS LES MACROS Une procédure particulière est prévue pour gérer les erreurs système qui peuvent intervenir dans les macros. Dans le programme de recherche d’un code postal, une erreur intervient à coup sûr (et provisoirement) si le nom de la ville recherchée comporte une apostrophe. Avant de réparer ce problème, tentez par exemple de rechercher le code postal de CAP D’AIL (qui se trouve bien dans la liste) avec la macro Mcr_Recherche_Code : le programme renvoie le message erreur de la figure 7.7.

Figure 7.7 Message erreur dû à une mauvaise syntaxe SQL.

Afin d’éviter l’affichage de ce message, incompréhensible pour l’utilisateur, nous modifions la macro Mcr_Recherche_Code de la manière suivante : 1. Ouvrez la macro en mode création. 2. Cliquez dans le ruban sur le bouton Noms de macro : le corps de la macro compte désormais 5 colonnes. 3. Insérez une nouvelle première ligne. 4. Sélectionnez l’action 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 suffixe habituel « Mcr_ » donné jusqu’à maintenant. En effet, ce nom de macro restera complètement interne à la macro en cours et ne donnera pas lieu à enregistrement en tant que tel. L’action SurErreur a été volontairement posée en début de programme pour intercepter toutes les erreurs qui suivront. 5. En bas de macro (9e ligne), saisissez « Gestion_Erreurs » dans la première colonne des Noms de macro. 6. Dans la colonne Action, sélectionnez BoîteMsg avec pour argument Message : « Le nom de la ville ne doit pas comporter d’apostrophe ». La macro a, au final, les propriétés indiquées à la figure 7.8. Figure 7.8 Macro avec gestion des erreurs.

188

Access® 2007 et VBA

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

7

Chapitre

Le programme, désormais, intercepte l’erreur avant qu’elle ne renvoie le message de la figure 7.7 et « détourne » le programme vers la gestion d’erreurs située en bas.

Note En fait, l’erreur est due à une imperfection de la syntaxe de la fonction RechDom() dans la troisième ligne du programme. La syntaxe actuelle est RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'"). Dans cette tournure, et pour simplifier les explications, on a employé des apostrophes pour cerner le nom de la ville recherchée dans la requête SQL. Or, si la ville recherchée, justement, comprend elle aussi une apostrophe, il s’ensuit forcément une erreur car SQL ne sait plus où se trouve la chaîne de caractères recherchée. Dans l’absolu, il faut remplacer chaque apostrophe par un double guillemet ("") pour solutionner le problème. La formule devient alors RechDom("[CODE]";"CODE_POSTAL";"[VILLE]= """ & [VarTemp]![VilleRecherche] & """").

(2)

Le passage des macros à Visual Basic Avant d’étudier les rudiments de Visual Basic, nous abordons ici un moyen très convivial de glisser du monde des macros à la programmation VBA proprement dite. Access est doté, en effet, d’un utilitaire qui permet de traduire les macros dans le langage commun à toutes les applications Office, Visual Basic pour Applications.

2.1 LA

CONVERSION DES MACROS EN

VISUAL BASIC

La procédure de conversion que nous allons étudier s’avère d’une simplicité extrême et peut être utilisée massivement dans un premier temps, avant que le langage VBA ne soit complètement assimilé. Dans de nombreux cas, il sera judicieux de passer par cette voie lorsque des syntaxes seront méconnues ; on gagnera par là un temps précieux. 1. Fermez tous les onglets Access actifs et mettez en surbrillance la macro Mcr_Visu_ Codes (sans la démarrer ou l’ouvrir en mode création !). 2. Cliquez dans le menu sur « Outils de base de données ». 3. Cliquez sur le bouton du ruban « Convertir les macros en Visual Basic ». 4. Le programme de conversion passe par une boîte message proposant d’ajouter une gestion des erreurs et des commentaires au programme (voir figure 7.9) : conservez les deux cases à cocher dans leur état et cliquez sur « Convertir ». Figure 7.9 Options de la conversion des macros en Visual Basic.

5. Immédiatement, le code qui avait été conçu sous forme graphique devient un « texte pur » ouvert dans la fenêtre bien particulière de Visual Basic. La conversion ne comporte pas plus de difficultés !

Les macros 189

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

6. Lorsque la boîte message « Conversion terminée » est fermée, l’interface est celle de Visual Basic : fermez le programme en cliquant sur la croix supérieure droite (ou Fichier > Fermer et retournez à Microsoft Office Access).

2.2 LA

PRÉSENTATION DU PROGRAMME

VISUAL BASIC

Dans le volet de navigation est apparu un module, nommé « Macro convertie – Mcr_ Visu_Codes ». Ce module nous servira de guide de découverte, mais ne devrait pas être inséré, en l’état, dans une application. Généralement, on donnera aux modules des noms plus courts et sans espaces. Un simple clic sur le module provoque tout à la fois le démarrage du programme VBA et l’ouverture à la page du module sélectionné. Il est également possible de cliquer sur l’icône Visual Basic dans le menu « Outils de base de données ». L’agencement général de Visual Basic est décrit à la figure 7.10. Pour afficher les propriétés de l’objet, sélectionner le menu « Affichage > Fenêtre Propriétés ». Figure 7.10. Fenêtre d’ouverture de Visual Basic.

La fenêtre n’est plus celle d’Access, mais celle de Microsoft Visual Basic. Un bouton en haut à gauche permet de retourner à Access, qui reste actif en permanence. Cette interface est la même pour Access, Excel, Word et tous les produits de la gamme Office. Dans la partie supérieure gauche de l’écran apparaît une sous-fenêtre des projets ; il peut exister un certain nombre de projets préchargés qui correspondent à des assistants (ACWZTOOL) ou compléments spécifiques : généralement, ils ne peuvent pas être ouverts. En dessous, dans la même zone, se trouvent les éléments du fichier Access ouvert. Au premier démarrage de VB, vous ne verrez probablement que des modules comme sous-éléments du fichier, mais rapidement, la structure sera celle montrée sur la figure 7.10 avec : • des Microsoft Office Access Objets de classe (et des formulaires en dessous) ; • des modules. Il est donc possible d’insérer du code : • soit dans les formulaires, ceux-là même qui ont été étudiés précédemment, et dont le code se référera à tous les événements pouvant survenir dans ces formulaires ; • soit dans des modules séparés : le code sera alors appelé par une syntaxe spécifique. Un double-clic dans l’un de ces éléments permet de le visualiser dans la partie droite de l’écran.

190

Access® 2007 et VBA

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

7

Chapitre

Dans la partie inférieure gauche sont affichées les propriétés de l’objet actif. Ici, on peut lire (et modifier le cas échéant) le nom du module. Les deux pavés de gauche (projets et propriétés) peuvent être supprimés de l’affichage ou remis en place par des options du menu général Affichage. Le pavé de droite contient le code Visual Basic proprement dit comme il apparaît à la figure 7.11. Nous allons le détailler. Figure 7.11 Code Visual Basic de la macro convertie « Mcr_ Visu_Codes ».

• La première ligne de code Option Compare Database est une ligne particulière, systématiquement ajoutée dans Access pour indiquer que les options d’ordre de tri seront ceux sélectionnés dans les paramètres régionaux. Cette partie, terminée par un trait, pourrait comprendre d’autres options générales 1. • Les quatre lignes suivantes commencent chacune par une apostrophe (') ; le texte qui se trouve à droite se colore en vert : il s’agit de commentaires et ces lignes ne seront pas exécutées par le programme. La conversion de la macro les a générées automatiquement. • Le texte du module proprement dit commence par le mot-clé Function et se termine par le mot-clé End Function (ils sont en bleu) ; entre ces deux limites, nous sommes dans une fonction, soit un ensemble de lignes de code constituant un programme qui pourra être exécuté. • Le mot-clé Function est suivi par le nom de fonction Mcr_Visu_Codes() : ce nom est directement issu de la macro originelle et devrait être modifié ; les parenthèses qui suivent, et qui pourraient contenir des paramètres sont obligatoires. La fonction (Function) déclarée ici possède des propriétés bien particulières que nous verrons plus loin ; elle peut être remplacée par une simple procédure (déclarée par les mots-clés Sub et End Sub). • Le code proprement dit, qui sera exécuté, est écrit en noir. La première ligne ne contient qu’une simple commande Beep, qui effectue un bip sonore. La deuxième ligne contient une commande de Boîte de message (MsgBox), suivie de ses paramètres. On verra bientôt que Visual Basic aide l’utilisateur à rédiger son code et énumère les paramètres à entrer au fur et à mesure de la saisie. Ces paramètres sont séparés par des virgules ; ici ils comprennent, par ordre, le message affiché dans la boîte ellemême, le type de boîte de message (vbExclamation) et le titre de la boîte. 1. Option Explicit, par exemple et qu’on recommande, oblige le programmeur à déclarer toutes ses variables.

Les macros 191

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

Le texte de la troisième ligne se retrouve souvent en programmation : • L’expression DoCmd lance une commande Access. Cette expression ne peut pas être utilisée seule : elle est toujours suivie d’un point et d’un autre objet membre de la classe DoCmd 1. • Dans le cas présent, DoCmd est suivi de l’objet OpenTable (ouvrir la table). De la même manière, on pourra manipuler d’autres éléments Access avec l’action 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 deuxième argument est la manière d’ouvrir la table, acViewNormal signifiant mode feuille de données, par opposition à acViewDesign (mode création). • Le dernier argument précise une ouverture en lecture seule (acReadOnly au lieu de acEdit). Pour bien vérifier que tous ces arguments sont directement modifiables dans le code, procédez de la manière suivante : 1. Dans la fonction étudiée, cliquez dans le texte tout de suite après l’expression OpenTable. 2. Appuyez sur la touche BackSpace (marche arrière) pour faire disparaître l’expression jusque et y compris le point séparateur. 3. Tapez de nouveau un seul point : vous voyez que Visual Basic vous propose tous les objets possibles par ordre alphabétique (AddMenu, ApplyFilter…). 4. Redescendez jusqu’à l’expression OpenTable, sélectionnez-la et utilisez la touche de tabulation, l’expression est reprise dans le texte. 5. Procédez de la même manière en supprimant l’argument acViewNormal et la virgule qui le précède puis retapez la virgule : VB propose plusieurs modes de visualisation (acViewLayout, acViewNormal, etc.). 6. Enfin, faites de la même manière pour le dernier argument acReadOnly. Il est clair, dès lors, que la frappe directe de code VB n’est pas aussi ardue que les noninitiés se l’imaginent. Un bon moyen de démarrer consiste, justement, à générer du code en utilisant les macros, à le réviser et à l’augmenter. Grâce à cette démarche, on ira graduellement vers une rédaction directe du code. La fonction créée comprend, comme on l’a prévu au moment de la conversion de la macro, une gestion des erreurs. Cette structure demande une explication particulière. • La première ligne de programme comporte le code On Error GoTo Mcr_Visu_Codes_ Err ; placé au tout début, ce code prévoit l’hypothèse d’une erreur. Dans cette éventualité, le pointeur de programme sera renvoyé au label Mcr_Visu_Codes_Err à la dixième ligne et sautera la totalité des lignes entre celle qui a provoqué l’erreur et ce qu’on appellera la récupération de l’erreur. Le mot-clé GoTo constitue un branchement sur une étiquette de ligne. • L’étiquette de ligne est signalée par le mot-clé employé dans le renvoi GoTo suivi du signe deux-points (:).

1. Avec la touche F2 dans Visual Basic ou en cliquant sur Affichage > Explorateur d’objets, on accède à la bibliothèque des objets constituant le modèle objet VB et grâce auquel on retrouvera tous les outils nécessaires à la rédaction du code.

192

Access® 2007 et VBA

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

7

Chapitre

• S’il survient une erreur dans le programme, le contrôle programme passe donc directement à l’étiquette de ligne Mcr_Visu_Codes_Err et poursuit en lisant la ligne suivante : la commande MsgBox Error$ ouvre une boîte de message décrivant l’erreur détectée. • La ligne suivante se sert de la syntaxe Resume pour « oublier » l’erreur et aller vers une nouvelle étiquette de ligne nommée Mcr_Visu_Codes_Exit. • Enfin, la ligne de programme Exit, située sous l’étiquette, permet de sortir de la fonction. Cette gestion des erreurs peut paraître lourde et complexe, mais s’avère indispensable dans le code. D’une part, elle est complètement générée sans l’intervention du programmeur mais elle a, d’autre part, l’immense avantage d’éviter à l’utilisateur de recevoir des messages incompréhensibles. En admettant que toute la structure de gestion d’erreur soit supprimée, le message affiché par Access serait celui de la figure 7.12. Figure 7.12 Message Access en cas d’absence de gestion d’erreurs.

Dans ce message, doté d’un numéro d’erreur inutile pour l’utilisateur final, il est possible de cliquer sur le bouton Débogage et d’accéder directement au code VB. Si une application complète et achevée doit être livrée à des utilisateurs, un tel message est donc à prohiber absolument !

Résumé Les macros d’Access, contrairement à celles d’Excel, s’écrivent en enregistrant des actions à réaliser, dotées de paramètres. Les manipulations s’effectuent dans un environnement graphique prévoyant tous les cas de figure possibles. Les macros d’Access 2007 permettent l’utilisation de variables, qui étendent considérablement leur champ d’action, et autorisent les conditions et les boucles de programmes. Toute macro peut être très facilement convertie en code afin d’être réutilisée sous l’environnement Visual Basic. Ce dernier, totalement intégré à Access, permet la mise au point de programmes beaucoup plus élaborés et sera donc préféré, à terme, à l’utilisation des macros. Les programmes VBA sont intégrés dans des fonctions (Function) ou des procédures (Sub). La rédaction du code en est facilitée par l’interface graphique qui propose, au fur et à mesure de la saisie, l’insertion de tous les mots-clés et paramètres du modèle objet de VBA. La conversion des macros en code crée automatiquement une gestion des erreurs qui évite aux utilisateurs d’accéder aux programmes eux-mêmes.

Les macros 193

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

Problèmes et exercices Les exercices proposent de créer des macros dans la base ECOLE_INTERNATIONALE. On transformera ensuite ces macros en code Visual Basic sur lequel on fera quelques ajouts et mises au point.

EXERCICE 1 • Énoncé

MACRO

INSÉRÉE DANS UNE ZONE DE LISTE

1. À partir d’un formulaire vierge, créez une zone de liste (simple) à choix unique, présentant tous les élèves ; un clic sur l’un des items de la liste doit ouvrir une boîte de message présentant la moyenne de l’élève. 2. La macro, incorporée dans le formulaire sera ensuite convertie en code VB. On ajoutera une nouvelle boîte de message interrogative demandant la matière à calculer pour donner finalement la seule moyenne de l’élève désigné dans cette seule matière. 3. Cette boîte de dialogue rappellera le nom et le prénom de l’étudiant suivi de sa note.

* Solution

1. Création du formulaire, de la macro et génération du code VB L’exercice reprend tous les éléments déjà vus dans les chapitres précédents : 1. Dans le menu « Créer », cliquez sur Création de formulaires (pour obtenir un formulaire vierge). 2. Cliquez sur le bouton Zone de liste (Contrôle de formulaire). 3. Dessinez un large rectangle dans le corps du formulaire. 4. À l’étape 1 de l’assistant Zone de liste, conservez l’option par défaut de recherche dans une table. 5. À l’étape 2, sélectionnez la table « ELEVE ». 6. À l’étape 3, insérez les trois champs « ID_ELEVE », « NOM_ELEVE » et « PRENOM_ ELEVE » dans le pavé des champs sélectionnés. 7. Sautez l’étape 4 des tris à ajouter. 8. Conservez les options par défaut de l’étape 5 (colonne clé cachée). 9. Dans la dernière étape, nommez l’étiquette « Liste des élèves ». 10. Enregistrez votre formulaire sous le nom « Frm_Liste_Eleves ». Vous devez obtenir un résultat similaire à la figure 7.13.

194

Access® 2007 et VBA

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

7

Chapitre

Figure 7.13

1. Dans la feuille de propriétés de la zone de liste, modifiez la propriété Nom par Choix_ Eleve au lieu de Liste0. 2. Vérifiez que la propriété Sélection multiple est bien à Aucun (c’est l’option par défaut) : l’utilisateur ne pourra donc pas « toper » plusieurs élèves simultanément. 3. À la ligne de la propriété SurClic, cliquez sur le bouton aux trois points de suspension à droite. 4. Sélectionnez Générateur de macro : l’interface des macros s’ouvre. 5. Sélectionnez l’action BoîteMsg. 6. Dans l’argument Message, insérez la formule = MoyDom("[NOTATION]";"NOTE";"ID_ ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]) que nous allons décomposer : • La fonction MoyDom() est une fonction de regroupement de domaine qui calcule une moyenne pour un champ d’une table à préciser dans les paramètres. • Le premier paramètre est celui du champ NOTATION, cité entre guillemets et crochets. • Le deuxième paramètre est celui de la table NOTE, citée entre guillemets. • Le troisième paramètre pose la condition de calcul : l’ID de l’élève sur lequel porte le calcul doit être celui qui correspond à la valeur prise par le contrôle Zone de liste. • ID_ELEVE = est cité entre guillemets pour respecter la syntaxe de la fonction. • La deuxième partie de l’équation, concaténée avec la première par le signe & n’est pas citée entre guillemets afin qu’Access ne le prenne pas pour une valeur littérale, mais traduise la valeur. • La valeur du contrôle de Zone de liste est renvoyée par la formule [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve] qui précise respectivement et séparés par des points d’exclamation le type de source (formulaire), le nom du document source et le nom du contrôle source. 7. Modifiez l’argument Bip par Non. 8. Pour l’argument Type, choisissez Information.

Exercices

Zone de liste de l’exercice 1.

Les macros 195

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

9. Pour l’argument Titre, entrez RESULTATS. 10. Fermez les fenêtres de la macro pour réaliser les tests. 11. Testez votre macro : la boîte message doit afficher un simple chiffre, doté de beaucoup de décimales. 12. On améliorera donc le résultat final en utilisant la formule suivante : ="Moyenne générale : " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]);"Fixe") (voir figure 7.14). • Le libellé Moyenne générale a été ajouté en début de formule, cité entre guillemets. • La fonction Format() a servi à calculer un arrondi à deux chiffres après la décimale ; ici, elle est de la forme Format( ; "Fixe"). Figure 7.14 Premier message renvoyé dans l’exercice 1.

La macro est incorporée dans le formulaire Frm_Liste_Eleves ; elle n’est donc pas convertissable en l’état en code Visual Basic. Il faut donc l’enregistrer au préalable : 1. Retournez en mode création dans la macro et cliquez sur le bouton Enregistrer Sous. 2. Renommez le libellé proposé par défaut Frm_Liste_Eleves par « Mcr_Liste_Eleves » et cliquez « OK », puis fermez la fenêtre de la macro : à la propriété SurClic du contrôle de Zone de liste n’apparaît plus le terme Macro incorporée, mais le terme Mcr_Liste_Eleves. 3. On remarque que la macro a été enregistrée comme telle et apparaît dans le volet de navigation ; restez sur la propriété SurClic de la zone de liste. 4. À présent, il est possible d’accéder au bouton Convertir les macros de formulaire en code Visual Basic dans l’onglet Outils de base de données : activez-le. 5. Acceptez la gestion d’erreurs et les commentaires, la macro est immédiatement traduite. 6. La propriété SurClic de la Zone de liste Choix_Eleve n’est plus nommée Mcr_Liste_ Eleves mais Procédure événementielle. Un clic sur le bouton aux trois points de suspension permet un accès direct à VB. Désormais, le code est bien implémenté sous le formulaire : • La seule ligne de programme proprement dit contient le code MsgBox "Moyenne générale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_Liste_ Eleves!Choix_Eleve), "Fixed"), vbInformation, "RESULTATS" qui correspond très exactement à ce qui avait été entré sous forme de macro. • La procédure commence par les mots-clés Private Sub : le mot Private indique que la procédure qui suit ne sera accessible que dans le module où elle est placée ; on touche ici à la notion de portée des fonctions et procédures, applicable aussi aux variables. Le mot Sub (auquel correspond un End Sub en fin de procédure) initialise une procédure (en lieu et place d’une fonction).

196

Access® 2007 et VBA

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

7

Chapitre

2. Création de la boîte de message demandant la matière Pour réaliser la deuxième partie de l’exercice, il faut à présent mettre en œuvre une nouvelle boîte de message, saisie cette fois directement dans VB, et deux variables. En effet, le programme doit demander à l’utilisateur une matière (ANGLAIS ou MATHEMATIQUES par exemple), retrouver le numéro correspondant à cette matière, tenir compte de l’élève sélectionné, et donner le résultat correct au moyen d’une formule qui précise la recherche en fonction du numéro d’élève et du numéro de matière. On déclare deux variables dans le programme nommées VARLIBMATIERE initialisée comme une chaîne de caractères et VARNOMATIERE initialisée comme une valeur entière. 1. Au-dessus de la ligne MsgBox existante (mais après le OnError), écrivez : Dim VARLIBMATIERE As String. Cette ligne déclare une variable en tant que chaîne de caractères. 2. En dessous, écrivez : Dim VARNOMATIERE As Integer. Cette ligne déclare une variable en tant que valeur entière. 3. En dessous, saisissez : VARLIBMATIERE = InputBox("Indiquez la matière recherchée", "Calcul de moyenne"). Cette ligne, dont la fonction InputBox() est l’équivalent de la fonction BEntrée() étudiée dans les macros, ouvre une boîte de message interrogative et passe à la variable VALIBMATIERE, la valeur saisie par l’utilisateur. 4. La formule suivante, insérée ensuite, permet de retrouver le numéro de la matière recherchée : VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_ MATIERE=' " & VARLIBMATIERE & " ' ")1. La fonction DLookup(), équivalente en VB de la fonction RechDom(), recherche le numéro de matière correspondant à la matière citée en toutes lettres. 5. Insérez une ligne plus bas et provisoirement une ligne MsgBox VARNOMATIERE qui nous permettra de tester le programme arrivé à ce stade. Au total, le programme est le suivant (provisoirement).

À ce stade, testez le programme : cliquez sur un élève de la liste, une boîte message demande la matière recherchée ; si vous choisissez MATHEMATIQUES, par exemple, le programme renvoie la réponse 2 ; la moyenne calculée ensuite est inexacte puisqu’il s’agit 1. L’enchaînement des guillemets s’écrit avec la même syntaxe que celle étudiée dans le cours concernant les macros. Les apostrophes (quotes simples américaines), destinées à faire comprendre la démarche du programmeur, doivent être remplacées par des doubles guillemets pour faire reconnaître les chaînes de caractères contenant elles-mêmes des apostrophes.

Exercices

Private Sub Choix_Eleve_Click() On Error GoTo Choix_Eleve_Click_Err Dim VARLIBMATIERE As String Dim VARNOMATIERE As Integer VARLIBMATIERE = InputBox("Indiquez la matière recherchée", ➥"Calcul de moyenne") VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" ➥& VARLIBMATIERE & "'") MsgBox VARNOMATIERE MsgBox "Moyenne générale : " & Format(DAvg("[NOTATION]", "NOTE", ➥_ "ID_ELEVE =" & Forms!Frm_Liste_Eleves!Choix_Eleve),"Fixed"), ➥_vbInformation, "RESULTATS" Choix_Eleve_Click_Exit: Exit Sub Choix_Eleve_Click_Err: MsgBox Error$ Resume Choix_Eleve_Click_Exit End Sub

Les macros 197

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

encore de la moyenne générale. Si cette partie fonctionne correctement, vous pouvez poursuivre le travail. 1. Supprimez le MsgBox renvoyant le numéro de matière, devenu inutile. 2. Modifiez la formule de résultat final de la manière suivante : MsgBox "Moyenne générale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_ Liste_Eleves!Choix_Eleve & " AND ID_MATIERE = " & VARNOMATIERE), "Fixed"), vbInformation, "RESULTATS". On a ajouté une deuxième condition dans la fonction DAvg(), qui concatène l’opérateur AND et pose la deuxième équation ID_MATIERE = VARNOMATIERE. 3. Présentation du nom et du prénom dans la boîte de dialogue Afin de parachever cet exercice et approfondir les propriétés des Zones de liste, il faut améliorer la qualité du renvoi de valeur de la dernière boîte de message. Le nom et le prénom de l’élève sélectionnés ne sont pas intégrés, pour le moment, dans le programme ; seul le numéro de l’élève est récupéré parce que la colonne liée de la Zone de liste renvoie la valeur de ce numéro au moment du clic ; c’est la valeur de Forms!Frm_ Liste_Eleves!Choix_Eleve. La fonction Column() de VB va nous permettre de récupérer nom et prénom de l’élève. 1. En haut de programme, déclarez deux nouvelles variables de chaînes de caractères Dim VARNOM as String, Dim VARPRENOM as String . 2. En bas de programme (avant le MsgBox final), insérez le code VARNOM = Me.Choix_ Eleve.Column(1). 3. Juste en dessous, saisissez MsgBox VARNOM et testez le programme : la boîte de message renvoie effectivement le nom de l’élève. L’expression utilisée nécessite plusieurs explications : • Pour la première fois, on emploie l’objet Me. Me, suivi d’un point et d’autres objets dépendants, désigne le formulaire en cours : on aurait pu écrire Forms!Frm_Liste_ Eleves mais cette formule est beaucoup moins rapide d’accès dans le programme et… plus longue à saisir ! • Me.Choix_Eleve désigne la zone de liste nommée Choix_Eleve dans le formulaire en cours. • Me.Choix_Eleve.Column désigne une colonne dans la zone de liste citée du formulaire en cours. Cette expression nécessite un paramètre de numéro de colonne entre parenthèses. • La numérotation des colonnes commence à 0. Dans la zone de liste présente, la colonne 0 est celle de l’ID_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 matière recherchée", _ "Calcul de moyenne") VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" _ & VARLIBMATIERE & "'") VARNOM = Me.Choix_Eleve.Column(1)

198

Access® 2007 et VBA

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

7

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 boîte de message s’apparente au libellé de la figure 7.15. Figure 7.15 Dernier message renvoyé dans l’exercice 1.

EXERCICE 2

MACRO D’ENVOI

• Énoncé

Créez un formulaire listant les numéros, prénoms et noms des élèves. Un bouton doit y exécuter une macro qui envoie un message électronique à chacun d’entre eux en lui indiquant quelle est sa moyenne. On imaginera que l’adresse internet des élèves est systématiquement de la forme [email protected]. Au courrier dont le texte sera simplement « Votre moyenne générale est de …. », on joindra le détail des notes sous format Excel. Traduisez ensuite les macros générées en code Visual Basic.

* Solution

1. Création de la requête à la source du formulaire La première démarche consiste à créer une requête qui appelle les quatre champs nécessaires ID_ELEVE, PRENOM_ELEVE, NOM_ELEVE et la moyenne générale de chacun d’entre eux ; cette requête servira à l’incrémentation du formulaire à partir duquel sera lancée la macro. 1. Dans le menu « Créer », cliquez sur « Création de requête ». 2. Insérez les tables « ELEVE » et « NOTE ». 3. Placez les champs « ID_ELEVE », « PRENOM_ELEVE », « NOM_ELEVE », « NOTATION » parmi les champs sélectionnés. 4. Cliquez sur le bouton « ∑ Totaux ». 5. Conservez l’opération de regroupement aux trois premiers champs et sélectionnez l’opération Moyenne pour le champ NOTATION. 6. Enregistrez la requête sous le nom « Req_EnvoiMail ». La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM ELEVE INNER

Exercices

DE MESSAGES ÉLECTRONIQUES

Les macros 199

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

JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE; doit avoir la structure graphique de la figure 7.16.

Figure 7.16 Structure de la première requête de l’exercice 2.

2. Création du formulaire Deuxième étape : construire le formulaire à la base de l’envoi des courriers électroniques. 1. Dans le volet de navigation, mettez la requête Req_EnvoiMail en surbrillance (sans l’ouvrir). 2. Dans le menu « Créer », cliquez sur le bouton « Plusieurs éléments » (qui crée automatiquement un formulaire continu). 3. Enregistrez le formulaire sous le nom « Frm_EnvoiMail ». 4. Modifiez les libellés et formats pour obtenir un résultat sensiblement voisin de la figure 7.17. Figure 7.17 Présentation du formulaire de l’exercice 2.

200

Access® 2007 et VBA

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

7

Chapitre

3. Création de la requête de calcul des notes par élève Troisième étape : créer la requête qui générera le « carnet de notes » de chaque élève, carnet envoyé sous format Excel. 1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ». 2. Sélectionnez les tables « NOTE » et « MATIERE ». 3. Insérez les champs « ID_ELEVE », « NOM_MATIERE », « NOTATION », « DATE_ NOTE » parmi les champs sélectionnés. 4. Indiquez un ordre croissant à la colonne MATIERE. 5. Insérez le critère suivant dans la colonne ID_ELEVE : [Formulaires]![Frm_EnvoiMail]![ID_ELEVE]. Ce critère réservera les résultats de la requête au seul élève actif dans le formulaire d’envoi. 6. Enregistrez la requête sous le nom « Req_EnvoiNotes ». La requête, dont le code SQL est SELECT NOTE.ID_ELEVE, MATIERE.NOM_MATIERE, NOTE.NOTATION, NOTE.DATE_NOTE FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_ MATIERE = NOTE.ID_MATIERE WHERE (((NOTE.ID_ELEVE)=[Formulaires]![Frm_ EnvoiMail]![ID_ELEVE])) ORDER BY MATIERE.NOM_MATIERE; doit avoir la structure graphique de la figure 7.18. Figure 7.18

4. Création de l’envoi des courriers Quatrième étape : créer la macro d’envoi des courriers. 1. Dans le menu « Créer », cliquez sur « Macro ». 2. Sélectionnez l’action EnvoyerObjet. 3. Sélectionnez Requête pour le premier argument de TypeObjet de l’action EnvoyerObjet. 4. Choisissez Req_EnvoiNotes dans la liste des requêtes disponibles dans l’argument Nom d’objet. 5. Prenez le format Excel désiré dans l’argument Format de sortie, Excel 2003 ou Classeur Excel (pour Excel 2007). 6. Dans l’argument À , écrivez la formule =[Formulaires]![Frm_EnvoiMail]![PRENOM_ ELEVE] & "." & [Formulaires]![Frm_EnvoiMail]![NOM_ELEVE] & "@pearson.net". Cette formule concatène le prénom, le nom et l’adresse de destination du

Exercices

Structure de la deuxième requête de l’exercice 2.

Les macros 201

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

mail. Les références citées font allusion au premier enregistrement en cours dans le formulaire ; il faudra plus tard réitérer l’opération pour le deuxième et ainsi de suite, jusqu’à la fin du fichier. 7. Dans l’argument Objet, une simple mention « Vos résultats »1 suffira. 8. L’argument Texte du message peut être plus élaboré : saisissez la formule ="Bonjour," & Car(13) & Car(10) & "Votre moyenne générale est de " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_EnvoiMail]![ID_ELEVE]);"Fixe"). Dans cette formule, la détermination de la moyenne générale est effectuée avec les mêmes paramètres (Format() et MoyDom()) que ceux du premier exercice. On y a ajouté la formule Car(13) & Car(10) qui génère un saut de ligne 2. La formule de politesse « Bonjour, » sera donc suivie d’un passage à la ligne avant le libellé suivant. 9. L’argument Modifier le message, enfin, sera conservé à Oui pour vérifier la qualité des résultats. 10. Sauvegardez cette macro sous le nom « Mcr_EnvoiMail ». Pour commencer à tester la macro, il faut que le formulaire Frm_EnvoiMail soit ouvert et qu’il soit positionné au début de la liste des élèves, il renverra les coordonnées du premier élève de la liste. L’action EnvoyerObjet de la macro ouvre une session MAPI Windows (Mail Application Program Interface) qui émule l’outil de messagerie choisi par défaut (Outlook Express, Outlook ou autres). Le message obtenu est similaire à celui de la figure 7.19. Figure 7.19 Mail automatique envoyé par Access.

Quand la macro sera fonctionnelle, il restera à prévoir le glissement d’un élève au suivant et l’envoi en chaîne de chacun des mails. 1. Modifiez l’argument Modifier le message de l’action EnvoyerObjet dans la macro Mcr_EnvoiMail : positionnez-le à Non afin que l’exécution se réalise en bloc 3. 2. Ajoutez une deuxième action AtteindreEnregistrement à la macro Mcr_EnvoiMail. 3. L’argument Type d’Objet est Formulaire. 4. L’argument Nom d’objet est Frm_EnvoiMail. 1. Dans la mesure où il ne s’agit pas d’une formule, le libellé ne nécessite pas de signe égal au début suivi d’une chaîne de caractères entre guillemets. 2. L’équivalent Visual Basic de Car(13) & Car(10) est vbCrLF (Carriage Return Line Feed) que nous verrons plus loin. 3. Il est recommandé, pour cet exercice, de déconnecter provisoirement la machine de son accès Internet : il sera ainsi plus facile de supprimer les messages restés dans la Boîte d’envoi (de toute façon, tous les messages seraient signalés avec une adresse invalide).

202

Access® 2007 et VBA

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

7

Chapitre

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

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

L’argument Enregistrement est Suivant. Enregistrez les modifications et fermez cette macro. Dans le menu « Créer », cliquez sur le bouton « Macro ». Dans la nouvelle macro ouverte, sélectionnez l’action ExécuterMacro. L’argument Nom de macro doit être Mcr_EnvoiMail. L’argument Nombre de répétitions est la formule =CpteDom("[ID_ ELEVE]";"ELEVE")-1, qui compte le nombre d’élèves de la table et retire 1 (le premier enregistrement déjà traité). Enregistrez la macro sous le nom « Mcr_EnvoiGroupe ». Ouvrez, si nécessaire, le formulaire Frm_EnvoiMail en mode création. Dans l’en-tête de formulaire, insérez un bouton de commande. À l’étape 1 de l’assistant Bouton de commande, choisissez Divers dans le pavé des Catégories et Exécuter une macro dans le pavé des Actions. Sélectionnez la macro Mcr_EnvoiGroupe dans la deuxième étape. Choisissez l’option Texte dans la troisième étape, avec pour libellé Lancer un envoi groupé. Nommez le bouton « Envoi » dans la dernière étape.

Attention Les tests, à partir de cet instant, portent sur les 26 enregistrements de la table et ne peuvent être interrompus. Le plus souvent, l’envoi automatique de mails depuis Access génère dans l’outil de messagerie une fenêtre d’alerte prévenant qu’un programme externe tente d’accéder à la messagerie : il est nécessaire alors de modifier les options de la messagerie (Centre de gestion de la confidentialité dans Outlook par exemple) afin d’autoriser les envois automatiques.

La traduction en code Visual basic de la macro Mcr_EnvoiGroupe donne le résultat affiché à la figure 7.20. Figure 7.20

Exercices

Code de la macro d’envoi groupé.

Les macros 203

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

La traduction en code Visual basic de la macro Mcr_EnvoiMail donne le résultat affiché à la figure 7.21. Figure 7.21 Code de la macro d’envoi d’un mail.

Pour mettre en place d’une boucle de répétition des envois, deux macros ont été nécessaires. En fait, et dans un code Visual Basic bien monté, il est plus judicieux de réunir ces deux morceaux de code en un seul sous la tournure suivante : Function Mcr_EnvoiGroupe() On Error GoTo Mcr_EnvoiGroupe_Err Dim i As Integer For i = 1 To DCount("[ID_ELEVE]", "ELEVE") DoCmd.SendObject acQuery, "Req_EnvoiNotes", ➥"ExcelWorkbook(*.xlsx)", ➥Forms!Frm_EnvoiMail!PRENOM_ELEVE & "." & ➥Forms!Frm_EnvoiMail!NOM_ELEVE & "@pearson.net", ➥"", "", "Vos résultats" , ➥"Bonjour," & Chr(13) & Chr(10) & "Votre moyenne générale ➥est de " & Format(DAvg("[NOTATION]", ➥"NOTE", "ID_ELEVE =" & Forms!Frm_EnvoiMail!ID_ELEVE), ➥"Fixed"), False, "" DoCmd.GoToRecord acForm, "Frm_EnvoiMail", acNext Next Mcr_EnvoiGroupe_Exit: Exit Function Mcr_EnvoiGroupe_Err: MsgBox Error$ Resume Mcr_EnvoiGroupe_Exit End Function

L’expression For i = 1 To DCount("[ID_ELEVE]", "ELEVE") démarre une boucle qui tournera depuis la valeur 1 jusqu’au nombre total d’élèves de la table. Elle est fermée par l’expression Next située avant la gestion d’erreurs 1. Entre ces deux lignes, la totalité du code de la macro Mcr_EnvoiMail peut être récupérée.

1. Il n’est pas possible, ici, d’expliquer longuement le fonctionnement des boucles. Pour plus de détails, se référer aux chapitres sur VBA dans le livre Excel 2007 du même auteur dans la même collection.

204

Access® 2007 et VBA

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

8

Chapitre

Le langage VBA sous Access 1. Le lancement de requêtes SQL sous VBA ............................... 206 2. L’utilisation de la notion de RecordSet......................... 208 3. L’automation ......................... 215 Problèmes et exercices 1. Un programme de notation .... 219 2. Travail sur jeu d’enregistrements .................. 224 3. Une automation Access/Word........................ 231

L’utilisation du code VBA donne à Access des performances et des capacités très supérieures à celles qui sont disponibles sous l’interface graphique, tant dans l’affichage des données que dans leur traitement. Ce chapitre présente l’exécution de requêtes SQL écrites avec le programme VBA, puis une méthode pour charger des données en mémoire afin de les traiter sans même les afficher. Enfin, nous étudierons les rudiments de l’automation, permettant d’exécuter des applications Office depuis Access.

205

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

(1)

Le lancement de requêtes SQL sous VBA La commande DoCmd.RunSQL de VBA exécute une requête SQL écrite dans le langage que nous avons étudié en même temps que les requêtes elles-mêmes. Cette commande est rarement utile quand il s’agit de requêtes Sélection (utilisant le mot-clé SELECT du langage SQL), mais elle devient très efficace lorsqu’il s’agit d’exécuter des requêtes SQL telles que INSERT, UPDATE ou DELETE. Voici un exemple d’action de cette commande pour insérer puis supprimer un enregistrement de la table CODES_POSTAUX. Les premières actions génèrent le code SQL de la requête à partir de l’interface graphique d’ACCESS. 1. Ouvrez la base de données « CODES_POSTAUX ». 2. Créez une nouvelle requête d’insertion (Créer, puis Création de requête, ne sélectionner aucune table, puis choisir Ajout dans le ruban et sélectionner la table CODES_ POSTAUX) pour ajouter un enregistrement à la table CODES_POSTAUX dont le code est 99999 et la ville MONCLOCHER ; la requête, 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 figure 8.1. La table CODE_POSTAL n’est pas présente dans la fenêtre supérieure (afin d’éviter une insertion d’autant de lignes que n’en compte la table elle-même) 1.

Figure 8.1 Requête d’insertion.

On peut ensuite sélectionner le code SQL généré et l’insérer dans un programme Visual Basic. 3. Cliquez sur le mode d’affichage SQL de la requête et copiez son texte (Ctrl + C). 4. Accédez à Visual Basic au moyen de la combinaison des touches Alt + F11. 5. Dans la fenêtre des projets, cliquez du bouton droit sur Modules et Sélectionnez « Insertion > module ». 6. Dans la fenêtre des propriétés (si elle n’est pas présente sélectionner Affichage > Fenêtre Propriétés ou F4), en bas à gauche, renommez le module Module1 par « Essais ». 7. Entrez le début de code suivant : Sub Insertion_CodePostal() DoCmd.RunSQL " End Sub

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

206

Access® 2007 et VBA

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

8

Chapitre

La structure de la procédure Insertion_CodePostal() est en place. Il faut maintenant modifier son contenu pour y écrire le code de la requête SQL précédemment copiée. 8. Collez (Ctrl + V) le texte du presse-papier entre les guillemets de la commande RunSQL. 9. Doublez les guillemets qui cernent déjà les chaînes 99999 et MONCLOCHER. 10. Veillez à ce que la chaîne SQL tout entière soit également entre guillemets de sorte d’obtenir le code suivant : Sub Insertion_CodePostal() DoCmd.RunSQL "INSERT INTO CODE_POSTAL ( CODE, VILLE ) _ SELECT ""99999"" AS CODE, ""MONCLOCHER"" AS VILLE;" End Sub

11. Exécutez le code en appuyant sur F5 (ou en cliquant sur le triangle vert de la barre d’icônes, ou en sélectionnant l’option de menu Exécution > Exécuter Sub/UserForm). 12. Access renvoie un message d’avertissement, prévenant qu’un enregistrement va être ajouté : validez-le. 13. Si le code est réexécuté une seconde fois, Access donnera le même message d’avertissement, mais refusera dans une deuxième fenêtre de réaliser l’insertion en raison de l’existence d’un doublon parmi les codes postaux. Afin de supprimer cet enregistrement fantaisiste, nous allons créer une nouvelle procédure Visual Basic faisant appel à un procédé voisin. Il est possible, dès lors que la syntaxe SQL est bien assimilée, d’écrire directement le code suivant, à la suite de la procédure précédente : Sub Suppression_CodePostal() Dim strSQL As String strSQL = "DELETE FROM CODE_POSTAL WHERE CODE = ""99999""" DoCmd.RunSQL strSQL End Sub

Dans cette deuxième présentation, la démarche met en œuvre une variable de type chaîne de caractères. On affecte à la variable strSQL (pour String SQL) le texte de la requête SQL, puis on cite la variable après la commande RunSQL. Cette présentation est particulièrement utile lorsque la requête contient de nombreux paramètres (on peut alors activer le mode débogage pour vérifier la valeur des variables) et lorsqu’elle est longue (on découpe alors en autant de variables qu’il existe, par exemple, de lignes de requête : une variable pour la ligne INSERT, une pour la ligne FROM, une pour la ligne WHERE, etc.). Ce code est particulièrement intéressant car il permet au programmeur de ne pas obligatoirement afficher des données pour procéder à des manipulations sur la base. Cette organisation s’adapte surtout aux environnements client/serveur, dans lesquels il n’est pas toujours nécessaire (et même déconseillé) de charger des masses de données importantes sur le poste client. On peut imaginer, par exemple, un simple formulaire dépourvu de toute source de données natives, qui charge le minimum d’informations indispensables à l’utilisateur, procède à tous les contrôles de forme et génère une seule commande de mise à jour (Insert, Update, Delete). Ce processus s’avère évidemment très lointain de la démarche conventionnelle d’Access où tout formulaire charge toutes les données de plusieurs tables gérées en monoposte.

Le langage VBA sous Access 207

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

(2)

L’utilisation de la notion de RecordSet Lorsqu’un formulaire est ouvert avec une source de données (propriété RecordSource du formulaire), il charge dans le même temps un jeu d’enregistrements, RecordSet en américain. Le jeu d’enregistrements se constitue des enregistrements chargés, avec leur ordonnancement et leurs colonnes, provenant d’une table ou d’une requête. Ils sont « montés » en mémoire afin de les afficher plus rapidement. Ce chargement en mémoire s’effectue également via l’interface de programmation nommée DAO (Data Access Objects). Dès lors, le programmeur peut « jouer » avec ces enregistrements, les afficher ou les mettre à jour comme il l’entend, sans qu’aucune interface homme/machine n’intervienne. On a adjoint à DAO, depuis sa création, une autre interface, ADO (ActiveX Data Objects). Les deux interfaces de programmation sont dotées chacune d’objets RecordSet dont la manipulation diffère légèrement. On déclarera donc un RecordSet en précisant toujours l’interface utilisée. De plus, DAO et ADO ne sont pas nécessairement chargés sur la machine, il est nécessaire de s’en assurer en faisant les vérifications suivantes : 1. Accédez à Visual Basic en utilisant la combinaison des touches Alt + F11. 2. Dans le menu général, cliquez sur « Outils > Références ». 3. Cochez les options (si elles ne le sont pas déjà) Microsoft Office 12.0 Access Data Engine Library (DAO) et Microsoft ActiveX Data Objects 6.0 Library (ADO) comme le montre la figure 8.2.

Figure 8.2 Paramétrage des interfaces chargées sous Visual Basic pour Access.

2.1 CHARGEMENT

DES

RECORDSET

Au lieu d’ouvrir un formulaire affichant les codes postaux, nous allons les charger en mémoire et les afficher grâce à un programme que nous nous proposons d’écrire. La première procédure s’appellera Lecture_Recordset().

208

Access® 2007 et VBA

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

8

Chapitre

1. Saisissez le code suivant dans un module Visual Basic : Sub Lecture_RecordSet() ; VB insère automatiquement un End Sub avant lequel sera saisi le code. 2. Entrez la déclaration Dim db as DAO.Database ; cette ligne déclare une variable nommée db de type objet, l’objet étant une base de données connectée sous l’interface DAO. 3. Entrez la déclaration Dim rst as DAO.RecordSet ; cette ligne déclare une variable nommée rst de type objet, l’objet étant un jeu d’enregistrements. Ces deux lignes de déclarations 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 référence d’objet à la variable qui avait été déclarée auparavant. Ici, db fera référence désormais à la base de données courante de l’application en cours (en l’occurrence la base Access CODES_POSTAUX). 5. Entrez Set rst = db.OpenRecordSet("CODE_POSTAL")  : la variable rst fera référence au jeu d’enregistrements constitué par la table CODE_POSTAL. On notera que la table est citée entre guillemets ; on aurait tout aussi bien pu citer entre guillemets une requête SQL SELECT tout entière ou bien une variable string contenant le texte de la requête. Le mot-clé OpenRecordSet ouvre le jeu d’enregistrements, c’est-à-dire qu’il le charge en mémoire vive 1. 6. Saisissez le code suivant, qui permettra un affichage en boucle jusqu’à ce que l’utilisateur ne l’interrompe. Dim i as integer i = 1 Do While i = 1 i = MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _ "Visualisation du RecordSet") rst.MoveNext Loop Rst.Close Set rst = Nothing Set db = Nothing

La valeur 1 est tout d’abord attribuée à la variable i. La ligne suivante démarre une boucle qui réitérera les lignes suivantes (jusqu’au Loop), jusqu’à ce que la valeur i ne soit plus égale à 1. La variable variable i, à la troisième ligne, prend la valeur renvoyée par une boîte de message dotée de deux boutons : OK et Annuler. Si l’utilisateur clique sur OK, la valeur renvoyée par la boîte de message à i est 1 ; si l’utilisateur clique sur Annuler, la boîte renvoie la valeur 2 et le programme sort de la boucle. Le contenu de la boîte (prompt) est constitué des deux colonnes de la table CODE_POSTAL, exprimées volontairement de manières différentes : • L’expression rst.Fields(0).value renvoie la valeur du premier champ de la table. Attention ! la numérotation commence à 0 et non à 1. rst fait référence au RecordSet, Fields désigne le champ et Value sa propriété de contenu. 1. La commande OpenRecordSet() comprend également un paramètres de mode d’ouverture du recordset qui n’a pas été précisé. Si la source est une table non liée (présente dans la base), par défaut l’ouverture se fait en mode table ; si la source est une requête ou une table liée, par défaut l’ouverture se fait en mode Dynaset. Il existe deux autres modes d’ouverture (SnapShot ou Instantané et ForwardOnly) qui gèrent le curseur différemment.

Le langage VBA sous Access 209

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

• L’expression rst("VILLE") désigne directement le contenu du champ VILLE pour l’enregistrement en cours. Les deux notations sont équivalentes, mais la première sera choisie de préférence si l’indice de colonne (ici 0) est précisé avec des variables. • L’expression rst.MoveNext, enfin, déplace le curseur d’une position vers l’avant, notion que nous verrons dans le paragraphe suivant. • La commande rst.Close ferme le jeu d’enregistrements. Elle est indispensable dans un code bien écrit, de même que l’annulation des références des deux lignes suivantes (Set rst = Nothing et Set db = Nothing). Le code écrit donne globalement la rédaction suivante : Sub Lecture_RecordSet() Dim db As DAO.Database Dim rst As DAO.Recordset Dim i As Integer Set db = Application.CurrentDb Set rst = db.OpenRecordset("CODE_POSTAL") i = 1 Do While i = 1 i= MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _ "Visualisation du RecordSet") rst.MoveNext Loop Rst.Close Set rst = Nothing Set db = Nothing End Sub

Lors de l’exécution, on verra s’afficher successivement tous les codes postaux et les villes associées jusqu’à ce que l’utilisateur clique sur Annuler.

2.2 DÉCOMPTE

DES ENREGISTREMENTS DANS UN

RECORDSET

ET DÉPLACEMENTS

La notion de curseur doit être finement appréhendée car elle est primordiale dans les jeux d’enregistrements. A priori et en premier lieu, il est quasi indispensable d’insérer un ordre précis dans la requête à la base d’un jeu d’enregistrements (une clause ORDER BY dans SQL) : l’ordre des enregistrements est totalement imprévisible dans la table. Il faut donc en prescrire un afin d’être sûr des résultats escomptés en cas de mises à jour. Au moment de l’ouverture, le curseur se trouve en début de jeu d’enregistrements 1. L’enregistrement lu est le premier et la commande rst.MovePrevious (aller à l’enregistrement précédent) génère un message erreur. La commande MoveNext positionne le curseur à l’enregistrement suivant, la commande MoveLast le positionne immédiatement sur le dernier. Ces commandes peuvent être combinées avec les propriétés BOF (Beginning Of File) et EOF (End Of File) dont il faudra appréhender les subtilités. Lorsque le jeu d’enregistrements est ouvert, le curseur est positionné sur le premier enregistrement, mais la propriété rst.BOF est positionnée à FALSE (faux) ; ainsi, dans l’exemple du paragraphe précédent, si la condition suivante est posée : If Not rst.BOF Then 1. Mais il n’est pas inutile d’insérer une commande MoveFirst pour s’en assurer dans tous les cas de figure.

210

Access® 2007 et VBA

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

8

Chapitre rst.MovePrevious End If

Le programme renverra assurément une erreur. De la même manière, lorsque le curseur arrive sur le dernier enregistrement, la propriété EOF est positionnée à FALSE et ce n’est qu’après une commande MoveNext que la propriété passera à TRUE (vrai), trop tard pour éviter un message erreur. Ces propriétés ne seront donc utilisées qu’à bon escient, par exemple dans le cadre du décompte des enregistrements d’un jeu. Au moment où un RecordSet est chargé, le système, en effet, ne connaît pas le nombre d’enregistrements qu’il contient : la propriété RecordCount n’est pas opérationnelle. Il est nécessaire de balayer tous les enregistrements du jeu pour en connaître la taille. Ci-après, un exemple de code qui compare deux décomptes d’enregistrements avant et après 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 "Décompte avant balayage : " & rst.RecordCount, , "Décompte 1" If Not rst.EOF Then rst.MoveLast End If MsgBox "Décompte après balayage : " & rst.RecordCount, , "Décompte 2" rst.Close Set rst = Nothing Set db = Nothing End Sub

La première boîte de message, avant balayage, ne décompte qu’un seul enregistrement alors que la seconde en compte 8 009.

2.3 RECHERCHE

DES ENREGISTREMENTS DANS UN

RECORDSET

Les méthodes FindFirst, FindLast, FindNext, FindPrevious et NoMatch sont les outils de base des recherches dans un jeu d’enregistrements. On se propose, ici, d’afficher au fur et à mesure les préfectures qui commencent par ST. Le programme suivant va ouvrir un jeu d’enregistrements contenant tous les codes postaux puis balayer le recordset en s’arrêtant chaque fois qu’une occurrence est trouvée. Sub Recherche_RecordSet() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = Application.CurrentDb Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset) rst.FindFirst "CODE LIKE '*000' AND VILLE LIKE 'ST*'" While Not rst.NoMatch MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures commençant par ST" rst.FindNext "CODE LIKE '*000' AND VILLE LIKE 'ST*'" Wend 1. Ici, l’ouverture en mode Dynaset (le plus fréquent) a été précisé pour éviter une ouverture en mode table, dont la gestion de curseur est différente.

Le langage VBA sous Access 211

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

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

On prêtera une attention particulière à la tournure de la boucle et son ordonnancement : • Le RecordSet est ouvert et le curseur se trouve positionné au premier enregistrement. • Une première ligne de code lance une recherche : le curseur se positionne sur le premier enregistrement concordant (ST BRIEUC). • La boucle démarre avec une condition de concordance (Not et NoMatch équivalent à « Match »). La propriété NoMatch étant positionnée à FALSE, l’expression Not Nomatch équivaut à TRUE : l’enregistrement en cours s’affiche. • Une nouvelle recherche est lancée (FindNext). • Et ainsi de suite jusqu’à la fin du jeu d’enregistrements. Cette structure est rendue obligatoire par la logique : si la première ligne de code comprenant le FindFisrt est supprimée, l’affichage commence par celui du code 01000 de BOURG EN BRESSE (qui ne répond pas aux critères demandés) et se poursuit par les quatre autres (respectant les critères). Dans cet exemple, c’est volontairement que le RecordSet initial contenait tous les enregistrements de la table et qu’une recherche sélective y était appliquée. Naturellement, une autre solution consiste à ne sélectionner dans le jeu d’enregistrements que les enregistrements respectant les critères pour, ensuite, les afficher tous. Ci-après le code de cette seconde formulation, utilisant la propriété EOF : Sub Affichage_RecordSet() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = Application.CurrentDb Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL + WHERE CODE LIKE '*000' AND VILLE LIKE 'ST*'") While Not rst.EOF MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures+ commençant ➥par ST" rst.MoveNext Wend rst.Close Set rst = Nothing Set db = Nothing End Sub

2.4 MODIFICATION

DES ENREGISTREMENTS D’UN

RECORDSET

Jusqu’à présent, les enregistrements d’un RecordSet ont été simplement lus sans aucune modification. S’il est nécessaire de modifier des données, il faut prendre en compte le fait que les données sont chargées en mémoire vive et que les modifications ne vont toucher que ces données en mémoire et non celles qui sont enregistrées sur le disque. Il faut donc procéder en deux étapes : modifier les données dans le RecordSet puis appliquer ces modifications aux données écrites sur le disque. Cette problématique touche également la manière dont le jeu d’enregistrements a été ouvert. En environnement multi-utilisateurs, il faut empêcher un utilisateur de modifier

212

Access® 2007 et VBA

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

8

Chapitre

des données déjà en cours de modification par un autre. On précisera donc le mode d’ouverture dans l’action OpenRecordSet (paramètre que nous n’avons pas encore étudié) en indiquant quel type de verrou (lock) est posé sur les données ; trois cas de figure sont envisageables : • La méthode OpenRecordSet est paramétrée avec le verrou dbReadOnly (valeur VB : 4) et le jeu d’enregistrements n’est pas modifiable. • L’ouverture du jeu est opérée avec le type de verrou dbPessimistic (valeur VB : 2) et toutes les données de la base concernées sont verrouillées dès la commande d’ouverture jusqu’à la commande de fermeture : aucun autre utilisateur ne peut y faire de mises à jour. C’est l’option par défaut prise par Access si aucun paramètre n’est précisé. • L’ouverture du jeu est opérée avec le type de verrou dbOptimistic (valeur VB : 3) et les données concernées ne sont verrouillées que lorsque la première mise à jour (Update) a été effectuée. Le programme ci-après ouvre la table CODE_POSTAL en mode ReadOnly (le dernier paramètre de la méthode OpenRecordSet est à 4), positionne le curseur au niveau du code 75001 et modifie le libellé PARIS par PARIS 1er. La mise à jour éventuelle est conditionnée par la propriété UpDatable (possibilité de modification) du jeu d’enregistrements. Sub Modification_RecordSet() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = Application.CurrentDb Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset, , 4) rst.FindFirst "CODE = '75001' " If rst.Updatable = True Then rst.Edit rst("VILLE") = "PARIS 1er" rst.Update Else MsgBox "La table ne peut pas être mise à jour", , "Contrôle d’accès" End If rst.Close Set rst = Nothing Set db = Nothing End Sub

Comme le paramètre 4 de la cinquième ligne de programme n’ouvre le jeu d’enregistrement qu’en lecture seule, le message erreur programmé constitue le choix logique de la procédure. Si, en revanche, le paramètre 2 ou 3 (ou aucun) vient en remplacement, le RecordSet est modifiable (UpDatable) et l’exécution s’opère de la manière suivante : • la commande rst.Edit copie l’enregistrement en cours dans une mémoire tampon ; • la ligne rst("VILLE") = "PARIS 1er" affecte la valeur Paris 1er au champ VILLE de l’enregistrement stocké dans la mémoire tampon. L’enregistrement sur le disque, à ce stade, n’est donc pas réalisé. C’est la commande rst.Update de la ligne suivante qui met à jour la table.

2.5 AJOUT

ET SUPPRESSION D’ENREGISTREMENTS L’ajout d’enregistrements respecte une syntaxe voisine de la modification. On prendra garde au fait que le contrôle de valeur des données s’opère de la même manière que si

Le langage VBA sous Access 213

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

l’insertion était faite manuellement, à la différence près que le programme s’interrompt en cas d’insertion non valide. Dans l’exemple suivant, on cherchera à insérer un code 123456 qui ne respecte pas la longueur maximum de code postal, ce qui occasionnera une erreur d’exécution. Sub Insertion_RecordSet() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = Application.CurrentDb Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset) rst.AddNew rst("Code") = "123456" rst("VILLE") = "VILLE-ERREUR" rst.Update rst.Close Set rst = Nothing Set db = Nothing End Sub

Quand le code est exécuté pas à pas (F8), on peut vérifier que l’interruption du programme intervient non pas au moment du rst.Update final , mais dès la ligne rst("Code") = "123456"  : le contrôle est réalisé dès l’affectation de la valeur à la mémoire tampon car le RecordSet contient déjà les caractéristiques des champs de la table. En revanche, il est clair que le programme ne peut pas contrôler immédiatement l’existence de doublons : si le code postal à insérer existe déjà dans la table source, la procédure sera interrompue au moment du rst.Update et non avant. De la même manière, il ne peut pas exister de contrôle sur la valeur de clés étrangères : si une valeur de clé étrangère inexistante dans la table mère est insérée dans une table liée par une contrainte d’intégrité référentielle, le message erreur n’interviendra qu’au moment du rst.Update. Plus grave: s’il n’existe pas de contrainte d’intégrité référentielle, une insertion erronée aura lieu. La suppression d’enregistrements via un RecordSet, enfin, est relativement peu employée. Il est plus cohérent et plus direct d’exécuter sous VB une requête SQL comportant la syntaxe DELETE. On trouvera, ci-après, un exemple dans lequel sont supprimés 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, n’effectuera aucune suppression car il n’existe aucune ville répondant au critère précisé. On notera surtout qu’ici la commande rst.Update est interdite : la suppression est immédiate.

214

Access® 2007 et VBA

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

8

Chapitre

(3)

L’automation Comme tous les produits de la gamme Office, Access comprend, via VBA, tous les outils pour pratiquer l’automation, en d’autres termes la manipulation « à distance » d’autres applications simultanément à Access. Nous avons déjà étudié, dans le chapitre 3, comment importer des données Excel vers Access et comment exporter des données Access vers Excel. Dans l’exemple qui suit, nous allons mettre en œuvre un procédé qui démarre à distance Excel, crée un tableau, insère des valeurs à partir d’un recordset et referme le fichier Excel. Il s’agit là d’un nouveau procédé d’exportation qui possède de nombreux avantages car il autorise tous les paramétrages imaginables. Avant de commencer cette partie, il est nécessaire de vérifier que la bibliothèque nécessaire est chargée. Cliquez dans VBA sur « Outils > Références » et cochez, le cas échéant, la bibliothèque Microsoft Excel 12.0 Object Library comme le montre la figure 8.3.

Figure 8.3 Chargement de la bibliothèque des objets Excel.

Décomposons le programme d’échange Access/Excel ligne par ligne. 1. Dans un module déjà créé, créez une procédure : Sub Echange_xlsx_accdb(). 2. Entrez la déclaration Dim prog_xlsx As Excel.Application  : cette déclaration prépare un objet application Excel. Il ne s’agit que d’une simple déclaration dont les effets immédiats sont nuls. 3. Entrez la déclaration Dim fic_xlsx As Excel.Workbook  : cette déclaration prépare un objet fichier Excel. Il ne s’agira pas du fichier lui-même, mais d’une référence à l’objet. 4. Entrez les déclarations déjà connues, aptes à gérer un jeu d’enregistrements, Dim db as DAO.Database et Dim rst As DAO.Recordset. 5. Une dernière déclaration Dim i as Integer définit un compteur. 6. La ligne Set db = Application.CurrentDb affecte pour référence à l’objet db la base de données active.

Le langage VBA sous Access 215

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

7. La ligne Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE LIKE '*000' ") crée un jeu d’enregistrements contenant les codes postaux et villes de toutes les préfectures. 8. L’ouverture du jeu d’enregistrements est suivi des deux commandes rst.MoveLast et rst.MoveFirst. Ces dernières sont destinées à balayer le jeu et assurer que son décompte sera exact. 9. La onzième ligne de programme démarre à distance Excel : Set prog_xlsx = New Excel.Application. L’objet étant déclaré au préalable, cette commande équivaut exactement aux gestes de l’utilisateur qui cliquerait sur Démarrer > Programmes > Microsoft Excel. 10. La ligne suivante rend l’application visible prog_xlsx.Visible = True. En effet, lorsque la ligne précédente est exécutée, une session Excel démarre (on peut le vérifier en consultant les processus en cours dans le Gestionnaire des tâches Windows), mais tout ce qui va suivre pourrait être exécuté en tâche de fond, sans visualisation graphique. 11. Set fic_xlsx = prog_xlsx.Workbooks.Add . équivaut à la manipulation Fichier > Nouveau dans Excel. À partir de cet instant, l’application Excel est « pilotée à distance » : tous les objets seront référencés à partir du « préfixe » fic_xlsx pour désigner cet objet et non pas un autre fichier ouvert simultanément par exemple. 12. La commande fic_xlsx.Sheets(1).Name = "Préfectures" donne au premier onglet du classeur Excel le nouveau nom de « Préfectures » en lieu et place de Feuil1, créé par défaut. La syntaxe Sheets(1).Name = « xxxx », bien connue des programmeurs sous Excel, est simplement préfixée par la référence à l’objet créé dans le même 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 l’objet Range d’Excel qui désigne une cellule a été utilisé. Remarque : la notation doit comprendre la référence au classeur, puis celle de la feuille 1, puis celle de la cellule, et enfin les coordonnées cartésiennes de la cellule. 14. La ligne For i = 2 To rst.RecordCount démarre une boucle avec pour valeur de i le chiffre 2 correspondant à la deuxième ligne du tableau Excel (la première est occupée par les noms de colonnes). Les lignes de commandes suivantes, et jusqu’à la ligne Next, seront réitérées autant de fois qu’il y a d’enregistrements dans le RecordSet. 15. fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE") attribue à la ligne i du tableur la valeur du champ CODE dans l’enregistrement en cours. Ici, on a choisi la syntaxe Cells(x,y) d’Excel et non celle de Range() car la référence numérique se conjugue avec la variable i. 16. fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE") fait la même opération avec la deuxième colonne. 17. Le curseur est avancé d’une position par la commande suivante rst.MoveNext. 18. La 21e ligne de programme ne comprend qu’un simple Next qui ferme la boucle ouverte au point 14. 19. Le fichier Excel est enregistré automatiquement par la commande fic_xlsx.SaveAs "C:\PREFECTURES.XLSX" qui est copié ici à la racine du disque dur. 20. Le fichier Excel (et non l’application) est fermé par la commande fic_xlsx.Close. 1. Sheets(1) désigne la première feuille du classeur qu’on aurait aussi pu appeler Sheets ("Préfectures").

216

Access® 2007 et VBA

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

8

Chapitre

21. L’application Excel est fermée par la commande prog_xlsx.Quit. 22. La référence à l’objet Excel est supprimée par la commande Set prog_ xlsx = Nothing. 23. Les trois dernières lignes de programme ferment les références au RecordSet, comme on l’a déjà vu précédemment. Au total, le programme s’écrit 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 = "Préfectures" fic_xlsx.Sheets(1).Range("A1").Value = "CODE" fic_xlsx.Sheets(1).Range("B1").Value = "PREFECTURE" For i = 2 To rst.RecordCount fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE") fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE") rst.MoveNext Next fic_xlsx.SaveAs "C:\PREFECTURES.XLSX" fic_xlsx.Close prog_xlsx.Quit Set prog_xlsx = Nothing rst.Close Set rst = Nothing Set db = Nothing End Sub

Plusieurs commentaires ne sont pas inutiles pour achever cette approche de l’échange de données : • Il existe également une méthode CopyFromRecordSet qui transfère directement des données selon une procédure sensiblement équivalente à celle qui vient d’être développée. Cette méthode livre « en bloc » les données, et donc de manière un peu hâtive, alors que le procédé qui vient d’être montré a l’avantage de pouvoir supporter de multiples paramètres. • De la même manière que l’échange de données est possible, toutes les opérations de pilotage à distance (formatage, mise en place de calculs, etc.) sont imaginables. • La propriété Visible de l’application destination peut être supprimée de sorte que les opérations se déroulent en tâche de fond et le fichier Excel se constitue à l’insu même de l’utilisateur.

Le langage VBA sous Access 217

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

Résumé L’utilisation de Visual Basic permet la mise au point de programmes complets, passant par tous les systèmes d’entrées/sorties (MsgBox(), InputBox()), toutes les gestions de variables et organisations en boucle (While…Loop, Until…Loop, For…Next) qu’un langage de programmation fournit classiquement. VB supporte également l’exécution de commandes SQL programmées (DoCmd.RunSQL) et non pas seulement lancées via l’interface graphique d’Access. Les mises à jour, insertions ou suppressions de données sont dès lors contrôlées et automatisées dans des procédures dont le programmeur a la totale maîtrise. Détachée des formulaires, la notion de RecordSet recouvre le chargement en mémoire vive de données extraites des tables Access et leur manipulation avant recopie éventuelle sur le disque. Une syntaxe particulière s’y attache, qui prévoit l’utilisation d’un curseur parcourant les données. Dans Access, enfin, et comme dans tout programme Office, toutes les fonctionnalités d’automation permettent au programmeur de piloter à distance d’autres applications installées sur la machine client. Ainsi, les échanges Excel/Access, par exemple, peuvent-ils être gérés depuis Access en utilisant le langage objet qu’est VBA.

218

Access® 2007 et VBA

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

8

Chapitre

Problèmes et exercices EXERCICE 1

UN

• Énoncé

On se propose de créer un formulaire qui permettra aux professeurs de noter les élèves de la base de données ECOLE_INTERNATIONALE. Dans la mesure où il y a plusieurs matières (donc plusieurs professeurs), le programme sera installé en réseau. En conséquence, le formulaire ne sera basé sur aucune source de données ; la démarche de notation sera la suivante :

PROGRAMME DE NOTATION

• Le professeur ouvre une zone de liste déroulante et choisit sa matière. • Une zone de liste, en dessous, s’affiche et montre la liste des élèves ayant déjà eu une note pour cette matière (elle se réactualise à chaque choix de matière). • Le professeur peut sélectionner un et un seul élève. • Au moment du choix, s’affichent à l’écran une zone de texte avec la date du jour (modifiable), une zone de texte rappelant le nom de l’élève choisi (non modifiable), une zone de texte vide pour entrer la note, un bouton pour valider la note et un bouton pour annuler l’opération. Aux différences près de présentation, le formulaire doit avoir la structure de la figure 8.4 au moment de la validation d’une note. Figure 8.4

Exercices

Formulaire de notation des élèves.

Le langage VBA sous Access 219

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

* Solution

L’exercice met en œuvre toutes les connaissances acquises sur les formulaires et y ajoute le lancement d’une requête SQL. Les assistants seront invalidés ; on utilisera de préférence le code VBA et non pas les macros. 1. Dessin des deux contrôles d’affichage des matières et des élèves 1. Dans le menu « Créer », cliquez sur « Création de formulaires ». 2. Enregistrez tout de suite le formulaire sous le nom « Frm_InsertionNotes ». 3. Dans le ruban du menu Création, décochez le bouton de l’icône (forme de baguette magique) Utiliser les assistants contrôles. 4. Dans le ruban du menu Création, cliquez sur le bouton « Zone de liste déroulante » et dessinez un rectangle en haut de formulaire. Si les assistants ont été invalidés, la zone est immédiatement créée avec des valeurs par défaut ; dans le cas contraire, cliquez sur Annuler pour obtenir le même résultat. 5. Les propriétés de la zone de liste déroulante sont directement entrées comme suit : Nom du contrôle : Choix_Matiere (au lieu de Modifiable0). Nombre de colonnes : 2. Largeur colonnes : 0;5. Contenu : SELECT MATIERE.ID_MATIERE, MATIERE.NOM_MATIERE FROM MATIERE ORDER BY MATIERE.NOM_MATIERE; . Toutes les autres propriétés sont a priori correctes (non compris la présentation). 6. Dans le menu Création, cliquez sur le bouton « Zone de liste » et dessinez un large rectangle en dessous du premier contrôle. 7. Les propriétés de la zone de liste sont directement entrées comme suit : Nom du contrôle : Choix_Eleve (au lieu de Liste2). Nombre de colonnes : 3. Largeur colonnes : 0;3;3. Contenu : SELECT DISTINCT ELEVE.ID_ELEVE , ELEVE.PRENOM_ELEVE, ELEVE.NOM_ ELEVE, NOTE.ID_MATIERE FROM ELEVE INNER JOIN [NOTE] ON ELEVE.ID_ ELEVE = NOTE.ID_ELEVE WHERE (((NOTE.ID_MATIERE)=[Formulaires]![Frm_ InsertionNotes]![Choix_Matiere])) ORDER BY ELEVE.NOM_ELEVE; . Toutes les autres propriétés sont a priori correctes (non compris la présentation). 8. Revenez à la zone de liste déroulante et cliquez sur le bouton aux trois points de suspension à droite de la propriété Après MAJ. 9. Sélectionnez Générateur de code (et non plus générateur de macro). 10. VB a créé une procédure Choix_Matiere_AfterUpdate(). Ajoutez-y la simple ligne de code Me.Choix_Matiere.Requery où Me désigne le formulaire en cours et Choix_ Matiere le contrôle de zone de liste. La méthode Requery relance la requête du contenu de la zone et actualise les résultats. Enregistrez et testez dès maintenant votre formulaire qui doit déjà fonctionner pour les deux contrôles créés. La requête du contenu de la zone de liste étant un peu complexe

220

Access® 2007 et VBA

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

8

Chapitre

(présence d’un DISTINCT après le SELECT !), elle est reproduite graphiquement sur la figure 8.5. Figure 8.5 Requête d’affichage unique des élèves de l’exercice 1.

2. Dessin des contrôles de la séquence de saisie des notes 1. Cliquez sur le bouton « Zone de texte » et dessinez un nouveau contrôle dans la partie droite du formulaire. Ce contrôle est destiné à afficher le nom de l’élève en cours de notation. Nommez-le « Eleve_encours ». La valeur de cette zone et sa visibilité seront gérées plus loin grâce à du code VBA. 2. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à entrer la note de l’élève. Nommez-le « Note_encours », donnez-lui un Format fixe et un nombre de décimales de 2. Cette zone sera un contrôle de saisie pour l’utilisateur. 3. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à afficher (et éventuellement modifier) la date du jour. Le nom du contrôle est « Date_encours » ; la valeur par défaut de la zone est =Date(). 4. Cliquez sur le bouton « Bouton de commande » et dessinez ce contrôle dans le formulaire en bas à droite. Renommez la légende et le nom du contrôle par « Validation » (deux modifications). Sous ce bouton se trouvera le code Visual Basic qui lance la commande SQL d’insertion de la note. 5. Cliquez à nouveau sur le bouton « Bouton de commande » et dessinez ce contrôle dans le formulaire en bas à droite. Renommez la légende et le nom du contrôle par « Annulation » (deux modifications).

Dans la feuille de propriétés du formulaire lui-même (et non pas d’un autre contrôle), cliquez sur le bouton aux trois points de suspension de la propriété Sur Ouverture et sélectionnez le générateur de code pour y entrer les commandes suivantes, incluses dans une procédure nommée Form_Open : Me.Eleve_encours.Visible = False Me.Note_encours.Visible = False Me.Date_encours.Visible = False

Exercices

3. Création du code Visual Basic À l’ouverture du formulaire, les boutons et zones de texte de saisie des notes doivent être invisibles :

Le langage VBA sous Access 221

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

Lors du clic sur un élève, les événements suivants doivent survenir : • les contrôles relatifs à la saisie doivent devenir visibles ; • le nom de l’élève choisi doit apparaître dans le champ correspondant. En conséquence : 1. Dans la feuille de propriétés du contrôle Choix_Eleve, entrez le code suivant dans la propriété SurClic : Me.Eleve_encours.Visible = True Me.Note_encours.Visible = True Me.Date_encours.Visible = True Me.Eleve_encours.Value = Me.Choix_Eleve.Column(2) Me.Date_encours.Value = Date

Le code entré précédemment pourra avantageusement être copié/collé en inversant simplement les valeurs booléennes des propriétés. Grâce au code de la quatrième ligne, le contrôle Eleve_encours prend la valeur du nom de l’élève et le contrôle Date_encours prend la valeur de la date en cours. On notera que lors de l’ouverture, la propriété de valeur par défaut de ce contrôle est fixée à la date en cours mais que par la suite, il est nécessaire de le repositionner. Lors du clic sur le bouton de validation, les événements suivants doivent survenir : • vérifications de la validité de la saisie ; • insertion de la note dans la table adéquate ; • disparition des contrôles de la saisie. Le code inséré sous la procédure Validation_Click() (propriété SurClic du bouton Validation) est le suivant : If Not IsNumeric(Me.Note_encours) Then MsgBox "Vous devez entrer une note valide", , "Contrôle de saisie" Exit Sub End If If Not IsDate(Me.Date_encours) Then MsgBox "La date doit être renseignée", , "Contrôle de saisie" Exit Sub End If If Me.Note_encours < 0 Or Me.Note_encours > 20 Then MsgBox "La note doit être comprise entre 0 et 20", , "Contrôle de saisie" Exit Sub End If DoCmd.SetWarnings False DoCmd.RunSQL "INSERT INTO [NOTE] (ID_ELEVE,ID_MATIERE,NOTATION, ➥DATE_NOTE) SELECT " & Me.Choix_Eleve & "," & Me.Choix_Matiere & ", ➥" & Replace(Me.Note_encours, ",", ".") & ",#" & Me.Date_encours & "#;" Me.Eleve_encours.Visible = False Me.Note_encours.Visible = False Me.Note_encours = "" Me.Date_encours.Visible = False Me.Date_encours.Value = Date DoCmd.SetWarnings True

Ce code mérite les commentaires suivants : • Les vérifications de validité couvrent le minimum envisageable : la condition If Not IsNumeric() assure que l’insertion SQL ne comprendra pas un champ vide (chaîne

222

Access® 2007 et VBA

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

8

Chapitre

vide), ou une valeur Null, ou une chaîne de caractères (auquel cas le programme renverrait un message erreur). La condition If Not IsDate() applique les mêmes règles au champ date. La troisième vérification vise la validité de la note elle-même. • La commande DoCmd.SetWarnings False évite que le programme n’affiche le message « Vous allez insérer un enregistrement » ; elle est annulée en fin de procédure. • La chaîne de caractères de la commande SQL étant très longue, elle est libellée sur plusieurs lignes mais vous devrez la saisir sur une seule ligne. D’une manière plus générale, on peut insérer des signes soulignés (underscore) en fin de ligne pour permettre un changement de ligne sans que Visual Basic n’interprète la ligne suivante comme une nouvelle commande ; mais cette règle n’est pas valide lorsque le texte coupé est une chaîne littérale entre guillemets. • Les expressions Me.Choix_Eleve et Me.Choix_Matiere renvoient des valeurs numériques (les ID) ; en conséquence, il est inutile de les cerner par des apostrophes ou des doubles guillemets. • La note entrée dans le contrôle Note_encours peut comporter des décimales ; or, le langage SQL exige que les valeurs numériques soient présentées au format anglo-saxon avec le point comme séparateur de décimales. C’est la raison pour laquelle la fonction Replace est utilisée, qui remplace toutes les virgules par des points dans la chaîne de caractères désignée. • La date, dans SQL, doit être cernée par des signes dièse (#). • Les trois contrôles relatifs à la saisie redeviennent invisibles après la validation de la note ; le contrôle de date reprend la valeur du jour en cours et le contrôle de note prend la valeur d’une chaîne vide. Cette précaution assure que l’élève suivant « n’hérite pas » de la note du précédent. Le code inséré sous la procédure Annulation_Click() (propriété SurClic du bouton Annulation) reprend la fin du code entré pour la validation, soit : Me.Eleve_encours.Visible = False Me.Note_encours.Visible = False Me.Note_encours = "" Me.Date_encours.Visible = False Me.Date_encours.Value = Date

Le bouton de sortie de formulaire pourra être réalisé avec l’assistant de bouton de commande (plus rapide) : 1. Le formulaire étant en mode création, cliquez sur l’icône Utiliser les assistants contrôle (représentée par une baguette magique). 2. Cliquez sur l’icône Bouton. 3. Dessinez un carré en bas à droite.

5. Cliquez directement sur Terminer. L’aspect général du formulaire (sélecteur d’enregistrements, boutons de déplacements, barres de défilement, etc.) ne sera pas négligé.

Exercices

4. Dans la première étape de l’assistant, choisissez les options « Opérations sur formulaires » et « Fermer un formulaire ».

Le langage VBA sous Access 223

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

EXERCICE 2

TRAVAIL

SUR JEU D’ENREGISTREMENTS

• Énoncé

On considère que les élèves natifs d’un pays étranger et qui suivent un cours de langue dans leur langue maternelle sont avantagés par rapport aux autres. Il convient donc de créer une procédure automatique pour retirer deux points aux notes déjà données par les professeurs ; cette procédure fait appel à la notion de RecordSet.

* Solution

1. Modification de la structure de la table En premier lieu, ce travail sur les notes nécessite une modification de structure de la table des notes. En effet, la nouvelle procédure modifiera certaines notes, sélectivement : si, par erreur, elle est appliquée deux fois sur la même série, le handicap des élèves concernés ne sera plus de deux points, mais de quatre ! Il faut donc insérer un champ NOTEPONDEREE qui stockera la note réévaluée alors que la colonne des notes initiales restera vierge de toute modification. 1. Insérez manuellement un champ NOTEPONDEREE dans la table NOTE. 2. Reprenez les caractéristiques du champ NOTATION pour en déterminer les propriétés. 3. Créez un nouveau module dans le projet ECOLE_INTERNATIONALE en effectuant un clic droit sur les modules dans Visual Basic Editor puis Insertion. L’accès à Visual Basic est obtenu par Alt-F11 ou Outils de base de données > Visual Basic. 4. Nommez le module « Pondération ». Il existe, comme toujours en informatique, un grand nombre de solutions au problème posé. Nous en indiquerons deux, faisant appel à des procédés différents et se distinguant surtout par la vitesse d’exécution. La première méthode met simultanément en œuvre deux jeux d’enregistrements (ce qui renforcera les notions acquises dans le cours ) ; la seconde comporte la notion nouvelle de variable tableau. Nous verrons alors que la seconde méthode « tourne » à peu près quatre fois plus vite que la première. 2. Version avec deux jeux d’enregistrements Le problème le plus immédiat de cet énoncé réside dans le fait que la nationalité des élèves est indiquée dans la table ELEVE par des caractères alphabétiques alors que les matières sont identifiées par des ID numériques ; de plus, plusieurs pays pratiquent la même langue (UK et USA par exemple). Il faut donc constituer, d’une manière ou d’une autre un « tableau d’équivalence » pour envisager ensuite la pondération automatique. La première idée, ici, consiste à procéder de la manière suivante : • On charge un jeu d’enregistrements contenant toutes les notes. • On charge un jeu d’enregistrements contenant les ID et les pays des élèves (les autres champs sont inutiles). • On vient lire le premier enregistrement des notes et d’abord l’ID de l’élève. • Dans le jeu des élèves, on recherche la nationalité. • On traduit dans une simple énumération de cas les nationalités en ID de matière. • On compare l’ID matière de l’enregistrement en cours avec celui obtenu après la traduction de la ligne précédente.

224

Access® 2007 et VBA

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

8

Chapitre

• S’il y a identité entre les deux ID de matières, on applique une soustraction et on écrit la note pondérée (update). • On passe à l’enregistrement suivant du jeu de notes. • Et ainsi de suite jusqu’à la fin du fichier des notes. La partie déclarative comprend les alinéas suivants : Sub Calcul_DeuxRecordSets() Dim vardebut As Date Dim db As DAO.Database Dim rst_eleves As DAO.Recordset Dim rst_notes As DAO.Recordset Dim varmatiere As Integer vardebut = Timer Set db = Application.CurrentDb Set rst_eleves = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM ➥ELEVE", dbOpenDynaset) Set rst_notes = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE, ➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset) rst_notes.MoveFirst

La variable vardebut déclarée comme une date entre dans le calcul du temps de réalisation du programme tout entier. Un peu plus bas, la ligne vardebut = Timer attribue à la variable le nombre de secondes écoulées depuis le jour en cours à 00:00h. Il est déclaré deux jeux d’enregistrements : rst_eleves et rst_notes ; le premier contient les ID des élèves 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 début de la boucle de lecture de toutes les notes s’écrit ainsi : While Not rst_notes.EOF rst_eleves.FindFirst "ID_ELEVE =" & rst_notes(0) Select Case rst_eleves.Fields(1) Case "FR", "B" varmatiere = 3 Case "D" varmatiere = 5 Case "UK", "USA", "IR" varmatiere = 6 Case "I" varmatiere = 7 Case Else varmatiere = 0 End Select

• La méthode FindFirst fait avancer le curseur du recordset des élèves jusqu’à la ligne où se trouve l’ID de l’élève qui a été noté. L’expression rst_notes(0) fait référence à la première colonne de l’enregistrement en cours, qui contient l’ID_ELEVE. • Le curseur du recordset des élèves étant bien positionné, le pays de celui-ci peut être récupéré grâce à l’expression rst_eleves.Fields(1). • La tournure conditionnelle If…ElseIf…EndIf est remplacée par l’emploi de la syntaxe Select Case, plus adaptée. La première ligne donne une valeur à comparer après

Exercices

Chaque fois que sera lu un nouvel enregistrement :

Le langage VBA sous Access 225

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

l’expression Select Case ; chaque valeur de comparaison est précédée d’un simple Case et l’énumération s’achève avec un End Select. • Les cas de figure regroupent les pays à la langue identique (France et Belgique, par exemple). Pour chacun d’entre eux, la variable varmatiere prend une valeur numérique correspondant à la table MATIERE. À l’issue de ces lignes, le programme connaît l’ID de l’élève étudié pour un enregistrement de la table des notes et sa langue d’origine, traduite en code matière. Le traitement de la note s’opère alors grâce aux lignes suivantes : If varmatiere = rst_notes(1) Then rst_notes.Edit If rst_notes(2).Value < 2 Then rst_notes(3).Value = 0 Else rst_notes(3).Value = rst_notes(2).Value - 2 End If rst_notes.Update End If rst_eleves.MoveFirst rst_notes.MoveNext Wend

Si la matière dans la table des notes coïncide avec la nationalité de l’élève, alors il est nécessaire de passer en mode modification (rst_notes.Edit). Deux cas de figure se présentent : soit la note est inférieure à deux et la note pondérée sera égale à 0 (il n’est pas prévu d’avoir une note négative !), soit elle est supérieure et peut donc se voir pondérée. C’est la condition posée par la formulation If rst_notes(2).Value < 2 dont la référence rst_ notes(2) correspond à la note actuelle non pondérée. La commande rst_notes.update lance la mise à jour de la colonne rst_notes(3) qui correspond à la note pondérée ; elle n’a lieu que lorsque les conditions précédentes sont réunies. La commande rst_eleves.MoveFirst oblige le curseur du jeu élèves à retourner en début de fichier (pour qu’un prochain rst_eleves.FindFirst puisse balayer la totalité des enregistrements). La commande rst_notes.MoveNext fait passer le programme à l’enregistrement suivant du jeu notes avant que le mot-clé Wend ferme la boucle. Le programme s’écrit enfin ainsi pour fermer l’ensemble des objets : rst_notes.Close rst_eleves.Close Set rst_notes = Nothing Set rst_eleves = Nothing Set db = Nothing MsgBox Format(Timer - vardebut, "Fixed") End Sub

En entier, le programme est le suivant : Sub Calcul_DeuxRecordSets() Dim vardebut As 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

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

8

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 l’indique la boîte de message finale, 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 paraître rapide à certains, il s’avère pourtant relativement lent : si le fichier contient non pas des milliers mais des millions d’enregistrements, il pourra être considéré comme non performant.

3. Version avec un tableau La deuxième formulation de la réponse pourrait donc emprunter une autre voie en imaginant la solution suivante : • On charge un jeu d’enregistrements contenant tous les élèves. • Pour chacun des élèves lus, on traduit sa nationalité en code équivalent à un ID matière et on stocke l’ID de l’élève et son ID matière dans une variable tableau. Une variable

Exercices

Le problème provient du fait que, pour chacun des enregistrements de la table des notes, le curseur du recordset des élèves reparcourt toute ou partie de la table des élèves et réévalue à chaque fois le pays d’origine alphabétique en code ID matière. Il y a, dans cette partie du programme, une grande économie de temps processeur à gagner.

Le langage VBA sous Access 227

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

tableau est, comme son nom l’indique, une variable qui peut contenir plusieurs colonnes de valeurs pour un même indice. L’indice de cette variable sera l’ID de l’élève et la seule colonne de la variable tableau contiendra l’ID matière. • Ce traitement étant terminé, on a en mémoire vive tous les élèves et leurs équivalents nationalité (avec une vitesse d’accès beaucoup plus rapide que celle d’un recordset). On peut donc fermer le premier recordset. • On charge un autre jeu d’enregistrements contenant toutes les notes. • Pour chacune des notes lues, si l’ID matière du recordset correspond à celui de la variable tableau, alors on applique une soustraction et on écrit la note pondérée (update). • On passe à l’enregistrement suivant du jeu de notes. • Et ainsi de suite jusqu’à la fin du fichier des notes. L’avantage de cette deuxième formulation tient surtout au fait que la translation entre les nationalités alphabétiques et les ID matière numériques n’est opérée qu’une seule fois : le temps de traitement descend à 0,54 seconde, soit quatre fois moins que dans la procédure précédente. Le code en est le suivant : Sub Calcul_VariableTableau() Dim vardebut As Date Dim db As DAO.Database Dim rst As DAO.Recordset Dim vartableau(99, 0) As Integer Dim i As Integer vardebut = Timer Set db = Application.CurrentDb Set rst = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM ELEVE", ➥dbOpenDynaset) rst.MoveFirst While Not rst.EOF i = rst(0).Value Select Case rst(1).Value Case "FR", "B" vartableau(i, 0) = 3 Case "D" vartableau(i, 0) = 5 Case "UK", "USA", "IR" vartableau(i, 0) = 6 Case "I" vartableau(i, 0) = 7 Case Else vartableau(i, 0) = 0 End Select rst.MoveNext Wend rst.Close Set rst = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE, ➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset) rst.MoveFirst While Not rst.EOF If vartableau(rst(0).Value, 0) = rst(1).Value Then rst.Edit

228

Access® 2007 et VBA

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

8

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 quatrième ligne, la variable tableau est déclarée par la syntaxe Dim vartableau(99, 0) As Integer. Cette variable pourra contenir 100 lignes (99 lignes plus la ligne 0) et une colonne (la colonne 0). Le programme prend l’indice de ligne pour y stocker l’ID de l’élève et la seule colonne disponible pour y stocker l’équivalent ID matière. Un seul RecordSet est ouvert : pendant la première partie du programme, il contient les ID des élèves et leur nationalité. Une boucle (While Not rst.EOF) fait lire tous les enregistrements ; pour chacun d’eux, la variable tableau est chargée des deux valeurs ID_ ELEVE en indice et équivalent matière en première colonne. La détermination des équivalents matière est effectuée avec la syntaxe Select Case de la même manière que dans la première solution. Lorsque toutes les équivalences sont chargées en mémoire dans la variable tableau, le même RecordSet est repris pour lire toutes les notes. Chaque fois que le numéro de matière contenu dans la variable tableau coïncide avec l’ID_MATIERE du RecordSet, la note pondérée est mise à jour. 4. Version SQL L’énoncé de l’exercice exigeait l’activation d’un ou plusieurs jeux d’enregistrements pour opérer la pondération des notes des élèves. C’est la raison pour laquelle les deux solutions proposées se réfèrent à ce procédé. Il existe une troisième solution, ni plus ni moins performante que la deuxième, et qui utilise uniquement SQL pour faire la même opération. Pour la mettre en œuvre, Vous devez créer une table EQUIVALENCE, dont le contenu est présenté à la figure 8.6. Cette table ne contient que deux colonnes, reprenant les champs ID_MATIERE et PAYS_ELEVE, et établissant les équivalences. Figure 8.6

Exercices

Table d’équivalence de l’exercice 2.

Le langage VBA sous Access 229

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

Dès lors, la requête mise à jour, dont la structure graphique est présentée à la figure 8.7, permet de faire la même opération en une seule fois. Elle est construite en sélectionnant dans l’onglet Créer, l’icône Création de requête. Choisissez ensuite les tables NOTE, ELEVE, EQUIVALENCE et MATIERE, puis dans le ruban, sélectionnez Mise à jour. Par un glisser/déposer, mettez en relation le champ PAYS_ELEVE des tables ELEVE et EQUIVALENCE. Dans la zone Champ de la première colonne choisissez NOTEPONDEREE de la table NOTE. Dans la zone Mise à jour inscrivez VraiFaux([NOTATION] Gérer > Compacter la base de données. Le gain de place disque peut être considérable. • Les options concernant le volet de navigation, les barres de menus et les rubans seront étudiées plus loin. Ici, elles seront simplement invalidées ou mises en place. L’option Autoriser les menus contextuels par défaut doit être désactivée 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 gère pas, contrairement à ce que l’on pourrait croire, l’orthographe, mais les erreurs de noms des objets d’Access. Elle pourra être conservée en standard. Il sera parfois utile, en revanche, d’invalider la correction automatique dans le chapitre Vérifications des Options d’Access. En effet, la saisie du mot « FRANCE » en majuscules, par exemple, est automatiquement modifiée par l’orthographe « France » en minuscules, ce qui peut induire des difficultés dans la rédaction d’une table des pays. La plupart des options citées ici sont invalidées lorsque l’application est démarrée en conservant le doigt sur la touche Majuscule pendant le démarrage : on accède alors à la base comme son programmeur 1.

(2)

La gestion des utilisateurs Jusqu’à Access 2003, le programme contenait des options permettant de gérer les accès des utilisateurs avec un mot de passe par utilisateur. Access 2007 a complètement supprimé cette notion 2. Il n’est plus possible que de créer un mot de passe général à un fichier « .accdb » (option Outils de base de données > Chiffrer avec mot de passe). La gestion des utilisateurs est donc totalement reportée sur les programmes développés, leur code Visual Basic et leurs formulaires. Pour reprendre l’exemple de la base Northwind, étudiée au début de cet ouvrage, il existe une table « Employés » et une table « Privilèges » qui gèrent quelques droits particuliers des utilisateurs compte tenu de leur position hiérarchique. Il n’existe pas, en revanche, de menu particulier pour telle ou telle catégorie d’employés. L’insertion d’un formulaire modal d’identification au démarrage de l’application a pour principal avantage, ici, de créer et d’incrémenter une variable publique qui pourra être utilisée comme valeur par défaut dans tous les formulaires et états. C’est la démarche qui a été choisie par les concepteurs de la base Northwind. Pour une gestion plus fine des droits des utilisateurs, il n’est donc envisageable que de créer une base de données SQL Server à laquelle sera connectée la base Access. En effet,

1. Cette fonctionnalité est elle-même supprimable au moyen de la propriété AllowBypassKey de la base grâce à Visual Basic. 2. La gestion des utilisateurs est encore utilisable pour les fichiers « .mdb » fonctionnant en mode de compatibilité sous Access 2007.

La finalisation, monter une application 237

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

SQL Server gère parfaitement les droits des utilisateurs, table par table, fonctionnalité par fonctionnalité. Quant aux menus, il sera excessivement lourd de les faire varier selon la catégorie d’utilisateur. On se contentera, le plus souvent de code Visual Basic ou autres macros qui bloqueront telle ou telle option si les privilèges requis ne sont pas atteints par l’utilisateur en cours. On mesure là l’une des limites du programme Access.

(3)

Le volet de navigation Le volet de navigation peut être choisi comme menu général d’une application : on y trouve tous les éléments formulaires qui fondent la base de données pour l’interface utilisateur. Si tous les exercices des chapitres précédents ont été réalisés, la base de données ECOLE INTERNATIONALE comprend sept formulaires qui peuvent servir de menu général à l’application. La démarche de mise en place sera la suivante : 1. 2. 3. 4.

Faites un clic droit sur le premier élément : « Frm_ChoixEleve ». Cliquez sur « Ajouter à un groupe > Nouveau groupe ». En haut, nommez le nouveau groupe « ECOLE » (au lieu de Personnalisé1). Inscrivez les autres formulaires dans ce nouveau groupe par un clic droit sur chaque élément puis en cliquant sur ECOLE. On doit obtenir les éléments suivants : • Choix d’un élève. • Envoi lettre de fin d’année. • Envoi mail des résultats. • Notation des élèves • Liste des élèves. • Moyennes des élèves 1. • Visualisation des élèves. 5. Faites un clic droit sur chacun des éléments listés 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 éléments que vous ne voulez pas faire apparaître et sélectionnez l’option Masquer dans ce groupe. Pour opérer plus rapidement, vous pouvez faire un clic droit sur un groupe d’éléments (Tables par exemple) et sélectionner Masquer 3.

1. Les sous-formulaires de ce formulaire n’ont pas besoin d’être libellés. 2. Les éléments ne peuvent être renommés que s’ils sont inscrits à un groupe. Il est vivement recommandé, dans les options de navigation, d’opter pour le double-clic sur les éléments de navigation : les actions sur les noms de raccourcis sont en effet très difficiles à réaliser lorsque le simple clic est choisi. On peut, le cas échéant, retourner au simple clic ensuite. 3. Pour rendre à nouveau visibles les éléments masqués, accédez aux Options de navigation par le menu du démarrage (voir paragraphe précédent) ou en faisant un clic droit sur la barre supérieure du volet de navigation, et cochez à nouveau les éléments masqués.

238

Access® 2007 et VBA

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

9

Chapitre

Il est envisageable de créer autant de groupes personnalisés que de besoin (maximum 10) pour s’adapter aux utilisateurs. À l’issue de ces manipulations, la limitation des menus prendra le dessin de la figure 9.2. Figure 9.2 Volet de navigation personnalisé.

Ces mises au point réalisées, l’utilisateur peut encore personnaliser « son » volet de navigation. Pour empêcher une telle démarche, le passage par les macros ou la programmation sera nécessaire. Il suffira de créer la macro Mcr_VerrouillageVolet présentée à la figure 9.3 et, le cas échéant, de la traduire en code Visual Basic (voir chapitre 7). Figure 9.3 Macro destinée à verrouiller le volet de navigation.

La macro (ou le code) sera lancée avec l’application, par exemple sur l’action Sur ouverture d’un formulaire de démarrage.

(4)

La gestion des rubans Les menus et des rubans sont gérés de manière toute à fait nouvelle avec Access 2007. Si une application avait été développée sous Access 2003 avec des barres de menus personnalisées, celles-ci sont récupérées sous Access 2007, mais dans un menu « Compléments » peu esthétique et qui laisse toute sa place aux rubans dans lesquels de nombreuses fonctionnalités peuvent être considérées comme « dangereuses » par le programmeur. Il devient dès lors nécessaire de les concevoir à nouveau complètement. Avant même de débuter la construction d’un ruban, il est nécessaire de créer les macros ou le code Visual Basic aptes à ouvrir les formulaires auxquels on veut associer un bouton de ruban. 1. Dans le menu « Créer », cliquez sur « Macros ». 2. Dans la colonne Action, sélectionnez Ouvrir formulaire. 3. Dans le Nom du formulaire, entrez « Frm_EnvoiMail ».

La finalisation, monter une application 239

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

4. Enregistrez la macro sous le nom « Mcr_Ouv_EnvoiMail ». 5. Réitérez la même opération pour obtenir une macro nommée « Mcr_Ouv_EnvoiLettre », destinée à ouvrir le formulaire d’envoi d’une lettre personnalisée. Ces deux macros, qui pourraient être traduites en langage Visual Basic, seront invoquées lors de la création des boutons du ruban. Alors qu’Access 2003 disposait d’un assistant graphique très rapide pour mettre en place des barres de menu, Access 2007 n’en dispose plus, alors que la conception, totalement nouvelle, se fonde sur XML (eXtensible Markup Language). Il est souhaitable, dès lors, de disposer d’un éditeur XML pour rédiger ses menus et rubans, bien qu’un simple éditeur de texte puisse suffire. XML est un langage utilisant des balises pour décrire des structures de données. Une balise se signale par les signes < et >. Généralement, il existe une balise ouvrante, notée par exemple et une balise fermante notée . Les balises peuvent être dotées d’attributs du type . Dans un fichier texte ou XML, entrez le code suivant :

La première balise (Customized User Interface ou Interface utilisateur personnalisée) est fermée en fin de fichier par la même balise démarrée avec une barre de fraction (). Elle fait appel à une adresse constante. La deuxième balise porte l’attribut 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é s’ajoutera au menu standard. La troisième balise vise les onglets supérieurs des rubans. Il n’a été créé ici qu’un seul onglet nommé tabMenuGeneral et dont le libellé visible sera « Menu Général ». Ce texte pourrait être conservé au format XML et chargé séparément au moment du démarrage d’Access, mais nous n’étudierons que la faculté d’Access de stocker ce code dans une table spécifique. 1. 2. 3. 4.

Dans le menu « Créer », cliquez sur « Création de table ». Nommez le premier champ « RibbonName » 1 (type texte de longueur 255). Nommez le second et dernier champ « RibbonXml » (type mémo). Enregistrez la table sous le nom exact « USysRibbons » sans clé primaire (répondez « Non » à la demande de création de la clé).

1. Les noms cités sont obligatoires.

240

Access® 2007 et VBA

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

9

Chapitre

5. USysRibbons étant une table système, elle est normalement non visible : pour la faire apparaître, dans les Options Access, cliquez sur « Base de données active > Options de navigation et cochez la case Afficher les objets système. 6. Ouvrez la table « USysRibbons ». 7. Au premier enregistrement, champ RibbonName, entrez le libellé « Ruban1 ». 8. Dans le deuxième champ, faites un copier/coller du code XML indiqué plus haut afin d’obtenir le résultat présenté à la figure 9.4, puis fermez la table 1. Figure 9.4 Code XML inséré dans la table USysRibbons.

9. Cliquez sur les Options Access. 10. Sélectionnez la rubrique Base de données active. 11. Dans la zone Options de la barre d’outils et du ruban, écrivez « Ruban1 » pour renseigner le nom du ruban (la zone de liste déroulante n’est pas opérationnelle). 12. Fermez la base, puis ouvrez-la à nouveau : il n’y a plus que l’onglet Menu Général. Rappel : on peut outrepasser ce démarrage en gardant le doigt sur la touche « Maj » pendant l’ouverture de la base. Nous nous proposons à présent de créer un simple ruban, comme présenté à la figure 9.5, dans lequel apparaîtront : • Un groupe nommé Gestion des courriers et dans lequel sont placés deux boutons d’envoi mail et envoi courrier. • Un groupe nommé Application et contenant un bouton de fermeture de la base. Figure 9.5 Ruban personnalisé.

S

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

1. On prendra garde à parfaitement orthographier le fichier XML, qui est sensible à la casse (caractères minuscules et majuscules). Toute erreur renverra un problème au démarrage.

La finalisation, monter une application 241

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

USysRibbons avec le code XML suivant, qui pourra être saisi au préalable dans un éditeur de texte :

La balise crée des pavés dans le ruban : le premier groupe s’appelle grpEnvois et le second grpApplication. Elle est chaque fois fermée par . Chaque pavé est doté des attributs id (nom unique) et label (étiquette). La balise crée des boutons dotés des propriétés suivantes : • Une identité qui peut être soit personnalisée, c’est-à-dire dotée d’un attribut nommé (id = « xxx »), soit standard et nommée idMso 1. La fermeture de la base, en bas du code, en est un exemple. • Un label, qui s’affichera sur le bouton. • Une taille, qui peut être normal ou large. • Une image 2. • Une bulle d’aide ou screentip. • Une sous-bulle d’aide (au texte plus long) ou supertip. • Une propriété onAction, qui lance le code ou la macro nommée dans l’attribut. La fermeture puis l’ouverture de la base font apparaître le nouveau ruban.

1. Les noms des idMso peuvent être retrouvés dans les options Access, page Personnaliser, en survolant les options des menus. 2. Le choix et les noms des images peuvent être connus de la manière suivante : depuis le « Download Center » de Microsoft, téléchargez (gratuitement) le 2007 Office System Add-In: Icons Gallery. Après installation, un fichier nommé Excel Office2007IconsGallery.xlsm pourra être ouvert sous Excel (dans le ruban Développeur d’Excel).

242

Access® 2007 et VBA

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

9

Chapitre

Il existe de nombreuses autres présentations des éléments qui peuvent apparaître dans un ruban (séparateurs, zones de liste déroulante, menus déroulants) ; il serait trop long de les énumérer ici.

Résumé Par défaut, le programme Access met à disposition de l’utilisateur tous les éléments d’une base de données : tables, formulaires et autres. Cette liberté peut être conservée dans le cadre d’une organisation où l’utilisateur et le programmeur ne font qu’un. Dès que la base de données est mise à disposition de plusieurs personnes, il devient indispensable de gérer les accès à tous ces éléments. Cette nécessité naît non seulement d’impératifs d’intégrité des données, mais également d’un besoin d’ergonomie à destination d’utilisateurs non avertis. Access donne la possibilité d’organiser le volet de navigation pour ne plus faire apparaître que les éléments achevés et protégés du système tout entier, les formulaires en particulier. D’une certaine manière, il peut donc devenir une forme de menu, à l’image de la barre horizontale des anciennes versions. Mais le volet de navigation n’est pas obligatoire et peut être remplacé (ou augmenté) par une gestion complète des rubans. Dépourvu de concepteur graphique, le gestionnaire de ruban d’Access 2007 exige l’écriture en code XML d’une arborescence d’onglets (tabs), de pavés (groups) et de boutons (buttons). Ceux-ci peuvent employer tout ou partie des éléments standards des menus Access.

La finalisation, monter une application 243

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

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

Index Symboles & 185 .accdb 3, 23 .csv 77 .dsn 72 .laccdb 23 .mdb 3, 23

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

B Balise 240 Barre de synchronisation 32 de défilement 155 Begin transaction 99 Bentrée 184 BOF 210 Boîte de dialogue modale 174 BoîteMsg (action) 185

Bouton de commande 183 de déplacement 155 Branchement 192

C Case à cocher 139 Champ 47 Champ-père 158 Clé étrangère 51, 94 primaire 40, 54 Coller 66 par ajout 66 Colonne liée 135 Column (VB) 198, 232 Coma Separated Values 77 Comme 87, 104 Commit transaction 100 Compactage 237 Compte() 149 CompteDom() 150 Concaténation 185 Conditions 186 Continu (formulaire) 127 Contrainte référentielle 50, 80 Contrôle 22, 125 ActiveX 143 Bouton de commande 137 Cadre d’objet dépendant 138 Case à cocher 139 Etiquette 133 Onglet 141 zone de liste 135 déroulante 133 zone de texte 131 Conversion (en Visual Basic) 189 Copier 66

Curseur 210

D DAO 208 Date() 119 DéfinirVarTemp (action) 184 Delete 97 Délimitée (structure de fichier) 69 Démarrage, paramètres 236 Diagramme d’activité 32 d’état 32 Dim (VB) 197 Distinct 88 Distinctes, valeurs 107 Diviseur d’enregistrements 136 DoCmd 192 Domaine 149 Données externes 69 Doublon 94

E Edit (VB) 213 Enregistrement, ligne 18 En-tête de formulaire 124 de ligne ou colonne 114 Entier Long 76 Entrée de données (formulaire) 129 EnvoyerObjet (action) 201 EOF 210 Et 88 États 12, 167 Etiquette 133 de ligne 192 Excel 67 automation 215

Index 245

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

ExécuterMacro (action) 187 ExtracChaîne() 91

F Facture, créer 27 Fen indépendante 174 Modale 174 Feuille (de données) 16 Fields 209 Filtre 15, 87, 103 Find 211, 225 Fonction 90 Compte() 149 CompteDom() 150 Date() 119 de domaine 149 ExtracChaîne() 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 entrée de données 129 unique 127

G Gauche() 90 Générateur d’expressions 90, 140 de code 220 GoTo 192 Graphique 142 Groupe d’options 139

I Icône 236 Identifiant 40 Importation de données 66 Index 48 Intégrité référentielle 50 IsDate 222 IsNumeric 222

J Jeu d’enregistrements 208 Jointure 93, 108 droite ou gauche 94

246

Access® 2007 et VBA

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

Processus 32 Produit cartésien 94 Projet 191 Propriété (de formulaire) 126

R

Macro 12, 164, 178, 181 conditionnelle 186 incorporée 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 Modèle physique 38 Module 12, 190, 206 Move 210 MoyDom() 195 MsgBox 191 MySQL 4, 72

RechDom() 184 RecordCount 211 RecordSet 208 Rectangle (contrôle formulaire) 136 Réel Double 76 Regroupement 91, 108, 170, 175 Regrouper et trier 171 Relation 38 de plusieurs à plusieurs 42 de un à plusieurs 42 icône 34 réflexive 45, 61 Réorganiser (onglet) 153 Requête ajout 95, 118 création 100 définition de données 101 mise à jour 98 paramétrée 89 Sélection 12, 84 suppression 97, 120 Round() 112 Ruban 11, 21, 239 RunSql 206

N

S

Non-correspondance 95 Not 88, 105 Null interdit 48

Select Case 226 Sélecteur 125 afficher 155 Sélection étendue (zone de liste déroulante) 136 multiple (zone de liste déroulante) 135 simple (zone de liste déroulante) 136 Séparateur 70 SetWarnings 222 SommeDom() 150 Source de données (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 (propriété) 196, 222 SurErreur (action) 188

M

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

P Paramètres d’importation 70 de démarrage 236 Pas 88, 105 PDF 169 Pièce (jointe) 18 Pied de formulaire 125 Points-virgules 78

T Table 12 création 46

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

Tableau 227 croisé dynamique 113 Tabulaire, mode 153 Temps, notion de 44 Titre de l’application 236 Totaux (icône) 91 Tracé d’enregistrement 70 Transaction 98 TransférerFeuilleCalcul (action) 183 Tri 15, 86, 103

U UML (Unified Modeling Language) 31

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

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

W Where 87

X XML 4, 240

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

Index 247

Informatique

Synthèse de cours

& exercices

Access 2007

Microsoft®

®

et VBA

corrigés L'auteur :

Bernard Minot est professeur associé en informatique à l’université Paris-Est. Il y enseigne l’utilisation des tableurs, l’audit informatique et la gestion des bases de données sous Oracle. Il est également auditeur informatique dans le cabinet qu’il dirige.

Dans la même collection : • Excel et VBA, B. Minot • Le langage C, J.-M. Léry • Le langage C++, M. Vasiliu • Java 5 et 6, R. Chevallier • UML 2, deuxième édition, B. Charroux et al • Création de bases de données, N. Larrousse • SQL, F. Brouard, C. Soutou • LaTeX, J.-C. Charpentier, D. Bitouzé • Algorithmique, applications en C, J.-M. Léry • Algorithmique en C++, J.-M. Léry • Algorithmique en Java 5, J.-M. Léry • Mathématiques discrètes appliquées à l’informatique, R. Haggarty • Architecture de l’ordinateur, E. Lazard • Systèmes d’exploitation, B. Lamiroy et al • Linux, J.-M. Léry

Ce livre, qui porte sur la dernière version d’Access, présente toutes les étapes de la conception de bases de données de taille moyenne. Il explique également comment réaliser des interfaces graphiques de saisie et de visualisation. Les premiers chapitres traitent de la modélisation des données, de la conception de tables grâce à l’interface graphique d’Access, et de l’échange de données avec d’autres applications, telles qu’Excel. Les chapitres suivants présentent les requêtes 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 données peuvent être récupérées sur le site www.pearsoneducation.fr. Les exercices sont tous intégralement corrigés. Ce livre s’adresse en premier lieu aux étudiants de premier cycle, aux étudiants en IUT et en BTS. Il sera également utile aux PME désirant créer leurs propres bases de données. La collection Synthex informatique propose de découvrir les fondements théoriques et les applications pratiques des principales disciplines de science informatique. À partir d’une synthèse de cours rigoureuse et d’exercices aux corrigés détaillés, le lecteur, étudiant ou professionnel, est conduit au cœur de la discipline, et acquiert une compréhension rapide et un raisonnement solide.

• Architecture des réseaux, D. Seret, D. Dromard • XML, G. Chagnon, F. Nolot

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

ISBN : 978-2-7440-4014-6

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF