Académique Documents
Professionnel Documents
Culture Documents
Please consider the environment - do you really need to print this document!?
Vincent Isoz
2015-03-09
Vincent ISOZ
Remarques:
Pour qu'il soit utilisable d'une manire rationnelle et sans danger, ce support qui constitue un
"super condens" d'un expos qui tiendrait trs facilement sur plusieurs milliers de pages (voir
les ouvrages de cette taille disponible sur le commerce) doit absolument tre complt par de
nombreuses notes et exposs oraux, au cours desquels les notions nouvelles sont prsentes au
moyen de situations concrtes et illustres par de nombreux exemples dont le choix dpend
essentiellement du droulement de la formation afin d'exciter l'esprit critique des apprenants.
Ce support correspond une formation d'environ 15 jours 6.5 heures par jour pour un
groupe de 6 personnes.
Ce qui est vu dans ce support peut tre appliqu toutes les versions antrieures
MS Access 2007. Je ne mettrai donc pas ce document jour pour qu'il corresponde la
version 2007, 2010 ou 2012 (sauf pour les nouveauts) puisque Microsoft la tendance ces
dernires annes changer l'interface chaque version et j'ai autre chose faire de mon temps
que de mettre jour des captures d'cran.
Je tiens galement m'excuser du fait que ce document mlange les captures d'cran d'un
grand nombre de versions de MS Access (97 2010) et en plus de diffrentes langues
(franais + anglais). Effectivement, mon mtier m'oblige constamment changer d'ordinateur
et ainsi le contenu des documents que je rdige. J'espre que le lecteur comprendra en
attendant une uniformisation.
Il y a de nombreuses marques dposes qui sont nommes dans le prsent support. Plutt que
d'utiliser le symbole du trademark sur chaque occurrence de marque nomme, j'ai choisi
d'utiliser le nom seul uniquement dans un souci d'esthtique ditoriale (ce qui devrait aussi
bnficier au propritaire de la marque), sans aucune intention de violer une quelconque
rglementation ou lgislation.
Pour terminer, je voudrais remercier ici les quelques collgues (Olivier Weber,
Fabrice Fournier) et clients qui ont bien voulu me faire part de leurs remarques pour amliorer
le contenu de ce livre lectronique. Il est cependant certain qu'il est encore perfectible sur de
nombreux points.
Si vous souhaitez tre inform des nouvelles versions majeures de ce document n'hsitez pas
m'crire un mail dans ce sens: isoz@sciences.ch.
MS Office Access
1/564
Vincent ISOZ
4 Tables .................................................................................................................................... 39
4.1 Liaison MS Excel/CSV ................................................................................................................ 41
4.2 Cration de tables......................................................................................................................... 42
4.3 Formulaire simple (auto-form) .................................................................................................... 44
4.4 Contrle des donnes ................................................................................................................... 45
4.4.1 Lgende ............................................................................................................................... 45
4.4.2 Types de donnes (Typages) ............................................................................................... 47
4.4.3 Formats ................................................................................................................................ 55
4.4.4 Masques de saisie ................................................................................................................ 55
4.4.5 Validation (Valide Si) .......................................................................................................... 58
4.5 Import MS Excel.......................................................................................................................... 62
4.6 Import MS ACCESS.................................................................................................................... 63
4.7 Import/liaison MS Outlook .......................................................................................................... 64
4.8 Format des tables ......................................................................................................................... 67
4.9 Outil recherche............................................................................................................................. 68
4.10 Proprits des tables................................................................................................................... 69
4.11 Tris et filtres ............................................................................................................................... 70
4.11.1 Critres numriques et textes ............................................................................................. 71
4.11.2 Critres numriques et dates .............................................................................................. 71
4.11.3 Caractres gnriques (wildcards) ..................................................................................... 71
4.11.4 Fonctions gnriques ......................................................................................................... 72
4.11.5 Tris et filtres avancs ......................................................................................................... 73
MS Office Access
2/564
Vincent ISOZ
5.1.1.4 ALC statique choix multiple de type liste droulante extensible...............................81
5.1.2 Assistant liste de choix (ALC) li ........................................................................................ 83
5.1.2.1 ALC statique li choix unique de type zone de liste droulante ................................83
5.2 Relation un un ........................................................................................................................... 88
5.3 Relation un plusieurs................................................................................................................. 89
5.4 Relation plusieurs plusieurs ...................................................................................................... 93
5.5 Relation "simple" (sans intgrit rfrentielle) ............................................................................ 93
5.6 Relation avec intgrit rfrentielle ............................................................................................. 93
5.7 Relation circulaire (auto-liaison) ................................................................................................. 99
5.8 Relations d'hritage et composites ............................................................................................. 101
5.9 Index simples et combins ......................................................................................................... 102
MS Office Access
3/564
Vincent ISOZ
8.2 Synthse et requte .................................................................................................................... 169
8.3 Sous-tats ................................................................................................................................... 171
8.4 Rapports avec groupes (pour lettres ou factures) ....................................................................... 175
8.5 Rapport paramtr par formulaire.............................................................................................. 190
8.6 Objet ActiveX ............................................................................................................................ 191
8.7 Graphique statistique insr ....................................................................................................... 192
8.8 Graphique insr ........................................................................................................................ 196
8.9 Tableaux croiss dynamiques .................................................................................................... 197
8.10 Graphiques croiss dynamiques............................................................................................... 198
MS Office Access
4/564
Vincent ISOZ
10.18 Fonction DLookUp (formulaire)............................................................................................ 256
10.19 Fonctions Count et DCount (requte) .................................................................................... 257
10.20 Fonction Dsum (requte) ....................................................................................................... 258
10.21 Fonction Dsum et Dates (requte) ......................................................................................... 259
MS Office Access
5/564
Vincent ISOZ
17.2.2 Mthodes ......................................................................................................................... 335
17.2.3 Modlisation des droits .................................................................................................... 337
17.2.4 Dangers de l'espace de travail "par dfaut": .................................................................... 338
17.2.5 Un peu de VBA avec la scurit ...................................................................................... 355
17.2.6 A propos du fichier ldb .................................................................................................... 358
17.2.7 Problmes de scurit avec les requtes .......................................................................... 358
17.3 Dploiement ............................................................................................................................. 359
MS Office Access
6/564
Vincent ISOZ
19.27 Identification .......................................................................................................................... 425
19.28 Utilisation de la scurit avec VBA ....................................................................................... 429
19.29 Automation ............................................................................................................................ 432
19.29.1 Ouvrir MS Excel et y faire des tratements.................................................................... 432
19.30 D.A.O. et ADO (avec MS Word ou MS Excel)..................................................................... 433
19.30.1 D.A.O............................................................................................................................. 433
19.30.1.1
Mthodes de lecture et criture de tables et requtes en DAO ..........................433
19.30.1.2
Mise jour de tables DAO ................................................................................436
19.30.1.3
Recherche VBA DAO .......................................................................................437
19.30.1.4
Excution requte d'action VBA DAO ..............................................................438
19.30.2 A.D.O............................................................................................................................. 439
19.30.2.1
MS Excel - lecture ADO ...................................................................................441
19.30.2.2
Curseurs adLockReadOnly, adLockPessimistic, adLockOptimistic,
adLockBatchOptimistic ...........................................................................................................441
19.30.2.3
MS Excel - Recherche ADO .............................................................................443
19.30.2.4
MS Excel - criture ADO .................................................................................443
19.30.2.5
MS Word - Recherche ADO .............................................................................444
19.31 DLookup syntaxe ................................................................................................................... 445
19.32 tats ....................................................................................................................................... 446
19.33 Requtes ................................................................................................................................. 447
19.33.1 Lecture du contenu d'une Query DAO .......................................................................... 448
19.33.2 ReQuery ......................................................................................................................... 448
19.34 Choix multiple ....................................................................................................................... 449
19.35 Calendrier .............................................................................................................................. 450
19.36 Connexion .............................................................................................................................. 452
19.37 Nouveauts VBA Access 2007-2010..................................................................................... 453
19.37.1 Connecteur ADODB...................................................................................................... 453
19.37.2 Export flat-file (schema.ini)........................................................................................... 454
19.37.3 Mode Hors-Ligne/En-Ligne SharePoint ........................................................................ 454
MS Office Access
7/564
Vincent ISOZ
30 MySQL ............................................................................................................................... 522
31 PocketPC ........................................................................................................................... 527
32 Business Objects ................................................................................................................ 532
33 Crystal Reports .................................................................................................................. 538
34 Runtime.............................................................................................................................. 540
34.1 Activer le clic droit dans le runtime ......................................................................................... 541
MS Office Access
8/564
Vincent ISOZ
MS Office Access
9/564
Vincent ISOZ
1 Liens internet
Voici une liste non exhaustive de quelques excellents liens concernant MS Access!
visiter absolument !!!
http://ww.testoffice.com (testez vos connaissances)
http://msdn.microsoft.com (page des dveloppeurs)
http://msdn.microsoft.com/fr-fr/library/bb726434%28v=office.12%29.aspx (lien direct VBA)
http://communities.microsoft.com (newsgroups)
http://mypage.bluewin.ch/w.stucki/astuces.htm (page perso)
http://ww.info-3000.com/access/supportdecours/index.htm (page perso)
http://access.seneque.free.fr (page perso)
http://ww.self-access.com/access (page perso)
http://memoaccess.free.fr (page perso)
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/sommaire.htm (page universitaire)
http://ww.wrox.com (livres MS Access en anglais)
http://ww.developpez.com (forum)
http://ww.microsoft.fr (pour les mises jour et plug-ins)
http://w.mvps.org/accessfr/ (page des MVP)
http://homepage.bluewin.ch/wstucki/astuces.htm (plein d'astuces VBA!)
http://www.mvps.org/access/general/gen0012.htm (Leszynski/Reddick naming convention)
http://www.techonthenet.com/access/functions/index.php (liste de fonctions Access avec
exemples)
http://www.bandwood.com/gbs.htm (plug-in permettant de crer rapidement des Gantt sous
Microsoft Access: Gantt Chart Builder System)
http://www.iheartmacros.com (site officiel du VBA de Microsoft Office)
MS Office Access
10/564
Vincent ISOZ
1. propos du rdacteur
Nom Prnom: ISOZ Vincent
Domicili ce jour Lausanne (Suisse)
Formation: Ingnieur Physicien HES (B.Sc.)
quivalence Internationale: Bachelor of Science
Anne de naissance: 1978
Actuellement, je suis consultant trilingue (franais, anglais et allemand) en mathmatiques
appliques dans le tutorat d'analystes quantitatifs (niveau Bac+5 Bac+7) et auteur de
plusieurs livres lectroniques dans les domaines suivants:
- matrise statistique des processus/procds (mthodes paramtriques et non paramtriques)
- modlisation prvisionnelle/dcisionnelle avance (arbres de dcisions, chanes de Markov)
- recherche oprationnelle (simplexe, algorithmes gntiques, algorithme GRG)
- data mining (rseaux de neurones, ACP, AFC, rgressions, scoring, clustering, etc.)
- modlisation du risque en gestion de projets et finance d'entreprise (monte-carlo, etc.)
- gestion de projets (modles et best practices thoriques EFQM+Six Sigma, MS Project)
- ISO 9001:2008, 5807:1985, 10015:1999, 31000+31010:2009, 8258:1991, 10017:2003, etc.
- Adobe Photoshop et Illustrator
- 12 applications de la suite Microsoft Office System (Project, Visio, SharePoint, Access, etc.)
ce jour interventions dans plus de ~200 entreprises dont 10 du Fortune 500 selon listing
2009 et 3 universits et coles d'ingnieurs suisses dans des cours de modlisation de bases de
donnes et simulations stochastiques du risque. Formation de plusieurs dirigeants de
multinationales en one to one.
Accessoirement j'interviens pour des formations sur des logiciels comme MS Project,
MS Visio, MS Access et une vingtaine d'autres dont je dlgue l'organisation des entreprises
spcialises dans la formation continue en bureautique (niveau licence et en-dessous).
MS Office Access
11/564
Vincent ISOZ
2 Introduction
"Je gre ma base de donnes sur Excel"
"Je travaille sur une base de donnes Excel"
Il est encore frquent d'entendre cette phrase, un non-sens puisque MS Office Excel n'est pas
un systme de gestion de base de donnes mais un tableur!
Cette confusion trouve son origine en partie dans le fait que les interfaces des deux logiciels
sont similaires, lorsque les donnes sont prsentes en tableau. Mais la ressemblance s'arrte
l! Le tableau se caractrise par sa souplesse et sa rapidit de mise en oeuvre, alors que le
systme de gestion de bases de donnes permet avant tout d'assurer la cohrence d'une grande
quantit d'informations, indpendamment de leur prsentation: tables, relations, intgrit
rfrentielle sont autant de puissants outils spcifiques aux bases de donnes permettant
d'assurer un contrle permanent de la cohrence des informations qu'elles renferment.
Une base de donnes relationnelle (S.G.B.D.R.) a plusieurs avantages compars une base de
donnes simple aussi appele "flat file". Elle utilise beaucoup moins d'espace mmoire, car
elle rduit au minimum les redondances ou les rptitions des donnes (si elle a t bien
conue).
Remarques:
R1. En prvision de l'volution technologique des bases de donnes, il est habituellement
prfrable de mettre les tables dans un fichier MS Access prdfini "indpendant" d'un autre
fichier o se trouveront les formulaires, requtes et tats (voir page 328).
R2. Contrairement aux exercices donns dans ce support, les noms des champs de donnes
doivent tre des mots uniques (sans espaces), en minuscules, sans accents et autres symboles
spciaux (c'est ce qui est fait pendant le cours).
R3. Pour plus d'informations sur les conventions de nommage voir la page 36.
De plus, pendant le cours, nous n'allons pas ncessairement suivre l'ordre et la structure des
exercices tels que prsents dans ce support (il faut savoir tre flexible!).
Par ailleurs, en toute rigueur nous ne devrions pas parler de "base de donnes MS Access"
mais de "base de donnes JET", JET (Joint Engine Technology) tant le moteur de base de
donnes de MS Access 2003 et antrieur qui est lui-mme un outil RAD (Rapid Application
Development).
Remarque: MS Access 2007 et ultrieur utilisent un nouveau moteur appel "Access Database
Engine"
Enfin, la stabilit des fichiers MS Access (fichiers *.mdb) n'est pas garantie. Il arrive qu'un
fichier soit endommag et, malgr les outils de rparation, ne puisse tre rcupr. Il est donc
impratif de soigner tout particulirement sa politique de sauvegarde.
Pour finir, je pense sincrement que les SGBDR clients sont des outils morts et dsuets face
aux bases de donnes internet qui permettent une beaucoup plus grande flexibilit, une
MS Office Access
12/564
Vincent ISOZ
interface plus conviviale, des possibilits grandioses, un environnement multi-utilisateur rel
et j'en passe... Donc, rflchissez srieusement avant de faire une base de donnes avec des
techniques qui ont 30 d'ge (est-ce que vous rouleriez avec une voiture dont la carrosserie est
neuve, mais dont le moteur a 30 ans... probablement pas!).
2.1 Environnement
Certes, MS Access est un L4G1 cr en 1992. Mais ce n'est pas le seul logiciel client de ce
type sur le march et pas le plus vieux! Je souhaiterais donc indiquer les grands classiques
dans l'ordre de popularit afin d'tre neutre:
un L4G (sigle de langage/logiciel de quatrime gnration) est un terme utilis pour dsigner un type de
logiciel qui comporte un langage de programmation combin avec un systme de gestion de base de donnes.
MS Office Access
13/564
Vincent ISOZ
4D Payant (www.4d.com)
et nous pourrions encore citer SQL Server Express, ORACLE Express et MySQL.
2.2 Protocole
Lorsque l'on cre une base MS Access, on procde toujours de la faon suivante (les temps cidessous sont donns relativement une qualit professionnelle assure - ces temps ne sont pas
valables pour des amateurs o les facteurs peuvent aller de 0.1 100:
1. Analyse des besoins (2 jours 2 semaines)
2. Choix d'une stratgie de nommage2 (1 2 heures)
3. Modlisation selon les formes normales (2 jours 2 semaines)
4. Dfinir un *.mdw selon le protocole donn dans le chapitre de gestion de la scurit
voir page 332)
5. Cration des tables (1 jour 2 semaines)
a. Dfinition des proprits des tables3 (types de donnes, formats, contraintes,
lgendes, index).
b. Cration des liaisons (aprs la cration des listes de choix !!!) entre les tables
(un un, un plusieurs, intgrit)
6. Cration des requtes (simple, ajout, suppression, table) (1 2 semaines)
7. Cration et design des formulaires (simples, imbriqus ne pas oublier les infobulles!)
(1 2 semaine)
8. Cration et design des tats (1 semaine)
9. Sparation des tables dans un fichier indpendant: stratgie dorsale/frontale (1 jour)
10. Analyse/Optimisation de la base (1 jour)
11. Dfinir la gestion des utilisateurs (1 3 jours)
12. Compression de la base (1 5 minutes)
13. "Beta Testing" de la base (plusieurs jours) et ensuite validation (1 plusieurs
semaines)
14. Crypter la base (*.mde/*.accde) et la dployer en runtime
Ne pas prendre comme exemple ce support de cours qui ne respecte pas 100% la norme pour faciliter la
comprhension du lecteur
3
Ne pas oublier de mettre une cl primaire sur des champs AutoNum sur chaque table mme si pas ncessaire
dans un premier temps sinon problmes en perspective lors de migrations !!!
MS Office Access
14/564
Vincent ISOZ
Remarques:
R1. Dans une dmarche rigoureuse, aucune donne ne devrait tre saisie dans les tables tant
que la base n'est pas totalement termine.
R2. Commentez vos tables, vos champs etc et il vaut mieux en mettre trop que pas assez !!!
R3. Il est possible que dans certains cas l'ensemble de la base doive tre faite en
programmation V.B.A cause de contraintes ou complications trop leves.
15/564
Vincent ISOZ
Il y aurait encore beaucoup dire comme:
-
MS Excel ne permet pas de faire un contrle fin de la saisie sans programmation VBA
MS Excel ne permet pas de faire des relations de un plusieurs entre tables avec la
fonction RECHERCHEV( ) ou sans passer par du VBA
etc.
Heureusement, les technologies venir s'orientent toujours plus vers des systmes GDD
(gestion de donnes) ou GED (gestion lectronique de documents) supports par des bases de
donnes relationnelles (comme SharePoint).
MS Office Access
16/564
Vincent ISOZ
Base de donnes
rseau
Base de donnes
orientes objet
Base de donnes
rparties
Base de donnes
relationnelles
MS Office Access
Remarques
Il existe une hirarchie entre les enregistrements (organigrammes). Un
enregistrement subordonn appartient un enregistrement suprieur
(contrairement au modle relationnel, le type des enregistrements d'une
relation ne sont pas forcment identiques!)
Ce modle est semblable au modle relationnel. Les relations entre les
donnes sont toujours de type un plusieurs et gnrent un graphique
galement appel "rseau" ou "flocon". Les relations sont appeles des
"ensembles" (cubes OLAP).
Les bases de donnes orientes objets ne comprennent pas de donnes,
mais des objets (donnes + oprations sur les objets selon les mthodes
de Programmation Oriente Objet). Par exemple SharePoint est bas
sur une telle structure.
Les bases de donnes rparties enregistrent des donnes dans plusieurs
bases de donnes (ex. sur des ordinateurs dans diffrentes villes) et
possdent des mcanismes de regroupement et d'interrogation des
donnes rparties
Les systmes de bases de donnes relationnelles (SGBDR) constituent
le type de base de donnes le plus important. Les donnes sont
enregistres dans des tables lies par des relations. Le langage SQL a
t dfini pour l'valuation des donnes
17/564
Vincent ISOZ
Tableau 1 Type de bases de donnes
MS Office Access
18/564
Vincent ISOZ
Projet de base de
donnes logique
Projet de base de
donnes physique
Gestionnaire de buffer
Le gestionnaire de buffer supervise les changes entre les disques et la mmoire
centrale grce une mmoire tampon.
Processeur de consultation
Le processeur de consultation transcrit les requtes de consultation dans la mmoire
physique en instructions comprhensibles par le gestionnaire de la base.
Optimiseur
L'optimisateur tente de formuler la requte de l'utilisateur de faon optimale en vue
d'en acclrer l'excution partir de statistiques d'utilisation de la base de donnes.
Pr-compilateur DML
Le pr-compilateur DML convertit les instructions DML (Data Manipulation Langage
comme SQL) du programme d'application SQL en procdures et codes adquats pour
tre comprises par l'optimiseur.
MS Office Access
19/564
Vincent ISOZ
Compilateur DDL
Le compilateur DDL convertit les instructions DDL (Data Definition Language
comme SQL aussi) en un jeu de tableaux (pages) stocks dans un dictionnaire de
donnes.
Contrleur multitche
Le contrleur multitche traite les conflits ventuels entre traitements simultans.
Module de rcupration
Le module de rcupration assure la cohrence de la base mme la suite d'un
"crash".
Fichiers de donnes
Les fichiers de donnes contiennent la description de la base de donnes.
Fichiers systmes
Le fichier systmes conservent les donnes relatives la structure de la base, les
autorisations d'accs et le dictionnaire des donnes.
Index
Les index assurent la rapidit d'accs aux donnes de la base au niveau des requtes
(SQL).
La vue utilisateur est convertie en vue logique et les structures de donnes ncessaires
sont recherches.
Le SGBD est donc l'origine de plusieurs transformations des vues. En outre, il peut tenir
compte des autorisations de l'utilisateur, noter les modifications des donnes, effectuer des
MS Office Access
20/564
Vincent ISOZ
vrifications lors de la saisie de donnes ou les prendre en considration lors de la suppression
de donnes et fonctionner en mode multiutilisateurs.
La cration d'un projet de base de donnes n'est gnralement pas une mince affaire comme
nous l'avons vu dans notre protocole au dbut de ce support. Vous devez rassembler toutes les
informations grer dans la base de donnes, raliser diffrentes vues utilisateur, rpartir
ventuellement les donnes sur plusieurs ordinateurs, etc. Vous devez choisir un modle de
donnes selon le systme de base de donnes utilis et le type de donnes, ainsi qu'une base
de donnes prenant ce modle en charge.
Si vous optez pour le modle de donnes relationnel, les donnes sont enregistres dans des
tables. Vous pouvez dfinir des relations et des rgles d'intgrit entre les tables.
Pour viter la rptition de donnes identiques dans diffrentes tables et une augmentation
excessive du volume des informations enregistres (erreurs nombreuses dans un
enregistrement), vous pouvez soumettre les donnes un processus de normalisation.
Il est galement utile de possder une vue d'ensemble des donnes sous la forme d'un
graphique. Pour ce faire, vous pouvez utiliser le modle E.R. (entit-relation).
Modle de donnes relationnel: reprsentations des donnes dans des tables pouvant tre
lies
Rgles d'intgrit: Rgles directement dfinies dans les tables et vrifiant l'intgrit des
donnes en cas de modification, de suppression et d'ajout.
Processus de normalisation: mthode d'enregistrement sans redondance des donnes (pas
d'enregistrement multiple) permettant d'viter les erreurs lors de la suppression, de la
modification et de l'insertion de donnes.
Modle entit-relation/association: reprsentation graphique de toutes les informations
importantes pour les tables dfinies et des relations entre elles.
Pour identifier de manire univoque tous les enregistrements d'une table, vous pouvez, par
exemple, ajouter cette dernire un attribut supplmentaire qui numrote les enregistrements.
Il est alors possible distinguer les entres de la table grce cet attribut. Dans ce cas, l'attribut
est la "cl primaire" de la table. Chaque table ne peut possder qu'une cl primaire qui permet
d'identifier de manire unique chaque enregistrement et qui n'est pas susceptible de changer
au cours du temps.
Dans l'exemple ci-dessous, l'ensemble d'entits Collaborateurs possde la cl primaire
N Personnel:
COLLABORATEUR
S
N Personnel
Nom
Adresse
Remarque: comme nous le verrons dans les dtails plus loin, la cl primaire d'une table peut
tre un attribut ou une association d'attribut dont la valeur permet d'identifier de manire
unique les enregistrements de cette table.
MS Office Access
21/564
Vincent ISOZ
Une "cl externe" est un champ d'une table qui cre une liaison avec un champ de cl primaire
d'une autre table. Par exemple, tous les enregistrements d'une table Commandes contiennent
le numro du client qui a pass commande. Ce numro identifie de manire univoque un
client dans la table des clients. Le numro de client dans la table des commandes constitue
donc une cl externe ("cl trangre" d'une autre table).
Il arrive frquemment aussi que les enregistrements d'une table doivent tre organiss dans un
ordre diffrent (tris). Dans les grands volumes de donnes, cette procdure peut toutefois
prendre du temps. Pour que l'accs aux donnes soit plus rapide, vous pouvez d'autres index
que la cl primaire (nous verrons effectivement que la cl primaire cre automatiquement un
index), appels "index secondaires".
Remarque: Pour plus d'informations sur les relations voir la page 74
Une table est constitue de colonnes, galement appeles "champs" ou "attributs". Les lignes
de la table contiennent des "enregistrements" ou "uplets". Tous les enregistrements d'une table
ont une structure identique.
La structure d'une table est galement appele son "schma". Les divers systmes de base de
donnes (ex. MS Access, dBase ou Paradox) disposent de diffrents formats de table, dont
MS Office Access
22/564
Vincent ISOZ
dpendent les conventions de noms des tables et des champs et les types de donnes de
champs.
Dfinitions:
D1. Une "entit" (ou "enregistrement" donc) peut tre un objet, un concept ou une
personne. Les entits se distinguent les unes des autres par leurs proprits.
D2. Un ensemble d'entits est un rassemblement d'entits avec des proprits identiques
et correspond une "table".
Remarque: lLrs de la cration d'une base de donnes rflchissez d'abord aux entits
et donc aux ensembles d'entits qu'elle doit contenir.
D3.Une "relation" est une "liaison d'entits". Les relations se distinguent les unes des
autres par leurs proprits.
Le type de relation dcrit les rapports numriques entre les diffrents lments par
exemple: combien d'enregistrements de la table "Collaborateur" ont t attribus un
enregistrement de la table "Dpartement" ? Le type de relation est gnralement dfini
par les mentions suivantes:
0 Pas d'attribution
1 Une seule attribution
n,m Plusieurs attributions
Les relations sont reprsentes par des lignes de connexion dans le modle ER: la
relation est dcrite par un symbole et la "cardinalit" est ajoute en fin de ligne.
D4. Les "proprits ou "attributs" caractrisent une entit, un ensemble d'entits, une
relation ou un ensemble de relations.
D5. Les proprits sont donnes par les "noms des champs de donnes" d'une table.
D6. Un "domaine de dfinition" indique la plage de valeurs autorises pour une proprit.
Exemple: une entreprise englobe des collaborateurs, des dpartements et des projets. Une
base de donnes relationnelle doit tre cre pour grer toutes les informations et tous les
vnements. Dans l'illustration suivante, tous les lments de la base de donnes et leurs
relations sont rassembls:
Tous les rsultats et informations peuvent tre rpartis en trois ensembles d'entits:
Dpartement, Collaborateur et Projets.
MS Office Access
23/564
Vincent ISOZ
Deux relations sont distingues entre les ensembles d'entits: un dpartement se compose
de collaborateurs, qui travaillent sur des projets.
tant donn qu'un dpartement comprend plusieurs collaborateurs, mais qu'un
collaborateur n'appartient qu' un dpartement, il s'agit d'une relation un plusieurs. Dans
ce cas, il est ncessaire d'insrer le champ de cl (primaire) de la table primaire
(Dpartement) dans la cl (trangre) de la table trangre (Collaborateurs) N
Dpartement.
Plusieurs collaborateurs peuvent travailler sur plusieurs projets. Il s'agit d'une relation
donc d'une relations plusieurs plusieurs.
Les ensembles d'entits Dpartement, Collaborateurs et Projets possdent certaines
proprits. Par exemple, l'ensemble d'entits Projets possde les proprits N Projet et
Description. La proprit N Projet identifie exactement une entit ou un enregistrement
et est donc choisie comme cl primaire.
Une relation plusieurs plusieurs ncessite un autre ensemble d'entits, appel "table de
transition" car l'association entre les collaborateurs et les projets n'est pas identifiable. Le
nouvel ensemble d'entits comprend au moins les champs de cl des deux ensembles
d'entits qui composent la relation plusieurs--plusieurs.
Pour obtenir une description compacte des entits, attributs et champs de cl, vous pouvez
utiliser la forme textuelle suivante. Elle commence par le nom de l'entit (table), suivi, entre
parenthses, des attributs (champs), les champs de cl primaire tant souligns.
DEPARTEMENT (N Dpartement, Description)
COLLABORATEURS (N Personnel, Nom, Prnom, N Dpartement)
PROJETS (N Projet, Description)
EVALUATION_PROJET (N Projet, N Personnel, HeuresTravail)
3.6 Normalisation
La rpartition des donnes dans des tables relationnelles peut entraner des erreurs lors de la
modification, de l'insertion et de la suppression de donnes et ainsi gnrer des redondances et
incohrences des donnes. Ces erreurs sont galement appeles "anomalies".
Par exemple, chaque collaborateur est associ avec son dpartement et ses donnes de projet
selon la table ci-dessous:
Toutes les donnes sont enregistres dans une seule table. Les problmes suivants surviennent
lors de la modification, de l'insertion et de la suppression de donnes:
MS Office Access
24/564
Vincent ISOZ
1. Lorsque vous insrez un nouveau collaborateur qui n'a travaill sur aucun projet, des
champs de donnes sont laisss vides, ce qui gaspille de l'espace disque. Des
problmes de traitement peuvent galement survenir en cas de requtes, ex. lorsqu'un
collaborateur travaille sur plusieurs projets en mme temps. Ils figurent tous dans un
champ N Projet et doivent faire l'objet d'une opration supplmentaire. Une requte
ne peut porter que sur tout le contenu d'un champ ou une partie de celui-ci.
2. Lorsque vous supprimez un collaborateur, vous devez galement supprimer les
donnes du projet correspondantes. Des donnes sont alors perdues.
3. Lorsque la dnomination d'un projet a t modifie, par exemple, Enqute des clients
est remplac par Etude de march, tous les enregistrements contenant cette valeur
doivent tre modifis (si plusieurs collaborateur y travaillent bien sr !)
Le processus de normalisation permet notamment de rsoudre les problmes susmentionns.
Pour ce faire, les donnes des tables doivent respecter certaines rgles. Le rsultat de
l'application de ces rgles est appel "forme normale" des tables.
Lors du processus de normalisation, les donnes sont rparties sur plusieurs tables. Les
diffrentes tapes du processus de normalisation sont dsignes sous le nom de formes
normales: premire, deuxime et troisime formes normales.
La structure des donnes de l'exemple ci-dessus est appele "non normalise", car plusieurs
informations sont enregistres dans certains champs d'un enregistrement. Par exemple, le
collaborateur Demus travaille sur les projets 1, 2 et 3.
MS Office Access
25/564
Vincent ISOZ
MS Office Access
26/564
Vincent ISOZ
En d'autres termes, il faut aussi que les champs interdpendants (dpendances transitives)
soient reports dans des tables externes l'aide d'une cl primaire et trangre.
Par exemple le champ Description une dpendance transitive avec les valuations du projet.
Nous pouvons donc le sortir de la table d'valuation (meilleures performances d'affichages
dans certaines situations comme les discussions pour les forums sur le web par exemple!):
COLLABORATEURS (N Personnel, N Dpartement, Nom, Prnom)
DEPARTEMENT (N Dpartement, Nom)
PROJETS (N Projet, Description)
EVALUATION_PROJET (N Projet, N Personnel, Heures, Description)
3.6.4 Exercice
Les donnes d'un magasin doivent tre enregistres dans une base de donnes. L'illustration
suivante montre les donnes essentielles dans une table non normalise. Esquissez un modle
ER pour les donnes indiques:
MS Office Access
27/564
Vincent ISOZ
2. Crez une base de donnes MS Access avec votre formateur soit directement dans le
logiciel lui-mme avec les outils disposition soit en utilisant SQL ou MS Visio
(votre formateur vous aidera)
3. Quelles mesures pouvez-vous prendre pour garantir l'intgrit des donnes ?
4. Crez les relations ncessaires. Quelles relations doivent tre cres avec l'intgrit
rfrentielle et les mise jour et suppression en cascade?
Remarque: N'hsitez pas faire usage dans MS Access de l'outil Analyse (dans le menu
Outils) qui va vous proposer de normaliser vos tables (voir les dtails sur cet outil la
page 313)
MS Office Access
28/564
Vincent ISOZ
MS Office Access
29/564
Vincent ISOZ
MS Office Access
30/564
Vincent ISOZ
Concernant le typage des colonnes ci-dessus, celui-ci a nettement chang dans les ultrieures.
Il a t standardis pour proposer une compatibilit vers diffrentes normes SQL, raison pour
laquelle on trouvera par exemple les typages LONGTEXT et LONGCHAR (ce dernier tant
privilgier pour MS Access) qui pour un forward engineering vers MS Access se retrouveront
de toute faon convertis en type Mmo.
Pour le registre "Trigger" le lecteur se rfrera une formation SQL Server, DBL2, Oracle.
Pour le registre "Check" l'auteur de ce document donne sa langue au chat Les deux autres
registres "Entended" et "Notes" ne sont pas absolument indispensables, nous en ferons donc
pas mention.
MS Office Access
31/564
Vincent ISOZ
Concernant les relations, il suffit de "glisser" une forme reprsentative de cette dernire entre
les deux tables et de l'y accrocher (il faut que les tables deviennent alors rouge).
Avec la touche Ctrl du clavier, slectionnez dans la liste de droite et de gauche, les champs
lier et cliquez sur le bouton Associate.
Ensuite, vous pouvez dans Misceallaneous:
Nous voyons que dans MS Visio, les options proposes vont plus loin que celles proposes
par MS Access seul.
MS Office Access
32/564
Vincent ISOZ
En ce qui concerne l'intgrit rfrentielle:
Pour exporter le schma dans une base, il faut d'abord avoir cr le support logique de cette
dernire. Dans MS Access cela consiste, par exemple, crer un fichier *.mdb vide (exemple:
visio.mdb).
Enfin, nous remarquons qu'il est dsagrable de ne pas avoir la cardinalit des relations, pour
cela heureusement dans le menu Database/Options nous avons une bote de dialogue
permettant de les afficher (nous conseillons vivement de tout cocher):
MS Office Access
33/564
Vincent ISOZ
Avec MS Visio, allez dans le menu Database/Generate (avec MS Visio 2003 et antrieur
puisque depuis 2007 il faut Visual Studio avec Visio Enterprise Architect...). Apparat alors la
fentre suivante (si aucune erreur n'est dtecte par MS Visio dans votre modlisation):
Cliquez sur Next aprs avoir activ les mmes options que dans la figure ci-dessus.
MS Office Access
34/564
Vincent ISOZ
Slectionnez MDB file already exists et cliquez sur Next autant de fois que ncessaire pour
arriver la fentre suivante:
Cliquez dans la bote ci-dessus sur OK sans saisir ni User ni Password. Allez ensuite chercher
la base cible:
MS Office Access
35/564
Vincent ISOZ
Cliquez enfin sur Next et Finish. Ouvrez le fichier visio.mdb et vous y trouverez toutes les
tables et relations modlises dans MS Visio (c'est pas beau a non !!??).
Suite cette dmonstration, nous vous demandons de faire deux exercices (au cas o
MS Visio n'est pas disponible, nous vous demandons d'utiliser du papier grand format) en
groupe(s) et de prsenter ensuite votre rsultat et vos conclusions au formateur ainsi qu'aux
autres groupes.
Remarques: les notations seront les suivantes sur vos feuilles:
I = index
PK = Primary Key
FK = Foreign Key
LR = Right Jointure
LS = Simple Jointure
Veuillez galement respecter la nomenclature pour les objets et champs MS Access (voir page
suivante).
36/564
Vincent ISOZ
1. Majuscule au dbut de chaque mot d'une variable
2. Pas d'accents
3. Pas de caractres spciaux
4. Pas d'espaces
5. Nom des champs en anglais
6. Eviter de dpasser les 15 caractres (3+12)
7. Ne jamais commencer avec des chiffres!
Il faut aussi dbuter avec cette nomenclature les noms des objets par trois caractres en
minuscule tel qu'indiqu ci-dessous:
-
Et les noms des champs de table par des identificateurs tels que ci-dessous:
-
MS Office Access
37/564
Vincent ISOZ
-
Et les noms des objets de formulaires par des identificateurs tels que ci-dessous:
-
Champs: fldNomChamp
Bouttons: btnButton
Onglets: regRegistres
Lgendes: lgdLegendes
Le respect de ces rgles vous permet d'assurer une cohrence dans votre travail et une
compatibilit sre avec des systmes autres que MS Access en cas de migration de la base.
Le non-respect de ces rgles peut entraner des consquences telles qu'un norme travail
pourrait tre refaire dans la base de donnes !!!
MS Office Access
38/564
Vincent ISOZ
4 Tables
Avant de commencer travailler voici quelques informations:
1. Il existe plusieurs fichiers de base de donnes sous MS Access: *.mdb, *.adp, *.mde et
les donnes peuvent provenir de plusieurs sources compatibles gres par MS ADO
(Microsoft ActiveX Data Objects). tel que MS Excel, DB2, Exchange, SQL Server,
etc
Pendant l'ensemble de cette formation, nous allons travailler sur des fichiers *.mdb.
Les fichiers *.adp sont destins plutt des dveloppeurs (informaticiens) qui utilisent
SQL Server comme gestionnaire de bases de donnes relationnelles (SGBDR).
Cependant, si vous crez un fichier *.adp (Access Database Project), la fentre (bien
connue par les dveloppeurs) suivante apparat, qui vous demande quelle base de
donnes SQL Server vous dsirez vous connecter:
Remarques:
R1. Il existe plusieurs technologies de SGBDR (FileMaker, SQL Server, MySQL, Oracle,
AS400,)
R2. MS Access est un environnement grant ADO, SQL, VBA, XML, etc.
R3. Une fois une erreur effectue ou des enregistrements effacs, on ne peut plus revenir en
arrire!!!
MS Office Access
39/564
Vincent ISOZ
R3. La provenance des tables de donnes, dans MS Access, peut tre diverses:
1. Cas simples: base MS Excel Externe, base MS Access Externe
2. Cas plus complexes: Oracle, MySQL, DB2, SAP, ou autres
A chaque fois que vous crez un objet en utilisant un des logiciels de la suite MS Office il
faudrait dfinir les proprits de ce dernier. Microsoft Project et Visio le font
automatiquement. Ce n'est malheureusement pas le cas de MS Access. C'est pourquoi nous
allons tout de suite nous attarder cette tche. Dans le menu Fichier, slectionnez l'option des
Proprits et saisissez les informations suivantes:
La fentre d'explorateur d'objets sera votre outil principal pendant votre travail dans Access.
Vous pouvez depuis cette fentre:
Lancer l'aperu, modifier, crer, supprimer, copier, renommer, excuter, masquer et afficher
des objets.
Avant que nous attaquions la cration d'une base, il est ncessaire de dfinir les objets
disponibles dans Access (formulaires, tables, requtes, tats, macros, modules et pages)
Il arrive lorsque l'on travaille sur d'normes bases, que l'explorateur d'objets soit remplis d'un
trop grand nombre d'objets pour les visualiser d'un simple regard. On choisira alors parfois de
masquer les objets (quels qu'ils soient) dont on est certain que l'on ne modifiera probablement
jamais les proprits et le contenu.
On peut masquer un objet en cliquant dessus avec le bouton droit de la souris et en
slectionnant l'option "Proprits" et en cochant la case "Masquer".
MS Office Access
40/564
Vincent ISOZ
Pour afficher nouveau les lments masqus, il suffit d'aller dans Outils/Options l'onglet
Affichage et activer la case Objets cachs.
Les tables ont-elles quelques cases cocher en plus comme Rplicable et Suivi du nombre de
lignes mais ce n'est que pour les utilisateurs travaillant avec les options de rplication.
Si vous souhaitez utiliser cette option pour empcher certaines personnes de modifier votre
base, ne procdez pas ainsi. Nous verrons plus tard comment il est possible de protger sa
base avec un mot de passe afin que personne d'autre que vous ne puisse la modifier.
MS Office Access
41/564
Vincent ISOZ
et slectionnez dans Type de fichier le type MS Excel. Slectionnez le fichier
TableNouveauxVendeurs et suivez simplement l'assistant. Observez l'icne qui reprsente la
table dans MS Access 2007 et ultrieur dans le ruban Donnes Externes/Fichier Texte:
et suivez l'assistant
2. Lier une table MS Excel de manire dynamique:
Dans MS Access allez dans Fichier/Source de donnes externe/Lier et slectionnez dans Type
de fichier le type MS Excel (remarquez que vous pouvez aussi vous connecter MS Outlook
comme une base de donnes !!!) Slectionnez le fichier TableNouveauxVendeurs.xls et
suivez simplement l'assistant. Observez l'icne qui reprsente la table.
Modifiez le fichier MS Excel et ouvrez ensuite la table lie dans MS Access pour voir si la
liaison s'effectue bien (vous pouvez ajouter/supprimer/modifier les lignes ou colonnes dans le
fichier source votre guise!). Vous verrez que MS Access ne peut pas modifier les proprits
des champs de cette table lie (donc pas de cl primaire, pas de relations, etc)
Attention, sur ce genre de tables lies, vous ne pouvez:
1. Pas crer de cls primaires et donc de liaisons (mais vous pouvez quand mme crer
des assistants liste de choix)
2. Vous ne pouvez pas appliquer de requte de suppression
3. Vous ne pouvez plus renommer les champs une fois l'import effectu
4. Vous ne pouvez pas ajouter ou modifier des champs (colonnes)
5. et autres que vous dcouvrirez par vous-mme
L'import d'un fichier CSV a une icne particulire que voici:
MS Office Access
42/564
Vincent ISOZ
Crer une nouvelle base nomme: Magasin.mdb (fichier mdb pour "Microsoft Data Base").
Dans le cas o vous tes sur une version antrieure d'Access faites apparatre les barres
d'outils de Formatage et Feuille de donnes.
1. Crez une nouvelle table en mode Feuille de donnes
2. Entrez tous les noms et donnes de champs ci-dessous dans les colonnes 1 5
3. Ajustez correctement la largeur des colonnes
4. Modifiez le type de donnes des champs (Texte, Nombre, Montaire)
5. Saisissez une description pour chaque champ et sa Lgende dans les proprits du
champ
On mettra les dtails des fournisseurs dans une autre table, o ils seront reconnus pas des
numros.
Pour crer la cl primaire de la table:
1. Faire passer la table en "mode cration"
2. Slectionner la ligne voulue comme cl primaire (strArticleNb)
3. Cliquer sur l'icne de la barre d'outils reprsentant une cl
4. Enregistrer la table sous le nom tblArticles
La puissance d'un programme de gestion de bases de donnes relationnelles comme MS
Access provient de sa capacit trouver et runir rapidement des informations stockes dans
des tables spares en utilisant des requtes, des formulaires et des tats. A cette fin, chaque
table doit inclure un champ ou un ensemble de champs qui identifie, de manire unique,
chaque enregistrement stock dans la table. Cette information est appele la "cl primaire" de
la table. Une fois que vous avez dsign une cl primaire pour une table, Microsoft Access
empchera, pour en garantir le caractre unique, que des doublons ou des valeurs "Null" ne
soit entrs dans les champs de cl primaire.
Si un de vos champs contient des valeurs uniques, comme des numros d'identification ou des
numros de pices, vous pouvez dsigner ce champ comme cl primaire. Cependant, si ce
champ contient des doublons ou des valeurs Null, Microsoft Access ne l'acceptera pas comme
cl primaire.
Vous pouvez alors excuter une requte "Trouver les doublons" pour trouver les
enregistrements contenant des doublons (nous verrons cela lors de notre tude des requtes).
MS Office Access
43/564
Vincent ISOZ
Si vous ne parvenez pas liminer facilement les doublons en ditant vos donnes, vous
pouvez ajouter un champ nomm "numroter automatiquement" (insrer une ligne en mode
cration et dfinir le type de donnes comme "Numrotation automatique") et le dfinir
comme cl primaire, soit dfinir une cl primaire combine.
Remarque: L'enregistrement n'est sauvegard qu'au moment o le point d'insertion est dplac
sr un autre enregistrement (sinon il y a possibilit d'ajouter un bouton pour cela mais c'est trop
tt pour en parler de manire dtaille).
Supprimez maintenant l'enregistrement n5 (il y a 3 possibilits pour cela: 1. Menu 2. Bouton
standard 3. Cration de bouton) et rinsrez-le l'identique. Lorsque vous crez un bouton,
faites bien attention ce que l'assistant de la bote outils contrles soit bien activ !
MS Office Access
44/564
Vincent ISOZ
Concernant les ordres de tabulation des champs de donnes du formulaire: vous pouvez les
dfinir (peut s'avrer parfois trs utile) en allant en mode cration (quand votre formulaire est
ouvert) et en slectionnant ensuite le menu Affichage/Ordre de tabulation
Fermez le formulaire. Enregistrez le sous le nom frmArticles.
Crez une table tblFournisseurs avec les donnes de la table ci-dessous. Les numros de
fournisseurs serviront de cl primaire numrote automatiquement
Nous "relierons" plus tard la table tblFournisseurs et tblArticles afin que lorsqu'on insre de
nouveaux articles l'aide du formulaire, on ait le choix des numros des fournisseurs (on
verra dans le cours expert comment faire en sorte que le nom du fournisseur apparaisse
automatiquement dans un champ lorsque l'on slectionne son numro).
4.4.1 Lgende
Donc dans le mode cration vous aurez pour chaque champ la zone suivante:
MS Office Access
45/564
Vincent ISOZ
Ce qui nous intresse ici en priorit (pour faire simple) c'est le fait que nous devons respecter
la nomenclature de Leszinsky/Reddick. Il est donc important pour chaque champ cr
prcdemment de changer les noms des champs de manire conforme:
et ensuite pour chacun de mettre un Caption (en franais une Lgende) qui correspondra au
nom que l'utilisateur verra dans lors de l'utilisation de la base de donnes:
MS Office Access
46/564
Vincent ISOZ
TEXTE-TEXT
0 255 caractres alphanumriques au format brut (plain text) cod sur 8 bits et utilisent str
comme prfixe d'usage.
Il est important d'optimiser au mieux la taille des champs lorsque vous travaillez sur des base
de donnes de plusieurs millions de lignes!
Mmo-Memo
Texte long sur 65'536 caractres alphanumriques que l'on peut formater que de manire
lmentaire dans les versions antrieures 2007 et de manire plus fine depuis MS Access
2007 (couleurs sur une partie du texte seul, idem pour le gras, idem pour l'italique, gestion du
surlignage, etc.) si l'on met une des proprits du champ au format RTF.
Le champ memo utilise mem ou parfois blb comme prfixe.
Numrique-Number
Type
Caractristiques
0 255 (1 byte)
MS Office Access
47/564
Vincent ISOZ
correspondant aux nombres de chiffre qui
apparatront aprs la virgule en tant que dcimales.
Par exemple un dcimal de 15 avec prcision de 8,
pourra avoir 7 chiffres avant la virgule et 8 aprs la
virgule.
Il n'est pas conseill de faire usage du type
Dcimal car lors de l'utilisation de grands nombres
les arrondis peuvent avoir des consquences trs
fcheuses!!
Date/Heure-Date/Time
Une date ou une heure (une prcision la seconde seulement). Il existe plusieurs formats de
saisie choix dans les options gnrales de ce type de champ. A remarquer que ce dernier se
comporte comme MS Office Excel si la saisie est au format JJ.MM.AAAA on peut quand
mme crire 20 mai 2001 qui se changera alors automatiquement en 20.05.2001.
Les dates vont du 01.01.100 au 31.12.9999 de 00:00:00 23:59:59 cod sur 8 bytes et
utilisant dat comme prfixe d'usage.
Attention!!! Rappelons que depuis 1988 tout les pays du monde utilisant le calendrier
Grgorian doivent respecter la norme ISO 8601. Donc nous recommandonc donc de formater
les champs en conformit:
et mme d'aller plus loin en s'assurant que les utilisateurs ne confondent jamais les mois et les
jours la saisie (par exemple 2003-11-03 sera accept ainsi que 2003-03-11 donc c'est trs
dangereux suivant le domaine d'activit) et alors de sparer la saise des dates dans 3 champs
MS Office Access
48/564
Vincent ISOZ
diffrents avec les contraintes en adquation (quitte donc les rassembler plus tard dans les
requtes)!!!!
Montaire-Currency
Il s'agit au fait simplement d'un numrique avec un formatage montaire. Cod sur 8 bytes
avec 4 chiffres aprs la virgule. Je ne recommande pas d'en faire usage pour des raisons
d'intercompatibilit avec d'autres systmes et je ne vais donc pas m'tendre plus sur le sujet
(de toute faon il est bas sur un rel simple).
Numroauto-Autonumber
Il s'agit d'un champ souvent utilis pour les cls primaires et bas simplement sur un entier
long (4 bytes). Son prfixe d'usage est pk
Oui/Non-Yes/No
Il s'agit d'un champ boolen. Il peut contenir qu'une valeur binaire correspondant Vrai/Faux
ou 1/0. Il est cod que sur 1 bit et dans MS Access le Oui vaut -1 et le Non vaut 0 Son
prfixe d'usage est bol
Objet OLE -OLE Object
L'object OLE (Object Linked And Embedded) est un type de champ qui vous permet d'insrer
ou de lier des fichiers externes dans la base. Cela peut tre utile pour les entreprises ayant
faire un suivi des clients par rapports aux documents qu'ils ont taps pour eux (bureaux
d'avocats typiquement).
Depuis MS Access 2007 il est conseill pour les documents d'utiliser plutt le champ de type
Pices jointes et qui est moins instable que le champ OLE.
Son prfixe d'usage est ole
Lien hypertexte-Hyperlink
C'est un simple champ texte acceptant jusqu' 2048 caractres qui a la proprit de
fonctionner comme un lien hypertexte. C'est--dire que si l'utilisateur clique sur l'URL il sera
envoy sur la page web spcifie. Le lien hypertexte ne fonctionne pas pour les e-mail comme
c'est le cas dans MS Office Word et Excel et pose des problmes lors de migration de bases
MS Access vers d'autres technologies.
Le champ de type lien hypertexte peut cependant tre trs utile en tant qu'alternative au
champ de type Pice Jointe (voir un peu plus bas) qui est gourmand en matire de mmoire
(puisqu'une base MS Access est limite 2GB).
Une astuce possible est alors de crer une ou plusieurs tables contenant juste un champ de cl
primaire et un champ de lien hypertexte en relation de type un plusieurs et de crer des liens
vers des documents se trouvant sur un disque rseau. Ce qui donnerait par exemple:
MS Office Access
49/564
Vincent ISOZ
Ensuite, l'utilisateur aura typiquement un formulaire (vite fait mal fait...) du type suivant:
et pour crer un lien vers un document se trouvant sur un disque rseau il suffit de fair un clic
droit une des cellules de la colonne Document:
MS Office Access
50/564
Vincent ISOZ
MS Office Access
51/564
Vincent ISOZ
2. Si vous faites une requte qui renvoie les lignes Uniques le champ mmo sera
tronqu. Il faut alors l'exclure de cette requte et le ramener plus tard en faisant une
requte de la requte pour le rapatrier via les cls primaires.
3. Si vous utilisez une requte d'Union, le champ mmo sera tronqu. Dans le code SQL
de la requte remplacez Union par Union All.
Ces limitations proviennent du moteur JET (qui n'est plus le moteur JET depuis
MS Access 2007). C'est un compromis de performance!
Calcul-Calculated
Nouveauts depuis MS Access 2010, permet de crer des calculs directement dans les tables
ce qui est fort pratique si l'on reste dans le monde MS Access mais ds qu'il s'agit de migrer
ensuite vers une autre technologie, c'est la catastrophe grer.
Voyons un exemple (idiot) de cette nouveaut... Considrons que quelqu'un souhaite dans le
cas de ventes dans un magasin avoir dans sa table sortie (tblSorties) les units de ventes
correspondant au rabais effectu sur la commande de l'article en question. Nous nous baserons
sur la proprit de commutativit de la multiplication:
Prabais Units PrixUnit 1 t % Units 1 t % PrixUnit
units virtuelles
correspondant au rabais
Nous ouvrons la table tblSorties en prenant soin de crer un nouveau champ appel
sngUnitesVirtuelles:
MS Office Access
52/564
Vincent ISOZ
Ds la slection de l'option Calcul effectue, la bote de dialogue suivante servant d'assistant
(mais ceux qui n'ont pas envie de l'assistant peuvent crire directement les formules de
mmoire):
Dans le prsent support, nous n'allons pas prsenter toutes les fonctions disponibles dans
l'arborescence Fonctions car le prrequis d'une formation MS Access est de matriser
MS Excel et au moins 200 de ses fonctions. Donc pour revenir nos moutons.... nous faisons
un bte formule d'arithmtique lmentaire:
MS Office Access
53/564
Vincent ISOZ
o le lecteur aura constat que dans l'onglet Gnral et plus particulirement dans le champ
Expression qui s'y trouve, notre formule a t reporte par l'assistant et donc in extenso il est
possible d'crire directement aussi des formules dans ce champ.
Ensuite, si nous passons en affichage Feuille de donnes en ayant pris soin d'enregistrer les
modifications au prlable, nous avons alors:
Donc toutes les anciennes donnes ont automatiquement la formule qui a t calcule et toutes
les nouvelles lignes ajoutes auront automatiquement le calcul qui s'excutera lors de la saise
des informations ncessaires cela.
MS Office Access
54/564
Vincent ISOZ
4.4.3 Formats
Pour chaque type de donne, vous pouvez spcifier en plus un format dans la zone prvue
cet effet:
Il faut dfinir ces formats avant de commencer saisir des valeurs dans la table (le principe
est cependant semblable MS Excel) !!!
#.##0" Kg"
#.##0 " kg rserve";-#.##0 "Kg achat"[Rouge]
jjjj (jours), mmmm (mois), aaaa (anne), t (trimestre), ss (semaine)
hh (heures), m (minutes), s (secondes)
#'###.00;-#'###.00[Rouge];0'000.00;"Non dfini"
> met toutes les donnes en majuscules (mais viter car ce n'est qu'une couche visuelle!)
Remarques:
R1. Ces options peuvent tres dfinies aussi sur des champs de formulaires en allant dans les
proprits de ceux-ci.
R2. Le format de comptabilit "CHF " * #'##0.00 avec l'toile pour avoir le symbole
montaire gauche et la valeur droite ne fonctionne plus depuis Access 2007 (sic!).
MS Office Access
55/564
Vincent ISOZ
dition, mais les espaces sont effacs lors de la sauvegarde des donnes, signes plus et moins
accepts).
L Lettre (A Z minuscule ou majuscule, entre obligatoire d'une lettre).
? Caractre quelconque ou espace (entre obligatoire).
C Caractre quelconque ou espace (entre facultative).
. ,: ; - / Sparateur de dcimales, de milliers, de date et d'heure ( loisir)
A Lettre ou chiffre (entre obligatoire d'une lettre ou d'un chiffre).
Attention le nombre de A ne limitera cependant pas la taille d'un chiffre si le champ est de
type Numrique. De plus vous aurez des surprises si vous utiliser les maques avec les rels
simples.
a Lettre ou chiffre (entre facultative).
Attention le nombre de A ne limitera cependant pas la taille d'un chiffre si le champ est de
type Numrique. De plus vous aurez des surprises si vous utiliser les maques avec les rels
simples.
< Tous les caractres qui suivent sont transforms en minuscules
> Tous les caractres qui suivent sont transforms en majuscules
Tableau 3 Codes pour masque de saisie
Remarque: Si vous affectez la proprit Masque de Saisie la valeur "Mot de passe", vous
crez une zone de texte permettant de saisir un mot de passe. Tous les caractres taps dans la
zone sont enregistrs mais remplacs l'cran par un astrisque (*). Vous utilisez le masque
de saisie Mot de passe pour empcher l'affichage des caractres taps.
MS Office Access
56/564
Vincent ISOZ
Exemples:
(0) 00-00-00-00
(1) 55-50-24-48
(9) 99-99-99-99
(1) 55-50-24-48
( ) 55-50-24-48
(0) AA-AA-AA-AA
(1) 55-55-TE-LE
#999
20
2000
VERTEVE339M3
MAI R 452B7
>L0L 0L0
T2F 8M4
00000-9999
98115-
98115-3007
Marie
Dupont
SSN 000-00-0000
SSN 555-55-5555
>LL00000-0000
DB51392-0493
>L????L?0005L0
>L<??????????????
Dfinition du masque
00\ 00\ 00\ 00\ 00;0;_
LLL"--"??;;@
\(000") "000\-0000;1;*
>L<CCCCCCCCCCCCCCC
"ISBN "0\-&&&&&&&&&\-0
####
+41(0)00\/000.00.00
Avant saisie
__ __ __ __ __
@@@--@@
(***) ***-****
__________________
"ISBN "_-____________-_
____
+41(_)__/___.__.__
Exemple de saisie
01 23 45 67 89
aze--r
(206) 555-0248
Jean-claude sohm
ISBN 5-126795111-8
-26
+41(0)76/329.53.88
57/564
Vincent ISOZ
La principale diffrence entre la dfinition d'un style de saisie dans le champ "format" ou dans
le "masque de saisie" est la suivante:
Si vous dfinissez un style dans le champ "Format", alors la saisie sera adapte lorsqu'elle
sera insre dans la table et non pas au moment mme de la saisie dans le formulaire
correspondant (ce qui est le rle du masque de saisie).
Remarque:
R1. Les donnes du masque, bien qu'elles apparaissent dans les tables, ne s'y trouvent pas
physiquement. Ainsi, si vous exportez une table avec un masque vers MS Excel, vous perdrez
tous les caractres du masque.
R2. Ces options peuvent tre dfinies aussi sur des champs de formulaires en allant dans les
proprits de ceux-ci.
MS Office Access
58/564
Vincent ISOZ
dans laquelle nous voyons un exemple d'application o la rgle impose que l'information
(date) se trouvant dans le champ nomm date naissance est infrieure la date se trouvant
dans le champ date dcs.
Attention!!!! Des critres multiples dans le Valide Si ncessitent obligatoirement l'usage de la
fonction VRAIFAUX( ) qui est l'quivalent de la fonction SI( ) de MS Office Excel
Maintenant que vous avez parcouru cette liste non exhaustive, nous allons passer un petit
exercice pratique:
Ouvrez la table tblArticles et entrez pour les noms de champs N Article, N Fournisseur et
Quantit par unit de commande une description comme ci-dessous (si l'quivalent n'a pas
dj t fait):
MS Office Access
59/564
Vincent ISOZ
Fermez et enregistrez la table et testez ensuite le formulaire instantan que nous avions cr
en tout dbut de cours pour voir comment il se comporte maintenant que nous avons dfini
toutes ces proprits (il faut prendre l'habitude de faire systmatiquement ce genre de
contrles).
Dfinissez pour le champ d'enregistrements N Article, un masque de saisie qui n'accepte
pour l'entre au trois premires positions que trois lettres et pour les trois dernires, trois
nombres spars par un trait d'union (>LLL-000).
Etablissez l'aide de l'assistant de liste de choix, une liste telle que l'on puisse choisir le N
Fournisseur dans la table Articles au lieu de le saisir (cette liste doit afficher galement les
noms des fournisseurs et s'adapter automatiquement si des nouveaux sont entrs dans le table
Fournisseurs). Changez pour le Mode feuille de donnes et vrifiez le rsultat.
Ouvrez l'ancien formulaire de la table tblArticles et testez la saisie. Comme vous pouvez
certainement le voir, le formulaire ne s'est pas adapt aux nouvelles proprits des champs.
Deux possibilits s'offrent alors vous:
1. Ecraser l'ancien formulaire instantan par un nouveau (option trs gnante si vous
avez pass beaucoup de temps faire des modifications sur ce premier)
2. Mettre jour l'ancien formulaire en supprimant les champs qui ont changs en
cliquant sur le bouton suivant de la barre d'outils (quand votre formulaire est en mode
cration):
Ce bouton va faire apparatre une petite fentre dans laquelle se trouvent tous les champs
utiliss par votre formulaire. Il suffit ensuite de faire un "glisser/dplacer".
Crez un formulaire instantan pour la table tblFournisseurs et insrez un nouveau
fournisseur (laissez jouer votre imagination). Enregistrez ce formulaire sous le nom
"Fournisseurs".
Revenez dans le formulaire Articles et testez si le numro du nouveau fournisseur apparat
dans la liste des numros de fournisseurs.
Changez le champ d'enregistrement NPA de la table tblFournisseurs en un champ
d'enregistrement de type "Texte" avec une taille de 5 caractres.
Renommez le champ d'enregistrement Dlais de livraison/Jours en Dlais de livraison et
dfinissez un format d'affichage qui contienne le texte "jour(s)". (#" jour(s)"). Dfinissez la
valeur par dfaut 0.
Dans la table tblSorties dfinissez la valeur par dfaut du champ d'enregistrement Date de
Sortie comme tant la date du jour (fonction Date( )).
Ajouter dans la table tblVendeurs la colonne de Provisions (avec le type de donnes
Numriques, au format Pourcentage avec taille de champ de type Rel simple) o seul des
pourcentages avec au plus deux dcimales aprs la virgule doivent pouvoir tre saisis.
MS Office Access
60/564
Vincent ISOZ
Saisissez les valeurs comme reprsentes sur la figure suivante:
Comme vous pouvez l'observer nous devons faire face un problme relatif aux
pourcentages. Parlez-en avec votre formateur.
Dfinissez pour le champ Rgion un liste de choix dans laquelle vous mettez disposition les
valeurs Nord, Est, Sud, Ouest. De plus, il faut empcher l'utilisateur de pouvoir saisir autre
chose que propos dans cette liste. Ainsi:
Cette proprit est assez importante. Il faut essayer de ne jamais l'oublier. Ainsi, dans notre
magasin, toutes les listes doivent tre limites.
Ouvrez l'ancien formulaire instantan de la table Vendeurs vrifiez si la liste fonctionne et au
besoin mettez le champ jour.
Insrez, toujours dans la table Sorties, un champ nomm "Payement en espces" et un autre
nomm "Payement par crdit". Pour chacun de ces champs, prenez comme type de donnes
celui nomm "Oui/Non".
Crez un formulaire instantan pour la table Sorties et dfinissez au hasard, pour chaque
enregistrement, le type de payement.
Evidemment on peut actuellement cocher les deux cases mais on verra plus tard avec les
macros comment grer ce genre d'absurdits.
MS Office Access
61/564
Vincent ISOZ
Crez manuellement (saisie clavier dans un formulaire instantan) la table tblEntree cidessous suivante (la cl primaire doit tre sur le champ idClient pour l'instant).
Saisissez partir de la fentre de base de donnes les proprits des tables (bouton droit sur
les tables). Fermez la base et observez ce qui ce passe (pas) !?
MS Office Access
62/564
Vincent ISOZ
Crez manuellement (saisie clavier dans un formulaire instantan) la table tblClients cidessous (la cl primaire doit tre sur le champ idClient pour l'instant).
Dans la table tblSorties, rajoutez une colonne ClientsId qui permettra plus tard de crer des
relations. Saisissez dans cette colonne des valeurs comprises entre 1 et 3 (y compris).
N'oubliez pas de cliquer sur le bouton Options qui vous donne des possibilits parfois
pertinentes:
MS Office Access
63/564
Vincent ISOZ
MS Office Access
64/564
Vincent ISOZ
Ensuite, dans la liste des types de fichier, choisissez Outlook. Vient alors aprs quelques
secondes la bote de dialogue suivante:
Prenons le carnet d'adresse local Contacts. Validez par Next et vous aurez:
MS Office Access
65/564
Vincent ISOZ
Mais cette mthode ne prend en compte que les modifications et suppressions d'lments
existants lors de la cration de la liaison et elle est unidirectionnelle (c'est Outlook qui pilote
Access!).
Il y a au fait un pige pour que la modification/ajout/suppression d'lments soit pris en
compte (mais toujours en unidirectionnel). Lors de l'assistant de liaison qui vous permet par
exemple de choisir le carnet d'adresse:
Il ne faut pas prendre celui-ci de la liste des Adress Books mais de la liste des dossiers du
Personnal Folders si situant en-dessous:
MS Office Access
66/564
Vincent ISOZ
Aprs quoi cela marche (donc les modifications sont prises au moins en unidirectionnel!).
67/564
Vincent ISOZ
Dplacez la colonne N Vendeur (tblVendeurId) au dbut de la table, puis annulez cette
opration et dplacez la colonne N Vendeur (tblVendeurId) la fin de la table.
Figer les colonnes N Sortie (idSortie) et N Article (idArticles) en passant par Format/Figer
les colonnes. Cette fonction se base sur le mme principe que celle se trouvant dans
MS Excel. Puis modifiez le layout de la table en masquant les colonnes Nombre d'units
(intUnites) et Date de Sortie (datSortie) (Format/Masquer les colonnes). Cette fonction est
utile lorsque l'on a besoin d'imprimer seulement certaines informations d'une table.
Supprimer le figement des colonnes et donnez la table tblArticles, le layout suivant (Access
2000 et ultrieur):
1. Apparence de cellule: 3D Relach (Format/Feuille de donnes)
2. Apparence du texte: Italique (Format/Police)
Selon le rsultat donn la page suivante (dont l'utilit est plus que douteuse):
dans toute la table tblSorties, le vendeur numro 2 par le vendeur numro 11. Refaites la
procdure inverse partir d'un formulaire instantan.
MS Office Access
68/564
Vincent ISOZ
Remarque: L'outil Rechercher/Remplacer gre la wildcard * mais pas les crochets, ni le point
d'interrogation. Par ailleurs il ne peut rechercher/remplacer plus de 10'000 donnes Le
mieux est alors de faire une requte de mise jour dans lequel le Critre de slection sera la
valeur cherche et la valeur de Mise--jour le nouveau texte..
Vrifiez l'orthographe dans la colonne Lieu de la table tblFournisseurs, et ajoutez au besoin
les termes dans le dictionnaire personnalis d'Office.
Remarque: la colonne Description est souvent utile au dveloppeur pour prendre des notes
quant l'utilit ou aux spcificits d'un champ. Par dfaut, les informations qui y sont saisies
seront visibles dans la barre d'tat du logiciel lorsque l'utilisateur cliquera sur le champ
concern dans un formulaire. La barre d'tat peut cependant tre dsactive comme nous le
verrons bien plus loin.
Pour chacun des champs de toutes les tables, dfinissez rigoureusement avec votre formateur
les proprits disponibles pour tous les diffrents champs.
Testez galement ensuite les modifications, soit en mettant jour votre formulaire existant (le
formulaire correspondant la table) soit en crant un nouveau formulaire automatique
(regardez bien le texte en bleu droite, il permet de comprendre l'utilit des diffrentes
fonctions).
Pour le champ Valide Si, mieux vaut se reporter l'aide d'Access, les exemples y sont
nombreux et c'est un bon exercice pour apprendre utiliser cette dernire. Cependant il y aura
plus tard un exercice ou nous utiliserons l'option Valide Si.
Le but principal de l'option Null Interdit est d'empcher l'utilisateur de faire une fausse saisie
en crivant uniquement avec espaces clavier. Evidemment cela peut faire doublon avec le
MS Office Access
69/564
Vincent ISOZ
masque mais le concept de Null Interdit existe dans la grande majorit des SGBR ce qui n'est
de loin pas le cas du masque de saisie!
Remarque: Attention ne pas mettre des Null Interdit partout car sinon vous pourriez ne
pas pouvoir crer de donnes o que ce soit!!! Il s'agirait alors d'une erreur de
modlisation de la part du dveloppeur (heureusement c'est une erreur qui prend que
quelques minutes corriger).
L'option Chane vide autorise permet de choisir si on considre l'espace vide comme une
valeur d'entre valable. Normalement on va plutt dire Non
La Compression Unicode doit tre active sur Oui si uniquement des caractres latins sont
supposs tre utiliss dans cette base (les caractres latins pouvant tre cods sur 1 octet
plutt que 2).
Depuis Access 2007 on trouve galement un champ Mode IME et Mode de formulation IME
(Input Methode Editor) qui concerne les diffrents caractres japonais Kanji et la manire de
les interprter.
L'onglet appel Liste de choix a galement certaines options trs intressantes qu'il faut
systmatiquement dfinir (voir capture d'cran page suivante).
Comme vous pouvez le voir ci-dessus, on retrouve les proprits du champ qui ont t
dfinies lors de l'utilisation de "l'assistant de liste de choix". Cependant l'option "Limiter la
liste" ne nous tait pas apparue et elle est pourtant importante.
Vu le nombre de paramtres qu'il faut dfinir dans Access, il est important de vous rappeler
que lorsque vous crez une base, vous devez d'abord commencer par crer les tables et de
dfinir toutes leurs proprits et contraintes avant mme de continuer avec quoi que ce soit!!!
MS Office Access
70/564
Vincent ISOZ
Filtrez tous les articles qui ont un prix suprieur 50.- (placer le curseur dans la colonne qui
doit servir de tri, menu contextuel Filtrer Pour et saisissez >50)
Il y a plusieurs mthodes pour dfinir des critres qui utilisent des symboles bien spcifiques
Access. Il est important de bien les comprendre, car ils sont utiles lors de la cration de
filtres et de requtes!
Attention!!! Certaines des critres ci-dessous ne fonctionnent que dans des requtes et pas
dans des filtres par slection.
71/564
Vincent ISOZ
la premire lettre du terme soulign restant compris entre p et z
>="D"
Tous les enregistrements dont le contenu du champ spcifi commence avec les lettres D Z
>3 ET <7
>3 AND <7
Tous les enregistrements dont le contenu des champs est compris entre les deux valeurs
spcifies. Il est donc possible d'utiliser des structures logiques
"A*" OU >"C*"
"A*" OR >"C*"
Tous les enregistrements qui commencent par A ou par un caractre plus grand que C
(attention Ca, Cb Ch seront compris dedans tant plus grands que C)
<>"G*"
Tous les enregistrements sauf ceux commenant par la lettre G
NOT IN ("France";"Allemagne")
PAS ("France";"Allemagne")
Tous les enregistrements qui ne sont ni en Allemagne ni en France
"K*" OU "L*"
"K*" OR "L*"
Tous les enregistrements commenant soit par la lettre K, soit par la lettre L
72/564
Vincent ISOZ
Retrouve les commandes de l'anne 2000. Cette fonction opre aussi (en franais) avec "j"
pour le jour, "m" pour le mois, et "t" pour l trimestre.
DiffDate("j";[datCommande];[datLivraison])>100
DateDiff("d";[datCommande];[datLivraison])>100
Retrouve les produits qui ont t livrs plus de 100 jours aprs avoir t commandes. Cette
fonction opre aussi (en franais) avec "j" pour le jour, "m" pour le mois, et "t" pour l
trimestre.
Jour([datCommande])=12
Day([datCommande])=12
Retrouve les commandes effectues le 12 (des mois prsents dans la table). La mme criture
est valable avec Mois/Month et Anne/Year au lieu de Jour/Day.
MS Office Access
73/564
Vincent ISOZ
5 Relations (jointures)
La notion de relation est ce qu'il y a de plus important dans MS Access o dans tout SGBDR.
C'est ce qui fait de cette famille de logiciel leur toute puissance dans la gestion simple de
bases de donnes plus ou moins complexes. Il est souvent trs difficile d'en comprendre le
principe, c'est pourquoi nous irons relativement lentement lors de l'tude de ce chapitre.
Remarque: Les relations ont une proprit sous-jacente qui se nomme la "jointure" techniquement il existe trois types de jointures possibles pour une relation. Une relation a
obligatoirement une des 3 jointures, d'o le fait que dans certains ouvrages, les auteurs ne
n'utilisent par le terme "relation" car pas assez prcis mais uniquement le terme "jointure".
Dans le prsent le prsent chapitre, nous ferons usage du terme "relation" pour signifier
qu'implicitement il s'agit de "jointures quivalentes".
Il existe diffrentes types de relations dont voici la liste (nous en avons dj fait mention lors
de notre introduction au schma ER page 22):
5.1.1.1
Pour ce cas particulier, nous allons prendre la table tblClients pour laquelle nous souhaiterions
une liste droulante statistique choix unique permettant le choix des genres (M., Mme, Mlle,
Dr., etc.).
Nous ouvrons donc la table en mode cration dans laquelle nous crons un champ nomm
lstGenre qui sera du type Texte en Assistant liste de choix (captures effectues avec
MS Access 2010):
MS Office Access
74/564
Vincent ISOZ
Nous avons alors un assistant qui dmarre et la premire tape, nous slectionnons Je
taperai les valeurs souhaites:
MS Office Access
75/564
Vincent ISOZ
en spcifiant bien que nous ne souhaitons pas que les utilisateurs puissent taper ou choisir
autre chose que ce que nous avons dfini (Limiter la liste) et qu'il ne peuvent pas
slectionner plusieurs valeurs la fois (Autoriser plusieurs valeurs). Nous cliquons sur
Terminer.
Ensuite, dans les proprits Gnrales du champs nous allons typiquement prendre:
MS Office Access
76/564
Vincent ISOZ
et nous vrifions bien que dans l'onglet Liste de choix nous puissions changer ventuellement
plus tard les paramtres:
et la liste droulante statistique choix unique est alors directement utilisable en mode table:
Remarque: Ceci dit, n'importe quel connaisseur vous dira qu'il vaut mieux faire une liste
choix lie une table avec une intgrit rfrentielle que d'utiliser cette technique!
5.1.1.2
La procdure est en tout point identique la prcdente. La seule chose qui change se situe au
niveau de l'option Contrle de l'affichage ci-dessous:
MS Office Access
77/564
Vincent ISOZ
Effectivement, dans l'exemple prcdent l'option a pour valeur (comme le montre la capture
ci-dessous) Zone de liste droulante. Ce qui donne dans un formulaire le rsultat suivant:
MS Office Access
78/564
Vincent ISOZ
et l nous voyons bien la diffrence entre une zone de liste droulante et une zone de liste
simple. Mais la diffrence n'est visible qu'avec les formulaires.
Remarque: Encore une fois, n'importe quel connaisseur vous dira qu'il vaut mieux faire une
liste choix lie une table avec une intgrit rfrentielle que d'utiliser cette technique!
5.1.1.3
MS Office Access
79/564
Vincent ISOZ
option qui peut aussi tre change tout moment des les options avances des listes:
MS Office Access
80/564
Vincent ISOZ
La suppression d'une des valeurs de la liste ne la supprimera pas dans les enregistrements o
elle est dj utilise.
Malheureusement ce type de liste ne sera pas tri dans l'ordre alphabtique!
Remarque: Encore une fois, n'importe quel connaisseur vous dira qu'il vaut mieux faire une
liste choix lie une table avec une intgrit rfrentielle que d'utiliser cette technique!
5.1.1.4
La mthode est la mme que la prcdente mais la diffrence que cette fois-ci, nous cochons
l'option Autoriser plusieurs valeurs:
Vous remarquerez ds lors que l'option Limiter la liste se cochera mme si vous l'avez
dcoche au pralable!
Nous avons alors (ce qui a peu de sens dans le cas prsent), la possibilit de choisir plusieurs
genres pour un mme client:
MS Office Access
81/564
Vincent ISOZ
Lorsque vous faites ce choix, vous avez trs probablement remarqu le message suivant:
Et effectivement, vous ne pourrez plus changer le type de ce champ. Il vous faudra ds lors le
supprimer entirement.
Remarque: Encore une fois, n'importe quel connaisseur vous dira qu'il vaut mieux faire une
liste choix multiple lie une table avec une intgrit rfrentielle que d'utiliser cette
technique!
Concernant l'option Afficher uniquement les valeurs de la source visible ci-dessous:
D'abord, elle ne marche que si et seulement si l'option Autoriser plusieurs valeurs et sur Oui.
Par dfaut elle est sur Non ce qui signifie que dans la table tblClients elle laissera visible dans
les cellules de colonne lstGenre les valeurs qui ne se trouvent pas dans la liste droulante
choix multiple. Si vous la passez Oui elle masquera (et non supprimera!) de la colonne
lstGenre toutes les valeurs non disponibles dans la liste droulante.
MS Office Access
82/564
Vincent ISOZ
5.1.2.1
Pour ce cas particulier, nous allons prendre la table tblClients pour laquelle nous souhaiterions
une liste droulante statistique choix unique permettant le choix des genres (M., Mme, Mlle,
Dr., etc.).
Nous ouvrons donc la table en mode cration dans laquelle nous crons un champ nomm
lstGenre qui sera du type Texte en Assistant liste de choix (captures effectues avec
MS Access 2010):
MS Office Access
83/564
Vincent ISOZ
Nous avons alors un assistant qui dmarre et la premire tape, nous slectionnons Je que
que la champs Liste de choix extraie les valeurs d'une autre table ou requte (vous
remarquerez que j'ai mme recopi la faute d'orthographe de l'entreprise 50 milliards de
dollars de capital...):
MS Office Access
84/564
Vincent ISOZ
Nous cliquons sur Suivant:
Nous nous limiterons aux Tables tant donne que nous n'avons pas encore tudi les requtes
mais cela n'enlve rien l'intrt (potentiel) trs puissant qu'il a y de lier une liste choix
une requte!!!! Nous choisissons la table tblGenres et cliquons sur Suivant:
on prend les deux champs (pour les utilisateurs qui ne comprendraient pas les abrviations...)
et nous cliquons sur Suivant:
MS Office Access
85/564
Vincent ISOZ
Nous trions sur la base des abrviations seulement et nous cliquons sur Suivant:
MS Office Access
86/564
Vincent ISOZ
Nous n'activons pas l'intgrit (nous ne voulons pas que les utilisateurs puissent supprimes
des Genres) et nous n'autorisons pas la slection de plusieurs genres.
Nous cliquons sur Terminer:
MS Office Access
87/564
Vincent ISOZ
et nous avons le rsultat souhait.
Nous pourrions refaire tous les exemples que nous avions prsents avec les listes statiques
mais ce serait du gaspillage de page...
5.2 Relation un un
Exemple 1: Une table tudiants table Taille, autrement dit: un tudiant une seule taille (
un moment donn de sa vie)
Exemple 2: une table classes table responsables, autrement dit: une classe a un responsable
et un responsable n'a la charge que d'une classe
Les deux exemples ci-dessus sont ceux que les spcialistes de l'algbre relationnelle appellent
une "dpendance fonctionnelle".
Prenons un exemple pratique avec notre base de donnes. Un vendeur peut travailler dans
plusieurs succursales au cours de sa carrire (c'est normal) mais nous allons supposer qu'un
vendeur ne peut tre responsable que d'un succursale tout au long de sa carrire.
Prenons la table tblVendeurs de notre base de donnes bddMagasin:
Attention, dans cet exemple il est particulirement important de ne pas oublier de faire (avec
l'assistant liste de choix pour simplifier) une relation entre le champ strNomResp et le champ
strNom de la table tblVendeur et ensuite d'aller activer l'intgrit rfrentielle entre les deux
tables:
MS Office Access
88/564
Vincent ISOZ
Allez ensuite dans le mode cration de la table tblSuccursales et changez l'index ET le Null
interdit comme indiqu ci-dessous du champ strNomResp:
Si vous revenez ensuite dans le schma de votre base vous verrez alors que nous avons bien
maintenant une relation 1 1:
MS Office Access
89/564
Vincent ISOZ
Si la table tblVendeurs n'est lie qu' une seule table par une relation un plusieurs alors
MS Access vous imbrique immdiatement la table ou "sous-feuille" esclave aprs un clic sur
le petit +.
En faisant un clic droit dans le mode cration de la table tblVendeurs:
MS Office Access
90/564
Vincent ISOZ
- Filtre et Tri: Permettent qu'un filtre et un tri soient appliqus automatiquement chaque fois
que la table est ouverte. C'est rarement utilis mme si cela marche trs bien.
- Sous-feuille de donnes nom: indique la sous-feuille ouvrir par dfaut si la table en
question est relie avec plusieurs tables par une relation un plusieurs.
- Champ fils et Champ pre: Sont respectivement la cl trangre et primaire de la relation
dfinie par la table sur laquelle vous tes et celle choisie dans le champ Sous-feuilles de
donnes.
Si vous ouvrez une table MS Access qui est lie plusieurs tables en un plusieurs, alors le
logiciel ne sachant pas quoi faire va vous demander quelle liaison avec quelle table vous
souhaitez visualiser. Par exemple avec la table tblArticles, en cliquant sur le petit + nous
obtenons:
MS Office Access
91/564
Vincent ISOZ
MS Office Access
92/564
Vincent ISOZ
Ainsi, en dfinissant directement dans les proprits de la table, la sous-feuille de donnes, le
champ pre et le champ fils il ne sera plus utile de faire cette manipulation chaque ouverture
de la table.
- Sous-feuille de donnes hauteur: c'est simplement la hauteur fixe en centimtres que doit
avoir par dfaut chaque sous-feuille dans la table mre. C'est trs pratique si vous avez
chaque fois une sous-feuille de donnes avec 5000 lignes cela permet de restreindre
seulement quelques unes.
- Sous-feuille de donnes tendue: Permet simplement que lorsque la table est ouverte d'avoir
toutes les sous-feuilles de donnes ouvertes (comme si pour chaque ligne nous avions dj
cliqu sur le petit +).
MS Office Access
93/564
Vincent ISOZ
Si vous effacez un enregistrement, ceux qui y font rfrence seront bloqus mais le
choix est quand mme possible (sous-options). Vous n'avez aussi plus la possibilit
d'avoir dans la table contenant la cl trangre de la relation, d'lments qui ne
correspondent pas au contenu de la table contenant la primaire de la relation (d'o le
terme "intgrit").
2. Mise jour en cascade:
Cette option est disponible seulement si vous avez activ l'intgrit rfrentielle. Elle
est utile aux personnes qui auraient fait l'erreur de mettre leur cl primaire ailleurs que
sur un champ ID (numro auto). Nous n'en ferons donc pas usage dans ce support.
Cette option est par contre redondante (ce qui ne signifie pas qu'il ne faut quand mme
pas l'activer) si vos cls trangres sont bases sur des listes choix.
3. Suppression en cascade:
A pour fonction de supprimer tous les enregistrements relis l'objet supprim (vous
perdez ainsi en quelque sorte l'historique)
Remarques:
R1. Il n'est pas ncessaire que des champs relis aient un mme nom. C'est le contenu qui fait
foi.
R2. Les tables sources de la relation doivent avoir une cl primaire avec un index unique.
R3. La relation doit se baser sur le champ de la cl primaire (respectivement de l'index
unique).
Lisez galement le contenu de votre support et l'aide lectronique intgre MS Access au
sujet des relations pour avoir un complment d'informations.
Evidemment, habituellement il n'y a pas (du moins il ne devrait pas avoir) de donnes dans les
tables lorsque l'on cre les relations !!!
Entrons maintenant un peu plus dans les dtails au niveau des relations (partie thorique un
peu barbante mais ncessaire).
Dans un premier temps, voici un rappel des conditions satisfaire pour crer des relations:
1. La cl primaire est le champ de la table qui sert d'identifiant un enregistrement. Il
s'agit d'un champ index sans doublon.
2. La cl trangre est le champ de la table qui servira matrialiser la relation avec la
cl primaire. Il doit tre de mme taille et de mme type de donnes que la cl
primaire laquelle il est li. Il est utile de lui donner le mme nom que celui port par
la cl primaire correspondante.
3. Pour crer une relation de un un, il faut imprativement lier des champs ayant leur
proprit "index" "oui-sans doublon".
MS Office Access
94/564
Vincent ISOZ
4. Pour crer une relation de un plusieurs, il suffit de lier les champs entre eux.
D'habitude, la relation se fait d'une cl primaire vers une cl trangre.
5. Pour crer une relation de plusieurs--plusieurs il faut crer une troisime table (dont
le besoin et le contenu se dfinissent tout fait naturellement), appele une "table de
jonction" (au fait c'est une table normale mais bon), et lui ajouter des champs, cls
trangres, possdant les mmes dfinitions que les champs cl primaire de chacune
des deux autres tables.
6. Nous crons des cls primaires combines dans des tables de transitions ce qui assure
par exemple qu'un couple de champs soit unique.
Crez maintenant les relations suivantes entre les tables que vous avez pour l'instant par
rapport au schma ci-dessous (votre formateur vous expliquera les tenants et aboutissants
dans les dtails).
Attention, des erreurs ont exprs t glisses dans ce schma (erreurs de nommage des
champs, d'intgrit, de position de cl primaire, d'index, etc.) et n'oubliez pas que vous
n'avez pas encore toutes relativement la finalit du cours donc ne paniquez pas si vous
n'avez quelque chose d'identique ce qui est montr dans la figure !!!
Remarques:
R1. D'une formation l'autre, ce schma peut changer un peu (votre formateur aime bien
parfois varier ses cours). Par exemple avec de bons participants en deux jours nous arrivons
un schma relationnel comme celui de la page suivante:
MS Office Access
95/564
Vincent ISOZ
Cl primaire simple
ou combine ?
R2. Certaines erreurs ont aussi t exprs introduites dans le schma ci-dessus afin que les
participants mettent en application leurs connaissances du cours initiation.
Pour vous exercer, vous pouvez tenter de rpondre ces questions (elles sont traites dans les
dtails lors du cours):
1. Pourquoi la cl primaire de la table tblArticles n'a pas t mise sur le champ idArticle?
2. O faudrait-il activer l'intgrit rfrentielle dans ce schma ?
3. La mise--jour en cascade a-t-elle alors un sens pour les tables relies cette cl
primaire strCodeArticle?
4. Et la mise--jour en cascade pour les autres relations ?
5. Quand faut-il activer la suppression en cascades des champs ?
6. Comment pouvons-nous rendre un champ unique sans utiliser de cl primaire (VBA?,
index?, etc.)???
7. Comment rendre le prnom et le nom d'un individu dans la table tblClients unique?
8. Faut-il mettre un index combin dans la table tblLanguesEmp ou pas ? Pourquoi ?
Ce schma est extrmement simple et il est aussi extrmement rare d'avoir quelque chose
d'aussi petit et simple dans MS Access, une bonne moyenne (nivele vers le bas) serait plutt
du type suivant (voir page suivante):
MS Office Access
96/564
Vincent ISOZ
MS Office Access
97/564
Vincent ISOZ
Figure 4 Exemple de BDD (taille standard)
Revenons notre exemple de dpart et dtaillons-le:
98/564
Vincent ISOZ
3. L'intgrit rfrentielle avec la suppression en cascade
Au hasard, un des participants ira au poste du formateur pour dmontrer le bon
fonctionnement de ces outils.
Nous souhaitons dfinir pour chaque vendeur, un vendeur responsable (une structure
d'organigramme d'entreprise en d'autres termes).
Pour faire cela, ajoutons cette table un champ strResponsable avec un champ de type
Integer. Ensuite dans la fentre des relations, ajoutons une deuxime fois la table tblVendeurs
(ce qui s'appelle techniquement un "alias de table"):
99/564
Vincent ISOZ
et si nous cliquons sur les petits en slectionnant la table tblVendeurs nous avons alors un
visuel de l'organigramme (cellulaire) de vendeurs:
MS Office Access
100/564
Vincent ISOZ
MS Office Access
101/564
Vincent ISOZ
MS Office Access
102/564
Vincent ISOZ
Ouvrez la table tblClients, basculez en Mode cration. Cliquez sur le bouton mis en vidence
ci-dessous et observez les options qui vous sont offertes:
MS Office Access
103/564
Vincent ISOZ
Attention
!!
Le fait de ne pas mettre d'index la deuxime ligne a pour effet (au mme titre que pour les
macros que nous verrons plus loin) de cumuler l'index, et ainsi de le combiner, entre strNom
et strPrenom.
MS Office Access
104/564
Vincent ISOZ
6 Formulaires (simples)
Les formulaires sont des objets importants dans MS Access. Effectivement, ce sont eux qui
vont permettre l'utilisateur de la base de donnes de gagner du temps relativement ces
besoins quotidiens. De plus, il est connu que lorsqu'une application est conviviale, elle est
beaucoup plus apprcie par les utilisateurs.
Remarques:
R1. Les formulaires (et la partie "configuration de l'esthtique des formulaires") sont aussi
traits dans le chapitre "Interfaage de l'application" (voir page 235) de ce support.
R2. Ne crez jamais de formulaires en les mettant en mode "pleine fentre" ce n'est pas du
tout une bonne mthode de travail pour des raisons de compatibilit et de veille
technologique.
R3. Essayez toujours de faire des formulaires (interfaces) aussi petits que possibles car de
plus en plus d'entreprises quipent leurs employs en PDA quips de Windows CE et d'un
runtime MS Access. Nous verrons tout la fin du document quoi ressemble notre base de
donnes sur un SmartPhone Qtek 9090 quip du logiciel DB Anywhere
(www.handango.com) permettant de synchroniser et convertir les bases MS Access au format
CDB.
MS Office Access
105/564
Vincent ISOZ
Le ct pratique des ces onglets c'est qu'ils que mme si un formulaire est devant un autre,
nous savons qu'il y en a derrire. Nous pouvons au mme titre qu' l'poque o nous avions
les fentres des formulaires modales passer de l'un l'autre par le raccourci Ctrl+F6 mais
part cela, beaucoup de concepteurs n'aiment pas cette nouvelle prsentation. Pour revenir
alors la version classique, il faut aller dans les options du logiciel:
MS Office Access
106/564
Vincent ISOZ
Ensuite:
MS Office Access
107/564
Vincent ISOZ
Vous verrez que le formulaire ne vous indique plus que les enregistrements qui satisfont aux
critres choisis. Vous pouvez maintenant les parcourir et les modifier comme lorsque vous
travaillez avec un formulaire normal.
Remarque: Ce "filtre par formulaire" comme son nom ne l'indique pas, fonctionne aussi
partir des tables directement (pour les personnes intresses):
MS Office Access
108/564
Vincent ISOZ
Un autre intrt des filtres par formulaire est qu'il est possible de sauvegarder (avec leurs tris!)
ceux-ci sans avoir connaissance du concept de "requte". Pour ce faire, une fois le filtre par
formulaire cr, il suffit en haut gauche de l'cran de cliquer sur le bouton:
qui vous demandera sous quel nom vous souhaitez enregistrer les paramtres du filtre par
formulaire en cours. Plus tard, (le lendemain, la semaine prochaine) vous pourrez ainsi
tout moment rouvrir ce filtre enregistr en cliquant sur:
et en choisissant dans la liste qui se proposera vous dans la bote de dialogue suivante:
le filtre que vous souhaitez rutiliser s'il y en un! Mais attention!!!! vous perdrez les tris si
vous chargez le filtre en mode Filtre par formulaire lorsque vous tes dans une table. Si vous
souhaitez contourner cette limitation, lorsque vous tes dans le formulaire il faut passer par le
menu:
MS Office Access
109/564
Vincent ISOZ
Sur un formulaire quelconque on peut par clique droit de la souris (si cette action a t
autorise par l'administrateur de la base de donnes) activer les options que nous avons dj
vues prcdemment tel que l'on ait l'cran la mme chose que ce qui est reprsent sur la
figure de la page suivante.
MS Office Access
110/564
Vincent ISOZ
MS Office Access
111/564
Vincent ISOZ
Ensuite, dans le ruban Cration, nous cliquons sur le contrle de type Bouton:
MS Office Access
112/564
Vincent ISOZ
Une fois que nous lachons le bouton gauche de la souris un assistant vient et nous prenons
alors la catgorie Opration sur formulaire avec l'action Appliquer le filtre d'un formulaire:
MS Office Access
113/564
Vincent ISOZ
Ensuite, nous cliquons sur Terminer. Cependant le bouton ne fera pas un filtre par fomulaire...
il faut alors aller modifier l'action de l'vnement Sur clic associe:
Nous arrivons alors (du moins depuis la version 2010 de Microsoft Access):
MS Office Access
114/564
Vincent ISOZ
MS Office Access
115/564
Vincent ISOZ
et la question qui vient:
Nous cliquons sur Oui. Ensuite nous repassons le formulaire en mode Formulaire:
Ce qui donne aprs que nous ayons cliqu sur ce nouveau bouton:
MS Office Access
116/564
Vincent ISOZ
Donc cela marche. Maintenant il nous faut un bouton pour appliquer les critres de
l'utilisateur. Nous recommenons la procdure depuis le dbut mais en prenant cette fois-ci:
et:
MS Office Access
117/564
Vincent ISOZ
Le problme est qu'activer le filtre par formulaire dsactive les boutons prsents sur le
formulaire... (voir les remarques en rouge au dbut de cette section). Donc nous sommes
coincs... Il semblerait que seule possibilit soit de crer un ruban contextuel ou une barre
d'outils contextuel mais cela sort du cadre de ce chapitre.
C'est pourquoi nous allons voir, ds maintenant, comment manipuler correctement un outil
aussi puissant et pratique que sont les filtres par requtes.
MS Office Access
118/564
Vincent ISOZ
2. l'outil de recherche (recherche et remplacer) inclus dans MS Access mais dont vous
avez cr un raccourci sur le formulaire l'aide de l'assistant de boutons.
3. l'outil de recherche par listes (combo box ou list box) inclus dans MS Access mais
dont vous avez cr l'accs en utilisant l'assistant correspondant de la bote outils
contrle (voir plus loin)
4. le dveloppement d'un formulaire spcial ddi la recherche derrire lequel se cache
du code VBA (si la recherche est labore)
Voyons comment marchent les deux premires options (la troisime est vue beaucoup plus
loin en cours).
MS Office Access
119/564
Vincent ISOZ
Il suffit maintenant de choisir un champ dans la liste pour accder directement au premier
enregistrement correspondant.
Remarques:
R1. Vous pouvez ajouter autant de "listes de recherche" que vous dsirez
R2. Plusieurs listes de recherche ne cumulent pas les critres (ET logique)
R3. Cette fonctionnalit marche galement en mode "tabulaire" sans cacher toutefois les
enregistrements qui ne correspondent pas au critre (MS Access se positionne seulement sur
l'enregistrement intress).
MS Office Access
120/564
Vincent ISOZ
R4. Pour appliquer un filtre plus complexe, prenregistr, il faudra d'abord que nous tudions
comment crer des requtes paramtres simples et ensuite comment crer une macro utilisant
l'option "Appliquer un filtre".
Ce dernier point consiste en un joli exercice de style qui n'est pas vraiment prvu dans la
formation faute de temps. Mais cependant, si une majorit de participants souhaitent voir
comme cela marche, il faudra qu'ils s'accrochent (dans le cadre d'un cours de base) leurs
stylos et qu'ils soient prts sacrifier 20 40 minutes sur le programme prvu. Sinon, si le
participant au cours souhaite y revenir lors d'une formation avance il faudra qu'il prenne
garde rappeler le formateur d'avoir l'obligeance de montrer cette fonctionnalit (eh oui !
j'oublie parfois tellement il y de choses montrer).
Dfinissez une telle zone un endroit voulu du formulaire. Ceci fait, la bote de dialogue
suivant apparat:
MS Office Access
121/564
Vincent ISOZ
Ensuite vous arrivez la fentre suivante (o il est inutile dans cet exemple de changer quoi
que ce soit):
Ensuite, il faut bien videmment choisir le champ dans lequel va tre enregistre cette valeur,
en l'occurrence intGenre:
MS Office Access
122/564
Vincent ISOZ
Ensuite, vous avez plein de choix intressants et pertinents pour l'aspect visuel::
Il suffit ensuite de donner une lgende au groupe et vous obtenez finalement un formulaire du
type:
MS Office Access
123/564
Vincent ISOZ
MS Office Access
124/564
Vincent ISOZ
et il est bien videmment possible d'utiliser d'autres fonctions que Sum pour faire des
statistiques de la mme table que celle sur laquelle est principalement bas le formulaire.
Remarque: Si pour le critre de la fonction DSum vous avez deux champs qui ont le mme
nom, spcifiez en suffixe la provenance (nom de la table ou de la requte entre crochets).
MS Office Access
125/564
Vincent ISOZ
MS Office Access
126/564
Vincent ISOZ
Remarque: si vous avez dj le nom du fournisseur (car cela dpend de votre choix antrieur
lors du cours de base o nous faisons exprs de crer des erreurs !) faites en sorte d'avoir le
dlai de livraison qui s'affiche sur le formulaire en fonction du nom du fournisseur.
La solution (il faut bien que vous l'ayez quelque part mais ne "trichez" pas en passant tout de
suite celle-ci sinon vous ne verrez pas l'intrt de l'exercice) consiste utiliser la trs
fameuse fonction DLOOKUP (RechDom en franais) de MS Access et dans un nouveau
champ, d'crire la fonction suivante:
Faites de sortes que toutes les "champs calculs" soient verrouilles et inactifs afin que
l'utilisateur ne puisse pas cliquer dedans (c'est une opration qu'il faut aussi savoir faire dans
les formulaires ressortant de requtes comme nous le verrons plus tard).
En tant qu'exercice, refaites de mme que prcdemment mais avec le dlai de livraison (c'est
plus pertinent) ainsi qu'avec le canton de localisation du fournisseur et le pays.
Petite remarque ! Rappelez-vous qu'au cours de base nous avions fait exprs de mettre les cls
primaires au mauvais endroit dans les tables tblPays et tblCantons. Nous vous demandons ds
lors la chose suivante afin de vous exercer nouveau avec les concepts de cls primaires:
1. Pour le canton, ne changez rien
2. Pour le pays, corrigez l'emplacement de la cl primaire
Quelles sont les diffrences ds lors au niveau de l'utilisation de la fonction DLookUp ?
6.16 Onglets
Lorsque vous avez trop de donnes reprsenter dans vos formulaires, vous avez la
possibilit dans les formulaires de MS Access d'ajouter des zones d'onglets pour ranger vos
champs par dfaut ou vos champs supplmentaires.
MS Office Access
127/564
Vincent ISOZ
Crez un formulaire automatique de la table tblClients par exemple (elle contient peu
d'informations mais nous ferons avec):
et passez en mode cration. Sur la bote outils vous avez le bouton suivant:
Dans votre formulaire faites un peu de place (en supprimant les champs que vous voudrez
dans les onglets !) pour les futurs onglets et insrez en un en le dessinant (comme vous le
feriez dans MS Word):
MS Office Access
128/564
Vincent ISOZ
Dans un premier temps, pour renommer, supprimer ou ajouter des onglets, il suffit de faire un
clic droit sur le nom de ceux-ci tel que:
MS Office Access
129/564
Vincent ISOZ
Comment faire en sorte que dans le formulaire vendeurs, nous puissions saisir
indpendamment les langues et les comptences d'un vendeur donn ?
1. Crer un formulaire en mode tabulaire de la table tblCompetencesV (avec les champs
strCompetences et tblVendeursId) et l'enregistrer sous le nom frmComptencesV
MS Office Access
130/564
Vincent ISOZ
2. Crer un formulaire en mode tabulaire de la table tblLanguesV (avec les champs
strLangues et tblVendeursId) et l'enregistrer sous le nom frmLanguesV
3. Crer un formulaire en mode simple (avec le champ IdVendeurs) de la table
tblVendeurs
Ainsi (pour l'esthtique nous vous laissons faire):
MS Office Access
131/564
Vincent ISOZ
7 Requtes (simples)
Attention! Enregistrez toujours une requte avant de l'excuter et veillez respecter la
nomenclature de L-R.
MS Access dispose d'un des QBE (Query By Example) les plus souples et les plus puissants
du march. Il est aussi facilement abordable par un dbutant capable de crer tous types de
requtes d'actions, d'analyses croises ou d'union.
Il est aussi trs simple de crer des requtes imbriques en enregistrant la premire puis en
l'appelant par son nom, dans la requte parent. Non seulement, cette fonctionnalit permet
d'optimiser des requtes complexes comme on peut le faire en SQL (Structured Query
Language), mais elle clarifie la vue d'ensemble et permet une mise au point par tapes: tester
d'abord le niveau le plus bas, puis remonter
Sans parler des assistants qui font gagner un temps prcieux: recherche de doublons
Ce QBE est tellement rapide et simple que, si j'ai l'obligation, dans un programme VB, C#,
ASP, PHP ou autre de manipuler du code SQL, je n'hsite jamais :
1. Ouvrir une base MS Access
2. Attacher les tables ncessaires
3. Crer une requte afin d'obtenir le rsultat dsir
4. Afficher les donnes pour vrifier que les rsultats correspondant aux attentes
5. Copier le code SQL dans l'application VB, C#, ASP, PHP ou mme SQL Server
6. Remplacer les valeurs paramtres par des noms de variables
Diffrences entre filtres et requtes:
Slection des donnes
Enregistrement
Utilisation
MS Office Access
Filtres
Une table est filtre par ligne
pour une table unique
Le filtre est enregistr dans la
table et ne peut tre consult
qu'en ayant la table l'cran.
Requtes
Une requte peut tre cre
pour plusieurs tables d'un coup
La requte est lie une tablerequte gnre
automatiquement chaque
excution de la requte et peut
tre visualise dans un
formulaire.
Pour l'affichage et la saisie
d'enregistrements en fonction
de plusieurs critres dans des
formulaires lis la tablerequte.
132/564
Vincent ISOZ
Les requtes sont plutt utilises pour que l'utilisateur puisse modifier une donne ou
visualiser les enregistrements d'une table partir du mode de cration ou d'un formulaire. En
aucun cas, il ne s'agit (communment en tout cas) d'un outil qui doit amener faire de la
saisie.
Il existe plusieurs types de requtes diffrencies sous MS Access (votre formateur va vous
dire de quoi il s'agit et comment utiliser l'aide dans le cadre de MS Office 2003 et du code
SQL):
1. Requtes de slection
2. Requtes d'ajout
3. Requtes de synthse
4. Requtes croises
5. Requtes de cration
6. Requtes de suppression
7. Requtes de mise jour
8. Requte de correspondance
9. Requte de non-correspondance
10. Requtes d'union ( coder en SQL)
11. Requtes de passage (pour excution sur SQL Server sans passer par Jet)
12. Requtes de dfinition ( coder en SQL)
Dans une "requte de synthse" (dans le cas de donnes numriques) on peut calculer des
totaux, moyennes et autres (il y aura un exercice l-dessus).
La case cocher dans le mode cration des requtes permet de se servir d'un champ comme
critre de la requte tout en l'obligeant ne pas s'afficher dans la table rsultant de la
compilation de la requte (et dans le formulaire rattach).
MS Office Access
133/564
Vincent ISOZ
Pour lancer une requte, il suffit de cliquer sur le bouton:
Dans les cellules de la ligne de "Critres" il est possible de dfinir des ingalits qui tabliront
si un champ d'un enregistrement sera affich dans la table compile ou non. Par exemple, si
nous souhaitons afficher un enregistrement uniquement s'il satisfait une certaine ingalit
donne par des oprations mathmatiques en relation d'autres champs du mme
enregistrement. Ainsi dans la ligne de critres on crira quelque chose du genre:
[Nom d'un premier champ]/[Nom d'un deuxime champ]*[Nom d'un troisime champ]>100
Si cette ingalit est satisfaite alors le champ correspondant la colonne de critre o l'on a
saisi cette formule sera affich.
On peut galement crer dans la table compile, une nouvelle colonne avec un "champ
calcul". Ainsi, dans la ligne Champ on crira:
NomNewColumn:[Champ existant]/Nombre voulu
Cela aura pour effet de crer lors de la compilation de la requte, une nouvelle colonne
nomme "NomNewColumn" avec les rsultats du calcul saisi.
Remarques:
R1. Nous n'allons voir ici que les requtes "simples". Les autres seront vues dans le chapitre
nomm "Requte et jointures" (voir page 199).
R2. Le lecteur remarquera lors de l'utilisation des assistants d'Access qu'il est possible
d'utiliser une requte dans une requte et de la mlanger avec des tables pour faire des
analyses pertinentes.
MS Office Access
134/564
Vincent ISOZ
Effectivement, partir du moment o vous cochez cette case, toutes les nouvelles requtes
que vous crrez vous afficheront TOUS les champs des tables prsents dans la requte lors
de son excuation mme ceux que vous n'auraz pas slectionn comme devant s'afficher...
MS Office Access
135/564
Vincent ISOZ
la surprise de beaucoup d'utilisateur MS Access, la colonne client n'est pas trie. Au fait
c'est normal car le moteur de requte utilise le numro de la cl primaire des clients
provenant de la table tblClients pour faire le tri et non le nom des clients eux-mmes! Il faut
donc aller chercher la table tblClients pour la rajouter dans la requte et prendre le champ
strNom:
MS Office Access
136/564
Vincent ISOZ
MS Office Access
137/564
Vincent ISOZ
MS Office Access
138/564
Vincent ISOZ
Remarque: Il existe une autre possibilit qui consiste utiliser le regroupement comme va
vous le montrer votre formateur (requte enregistrer sous le nom de
qryDistinctionGroupee), mais normalement cette dernire technique devrait plutt tre
rserve pour des calculs arithmtiques.
Vrifiez si en crant un formulaire des deux requtes prcdentes, vous pouvez oui ou non
crer de nouvelles donnes. Argumentez votre observation!
MS Office Access
139/564
Vincent ISOZ
Remarque: le champ en question doit tre au pralable tri si nous voulons les X premiers
(ordre dcroissants) ou X derniers (ordre croissant).
MS Office Access
140/564
Vincent ISOZ
MS Office Access
141/564
Vincent ISOZ
En excutant:
Donc tous les clients sauf ceux qui n'ont pas de Nom. Pour contourner cela, nous changeons
notre requte comme suit:
MS Office Access
142/564
Vincent ISOZ
Le problme est alors lorsque la slection d'un client est effectue, seulement la premire
colonne de la liste de choix, apparat dans la cellule de la table (respectivement dans le champ
du formulaire.. pour les formulaires). Pour rsoudre ceci, il suffit de faire une modification
dans une requte qu'Access aura cre automatiquement pour vous lors de la cration de la
liste de choix
Effectivement, dans les paramtres de la liste, cliquez sur:
Apparat alors:
Ensuite, fermez la fentre de la requte (confirmez les changements) et de retour dans les
proprits de la liste choix, changez l'option Nbre Colonnes :
la valeur 2 !
MS Office Access
143/564
Vincent ISOZ
Vous obtenez alors le rsultat suivant:
MS Office Access
144/564
Vincent ISOZ
Croissant
Comme vous pouvez le voir sur la figure ci-dessus, les deux tables sont relies entre elles.
Avant de voir en quoi cela consiste, excutez votre requte sans la liaison, crez-en un
formulaire instantan que vous enregistrerez sous le nom frmCibleFournisseurs et essayez
d'en tirer une conclusion. Vous verrez que la liaison permet de faire barrire cette absurdit
(nous verrons plus loin, plus en dtail, les diffrentes possibilits).
Si vous essayez de saisir des donnes par l'intermdiaire du formulaire Cible Fournisseurs
vous verrez que l'opration d'ajout d'enregistrements vous sera refuse. Expliquez pourquoi.
Remarque: Attention l'utilisation de la ligne OU, elle implique un doublement des critres
pour fonctionner:
Remarque: Il s'agit du premier exemple utilisant deux tables et il faut savoir que dans le cadre
des requtes que l'on ne doit jamais avoir une table non lie (au cas o il y en aurait plusieurs
bien sr...).
Il existe souvent plusieurs manires d'crire un mme critre. Par exemples les trois requtes
suivantes sont quivalentes:
MS Office Access
145/564
Vincent ISOZ
Il en va de mme pour les trois suivantes:
pour
MS Office Access
146/564
Vincent ISOZ
Si vous terminez l'assistant et excutez la requte, vous y trouverez une "erreur" (introduite
exprs par le formateur dans l'nonc de l'exercice). Quelle en est l'origine? Comment la
corriger?
Le rsultat dfinitif est le suivant:
MS Office Access
147/564
Vincent ISOZ
Si vous comparez avec le contenu de la table tblSorties, vous verrez que la synthse est bien
correcte.
Exportez le contenu de cette requte dans MS Excel et observez ce qui se passe pour le champ
du code d'article (vous verrez que celui-ci apparat normalement puisque le code fait luimme office de cl primaire).
En tant qu'exercice crez une requte que vous nommerez qryPerformance qui affiche pour
un article donn, le vendeur qui en a vendu le plus et la quantit correspondante (si deux
vendeurs sont galit, nous prendrons le premier dans l'ordre de saisie).
Solution:
Soit:
Attention!! N'utilisez jamais les regroupements dans le but d'avoir une table valeurs
uniques dont l'objectif serait d'tre utiliss dans des listes droulantes de formulaires.
Effectivement, ce type de stratgie vous posera des problmes pour crire avec des macros du
type DfinirValeur. Pour faire en ralit proprement une liste d'lments uniques, il vous faut
utiliser l'option Unique que nous verrons comme exemple plus loin.
MS Office Access
148/564
Vincent ISOZ
Exportez d'abord la table tblSorties vers vers MS Excel manuellement et faites ensuite l'export
de la requte qryPiege avec la macro.
Quelle diffrences pouvez-vous observer entre l'export manuel et l'export avec la macro au
niveau du tableau MS Excel obtenu?
Remarque: Si vous avez Access 2007 ou ultrieur, exportez au format *.xlsx sinon quoi il
peut y avoir une mauvais export de donnes (incomplet).
MS Office Access
149/564
Vincent ISOZ
Que constatez-vous pour les champs clients et vendeurs ? Que peut-on en conclure ? Quelles
sont les consquences aprs coup ?
Si vous souhaitez pouvoir exporter plusieurs requtes ou tables dans un mme fichier
MS Excel cela ne fonctionnera pas avec Output To, il vous faudra utiliser l'action suivante
TransferSpreadsheet (TransfrerFeuilleCalcul):
MS Office Access
150/564
Vincent ISOZ
MS Office Access
151/564
Vincent ISOZ
Ce qui est dommage, c'est que si l'on laisse la formule comme reprsente ci-dessus,
l'utilisateur lambda ne pourra pas choisir la valeur de l'augmentation. Pour ajouter un peu
d'interactivit, nous allons plutt crire la chose suivante dans le champ "Mise jour":
[Prix unitaire]*(1+[Saisissez l'augmentation en %]/100)
Enregistrez cette requte sous le nom "Requte mise jour".
Remarques:
R1. A chaque fois que vous excutez une requte d'action un message d'avertissement
apparatra l'cran. Pour dsactiver celui-ci sans faire de VBA allez dans le menu
Outils/Options et dans l'onglet Modifier/Rechercher dsactivez la case cocher Requtes
d'action (sinon avec du VBA il suffit d'utiliser la commande docmd.setwarnings false)
R2. Si vous slectionnez l'astrisque (*) dans une requte, cela prsente un avantage par
rapport l'opration qui consiste slectionner tous les champs. Lorsque vous utilisez
l'astrisque, les rsultats de la requte comprennent automatiquement tous les champs qui ont
t rajouts la table (pendant son volution) ou la requte sous-jacente (si la requte est
cre partir d'une requte) aprs la cration de la requte et excluent automatiquement les
champs qui sont supprims. Lorsque vous utilisez l'astrisque, vous ne pouvez pas trier les
enregistrements ou spcifier les critres de champs sauf si vous ajoutez ces champs ensuite
part dans la grille de cration de la requte et que vous dsactivez son affichage lors de
l'excution de la requte.
R3. Si vous avez des calculs avec des champs "null" effectuer (ce qui n'est pas quivalent au
nombre 'nul' = 0) les rsultats ne sortent pas. Il faut ds lors dans le champ contenant la
relation mathmatique ajout l'endroit adquat une des deux formules suivantes:
IIf(isnull([nomchamp]);0;[nomchamp])
nz([nomchamp];0) // convertit la valeur du champ 'nomchamp' en la valeur du second
argument de la fonction
MS Office Access
152/564
Vincent ISOZ
MS Office Access
153/564
Vincent ISOZ
qu'il suffira de valider par Yes.
Le tableau gnr par la requte devra ressembler quelque chose comme cela:
L'objectif est de crer un formulaire qui n'affichera que le premier vendeur de la liste (sans
que l'utilisateur puisse voir les deuxime, troisime, vendeurs).
Il est bien sr facile d'indiquer l'utilisateur seulement le premier vendeur. Pour cela, sans
passer par le VBA, il suffit dans les proprits du formulaire et de dsactiver le navigateur
d'enregistrements.
Avec l'assistant de requtes, crez maintenant une requte de synthse de la table tblSorties
(comprenant les champs strNbArticles, intUnites, datDateOut) qui vous indique la somme des
articles vendus par trimestre:
MS Office Access
154/564
Vincent ISOZ
MS Office Access
155/564
Vincent ISOZ
La macro correspondante:
L'objectif maintenant est de faire de ces trois tables importes (qui habituellement ne viennent
pas de MS Excel mais sont crs et conserves dans MS Access) une unique table qui indique
MS Office Access
156/564
Vincent ISOZ
quels sont les produits qui ont t vendus en entre 1978 et 1980 (remarquez bien que certains
articles se rptent !).
Si vous crez une requte normale (c'est celle que les gens choisissent souvent en premier):
Vous n'arriverez rien ! Bien sr, vous pouvez faire une multitude de "Requtes d'ajout" mais
lorsque les donnes sont nombreuses, la mthode est alors catastrophique!!! Bon ceci dit cela
reste un bon exercice et c'est quand mme le cas le plus courant qui vite d'apprendre par
coeur le langage SQL. Vous pouvez donc aussi le faire en tant qu'exercice!
La solution est alors la suivante:
Il faut crer une requte en mode cration et passer directement en affichage SQL et saisir:
et vous obtenez comme symbole pour cette requte dans la fentre de base de donnes:
MS Office Access
157/564
Vincent ISOZ
Nous avons obtenu ce que nous voulions mais avec les doublons en plus. Pour les liminer,
il faut enlever les "ALL" de la requte SQL. Il vient alors:
Si nous rajoutons des paramtres pour les rsultats d'affichage, nous voyons que nous passons
alors de 7 enregistrements 9 (pas besoin de mettre les crochets ! c'est juste pour montrer une
autre faon d'crire):
Ce rsultat est totalement normal car le couple (Article,Vendeurs) devient maintenant unique.
En l'occurrence les GEN-001.
MS Office Access
158/564
Vincent ISOZ
Remarque: Vous pouvez changer le "Union" par un "Intersect" ou un "Minus" sur d'autres
systmes de base de donnes que MS Access dsol
Ensuite, rien ne vous empche d'ajouter des critres en spcifiant la commande "WHERE", tel
que par exemple (nous voulons que le vendeur numro 8 !):
Exercice: Dans la requte prcdente, faites que les articles soient tris dans l'ordre
dcroissant de leurs noms.
Remarque: nous allons voir de suite une autre application trs concrte de ces requtes
d'union.
MS Office Access
159/564
Vincent ISOZ
Et il faut rajouter la requte la proprit de distinction que nous avons dj vue plus haut:
L'ide est de compter combien de clients (uniques) ont fait une commande
malheureusement la solution n'est pas simple et faire un simple regroupement par nom de
client ne suffit pas. Nous donnons alors la solution (ne connaissant pas plus simple ce jour):
MS Office Access
160/564
Vincent ISOZ
Nommez cette requte qrySQLCount.
Remarque: Certains utilisateurs font usage de MS Access pour tester des commandes SQL
avant de les excuter dans SQL Server. Si c'est votre cas, n'oubliez pas d'aller dans le menu
Outils/Options de MS Access et dans l'onglet Tables/Requtes d'activer l'option Syntaxe
Compatible SQL Server (ANSI 92) comme indiqu ci-dessous:
MS Access utilisant par dfaut le ANSI 89 ce qui date un peu quand mme
Attention bien faire une copie de la base de donnes avant l'activation de cette option
comme vous l'indiquera le systme!
et une requte similaire (que nous laisserons le soin au participant de crer) qui comptera
simplement le nombre de clients partir de la table tblClients et que le participant nommera
qrySQLCountCust.
MS Office Access
161/564
Vincent ISOZ
Nous allons maintenant crer la requte d'union suivante:
Qui donne le rsultat suivant dans le cadre de notre petite base de donnes:
Essayez comme exercice de compiler les trois requtes en une seule uniquement avec code
SQL.
MS Office Access
162/564
Vincent ISOZ
MS Office Access
163/564
Vincent ISOZ
MS Office Access
164/564
Vincent ISOZ
8 tats-formulaires (complexes)
On peut imprimer les tables dans MS Access pour consultation et vrification. Cependant, il
est peut tre prfrable avant d'envoyer l'imprimante une table avec 10'000 enregistrements,
de vrifier la faon dont l'impression va tre effectue.
Pour cela, avant d'imprimer quoi que ce soit, comme dans tout autre logiciel, il faut prendre
l'habitude d'activer l'Aperu avant impression et au besoin de dfinir ses propres proprits
d'impression qui sont peu nombreuses...
Par exemple, ouvrez la table Articles et activez l'aperu avant impression et dfinissez une
mise en page "paysage".
Cependant, on utilisera plus frquemment les tats pour effectuer une impression
professionnelle des donnes de la base. On verra plus tard comment personnaliser ses tats
avec tous les soins ncessaires.
Par exemple, slectionnez la requte "Cible Fournisseurs" et crez en un tat l'aide de
l'assistant (du type de celui visible la page suivante). Vous enregistrerez cet tat sous le nom
rptCibleFournisseurs.
Pour crer un tat instantan, ouvrir une table et:
Evidemment, il faut rendre l'tat accessible l'utilisateur de votre base partir d'un bouton se
situant sur un formulaire si l'on veut bien faire les choses.
Maintenant que nous avons parcouru les principaux objets d'Access (Tables, filtres, requtes,
formulaires (sur requtes et sur tables), tats) vous pensez ncessairement qu'il est dommage
que l'on doive passer chaque fois par la fentre de base de donnes pour activer ces
derniers?!
Il n'est est rien! Au cours "avanc" (ou lors de la dernire demi-journe), nous verrons
comment crer une belle interface utilisateur avec tous les boutons (il y a du code VBA
derrire) ncessaire une utilisation optimale de votre base. Il en sera de mme pour le choix
de l'ouverture automatique d'un des formulaires, lors de l'ouverture de la base.
MS Office Access
165/564
Vincent ISOZ
Vous avez ci-dessous un tat cr avec l'assistant qui groupe les articles de la table tblSorties
par ordre alphabtique et qui indique les informations de sortie des articles (Vendeurs, Units
vendues, Type de payement, Date de sortie) et qui pour chaque article fait une synthse des
informations (Somme du nombre d'articles et pourcentage par rapport la totalit).
Il existe galement au besoin une option qui permet d'exporter les donnes reprsentes par
l'tat vers un fichier Word ou Excel. Le systme de marche pas toujours comme on le souhaite
et n'est pas toujours fonctionnel (dpendant de la faon avec laquelle le logiciel a t install
sur la machine et de la complexit de la base de donnes en question).
Comme exercice il vous est maintenant demand de crer un tat que vous nommerez
rptLettreType qui gnre automatique une lettre type de bienvenue chaque nouveau client
inscrit notre systme fidlit du magasin.
La lettre type (outre le logo que vous pouvez choisir) doit contenir les informations standards
du client tel que l'expditeur, l'adresse de son destinataire, les formules de politesses
adquatement conjugues, etc.
MS Office Access
166/564
Vincent ISOZ
Si par mgarde, la numrotation des pages des rapports est supprime, il est toujours possible
de la rinsrer un endroit quelconque en allant dans le menu Insertion/Numros de pages.
Apparat alors l'cran l'option suivante:
MS Office Access
167/564
Vincent ISOZ
Validez enfin par Terminer et observez le rsultat (dont l'esthtique est toujours discutable et
demande un peu de travail de la part du dveloppeur):
MS Office Access
168/564
Vincent ISOZ
MS Office Access
169/564
Vincent ISOZ
MS Office Access
170/564
Vincent ISOZ
Personnalisez cet tat maintenant avec votre formateur (rajout de formules en pied et tte de
page ainsi qu'en pied de rapport, mise en forme conditionnelle, DLookUp,).
8.3 Sous-tats
Nous allons dans cet exemple crer un tant avec des sous-tats (ou sous-formulaires pour
tre plus exact). L'objectif sera d'avoir un rapport qui nous indique pour chaque article, une
colonne avec les sorties et une colonne avec les entres.
L'esthtique du rsultat ne sera pas prise en compte car seule nous intresse la technique et la
possibilit offerte par MS Access (le formatage tant ce niveau suppos matris).
Pour cet exemple, il va nous falloir dans un premier temps crer deux formulaires
respectivement pour les tables tblEntrees et tblSorties ayant le design et les noms visible dans
les capture d'cran ci-dessous ( ce niveau du cours, crer ce genre de formulaires ne doit plus
tre un problme):
Nous aurons galement besoin d'un rapport bas sur la table tblArticles et nomm rptArticles
affichant simplement la chose suivante:
MS Office Access
171/564
Vincent ISOZ
Maintenant, nous allons passer cet tat en mode cration et largie la zone Dtails:
Ensuite, dans la bote outils contrles, nous cliquons sur le bouton Sous-formulaire/Soustat
et nous traons une zone d'une taille choisie au bolomtre pour commencer que nous
pourrons toujours changer plus tard:
MS Office Access
172/564
Vincent ISOZ
Apparat alors l'assistant suivant dans lequel il vous est demand pour l'exemple de
slectionner un des deux formulaires crs prcdemment:
Cliquez sur Suivant et dans la fentre suivante ne touchez rien. Cliquez simplement sur
Suivant (MS Access s'occupe de faire les liaisons qu'il faut tout seul comme un grand dans un
cas si trivial):
MS Office Access
173/564
Vincent ISOZ
Validez par Terminer. Faites de mme avec le deuxime sous-formulaire de manire obtenir
quelque chose du genre (vous pouvez prendre l'incitative d'amliorer l'esthtique si le cur
vous en dit):
MS Office Access
174/564
Vincent ISOZ
Le rapport donne alors (normalement on prendra soin de supprimer l'information double
dans le sous-formulaire affichant une deuxime fois le code de l'article bien videmment):
MS Office Access
175/564
Vincent ISOZ
qui donne:
Nous aimerions maintenant construire un tat qui affiche par client la liste des produits
achets en ayant un client par page. Pour faire vite, et juste pour voir le principe, crez un
rapport automatique de cette requte. Cela vous donnera:
MS Office Access
176/564
Vincent ISOZ
Ensuite allez dans le menu Affichage/Tris et Groupes et mettez-y les valeurs visibles cidessous:
MS Office Access
177/564
Vincent ISOZ
Et enfin compltez pour que cela ait l'air d'une petite lettre:
MS Office Access
178/564
Vincent ISOZ
Ensuite, il faut faire un double clic sur la ligne strNom Footer et changer la valeur du champ
Force New Page:
MS Office Access
179/564
Vincent ISOZ
Cela vous donner un tat par client qui aura la forme suivant au final:
Il n'est pas possible ce jour dans Access de faire des grands totaux dans des rapports qui
utiliseraient le nom d'un champ intermdiaire. Donc ceci par exemple, ne fonctionnera pas:
Nous allons voir ici un des piges classiques et merveilleux de MS Access....
MS Office Access
180/564
Vincent ISOZ
Crez d'abord l'tat suivant de faon classique avec l'assitant d'tat sur la base de la table
tblVendeurs:
Maintenant, crez l'tat suivant qui affiche les sorties et nommez-le srptSortiesParVendeur:
MS Office Access
181/564
Vincent ISOZ
Nous souhaitons maintenant mettre ce dernier rapport en tant que sous-rapport du rapport
prcdent. C'est--dire que pour chaque vendeur, nous puissions voir la liste des lments
vendus. Pour cela le dbut est simple et classique, nous prparons ce dernier rapport en lui
enlevant l'en-tte d'tat et le pied de page tel que:
MS Office Access
182/564
Vincent ISOZ
Ensuite vient maintenant le pige!!! Effectivement, si vous insrez ce rapport en tant que
sous-rapport, l'en-tte de page avec les intituls de colonnes n'apparatra pas (ce
relativement logique car... ce n'est justement pas un page).
Pour y remdier, il faut crer un groupement. Donc on clique sur le bouton Regrouper et trier:
Il vient alors:
MS Office Access
183/564
Vincent ISOZ
MS Office Access
184/564
Vincent ISOZ
Dplacez les libells dans la zone d'en-tte la zone de groupe et rduisez ensuite la zone
d'en-tte car elle vient inutile:
Ensuite, vous pouvez voir que cela fonctionner. Ajouter ce sous-rapport dans le rapport
principal:
MS Office Access
185/564
Vincent ISOZ
Ensuite nous dessinons la zone du sous-rapport l'assistant dmarre:
Nous slectionnons srptSortiesParVendeur et cliquons sur Suivant pour dfinir les cls qui
feront la liaison:
MS Office Access
186/564
Vincent ISOZ
Supprimez la petite lgende bleue dans le coin suprieur droit o est crit le nom du sousrapport:
et lancez l'aperu:
MS Office Access
187/564
Vincent ISOZ
Donc nous retrouvons bien les intituls es colonnes dans le sous-rapport. Donc le problme
est rgl mais il en apparat un autre... Les vendeurs qui n'ont aucune vente occupent une zone
verticale vide innaceptable!
Pour corriger cela, nous ditons le rapport principal et dans les proprits de la section
Dtails:
MS Office Access
188/564
Vincent ISOZ
Nous mettons la proprit Auto rductible la valeur Oui. Ce qui donnera au final:
MS Office Access
189/564
Vincent ISOZ
et ajoutez sur le formulaire, un bouton qui permet d'excuter la requte (quand vous avez
termin de saisir la dernire date, faites de prfrence un TAB pour valider la date):
Attention! Une curiosit de l'ouverture d'tats en passant par les formulaires c'est que suivant
le type de driver d'imprimante que vous aurez d'install sur votre PC vous aurez
systmatiquement un message d'erreur du type OpenReport Canceled.
Voil une interface bien plus conviviale n'est-ce pas ? Maintenant enlevez le bouton de la
requte et ajoutez-y celui du rapport (pour vrifier que lui aussi se base sur le contenu de ce
formulaire):
MS Office Access
190/564
Vincent ISOZ
Une fois que vous avez test la fonctionnalit de la prcdente requte. Ajoutez maintenant
(seul !) une liste droulante dans le formulaire cr prcdemment permettant de choisir le
vendeur pour lequel vous souhaitez avoir un rapport (temps estim: 5 minutes)
MS Office Access
191/564
Vincent ISOZ
3. Crer deux boutons qui ouvrent les formulaires avec le calendrier
Dans chacun des formulaires contenant le calendrier insrer le code suivant dans l'vnement
OnClose:
Private Sub Form_Close()
Forms!frmNomFormulaireAvecDate!NomChamp = NomCalendrier.Value
End Sub
et voil:
Mais que se passe-t-il s'il n'y aucune donne entre ses deux date ? Eh bien quelque chose de
trs moche et pas professionnel du tout avec des #Erreur un peu partout ! Comment remdier
cela esthtiquement. Et bien, dans les proprits du rapport il existe un vnement appel
On No Data , et associez-y le code VBA suivant:
Private Sub Report_NoData(Cancel As Integer)
MsgBox "Il n'y pas de donnes. Dsol !"
DoCmd.CancelEvent
End Sub
MS Office Access
192/564
Vincent ISOZ
1. Dans un autre formulaire (si ! si !)
2. Dans un tat (aussi .)
Pour crer un formulaire contenant un graphique ou un tableau crois dynamique, il faut
passer par le bouton mis en vidence ci-dessous (cela n'est pas propos dans les boutons du
dessous curieusement):
Aprs quoi, choisissez Assistant Graphique (vous remarquerez que certaines des options cidessous ne sont disponibles que sous MS Access 2002 ou 2003):
MS Office Access
193/564
Vincent ISOZ
Il faut faire en sorte que le graphique ne soit pas trop gros (5x5 cm au maximum pour notre
exercice). Aprs un peu de travail (le graphique est enregistr sous le nom frmGraph):
Voil comment l'on cre un simple graphique dans MS Access Evidemment, on peut laisser
fonctionner l'imaginaire pour personnaliser le formulaire dans lequel se trouve notre
graphique (nous avons dj vu comment faire cela auparavant) et le graphique lui-mme.
Sinon, le reste tient plutt un cours MS Excel qu' un cours MS Access bien videmment.
Nous allons maintenant voir comment ajouter ce graphique dans un formulaire ou tat
existant. Crez un formulaire (pas trop moche) de la table tblSorties:
MS Office Access
194/564
Vincent ISOZ
Allongez en mode cration un tant soit peu en longueur ce formulaire et cliquez sur le bouton
suivant de la barre d'outils:
Suivez l'assistant aprs avoir cliqu sur le bouton Insrer un sous-formulaire et choisissez le
formulaire contenant le graphique:
MS Office Access
195/564
Vincent ISOZ
Vous voyez comme cela est fort intressant. De plus chaque fois que vous passez d'un
enregistrement l'autre, le graphique reste l'cran. Par contre, si vous ajoutez des sorties, ou
modifiez la valeur des units vendues, le graphique ne change pas. Pour remdier cela, vous
pouvez crer un bouton rattach une macro qui rafrachira le formulaire en le fermant et en
le rouvrant automatiquement.
La macro:
196/564
Vincent ISOZ
Objectif: crer un graphique dans le formulaire qui pour chaque vendeur affich montre les
units qu'il a vendu et en quelle quantit.
Conseil: utilisez les assistants en particulier le menu Insertion/Graphique (dure de
l'exercice: heure)
Que peut-on en conclure relativement l'exercice prcdent ?
Pour plus de prcisions sur les TCD nous renvoyons le participant un cours MS Excel sur le
sujet.
Remarques:
R1. Cet outil est complmentaire aux requtes croises dynamiques. Il a aussi un dfaut: audel de 3000 4000 donnes il faut parfois attendre 15 30 secondes avant que le tableau
s'affiche. Il vaut mieux ds lors avoir d'autres outils sa disposition (SQL Server, Oracle avec
des Cubes OLAP)
R2. La plupart du temps, les utilisateurs exporteront l'aide du bouton adquat, ce TCD vers
MS Excel.
MS Office Access
197/564
Vincent ISOZ
Bien sr, il faut un peu retravailler les couleurs, les lgendes et la mise en page mais au
moins, nous voyons tout de suite que nous dpassons ce que MS Excel sait faire.
Attention!!! Lors de la cration de bouton permettant d'ouvrir un formulaire ou une requte de
type tableau ou graphique crois dynamique, ne pas oublier de forcer le deuxime paramtre
de la commande OpenForm en indiquant acFormPivotChart ou acFormPivotTable. Par
exemple pour un formulaire avec un GCD:
DoCmd.OpenForm stDocName, acFormPivotChart, , stLinkCriteria
ou un pour une requte de type GCD:
DoCmd.OpenQuery qryName, acViewPivotChart
MS Office Access
198/564
Vincent ISOZ
MS Office Access
199/564
Vincent ISOZ
MS Office Access
200/564
Vincent ISOZ
MS Office Access
201/564
Vincent ISOZ
Nous souhaiterions de cette liste, crer une requte nomme qryFirst qui nous indique qui est
le client qui a command en premier un certain article.
Pour ce faire, il faut crer une requte de ce type:
Ou afficher la dernire commande effectue dans une requte nomme qryLast par Boltzmann
(client n3):
MS Office Access
202/564
Vincent ISOZ
MS Office Access
203/564
Vincent ISOZ
Pour cela, dans le bouton menu gauche du bouton d'excution de la requte, il y a une option
nomme Requte Cration de table... Slectionnez cette option et choisissez comme nom de
la nouvelle table: tblEntrees1996. Ceci fait, excutez la requte, contrlez que la nouvelle
table ait bien t cr dans le fichier Access prpar cet effet.
Ce type de manipulation est frquent dans les entreprises car les employs ont souvent besoin
d'analyser les donnes pour leur compte dans un autre fichier Access (on peut faire de mme
avec MS Excel!) Or, on ne peut leur demander d'effectuer les oprations que nous venons de
faire (ils n'ont ni le niveau de connaissance ni les droits).
Il faudrait donc crer un petit programme (nomm "Macro" par Microsoft) qui permet partir
d'un bouton sur un formulaire (le formulaire d'accueil de la base typiquement) d'effectuer
toutes ces oprations automatiquement.
La cration et l'enregistrement d'une Macro est une chose extrmement simple mais encore
faut-il savoir quelles actions utiliser (les combinaisons possibles sont suffisamment grandes
pour passer plusieurs annes les tudier).
Nous allons faire cela en tant qu'exercice (voir ci-dessous une macro similaire celle dont
nous avons besoin, vous de l'adapter!).
Remarque: Quand vous effectuez des requtes simples (et non des requtes d'action), il est
bien sr possible d'imprimer la requte (action: Imprimer) puisqu'elle va s'ouvrir
automatiquement et de la fermer de suite aprs (action: Fermer).
MS Office Access
204/564
Vincent ISOZ
Pour faire cela, crez d'abord une table nomme tblGroupes avec la structure suivante:
MS Office Access
205/564
Vincent ISOZ
2. Glisser les tables dans la requte
3. Dans le champ critres taper: [Entrez le nom] (les termes entre crochets ne doivent pas
contenir le nom d'un champ existant dans la table utilise!!!)
4. Excuter la requte avec le nom Castrini
5. Enregistrez la requte sous le nom qryParametree
Problme: vous voyez que lorsque l'utilisateur ne saisit rien dans le paramtre de la requte,
rien ne s'affiche (ce qui peut tre vu comme fort ennuyeux). Pour remdier cela, il suffit
d'crire la chose suivante:
[Nom du Vendeur:] Or Is Null
Sinon avec un peu d'imagination voici le genre de paramtres (exemples importants et
tester!!!) que vous pouvez dfinir (concepts similaires aux filtres vus au dbut du cours):
Like [tapez ici] & "*"
Like "*" & [tapez ici] & "*"
Year([ChampAvecDate])=[Saisissez une anne]
Month([ChampAvecDate])=[Saisissez un mois entre 1 et 12]
Month([ChampAvecDate])=[Saisir] And Year([ChampAvecDate])=[Saisir]
>Date() [Donnes depuis X jours]
la syntaxe ci-dessus change si vous avez activ l'ANSI 92 dans Access (le Like devient ALike
et le "*" devient "%").
MS Office Access
206/564
Vincent ISOZ
Crez une nouvelle requte (en mode cration) et redfinissez la requte comme tant une
qryAjoutVendeurs
Dans le champ Ajouter , slectionnez la table tblVendeurs.
Dfinissez ensuite les champs de requtes ainsi:
MS Office Access
207/564
Vincent ISOZ
MS Office Access
208/564
Vincent ISOZ
Nous remarquons tout de suite le problme inhrent au fait d'avoir fait des relations avec le
idClient au lieu strNom. Il n'est pas possible ici de corriger ce problme sans faire appel aux
jointures.
Remarque: au besoin, si vous avez des difficults, crez une requte en mode cration et
redfinissez-la comme "Requte d'analyse croise" et dfinissez les champs comme cidessous:
MS Office Access
209/564
Vincent ISOZ
1. Excutez la requte
2. Enregistrez la sous le nom qryComplexCrossTab
Si vous allez voir dans la table tblVendeurs, vous verrez que le rsultat est juste.
Maintenant, nous souhaiterions regrouper les donnes par paquets de 1 mois. Pour ce faire,
saisissez la formule suivante dans le champ datDateOut:
MS Office Access
210/564
Vincent ISOZ
Cette syntaxe fonctionne pour (attention pour les codes si vous travaillez sur une version
anglophone):
1. Les regroupements par jours: Format([datDateOut];"aaaa/j")
2. Les regroupements par semaines: Format([datDateOut];"aaaa/ww")
3. Les regroupements par mois: Format([datDateOut];"aaaa/m")
4. Les regroupements par trimestres: Format([datDateOut];"aaaa/t")
5. Les regroupements par annes: Format([datDateOut];"aaaa")
MS Office Access
211/564
Vincent ISOZ
MS Office Access
212/564
Vincent ISOZ
Ainsi, le rsultant de l'exemple susmentionn sera:
Nous voyons bien que la table de droite, qui n'est d'autre que la requte, n'affiche pas un
lment de la table de droite qui est le seul lment dont le code d'article n'est pas double
dans la table tblEntrees; soit INF-004.
2. Effacez-y le champ de cl primaire idSorties et mettez des cls primaires multiples sur
tous les autres champs
MS Office Access
213/564
Vincent ISOZ
3. Crez ensuite une requte d'ajout qui aura pour objectif de dplacer tous les champs de
la table tblSorties vers la table tblSortiesSDbl
Il suffit ensuite d'excuter la requte pour avoir dans la table tblSortiesSDbl tous les
enregistrements sans doublons.
Attention!!! Cette technique qui suppose l'utilisation de cls primaires multiples implique que
l'ensemble des enregistrements ont des champs non vides et que le nombre de cls primaires
ne dpasse pas 10.
Attention!!! Cette technique ne prendra pas les lignes dont les champs comprenant les cls
primaires dans la table cible sont vierges.
MS Office Access
214/564
Vincent ISOZ
Rsultat: vous devriez avoir comme seul non correspondant, l'article que vous venez de saisir.
Nous pouvons observer qu'il y a ici une jointure droite tout simplement !
Remarque: Pour supprimer les non-correspondants (suppression des doublons) dans le cas des
problmes d'intgrit, il suffit de supprimer le rsultat montr par la requte (slection des
lignes de la requte et SUPPR).
MS Office Access
215/564
Vincent ISOZ
MS Office Access
216/564
Vincent ISOZ
ALTER table tblVendeurs
ADD CONSTRAINT VendeursFK FOREIGN KEY (tblSuccursaleId)
REFERENCES tblSuccursale (idSuccursale);
Ajout de donnes dans la table tblSuccursale (qryAjoutData):
INSERT INTO tblSuccursale ( idSuccursale, strVille )
VALUES ('1','Lausanne','0.1');
ma connaissance il n'est pas possible (sans VBA) d'ajouter plusieurs valeurs d'un
coup dans une mme requte Microsoft Access... ce qui limite grandement l'exemple
prcdent!
Remarque: La syntaxe de cette dernire commande SQL est dans le cas gnral INSERT
INTO nomTable (champ1, champ2, ) Values ('valeur champ1', 'valeur champ2', )
La jointure s'expliquant par le fait que nous voulons quand mme dans le listing les articles
qui n'ont jamais t vendu!
Ce qui donnera:
MS Office Access
217/564
Vincent ISOZ
Ce qui donnera:
MS Office Access
218/564
Vincent ISOZ
Il semblerait qu'en toute gnralit, il ne soit pas possible de faire un vrai Pareto Cumul sans
du VBA dans MS Access.
Dans la deuxime:
Dans la troisime:
MS Office Access
219/564
Vincent ISOZ
Attention!!! MS Access ne gre pas bien les fonctions en franais. Il faut donc crire tout en
anglais afin que la requte ci-dessous fonctionne correctement!
MS Office Access
220/564
Vincent ISOZ
Les requtes sont prsentes dans l'ordre croissant de difficult.
Ce qui donne:
MS Office Access
221/564
Vincent ISOZ
MS Office Access
222/564
Vincent ISOZ
Ce qui donne:
MS Office Access
223/564
Vincent ISOZ
MS Office Access
224/564
Vincent ISOZ
Maintenant il nous faut rcuprer la dernire ligne de la premire requte et aussi la dernire
ligne de la deuxime requte.
Ce qui donne:
MS Office Access
225/564
Vincent ISOZ
Soit en dtails:
MS Office Access
226/564
Vincent ISOZ
La premire tape consiste crer les simples requtes suivantes et copier leur code SQL
respectif:
MS Office Access
227/564
Vincent ISOZ
Supposons que nous aimerions la valeur cumule et la moyenne mobile par ligne
d'enregistrement afin d'obtenir:
MS Office Access
228/564
Vincent ISOZ
Pour cela (c'est scandaleux mon avis mais c'est ainsi) il vous faudra d'abord crer un
module VBA (peu importe son nom) avec le code ci-dessous:
MS Office Access
229/564
Vincent ISOZ
Une fois que nous avons les donnes d'entranement, nous devons test le modle thorique sur
les donnes restantes. Voyons comment maintenant ne slectionner que les donnes restantes:
ToDo: faire...
Premire tche que nous allons effectuer: Afficher dans une petite bote de dialogue
l'esprance de chaque titre i selon la relation triviale:
n
E Ri i
Ri, j
j 1
et l'cart-type au carr (variance) de chaque titre i selon la relation tout aussi triviale:
n
i2
Ri, j i
j 1
n 1
MS Office Access
230/564
Vincent ISOZ
n
E R p X i Ri X11 X 2 1 X 3 1
i 1
V R p 2 R p X i2V Ri 2 X i X j cov R j , Ri
i 1
X i2 i2 2 X i X j cov R j , Ri
i 1
MS Office Access
231/564
Vincent ISOZ
MS Office Access
232/564
Vincent ISOZ
9.22 Transactions
Les systmes de bases de donnes professionnels comme Oracle, SQL Server, mySQL etc.
ont un concept que l'on appelle les "transactions" (voir mon e-book sur le SQL pour plus de
dtails). L'ide est simple: si la requte n'est pas parfaitement excute, tous les changements
effectus par celle-ci sont annuls et l'utilisateur en est averti (dans de nombreux cas pratique
un tel contrle est primordial pour ne pas se retrouver dans certaines situations suicidaires...).
C'est donc quelque chose d'extrmement important lorsque l'on manipule des donnes
sensibles et que l'on veut garantir l'intgrit de la base de donnes dans son ensemble.
Le problme (parmi d'autres...) avec MS Access c'est que les transactions ne peuvent tre
faites ce jour qu'en VBA... c'est aussi une des raisons (parmi de nombreuses autres) pour
lesquelles certains dveloppeurs de mtier crent tout en VBA dans MS Access.
Donc voici un exemple complet par rapport notre magasin:
Sub ListReferences()
Public Sub TransferFunds()
Dim wrk As DAO.Workspace
Dim db As DAO.Database
Set wrk = DBEngine(0)
Set db = CurrentDb
On Error GoTo trans_Err
wrk.BeginTrans
'Attention les transactions respectent les cls/primaires et trangres
ainsi que les champs requis mais pas les masques!
db.Execute "INSERT INTO
tblArticles(strNbArticle,strDesignation,tblFournisseurNom,intMoq,intUnitPri
ce) VALUES ('GEN-010','<div>Test insertion 1</div>','1',25,30)",
dbFailOnError
db.Execute "INSERT INTO
tblArticles(strNbArticle,strDesignation,tblFournisseurNom,intMoq,intUnitPri
ce) VALUES ('GEN-011','<div>Test insertion 2</div>','1',25,30)",
dbFailOnError
MS Office Access
233/564
Vincent ISOZ
'ici on provoque l'erreur
db.Execute "INSERT INTO
tblArticles(strNbArticle,strDesignation,tblFournisseurNom,intMoq,intUnitPri
ce) VALUES ('','<div>Test insertion 3</div>','1',25,30)", dbFailOnError
'on reprend avec une requte normale
db.Execute "INSERT INTO
tblArticles(strNbArticle,strDesignation,tblFournisseurNom,intMoq,intUnitPri
ce) VALUES ('GEN-013','<div>Test insertion 4</div>','1',25,30)",
dbFailOnError
wrk.CommitTrans dbForceOSFlush
trans_Exit:
wrk.Close
Set db = Nothing
Set wrk = Nothing
Exit Sub
trans_Err:
wrk.Rollback
If DBEngine.Errors.Count > 0 Then
For Each errLoop In DBEngine.Errors
MsgBox "Error number: " & errLoop.Number & vbCr & _
errLoop.Description
Next errLoop
End If
MsgBox "Opration annule. Il y a eu une erreur parmi les requtes
excutes", vbCritical + vbOKOnly
Resume trans_Exit
End Sub
Ainsi, si une des requtes, et une seule seulement (!) venait chouer, l'ensemble est annul!
Ce qui est fort heureux mais qui devrait tre intgr par dfaut dans le logiciel.
MS Office Access
234/564
Vincent ISOZ
10 Fonctions
Nous avons rencontr jusqu' maintenant plusieurs fonctions de calcul bien utiles dans les
requtes, formulaires et dans les tables (pour les valeurs par dfaut).
Le but de ce chapitre, tant donn l'importance relative du sujet, est de recompiler les
fonctions dj vue et d'en montrer de nouvelles qui sont aussi utilises dans les entreprises.
nous souhaiterions que la date d'chance ne puisse pas tre antrieur la date de dbut. Pour
cela nous allons cliquer sur le bouton
de dialogue suivante:
MS Office Access
235/564
Vincent ISOZ
Remarque: Il n'est pas possible d'utiliser toute les formules disponibles dans MS Access dans
les tables. Seulement les plus simples y sont autorises (soit une trs faible minorit)!
MS Office Access
236/564
Vincent ISOZ
o la formule dans Validation Rule est (sur un PC avec les paramtres amricains):
Weekday([datSaisie])>=2 And Weekday([datSaisie])<=6
Remarque: Il est impossible avec les formules traditionnelles ( ce jour) dans un champ de
faire rfrence un autre champ de la table!
MS Office Access
237/564
Vincent ISOZ
Voici un exemple qui met automatiquement le nom de l'utilisateur lors de la saisie d'un
nouveau champ et qui s'assure que celui-ci une longueur d'au moins 5 caractres:
Ce qui donne:
MS Office Access
238/564
Vincent ISOZ
Malheureusement il se peut que la longueur des codes articles ne soit pas toujours la mme. Il
faut alors utiliser une fonction trs courante dans MS Access qui est capable de dterminer la
position du symbole de sparation. Nous aurons alors:
ce qui donnera:
MS Office Access
239/564
Vincent ISOZ
ce qui donnera:
Il arrive malheureusement (environ 2 3% des donnes) que les utilisateurs saisissent des
espaces doubles dans des noms divers. Ce qui donne alors des catastrophes du genre:
Il faut alors souvent nettoyer la sortie des requtes en utilisant la fonction TRIM:
MS Office Access
240/564
Vincent ISOZ
o le paramtre 3 signifie que l'on souhaite que la premire lettre de chaque mot en majuscule
(la valeur 1 correspond UCase et la valeur 2 LCase).
MS Office Access
241/564
Vincent ISOZ
Nous souhaiterions remplacer tous les double zro (00) par rien. Nettoyer des textes dans
MS Access arrive souvent ds que l'on travaille avec SAP ou le Web. La fonction Replace est
alors trs utile dans ce contexte:
De mme que la fonction Replace, la fonction Mid est elle aussi souvent utilise pour nettoyer
des chanes de caractres ou prendre qu'une partie de ceux-ci. Voyons un exemple avec la
table tblArticles dont le champ de Description contient des caractres parasites provenant d'un
import du web:
Mme s'il existe plusieurs manire d'arriver au mme rsultat, en utilisation la fonction Mid et
la requte suivante:
ce qui donnera:
MS Office Access
242/564
Vincent ISOZ
MS Office Access
243/564
Vincent ISOZ
ce qui donne:
MS Office Access
244/564
Vincent ISOZ
ou avec la fonction DatePart on peut avoir les numros de semaines en commenant par la
premire semaine complte de l'anne (paramtre 3):
Ce qui donne:
MS Office Access
245/564
Vincent ISOZ
et il est possible bien videmment de changer le "d" par un "m" pour mois et un "y" pour les
annes.
Remarque: Malheureusement il n'existe pas ce jour de fonction ne prenant pas en compte le
Week-End. Il faut passer par du VBA.
MS Office Access
246/564
Vincent ISOZ
Vous souhaiteriez pouvoir ajouter un champ avec une formule qui indique la date de fin
calcule week-end compris. Il suffit alors de crer un champ du type:
mais si vous souhaitez que les week-end ne soient pas pris en compte il faudra passer par du
VBA.
On peut arriver au mme rsultat avec la fonction DateAdd:
MS Office Access
247/564
Vincent ISOZ
avec par contre l'avantage que cette fonction DateAdd est capable de prendre plusieurs types
d'units diffrentes dans ses calculs:
Valeur Correspondance
yyyy
Annes
Trimestres
Mois
Jours
Heures
Minutes
Secondes
qui affiche "Trop cher" si le prix l'unit est suprieur 100.- ou "OK" lors que le prix en est
infrieur.
MS Office Access
248/564
Vincent ISOZ
MS Office Access
249/564
Vincent ISOZ
Nous souhaiterions y remplacer Clerc par Weidman, Butty par Hoffmann, Barbier par Massa
et Mettrez par Mettraux et les autres devront rester tels qu'ils sont. Cela donne ds lors dans la
requte avec la fonction Switch:
MS Office Access
250/564
Vincent ISOZ
MS Office Access
251/564
Vincent ISOZ
qui donne lorsqu'un client de la table tblClients n'a jamais fait d'achats (voir les deux dernires
lignes):
Or si nous souhaitons une moyenne des units vendues comprenant TOUS les clients et une
moyenne comprenant SEULEMENT les clients ayant fait des achats il nous faudra utiliser la
fonction IsNull, NZ ou Null:
MS Office Access
252/564
Vincent ISOZ
o la deuxime colonne permet donc de faire une moyenne sur TOUS les clients!
Une deuxime solution qui donne exactement le mme rsultat:
MS Office Access
253/564
Vincent ISOZ
MS Office Access
254/564
Vincent ISOZ
et il est bien videmment possible d'utiliser d'autres fonctions que Sum pour faire des
statistiques de la mme table que celle sur laquelle est principalement bas le formulaire.
MS Office Access
255/564
Vincent ISOZ
MS Office Access
256/564
Vincent ISOZ
Faites de sortes que toutes les "champs calculs" soient verrouilles et inactifs afin que
l'utilisateur ne puisse pas cliquer dedans (c'est une opration qu'il faut aussi savoir faire dans
les formulaires ressortant de requtes comme nous le verrons plus tard).
En tant qu'exercice, refaites de mme que prcdemment mais avec le dlai de livraison (c'est
plus pertinent) ainsi qu'avec le canton de localisation du fournisseur et le pays.
Petite remarque ! Rappelez-vous qu'au cours de base nous avions fait exprs de mettre les cls
primaires au mauvais endroit dans les tables tblPays et tblCantons. Nous vous demandons ds
lors la chose suivante afin de vous exercer nouveau avec les concepts de cls primaires:
1. Pour le canton, ne changez rien
2. Pour le pays, corrigez l'emplacement de la cl primaire
Quelles sont les diffrences ds lors au niveau de l'utilisation de la fonction DLookUp ?
MS Office Access
257/564
Vincent ISOZ
La jointure s'expliquant par le fait que nous voulons quand mme dans le listing les articles
qui n'ont jamais t vendu!
Ce qui donnera:
MS Office Access
258/564
Vincent ISOZ
Ce qui donnera:
Il semblerait qu'en toute gnralit, il ne soit pas possible de faire un vrai Pareto Cumul sans
du VBA dans MS Access.
MS Office Access
259/564
Vincent ISOZ
Dans la deuxime:
Dans la troisime:
Attention!!! MS Access ne gre pas bien les fonctions en franais. Il faut donc crire tout en
anglais afin que la requte ci-dessous fonctionne correctement!
MS Office Access
260/564
Vincent ISOZ
11 Interfacage de l'application
Les lments principaux de la base de donnes ayant t vus, il convient maintenant de
s'occuper de l'interfaage global de l'application. Ce que nous entendons par l ? C'est
l'interaction entre les formulaires, les requtes, les sous-formulaires, les tats, les vnements,
etc et leurs proprits avances.
Avant de passer des cas concrets il faudra se rappeler que pour chaque formulaire, vous le
verrez (ou le savez dj), qu'il y une petite case (voir figure ci-dessous) en mode cration qui
permet de paramtrer certaines options importantes du formulaire que vous tes entrain de
crer:
Parmi ces options, beaucoup ne sont utiles que pour la partie VBA ou macros du cours (dans
l'onglet Evenements") donc nous ne nous y attarderons pas pour l'instant. Mais faisons un
rsum de celles qui sont absolument indispensables avec un petit texte explicatif pour
chacune d'entre elles.
MS Office Access
261/564
Vincent ISOZ
1. Lgende: il faut toujours la saisir. C'est ce qui va apparatre l'cran de vos
utilisateurs. Souvent on y retrouve le nom de la socit ou du logiciel c'est suivant
2. Barre de dfilement: c'est une option trs importante. Beaucoup de formulaires n'en
ont pas besoin donc inutile de perturber vos utilisateurs avec cela. De plus, quand c'est
inutile ce n'est pas joli l'cran et cela prend de la place.
3. Afficher slecteur: cette option est inutile si votre base de donnes n'est pas en mode
multiutilisateur sur un rseau. Effectivement, quoi cela peut-il bien servir de voir un
petit crayon gauche du formulaire pendant que nous faisons de la saisie ( part de
nous prendre pour des idiots).
4. Boutons de dplacement: cette option vous permet de choisir si vous voulez les
boutons de navigation (prcdent, suivant, nouveau) en bas de vos formulaires. La
plupart du temps il faut avouer que cette option est dsactive au profit de boutons qui
seront plus esthtique et plus parlant pour les utilisateurs de votre application.
5. Diviseur d'enregistrement: vous pouvez la dsactiver systmatique mis part (!) dans
les sous-formulaires en mode tabulaire.
6. Auto centrer: toujours activer l'auto-centrage !! Cela vous vitera vous nerver avec
vos utilisateurs qui perdent le formulaire dans un coin de leur cran.
7. Style bordure: la plupart du temps, le dveloppeur cherchera mettre l'option fine
correspondant l'impossibilit pour l'utilisateur de changer la taille (par accident) de
votre formulaire ce qui vitera des coups de tlphone au Help Desk pour rien
8. Bote de contrle: permet simplement de masquer l'affichage l'cran sur le
formulaire les trois boutons standards: rduire, restaurer, fermer ( vous de rajouter
des boutons par la suite pour faire que l'utilisateur puisse quand mme travailler)
9. Boutons min max: permet simplement de masquer l'affichage l'cran sur le
formulaire les deux boutons standards: rduire, restaurer, fermer
10. Bouton fermer: dsactive la possibilit d'utiliser le bouton fermer sans toutefois le
masquer l'cran.
11. Dplacable: empche l'utilisateur de dplacer le formulaire l'cran (ce qui est une
trs bonne chance)
Toujours pour les formulaires voyons prsent ce qu'il y a d'intressant dans l'onglet
Donnes:
MS Office Access
262/564
Vincent ISOZ
1. Filtre: vous pouvez saisir le nom d'un filtre que vous auriez enregistr l'aide des
filtres par formulaire (voir plus haut dans le prsent support pour savoir faire cela)
2. Tri par: important mais pas dur comprendre
3. Filtrage autoris: vous de voir si vous autorisez l'utilisation du filtrage
4. Modif autorise: trs utile ! (ne ncessite probablement pas d'explications)
5. Suppr autorise: trs utile aussi ! (ne ncessite probablement pas d'explications)
6. Ajout autoris: trs utile aussi ! (ne ncessite probablement pas d'explications)
7. Verrouillage: trs utile pour appliquer l'impossibilit de cliquer sur certains champs du
formulaire actif.
MS Office Access
263/564
Vincent ISOZ
1. Dcimales: nous avons dj vu cela lors de notre travail dans les tables donc inutile de
s'y attarder c'est trivial.
2. Visible: option trs important permettant de masquer un champ l'utiliser
(typiquement pour faire des calculs intermdiaires indivisibles l'utilisateur).
3. Style fond: il est parfois mis en mode transparent si nous souhaitons faire croire
l'utilisateur que l'information qui y est indique n'est pas dans un champ.
1. Source contrle: permet de dfinir d'o viennent les donnes (si elles viennent de
quelque part) pour le champ slectionn
MS Office Access
264/564
Vincent ISOZ
2. Masque de saisie: option trs important car il ne faut pas oublier que les masques de
saisie ne sont pas stocks dans les tables. Ainsi, dans un formulaire il peut arriver que
vous ayez besoin de redfinir un masque.
3. Activ: le champ devient gris et l'utilisateur ne peut plus cliquer dessus mais
seulement lire le contenu.
4. Verrouill: l'utilisateur ne peut plus modifier le contenu mais peut cependant toujours
cliquer dans le champ (contrairement l'option Activ)
1. Nom: cette option est cruciale quand vous faites des calculs avec les champs. Nous
l'avons dj utilise de nombreuses fois dans des exercices antrieurs.
2. Texte barre d'tat: petit truc sympa mais encore faudrait-il que les gens regardent en
bas de leur cran.
3. Texte d'infobulle: souvent utilis et important. les info-bulles sont connues par toutes
et par tous.
MS Office Access
265/564
Vincent ISOZ
Valider 'Suivant >', choisir d'afficher les donnes par codes d'articles. Valider encore
'Suivant>' jusqu' arriver la bote de dialogue ci-dessous et d'avoir les valeurs de champs
correspondantes:
MS Office Access
266/564
Vincent ISOZ
Il est possible de combiner plus qu'une table et ce qu'elle soit connexe ou non la table
principale du formulaire!
MS Office Access
267/564
Vincent ISOZ
En plus, dans le mme formulaire, crez un champ qui indique, lorsque le total est suprieur
200.- francs, le fait que le vendeur ait eu le droit de faire une ristourne ou pas:
=IIF([Quantit par unit de commande]*[Prix unitaire]>200;"Ristourne";"Pas de
Ristourne"]
Un petit rappel sur les fonctions disponibles:
IIf(expression;rsultat si vrai; rsultat si faux): calcule l'expression en fonction de une ou
plusieurs conditions.
Par exemple avec plusieurs conditions:
IIf([Date commande]>#01/02/97# ET [MONTANT]>=10000;[Montant]*0.9;[Montant])
Date() afficher la date du jour
DateDiff() calcule le nombre de jours entre deux dates
Month() extrait le mois d'une date donne
Year() extrait l'anne d'une date donne
Sum() calcule la somme des valeurs d'un champ (ex. Sum([Prix unitaire]))
Avg() calcule la moyenne des valeurs
Log, sin
Pour concatner deux champs, on utilisera la syntaxe:
[Titre] & " " & ![Nom]
MS Office Access
268/564
Vincent ISOZ
Ensuite apparat un assistant l'cran qui vous demande quelles donnes doit contenir le sousformulaire. Slectionnez la source depuis la table tblSorties (ou une formulaire de la table
sorites que vous aurez cr au pralable) et ensuite prenez les champs de cette table except
N Article pour qu'il n'y ait pas redondance de l'information.
La question suivante de l'assistant qui vous demande de dfinir vous-mme les champs lier
est particulirement utile si vous avez un formulaire utilisant des champs de tables multiples
dont un seul (ou plusieurs) doit contrler le contenu du sous-formulaire (cela fonctionne un
peu comme un filtre au fait). En ce qui nous concerne ce n'est pas le cas et nous allons
simplement cliquer sur le bouton "Suivant".
Vous pouvez dfinir des proprits pour le sous-formulaire et les contrles du formulaire.
Ainsi en allant dans le mode cration et en affichant l'onglet Toutes de la page de proprits
du sous-formulaire (clique gauche et Proprits):
MS Office Access
269/564
Vincent ISOZ
Vous avez ici de nombreuses options dont certaines sont forts intressantes autant pour leur
utilit que pour leur esthtique.
Sinon pour les lments de formulaire:
L'option Activ (oui/non) pour l'accs un champ et Verrouille (oui/non) pour la
modification d'un champ sont peu prs quivalentes (validez et testez!).
11.6 Formatage
Ouvrez cette dernire base et le formulaire frmComposeArticles en mode cration et changez
le formulaire afin d'obtenir le rsultat suivant ci-dessous:
L'image de fond a t dfinie dans les proprits du formulaire dans l'option Images.
Le logo quant lui se place avec les options disponibles dans la barre d'outils.
Crez dans le formulaire ci-dessus, un "contrle calcul" nomm clcTVA et dont la formule
sera =[Prix unitaire]*(1+0.075) tel que:
MS Office Access
270/564
Vincent ISOZ
Si vous regardez la taille de la base maintenant vous verrez que sa taille tourne autour des 10
MB !!! Au fait, MS Access convertit l'image que l'on a utilise en arrire-plan en image
bitmap On verra plus tard comment l'on peut rduire la taille de la base de faon
relativement satisfaisante.
Maintenant, ajoutez un bouton "Fermer le formulaire" qui permette l'utilisateur de fermer le
formulaire de faon conviviale et ergonomique.
Sachez que vous pouvez galement formater le contenu d'un contrle avec la barre d'outils
mis en forme:
Vous avez galement une option trs intressante qui comme dans Excel permet de dfinir
une mise en forme conditionnelle pour un champ de donnes:
MS Office Access
271/564
Vincent ISOZ
Ces diffrentes options tant extrmement simple d'utilisation, je n'ai pas souhait crer
d'exercices crit les utilisant. Amusons-nous un peu avec les formulaires que nous avons
actuellement disposition dans note base.
Remarque: attention on ne peut pas dsactiver un champ de formulaire (clic
droit/proprits/donnes/activer) qui a un format conditionnel !!
Que faire de cette grosse zone blanche dans le formulaire ? En fait, elle reprsentera une
image (sous forme d'icne si on le dsire) de l'objet li l'enregistrement en cours d'affichage.
Exemple:
Pour lier une image l'article GEN-001, il faut aller dans le menu Insertion/Objet. Ensuite,
apparat la bote de dialogue ci-dessous qui devrait (au niveau d'un crateur de bases de
donnes Access dj connue):
MS Office Access
272/564
Vincent ISOZ
MS Office Access
273/564
Vincent ISOZ
Il est de premire importance de remarquer l'option nomme "Liaison" qui vous est propose.
Son but, rappelons-le quand mme au cas o, est de permettre de modifier le fichier OLE
(Object Linked and Embedded) sans l'ouvrir depuis MSAccess et que celui-ci fasse
automatiquement une mise jour de la liaison (au fait, c'est bien plus compliqu que cela
mais nous n'avons pas le temps d'aller plus dans les dtails).
Ce type d'option est certainement fort intressant mais demande, lors d'une distribution en
rseau de la base, d'avoir une bande passant non ngligeable, lorsque ce genre d'oprations
(ouverture de fichiers lis) sont frquemment effectues par les utilisateurs. De plus, les
documents lis devraient viter d'avoir trop la "bougeotte" sur l'arborescence du rseau de
l'entreprise. En plus, bien que le fichier ne soit que li, celui-ci est quand mme intgr au
fichier *.mdb dont je vous laisse imaginer le poids mmoire lors d'une utilisation accrue de ce
genre d'options.
Allez chercher le fichier nomme "crayons.jpg" (attention la valeur du champ "Nom" de la
bote de dialogue "Parcourir" qui peut parfois vous causer des surprises). Aprs avoir trouv
ce fichier image et valid la chose, vous devriez avoir un formulaire ressemblant la capture
d'cran ci-dessous:
MS Office Access
274/564
Vincent ISOZ
Rptez l'opration avec tous les autres articles et testez si le systme fonctionne bien (de plus
c'est un trs bon exercice). Enregistrez les modifications de votre formulaire une fois termin
(en prvision de la suite).
Remarque: si vous souhaitez que l'image s'adapte automatiquement la taille du champ, faites
un clic droit sur celui-ci et choisissez l'option Proprits. Ensuite allez dans l'onglet Tous et
dans la proprit Mode d'affichage slectionnez Echelle:
Si l'objet OLE insr est un document de la suite Office ditable, l'utilisateur de la base de
donnes n'a (thoriquement) qu' double cliquer sur l'icne du document pour pouvoir l'diter.
Malheureusement, cela ne fonctionne pas toujours. Il faut alors que l'utilisateur clique avec le
bouton droit de la souris dessus de faon avoir accs aux options suivantes qui elles sont
quasiment toujours fonctionnelles:
Je vous laisse le temps d'essayer cette option avec un fichier texte quelconque que vous
prendrez le soin de prparer et d'insrer par vos propres moyens et connaissances.
Prenez galement le temps de tester l'option "Liaison" !
Remarque: il est possible que MS Access rencontre parfois un problme avec le serveur OLE.
Au fait, c'est MS Windows qui a le problme et non MS Access pour palier ceci, vous
pouvez ds lors insrer les objet par copier/coller ou aller corriger l'erreur dans la base de
registres de MS Windows mais alors l nous sortons du cadre de cette formation.
MS Office Access
275/564
Vincent ISOZ
MS Office Access
276/564
Vincent ISOZ
MS Office Access
277/564
Vincent ISOZ
Il existe dans MS Access une sorte d'assistant pour faire un formulaire de dmarrage (mais
faut aimer), appel "Switchboard" en anglais.
Pour lancer cet utilitaire il faut aller l'emplacement indique ci-dessous:
Apparat ensuite une bote de dialogue vous disant qu'il n'existe pour ce moment pas de
formulaire de dmarrage dans votre base. Cliquez sur Yes pour confirmer que vous souhaitez
en crer un.
MS Office Access
278/564
Vincent ISOZ
Ensuite, vous allez devoir ajouter des boutons votre formulaire de dmarrage. Pour faire
ceci, cliquez sur le bouton New
Entrez le texte qui va apparatre ct du bouton. Dans cet exemple, nous cration un lment
de switchboard pour ouvrir un formulaire nomm frmFeedback. Cliquez sur le bouton OK.
Maintenant, quand vous ouvrez votre base de donnes, le switchboard devrait s'ouvrir
automatique et afficher les boutons que vous avez configur:
MS Office Access
279/564
Vincent ISOZ
Cette bote de dialogue a beaucoup chang et propose une nouvelle option mis en vidence
sur la capture suivante depuis la version 2007:
Il faudra passer par le systme de gestion de scurit de MS Access ou par une MDE ou par un code VBA pour
bloquer la touche Shift (tous ces sujets sont traits plus loin)
MS Office Access
280/564
Vincent ISOZ
Activez ou dsactivez la case cocher Utiliser les touches spciales d'accs pour activer ou
dsactiver les touches suivantes:
Touches
Effet
F11 ou ALT+F1
CTRL+G
CTRL+F11
CTRL+PAUSE
MS Office Access
281/564
Vincent ISOZ
1. Utiliser le systme de gestion de la scurit avacane disponible dans les vieux fichiers
*.mdb (systme de scurit qui n'est donc plus disponible lorsque l'on travaille avec
les nouveaux formats de base de donnes Access 2007 et ultrieur)
2. Bricoler des codes VBA comme nous allons le voir ci-aprs car c'est le cas le plus
demand par les utilisateurs.
Microsoft propose alors le script assez simple suivant qu'il suffit dans un premier temps de
mettre dans un module quelconque du projet VBA de votre base de donnes (projet qui sera
videmment protg par un mot de passe!!!):
Function ap_DisableShift()
'This function disable the shift at startup. This action causes
'the Autoexec macro and Startup properties to always be executed.
On Error GoTo errDisableShift
Dim db As DAO.Database
Dim prop As DAO.Property
Const conPropNotFound = 3270
Set db = CurrentDb()
'This next line disables the shift key on startup.
db.Properties("AllowByPassKey") = False
'The function is successful.
Exit Function
errDisableShift:
'The first part of this error routine creates the "AllowByPassKey
'property if it does not exist.
If Err = conPropNotFound Then
Set prop = db.CreateProperty("AllowByPassKey", dbBoolean, False)
db.Properties.Append prop
Resume Next
Else
MsgBox "Function 'ap_DisableShift' did not complete successfully."
Exit Function
End If
End Function
Function ap_EnableShift()
'This function enables the SHIFT key at startup. This action causes
'the Autoexec macro and the Startup properties to be bypassed
'if the user holds down the SHIFT key when the user opens the database.
On Error GoTo errEnableShift
Dim db As DAO.Database
MS Office Access
282/564
Vincent ISOZ
Dim prop As DAO.Property
Const conPropNotFound = 3270
Set db = CurrentDb()
'This next line of code disables the SHIFT key on startup.
db.Properties("AllowByPassKey") = True
'function successful
Exit Function
errEnableShift:
'The first part of this error routine creates the "AllowByPassKey
'property if it does not exist.
If Err = conPropNotFound Then
Set prop = db.CreateProperty("AllowByPassKey", dbBoolean, True)
db.Properties.Append prop
Resume Next
Else
MsgBox "Function 'ap_DisableShift' did not complete successfully."
Exit Function
End If
End Function
Et ensuite dans la fentre d'excution il suffira de taper respectivement pour activer le
blocage:
MS Office Access
283/564
Vincent ISOZ
Cependant, mme si maintenant l'utilisateur ne peut plus faire Shift pour dsactiver
l'Autoexec, il lui reste la possibilit de faire F11 pour ractiver la fentre de base de donnes
sous l'hypothse que nous n'avons pas dsactiv (il ne faut pas!!!) l'option:
Remarque: Le Alt+F11 pour accder au VBA n'est pas un problme puisque celui-ci est
normalement protg par un mot de passe et puis pour le problme du Ctrl+G qui permet
d'accder la fentre d'xecution... eh bien il suffit simplement de nommer les deux fonctions
de Microsoft autrement qu'avec leur nom par dfaut sinon bien videmment tous les petits
curieux pourront dsactiver votre pseudo-scurit.
L'ide est alors (outre le fait de renommer les deux fonctions proposes par Microsoft) de
mettre dans le formulaire de dmarrage et en toute gnralit dans tous vos formulaires (pas
d'autre choix! car cela ne fonctionne pas si vous le mettez dans une routine centralise) un
appel une routine via l'vnement:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF11 Then KeyCode = 0
MsgBox "Bien essay!!!...."
End Sub
partir de l votre base est relativement bien protge. Cependant le malin qui personnalisera
sa barre d'accs rapide comme il convient (c'est--dire avec le bouton Mode cration ou
diteur Visual Basic):
pourra passer outre ce niveau de scurit. La dernire possibilit est alors de contrler les
rubans et barres d'accs rapides comme nous le verrons beaucoup beaucoup plus loin dans le
prsent document. Mais ds lors il faudra faire attention ne pas se bloquer soi-mme (en
MS Office Access
284/564
Vincent ISOZ
laissant au moins dans le nouveau ruban cr sur mesure le boutond d'accs VBA qui de
toute faon est normalement protg par un mot de passe connu par l'administrateur seul!).
Remarque: la barre d'outils est cre dans le fichier MDB courant (ce qui veut dire que cette
barre apparat seulement l'ouverture de la base courante) !
Si vous souhaitez excuter une macro spcifique lors du clic d'un des boutons insrs dans la
nouvelle barre d'outils, vous devez effectuer un clic droit sur le bouton en question et
slectionner Proprits. Vous aurez l'cran:
L'option importante ici est Sur Action. Il s'agit de slectionner la macro qui devra tre
excute lors du clic sur votre bouton.
Dans la fentre Personnaliser/Barre d'outils cliquez sur le bouton Proprits et ensuite
choisissez les options comme ci-dessous (nom de la barre d'outils mis part):
MS Office Access
285/564
Vincent ISOZ
286/564
Vincent ISOZ
Nom colonne
Contenu
RibbonName
HideTheRibbon
RibbonXML
et ensuite il suffit dans les options de la base de donnes active d'associer le ruban
HideTheRibbon comme ruban de dmarrage.
videmment, il est possible de nommer le ruban autrement que HideTheRibbon et d'y mettre
un autre code XML.
Par exemple le code XML suivant:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<tabs>
<tab id="tabTest" label="Test"visible="true">
<group id="grpTest" label="Test">
<button id="idTest" label="Test sans icone standard" size="large"/>
<button idMso="Paste" label="Test avec icone standard" size="large"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
MS Office Access
287/564
Vincent ISOZ
12 Finitions lmentaires
Le but ici est de prsenter les finitions lmentaires au niveau scurit de votre base de
donnes ainsi que les interactions lmentaires entre cette dernire est quelques logiciels de la
suite MS Office.
12.1 Compactage
Souvent, les fichiers MS Access ont des tailles non ngligeables. Sachez que l'on peut
compacter (compresser) la base de donnes en allant dans:
Outils/Utilitaire de base de donnes/Compacter une base donne
Pour info le record de ce que j'ai vu de pire jusqu' aujourd'hui est le passage d'une base de 76
Mo 1.3 Mo
Au fait, il faudrait comprimer la base de donnes systmatiquement aprs chaque
modification Mais ne vous inquitez pas, Microsoft a pens tout ! Allez dans:
Outils/Options/Gnral/Compacter la fermeture
MS Office Access
288/564
Vincent ISOZ
Vous pourrez ensuite dfinir le mot de passer comme indiqu prcdemment. Apparatra la
bote e dialogue suivante:
et quand vous fermez et rouvrez votre base de donnes, MS Access vous demandera chaque
fois de saisir le mot de passe.
12.3 MS Query
Le but de cet exercice consiste importer des donnes de la dernire version de notre base
dans MS Excel. Pour ceci, nous utiliserons dans MS Excel MS Query. Vous pouvez alors
dans ce logiciel aller dans Donnes/Donnes externes/Crer une requte puis apparat:
quand vous cliquez sur OK vous pouvez aller chercher la base intresse:
MS Office Access
289/564
Vincent ISOZ
Veuillez aprs avoir cliqu sur OK choisir les champs qui vous intressent:
12.4 Publipostage
Le but ici, est de vous introduire la technique de publipostage dans MS Word depuis une
base MS Access. Personnellement je considre cela cependant plus comme un cours
MS Word que comme un cours MS Access mais bon cela peut toujours tre utile
La raison s'explique par le fait, que bien que la mise en place des "champs de fusion" soit
simple, toutes les options qu'il existe dans MS Word autour de ces dernires sont assez
consquentes et pourraient faire l'objet d'un cours de 3 heures pour des non-initis ce
logiciel.
Vous voil avertis. Cependant si vous tenez voir du MS Word et laisser de ct MS Access
pendant un moment, votre formateur se tient votre disposition pour vous montrer le
fonctionnement du publipostage (et ses fonctions avances).
Remarque: Malheureusement, MS Access doit tre ferm pour faire du publipostage depuis
MS Word.
MS Office Access
290/564
Vincent ISOZ
13 Macros
Une macro est compose d'actions, chaque action correspond une tche: lorsque vous
excutez la macro, MS Access excute automatiquement les actions qu'elle contient.
Certaines de ces actions, plus complexes, permettent d'afficher des botes de dialogue, de
tester la rponse fournie par l'utilisateur, d'afficher une barre de menus personnalise et de
dvelopper ainsi une application autonome sans que vous ayez besoin de programmer (bien
que les actions fassent rfrence des instructions du langage VBA).
Disons tout de mme que les macros ont l'norme mrite d'ouvrir la porte aux non
programmeurs, en leur permettant de commencer sans trop de difficults. Elles sont donc
rserves aux nouveaux venus tout en tant interdites tout dveloppeur professionnel
confirm ! Profitez-en donc !
Enumrons quelques limites des macros:
1. Pas de dbogueur: test de variables, arrt sur changement de valeur
2. Pas de contrle d'erreur: s'il y un problme la macro plante sans espoir
3. Pas d'instruction de boucles (Do While, For Next, etc.)
4. Expression conditionnelle permettant de sauter une groupe d'instructions sans rapport
avec un If Then Else ou mieux encore, un Select Case
5. Pas de programmation structure: procdures Sub(), Function()
6. Pas de paramtres dans l'appel d'une macro
7. Pas de variables globales non plus, pour passer une valeur.
8. Encore moins de programmation Objet
9. Aucun accs aux rfrences extrieures: pas d'automation OLE pour piloter Word,
Excel, Outlook et les autres
10. De nombreuses limitations: string SQL de 256 caractres (au lieu de 32'000 en VBA)
11. etc.
Il faut savoir enfin que MS Access comporte une command Outils/Macro/Convertir les
macros en Visual Basic. A Consommer sans modration. C'est un des meilleurs moyens
d'apprendre le VBA.
Remarque: les macros sont la trs frquemment affectes des boutons poss dans des
formulaires et pris de la barre d'outils "contrles".
MS Office Access
291/564
Vincent ISOZ
Chaque action comporte des arguments qui seront passs en paramtres la macro VBA. Un
descriptif des effets de l'action est donn par Microsoft. Vous pouvez ajouter et supprimer des
lignes dans la Macro comme vous le feriez pour une table normale (bouton droit de la souris).
Avant de s'attaquer des macros complexes il faut avoir fait !
1. Les exercices des requtes (voir plus haut) avec les macros d'export et import de MS
Excel
2. Les macros de messages (MsgBox)
MS Office Access
292/564
Vincent ISOZ
Il existe une mthode cependant pour crer un raccourci (pouvant tre utilis d'autres fins!)
avec une seul touche pour excuter une requte en mode cration.
Cette mthode consiste dans MS Access 2003 et antrieur crer la macro suivante et de bien
la nommer AutoKeys (il faudra fermer et rouvrir la base pour qu'elle soit prise en compte!):
Pour avoir fait apparatre les colonnes Macro Name et Condition nous avons cliqu sur les
boutons
de la barre d'outils (c'est pas utile de faire une macro groupe si jamais)
MS Office Access
293/564
Vincent ISOZ
Ensuite dans les proprits du champ intCP du formulaire frmClients nous dfinissons:
MS Office Access
294/564
Vincent ISOZ
Bonne chance !
Nous souhaitons l'aide d'une macro l'ouverture de ce formulaire, dsactiver (ou cacher) le
bouton de calcul du CA tant que les champs de dbut de priode ou de fin de priode ne
contiennent pas une information.
Les donnes disponibles sont les suivantes:
1. Le formulaire se nomme frmCAPeriode
2. Les deux champs de dates se nomment respectivement txtDebutPeriode et
txtFinPeriode
3. Le bouton se nomme cmdCA
Nous allons faire en sorte que le bouton cmdCA soit cach par dfaut l'ouverture du
formulaire:
Nous voulons lors de la perte du focus du champ txtFinPeriode, excuter une macro nomme
mcrAffCmd qui nous activera l'affichage du bouton si et seulement si les deux champs de date
ont un contenu non nul!
MS Office Access
295/564
Vincent ISOZ
Nous voyons que dans un premier temps (sous-macro TestPeriodes), celle-ci effectue un
contrle du contenu du champ de dbut de priode. Si celui-ci est vide, l'action GoToControl
donne le focus au champ au Control Name: txtDebutPeriode. Aprs quoi la macro s'arrte.
Idem pour le cham de fin de priode.
Si les deux champs de dates ont un contenu, alors squentiellement, MS Access excutera la
sous-macro AfficheBouton dont l'action SetValue a pour Item:
[Forms]![frmCAPeriode]![cmdCA].[Visible]
et pour valeur: True
Ainsi le bouton d'excution de notre requte, ne sera visible que si la date de dbut ET la date
de fin ne sont pas vides de contenu.
Attention!!! Pensez toujours lcher le focus sur un lment que vous allez masquer en
utilisant l'action GoToControl (sur un autre contrle choix).
MS Office Access
296/564
Vincent ISOZ
Vous pouvez bien videmment enregistrer le groupe de macros comme on enregistre un tat,
formulaire, table en cliquant simplement sur la petite disquette habituelle.
Pour faire appel une des macros du groupe partir d'un objet quelconque, vous devrez alors
la dnommer sous la forme: NomduGroupe.NomDeLaMacro.
Pour cette raison, donnez vos groupes et macros des noms suffisamment explicites mais pas
trop longs.
Pour excuter un macro appartenant autonome, utilisez la commande:
Outils-Macro-Excuter une Macro
ou sinon partir d'une fentre macro en mode cration cliquez sur le petit point
d'exclamation:
Access excute alors chaque action de la fentre Macro, les unes la suite des autres. Il
s'arrte lorsqu'il rencontre une ligne vierge, l'instruction ArretMacro (ou ArretMacro) ou si la
macro affiche une boite de message.
Pour excuter une macro l'ouverture d'une base, appelez-la AutoExec (pour viter d'excuter
cette macro l'ouverture de la base, maintenez la touche Shift enfonce pendant l'ouverture de
la base).
Afin d'analyser le droulement d'une macro, vous pouvez l'excuter pas pas. Pour ce faire,
affichez la macro en mode cration et cliquez sur l'outil
MS Office Access
297/564
Vincent ISOZ
MS Office Access
298/564
Vincent ISOZ
Etats![Adresses]![Nom]
se rfre au champ "Nom" de l'tat "Adresses"
Pour faire rfrence la proprit d'un champ ou d'un objet, faites suivre son identification
d'un point et du nom de la proprit. Exemples:
[Code].Visible
se rfre la proprit "Visible" du champ "Code" du formulaire actif
Formulaires![Clients].Visible
se rfre la proprit "Visible" du formulaire "Clients"
Formulaires![Clients]![Code].Visible
se rfre la proprit du champ "Code" du formulaire "Clients"
Si la base de donnes comporte du code Visual Basic Application, en l'enregistrant comme
fichier MDE on permet de compiler tous les modules, de supprimer tout le code source
modifiable et de compacter la base de donnes de destination.
Le code Visual Basic sera toujours excut, mais il ne pourra plus tre visualis ni modifi ;
de plus, la base de donnes prendra moins de place car le code source est supprim et
l'utilisation de la mmoire est optimise, ce qui augmente les performances.
La conversion en MDE ncessite cependant un zro faute dans votre code sinon la conversion
ne russira pas !
L'enregistrement de la base de donnes comme fichier MDE, empche les oprations
suivantes:
Afficher, modifier ou crer des formulaires, des tats ou des modules en mode
Cration.
Ajouter, supprimer ou modifier des rfrences aux bases de donnes.
Modifier le code Visual Basic , car le fichier MDE ne contient aucun code source.
Changer le nom du projet VBA de la base de donnes l'aide de la bote de dialogue
Options.
Importer ou exporter des formulaires, des tats ou des modules. Par contre, il est
toujours possible d'importer ou d'exporter des tables, des requtes ou des macros
partir ou vers des bases de donnes non MDE.
Attention:
Il faut absolument effectuer une copie de la base de donnes d'origine. Si l'on dsire modifier
ultrieurement la structure d'un formulaire, d'un tat ou d'un module d'une base de donnes
MS Office Access
299/564
Vincent ISOZ
enregistre au format MDE, on doit effectuer ces modifications dans la base de donnes
d'origine, puis l'enregistrer nouveau comme fichier MDE.
C'est pour cette raison qu'il faut viter d'enregistrer comme fichier MDE une base de donnes
comportant des tables On ne pourra pas simplement modifier la structure d'un formulaire,
d'un tat ou d'un module dans la version d'origine, car les donnes des tables qu'elle contient
ne sont plus jour ! Il est plutt conseill de choisir la base de donnes frontale qui contient
toute la structure de gestion (requtes, formules, tats, modules) pour l'enregistrer comme
fichier MDE, alors que la base qui contient les tables se contentera d'tre lie.
Marche suivre:
1. Fermer la base de donnes. Dans un environnement multi-utilisateur, tous les
utilisateurs doivent fermer la base de donnes.
2. Menu "Outils" "Utilitaires de base de donnes" "Crer fichier MDE".
3. Dans la bote de dialogue "Base de donnes enregistrer comme MDE", indiquer la
base de donnes que l'on dsire enregistrer comme fichier MDE et cliquer sur "Crer
MDE".
4. Dans la bote de dialogue "Enregistrer MDE comme", indiquer le nom, l'unit et le
dossier de la base de donnes.
MS Office Access
300/564
Vincent ISOZ
Cette macro AutoExec est de la plus haute importance car nous la retrouverons lors de l'tude
des options avances du travail en mode multi-utilisateurs.
MS Office Access
301/564
Vincent ISOZ
Et dans function name nous cliquons sur le bouton d'assistance:
o Message est une simple fonction VBA Access utilise pour l'exemple:
MS Office Access
302/564
Vincent ISOZ
MS Office Access
303/564
Vincent ISOZ
Et ensuite crez d'abord une requte (qryCantonsPays) telle que prsente ci-dessous:
Dans le formulaire frmClients (ci-dessus), veillez avoir la proprit suivante pour le champ
strCantons (il va chercher les donnes dans la requte que nous venons de crer):
Crez aussi une macro nomme mcrCantonsPays avec l'vnement Requery (en franais:
Actualiser):
MS Office Access
304/564
Vincent ISOZ
MS Office Access
305/564
Vincent ISOZ
Modifiez la requte qui est rattache ce formulaire comme ci-dessous (attention, veuillez
remplacer dans la capture d'cran ci-dessous la variable ChoixVendeur par lstNomVendeurs) :
L'exemple ci-dessous marche parfaitement (au niveau de la liste des vendeurs pour l'instant) si
vous avez fait tout juste jusque-l:
MS Office Access
306/564
Vincent ISOZ
Il faut maintenant nous occuper des boutons d'option qui ont pour rle, d'activer ou de
dsactiver le choix des vendeurs. Crez une nouvelle macro conditionnelle vide nomme
mcrRapportVendeurs:
Cette premire tape permet d'activer/dsactiver la liste droulante du choix des vendeurs
(Expression vaut Yes pour le premier et No pour le second):
Une fois ceci fait, votre formulaire devrait fonctionner. Ainsi lorsque l'utilisateur clique sur
Oui la liste des vendeurs s'active et inversement.
Mais si nous ouvrons la requte, celle-ci va quand mme prendre le nom du vendeur dans la
liste mme si celle-ci est dsactive. Il nous faut donc vider cette liste en rajoutant quelques
actions comme ci-dessous (attention les noms des champs diffrent !!!).
MS Office Access
307/564
Vincent ISOZ
Remarque: prenez garde ne pas copier ce qui est crit sur les captures d'cran ci-dessous
sans rflchir ce que vous faites !
Il nous faut donc maintenant modifier en consquence le critre de la requte relativement aux
champs du nom de vendeur. Ainsi, comme nous l'avons dj vu, si le paramtre est vide, il
convient d'crire (c'est une possibilit parmi celles que nous avons vu jusqu'ici dans le cours
et pas ncessairement la plus simple !):
[Forms]![frmSortiesRptAvance]![lstNomVendeurs] OR
[Forms]![frmSortiesRptAvance]![lstNomVendeurs] is Null
Maintenant il nous faut dans ce groupe, une dernire macro qui va s'excuter lorsque
l'utilisateur voudra visualiser le rapport. Cette macro devra vrifier si les champs des dates ne
sont pas vides et le cas chant si un nom de vendeur aurait t choisi.
Voici quoi doit ressembler la macro (vous la faites avec le formateur):
MS Office Access
308/564
Vincent ISOZ
3. Lorsqu'un fournisseur est activ que la liste des articles n'affiche que ceux du
fournisseur slectionne (requery)
4. Activer ou dsactiver le filtre
Remarque: il faudra crer plusieurs requtes ainsi que plusieurs macros ainsi qu'un
formulaire. Nous vous laissons le choix des noms.
Le rsultat peut ressembler quelque chose comme cela (modulo vos gots esthtiques
personnels) outre les requtes qui sont considres comme triviales:
1. Le formulaire:
2. La macro principale:
MS Office Access
309/564
Vincent ISOZ
MS Office Access
310/564
Vincent ISOZ
Si la fentre Liste des champs n'apparat pas, allez dans le menu Affichage.
Une fois la page d'accs aux donnes formate selon vos besoins et prfrences cliquez sur
l'habituelle disquette pour enregistrer la page au format HTML sur un disque rseau ou
serveur IIS de votre entreprise.
Remarque: Evitez d'inclure des espaces et des accents dans le nom d'une page Web ou d'une
page d'accs aux donnes.
Pour visualiser la liaison existante entre la page d'accs aux donnes et la base de donnes
source, accdez l'onglet Base de Donnes de la Liste des champs, cliquez avec le bouton
droit sur le nom de la base puis cliquez sur l'option Connexion:
MS Office Access
311/564
Vincent ISOZ
Attention! Si vous dplacez la base de donnes associe la page, vous devez modifier le
chemin d'accs la base dans l'onglet Connexion de la bote de dialogues Proprits des
liaisons de donnes.
Vous pouvez regrouper la page d'accs aux donnes en mode cration. Pour cela, ajoutez si
besoin est, le champ sur lequel le regroupement doit tre effectu puis slectionnez-le.
Affichez la barre d'outils nomm "Web".
Cliquez sur le bouton
puis vous verrez le champ se dplacer vers la gauche avec un
nouveau bouton reprsentant une croix. Enregistrez les modifications, lancez l'aperu et
observez le fonctionnement.
Evidemment, pour annuler le regroupement il vous faudra cliquer sur le bouton
Si une bote de dialogue apparat vous indiquant que des paramtres de scurit empchent
l'accs une source de donnes situe sur un autre domaine, activez l'option Accs aux
sources de donnes sur plusieurs domaines dans Internet Explorer 5 ( peu prs le mme
principe sur la version 6).
Les composants Microsoft Office Web Component doivent tre installs sur les postes clients
et serveur.
Attention!!! Des donnes ne peuvent tre saisies dans une page pour laquelle vous avez
effectu des regroupements.
MS Office Access
312/564
Vincent ISOZ
Voici quoi ressemblera finalement la page web dans Internet Explorer 6.0:
MS Office Access
313/564
Vincent ISOZ
Ensuite, vous allez dans le menu Save & Publish o vous pourrez cliquer sur Run
Compatibility Checker:
MS Office Access
314/564
Vincent ISOZ
S'il n'y a pas d'erreurs, vous mettez l'adresse cible de votre site SharePoint. Attention faire le
bon choix car aprs pour dplacer la base c'est la joie...:
Vous validez en cliquant sur le bouton Publish to Access Services et vous devrez attendre un
peu de temps:
Une fois la conversion termine sans erreurs vous aurez le message avec le lien direct vers le
site SharePoint comme visible ci-dessous:
MS Office Access
315/564
Vincent ISOZ
Quand vous cliquez sur le lien vous voyez votre base Access en mode web avec les requtes,
formulaires et macros fonctionnelles:
MS Office Access
316/564
Vincent ISOZ
Efin remarquez les choix disponible dans le menu Options:
Si nous cliquons sur Settings nous voyons tout le contenu de la base avec la possibilit
d'ouvrir dans SharePoint chaque lment (mais pour modifier il faut passer pour l'instant
obligatoirement par le client lourd):
MS Office Access
317/564
Vincent ISOZ
vous pouvez saisir l'URL de destination du site SharePoint de votre entreprise. Le lien sera
cr dans la liste Applications du site cible.
Une fois la gnration termine, nous arrivons sur la vue suivante (remarquez le lien Ajouter
une table vide mis en vidence ci-dessous):
MS Office Access
318/564
Vincent ISOZ
L'interface d'Access change du tout au tout avec uniquement (du moins pour Access 2013)
deux onglets:
et le but n'est pas d'y faire de la saisie mais de modifier les formulaires (ce qui pour les
modifications de base est trivial et similiare ce que nous avons dj vu)!
Remarquez le contenu du bouton Avanc:
MS Office Access
319/564
Vincent ISOZ
avec pour les requtes les mmes possibilit que les bases locales!!! (simplement les requtes
paramtres ne peuvent pas tre appeles depuis l'interface web...!)
Si maintenant nous souhaitons voir ce que verront les utilisateurs, nous cliquerons sur:
Nous arriverons alors sur la page SharePoint (remarquez la possibilit de re-modifier dans
Access tout moment via l'engrenage):
MS Office Access
320/564
Vincent ISOZ
avec uniquement certaiens proprits par rapport aux bases locales (remarquez l'absence des
masques de saisie!! ce qui enlve presque tout intrt professionnel la l'outil):
MS Office Access
321/564
Vincent ISOZ
et le lecteur aura trs probablement remarqu que l'on peut ajouter des boutons (et aussi
supprimer les existants!):
On choisira alors le nom du contrle et l'info-bulle et lorsque l'on clique sur Sur clic, il vient
l'assistant de gnration de macros:
Donc rien de nouveau mais c'est quand mme assez puissant lorsque l'on sait que cela va tre
transform en script web.
Il en va de mme pour afficher des vues (d'autres tables ou requtes non paramtres):
MS Office Access
322/564
Vincent ISOZ
MS Office Access
323/564
Vincent ISOZ
15 Optimisation et analyse
Une fois votre base termine, il existe dans MS Access, une srie d'assistants qui vont
effectuer une analyse de votre base et qui vont tenter de vous aider corriger les ventuelles
erreurs ou manque de rigueur de votre part.
Nous aurions pu voir ce outil ds le dbut du cours mais il fallait au pralable certaines
connaissances. Par ailleurs, lors de la discussion sur la normalisation des base de donnes
dans le chapitre de modlisation, nous avons fait rfrence au prsent chapitre.
15.1 Table
L'outil Table me dans le menu Outils/Analyse est assez (voir trs) mdiocre. Il s'agit en fait
d'un outil d'aide la normalisation de deuxime et troisime forme mais qui ne peut deviner
ce que vous avez en tte comme stratgie de dveloppement.
Pour exemple, prenons la table tblSorties dans une version compltement errone (en 1re
forme normal) sans qu'elle soit lie quoi que ce soit donc:
15.2 Performances
Dans Outils/Analyse lancez l'option Performances:
L'idal, serait de ne plus avoir aucun message dans les diffrentes analyses. Ainsi, si vous
slectionnez l'onglet "Tous types d'objets" et cliquez ensuite sur le bouton "Slectionner tout"
et enfin sur le bouton "OK", vous pourriez tre amen avoir un rsultat du genre:
MS Office Access
324/564
Vincent ISOZ
Autre point important: Microsoft Access ne recouvre pas automatiquement l'espace libre
aprs avoir effacer des enregistrement ou des objets. Pour recouvrir cet espace, vous devez
compacter la base de donnes. Pour ce faire, allez dans le menu Outils/Utilitaire de base de
donnes et slectionnez l'options Compacter la base de donnes. Pour viter avoir faire ceci
systmatique, vous pouvez aller dans Outils/Options:
Vous remarquerez l'option Compacter la fermeture dans l'onglet General qui vous vitera
d'oublier cette procdure.
MS Office Access
325/564
Vincent ISOZ
15.3 Documenter
MS Office Access
326/564
Vincent ISOZ
16 Distribution
Votre application est termine, et vous souhaitez maintenant la partager avec vos collgues ou
autres utilisateurs (si vous tes dveloppeur). Dans le cas le plus simple une solution consiste
placer la base sur le disque rseau commun de l'entreprise afin que chaque utilisateur puisse
l'excuter sans complications. Cependant, avant de faire ceci, il est bon de penser la manire
dont vous allez la distribuer et faire de la maintenance.
Si votre ordinateur est connect un rseau, vous pouvez travailler dans une base de donnes
Microsoft Access en mme temps que d'autres utilisateurs. Vous pouvez partager des donnes
dans un environnement multi-utilisateur de plusieurs manires.
1. Partager une base de donnes MS Access tout entire
Placez la base de donnes MS Access entire sur un serveur de rseau ou dans un
dossier partag. Cette mthode est la plus facile mettre en uvre. Chaque utilisateur
partage les donnes et utilise les mmes formulaires, tats, requtes, macros et
modules. Utilisez cette stratgie si vous souhaitez mettre en place une utilisation
uniforme de la base de donnes ou si vous ne voulez pas que les utilisateurs puissent
crer leurs propres objets.
2. Ne partager que les tables de la base de donnes MS Access
Placez uniquement les tables (la base "Jet") sur le serveur du rseau et conservez les
objets de la base de donnes dans les ordinateurs des utilisateurs. Ainsi, les
performances de la base de donnes sont accrues, car seules les donnes sont
transfres sur le rseau. De plus, les utilisateurs peuvent personnaliser leurs
formulaires, tats et autres objets en fonction de leurs prfrences et besoins
individuels, sans affecter les autres utilisateurs.
Vous pouvez sparer les tables des autres objets de base de donnes l'aide de l'outil
Fractionner la base de donnes (Outils/Utilitaire de base de donnes).
Au besoin, on pourra remplacer la base Jet par une base MSDE (Microsoft SQL
Server Desktop Edition) ou client/serveur.
Jet et MSE sont limits en taille: 2Go maximum. Au-del, il faudra utiliser une base
client/serveur proprement dite.
Jet, avec une limite thorique de 255 connexions simultanes, marque une baisse de
performances partir de 5 connexions, et n'est pas recommand au-del de 10. MSDE
est optimis pour 5 requtes concomitantes, y compris les procdures stockes. Audel, les performances se dgradent rapidement.
3. Partager la base de donnes MS Access sur Internet
Vous pouvez convertir un ou plusieurs objets de base de donnes au format HTML
statique ou HTML gnr par serveur, ou crer des pages d'accs aux donnes, puis les
afficher dans un navigateur tel que Internet Explorer, sur le Web
MS Office Access
327/564
Vincent ISOZ
4. Rpliquer la base de donnes MS Access
Si vous utilisez deux ordinateurs, un ordinateur de bureau et un portable par exemple,
vous pouvez utiliser le Porte-documents de Microsoft Windows pour effectuer des
rplicas de votre base de donnes Access et les maintenir synchroniss. En outre,
plusieurs utilisateurs situs divers endroits peuvent travailler simultanment avec
leurs propres copies et les synchroniser travers le rseau, par l'intermdiaire d'une
connexion par numrotation tlphonique ou via Internet.
5. Crer une application client-serveur
Si vous travaillez dans un environnement client-serveur, vous pouvez tirer profit de la
puissance et de la scurit supplmentaires qui vous sont offertes en crant une
application client-serveur. Pour plus d'informations, il faudrait suivre un cours Visual
Basic et MS SQL Server ou ASP/PHP.
Voici toutes fins utiles un tableau rcapitulatif:
Tableau 6 Stratgies de dploiement
Rseau
Rseau local peu
encombr
Application
Type de Base
Mono Poste
Jet (.mdb)
Base partage 5 10
utilisateur maxi.
Jet
MSDE
Rseau local avec
serveurs (de domaine, de
fichiers, de mail)
Internet
Distribue, de un
plusieurs dizaines
d'utilisateurs, mise jour
priodique
Jet zippe, en
tlchargement
Jet rplique
Client/serveur, avec ou
sans rplication
Contraintes
Convivialit maximale.
Performances maximale
Si pas trop de conflits sur
les blocages convivialit
maximale. Performances
acceptables
Perte de souplesse.
Bonnes performances
Convivialit maximale.
Performances maximales.
Flexibilit de la base
tampon.
Convivialit maximale.
Bonnes performances.
Convivialit maximale.
Performances maximales.
Convivialit maximale.
Performances maximales.
Rplication mettre en
place.
Convivialit Internet.
Performances Internet.
MS Office Access
328/564
Vincent ISOZ
Vous verrez dans la fentre base de donnes que chaque table comporte maintenant une flche
ce qui signifie qu'il y a une liaisons externe.
Au cas o la liaison serait perdue ou modifie, il faut aller dans le menu Outils/Utilitaire de
base de donnes/Gestionnaire de tables lies:
Il suffit alors de cliquer sur Select All et ensuite sur OK et de dfinir le nouveau chemin du
fichier mdb contenant les tables.
Nous allons placer les tables de la base "la plus propre" de la classe sur le serveur (ou de
chaque participant respectif)
MS Office Access
329/564
Vincent ISOZ
Distribuons le fichier contenant les formulaires, requtes et tats sur chaque poste et
effectuons-y la liaison.
Vrifiez le fonctionnement.
Remarque: dans une entreprise il est malheureusement frquent que groupe de travail ait
dvelopp sa propre base. Quand vient le temps pour des raisons de cohrence et de
productivit de runir toutes les bases il existe une possibilits qui revient lier une table
d'une base donne une autre base. Pour ce faire, la manipulation est trivialement simple, il
suffit d'aller dans le menu Fichier/Donnes externes/Lier une table (nous avons dj pratiqu
cela au dbut du cours).
Nous verrons dans la partie VBA du cours comment lorsque nous sommes en possession d'un
fichier MDE, automatiser la mise--jour des liaisons.
16.2 Rseau
Lorsque vous travaillez en rseau avec plusieurs personnes:
1. Microsoft Access a besoin de beaucoup de bande passante sur le rseau. moins de
100 Mb/s, ne faites pas d'applications partages!
2. Privilgiez le runtime plutt que le client lourd du dveloppeur
3. Privilgiez l'utilisation des *.mde plutt que des *.mdb ou *.accdb
4. vitez de mettre l'application comme le fichier des donnes dans des sous-sous-sous
rpertoires et vitez les noms longs pour les rpertoires et le fichier de donnes. Plus
vous tes proche de la racine et moins vos noms de rpertoire sont courts
(convention 8.3), plus les performances seront accrues.
5. Au moins une fois par demi-journe demandez tout le monde de fermer
compltement la base de donnes (sans la faire planter par le gestionnaire de tches ce
qui n'quivaut pas la fermer!)
6. Si votre fichier de donnes est hberg sur un serveur Windows (sauf Windows 2003
Server):
a. Dsactivez le dlai de notification de violation de partage.
b. Dsactivez la gnration automatique de nom de fichier court.
c. Activez la mise en cache des noms longs (sauf si vous utilisez des noms
courts).
7. Certains Anti-virus trop agressifs nuisent la bonne marche de nos machines, les
applications en font les frais. N'hsitez pas exclure de la vrification les applications
Microsoft Access.
8. Placez vos bases partages sur des volumes NTFS plutt que FAT ou FAT32.
MS Office Access
330/564
Vincent ISOZ
9. Enfin dans le dernier des cas en allant dans Fichier/Options/Paramtres du client
(versions 2007/2010/2013) vous pouvez jouer par tatonnement avec les paramtres
suivants:
10. Ou encore en allant dans la section Base de donnes active vous pouvez dcocher les
lments mis en vidence ci-dessous:
MS Office Access
331/564
Vincent ISOZ
17 Securit avance
Microsoft Office Access offre trois mthodes de protection d'une base de donnes:
1. Dfinir un mot de passe pour ouvrir une base de donnes
2. Enregistrer la base de donnes dans un fichier au format MDE (dj vu dans la
thorie des macros), ce qui supprime le code Visual Basic modifiable et empche la
modification de la structure des formulaires, des tats et des modules.
3. Utiliser une scurit au niveau utilisateur, ce qui permet de dlimiter les parties
auxquelles l'utilisateur peut accder ou celles qu'il peut modifier.
Remarque: Dsol si ce chapitre n'est pas trs clair mais force que Microsoft change les
versions un rythme endiabl il y a un mlange de plus en plus grand dans le prsent
document. videmment tout ce qui est crit ci-dessous est dcant en formation de manire
correcte et propre (du moins j'essaie).
2.
3.
Dans le menu Fichier, cliquer sur Ouvrir Activer ensuite la case cocher Mode
exclusif dans le bouton Ouvrir en bas droite de la bote de dialogue. Ce qui aura
pour effet d'ouvrir la base de donnes mais pas en mode exclusif:
MS Office Access
332/564
Vincent ISOZ
4.
5.
6.
7.
Valider.
MS Office Access
333/564
Vincent ISOZ
Le mot de passe est prsent dfini. La prochaine fois que tout utilisateur ouvrira la base de
donnes, une bote de dialogue demandant le mot de passe s'affichera.
Attention:
Si on perd ou si on oublie le mot de passe, il ne peut pas tre rcupr (sans logiciels
spcialiss gratuitement disponibles sur le web) et plus personne ne pourra ouvrir la
base de donnes !
Remarque: le danger avec cette mthode, c'est que chaque utilisateur a quand mme accs
toute l'architecture de la base de donnes s'il connat comment passer outre l'cran d'accueil
(shift). De plus, n'importe quel utilisateur pourrait l'ouvrir en "Mode exclusif"
(Fichier/Ouvrir Bouton Ouvrir Ouvrir en mode exclusif) et ds lors empcher chacun
de ses collgues d'y crire ou lire la moindre information !
MS Office Access
334/564
Vincent ISOZ
12. Faire Outils/Scurit/Autorisations d'accs pour paramtrer les droits:
13. Retirer tous les droits du groupe des Utilisateurs (s'il est l)
14. Retirer tous les droits du groupe des Administrateurs
15. Mettre tous les droits au groupe des Dveloppeurs (si vous cr un tel groupe)
16. Et faire cela sur chacun des types d'objets de la base de donnes. Ainsi, la base de
donnes ne pourra pas tre ouverte pas l'utilisateur par dfaut (utilisateur:
Administrateur)
17. Construire sa base de donnes
18. Crer tous les utilisateurs, groupes avec droits ad hoc
19. Mettre la base disposition des utilisateurs en tant que raccourci dans lequel il y
aura une liaison avec le *.mdw (voir plus loin) se trouvant le rseau pour l'ouvrir
de manire scurise quel que soit l'ordinateur
20. Enfin faire un back up rgulirement du fichier *.mdw cr au point 1
Si vous ne suivez pas ces tapes, n'importe qui pourra ouvrir votre base de donnes sans
aucune scurit sur un autre ordinateur.
17.2.2 Mthodes
La mthode la plus flexible et la plus tendue pour protger une base de donnes s'appelle la
"scurit au niveau utilisateur". Ce type de scurit est similaire aux mthodes utilises
dans la plupart des systmes de rseau. Les utilisateurs doivent s'identifier et taper un mot de
passe lorsqu'ils dmarrent MS Access (et non pas ncessairement une base de donne
spcifique !!!).
Au sein du fichier d'informations de groupe de travail, ils sont identifis comme tant les
membres d'un groupe. MS Access fournit deux groupes par dfaut: les administrateurs
(appels le "groupe Administrateurs") et les utilisateurs (appels le "groupe Utilisateurs"),
mais des groupes supplmentaires peuvent tre dfinis (heureusement).
Les autorisations d'accs sont accordes aux groupes et aux utilisateurs pour dterminer de
quelle manire ils sont autoriss travailler avec chaque objet dans une base de donnes. Par
exemple, les membres du groupe utilisateurs pourraient tre autoriss visualiser, introduire
ou modifier des donnes dans une table, mais ils ne pourraient pas changer la prsentation de
cette table. Le groupe Utilisateurs pourrait tre autoris visionner les donnes de certaines
tables et se voir refuser l'accs total une table contenant des donnes sensibles. Les membres
du groupe Administrateurs ont toutes les autorisations d'accs sur tous les objets d'une base de
donnes.
Les trois raisons principales d'utilisation de la scurit au niveau utilisateur sont:
MS Office Access
335/564
Vincent ISOZ
Eviter que les utilisateurs ne dtriorent par inadvertance une application en changeant
le code ou les objets dont l'application dpend.
Les groupes, les utilisateurs, les bases de donnes et toutes les autorisations d'accs font partie
d'un environnement commun qu'on appelle un espace de travail (Workspace).
La scurit au niveau utilisateur s'applique donc au niveau du logiciel MS Access et non
uniquement sur une unique base prdfinie !!!
Remarque: Bien qu'un utilisateur appartienne toujours un groupe, s'il a des droits diffrents
du groupe, ce seront ses droits individuels actifs qui prendront le dessus sur ceux inactifs du
groupe (et si le groupe a donc des lments actifs qui sont inactifs chez l'utilisateur, alors il
hritera automatiquement des droits actifs du groupe).
Dans MS Access, le systme de scurit est toujours en activit:
Ces diverses informations sont stockes dans un fichier discret, mais trs important, que l'on
trouve au premier niveau de l'environnement d'installation de MS Access, soit dans
MSOFFICE (ou directement dans le moteur JET de votre base si le protocole
prcdemment prsent a t suivi) pour les machines en rseau, soit dans:
C:\Documents and Settings\<Utilisateur>\Application Data\Microsoft\Access
pour les machines autonomes: le fichier system.mdw.
2.
MS Office Access
336/564
Vincent ISOZ
Un Administrateur (Admin)
2.
Remarques:
Dans la version franaise, les termes anglais ont t traduits, mais il faut utiliser les
termes anglais en Visual Basic Application (V.B.A.).
Il arrive que l'utilisateur standard (Guest) ne soit pas cr dans l'espace de travail. On
n'aura donc que l'Administrateur (Admin) disposition
Le(s) utilisateur(s) par dfaut susmentionn(s) n'ont pas de mot de passe comme nous l'avons
dj implicitement mentionn dans le protocole de dbut !
MS Office Access
337/564
Vincent ISOZ
Consquence:
En tant qu'Administrateur, on a tous les pouvoirs sur l'espace de travail en cours, ainsi que
sur toutes les bases de donnes cres partir de cet espace et, bien entendu, sur tous les
objets que peuvent contenir ces bases !
Risque (qui concernant les O.S. avant Windows XP ma connaissance):
Le premier utilisateur un peu fut et mal intentionn (ou maladroit) attribue un mot de
passe l'Administrateur il devient le propritaire de l'espace de travail et, partir de cet
instant, il empche tous les autres utilisateurs d'utiliser toutes les bases de donnes dj
cres partir de cet espace de travail (de son ordinateur au fait)!
MS Office Access
338/564
Vincent ISOZ
2.
3.
Garder une copie du fichier System.mdw en lieu sr pour remplacer la version qui
serait modifie par un utilisateur malveillant (donc in extenso toute personne qui
sait o se trouve le fichier mdw d'une base pour le rinitialiser en l'crasant par
System.mdw aprs avoir chang le nom du fichier. d'o le fait que beaucoup
cherchent mettre ce fichier sur un disque rseau en lecture seule)
4.
MS Office Access
339/564
Vincent ISOZ
Comme on le voit, ce fichier n'est pas tir du nant, mais est "copi" partir d'un fichier
existant: cela peut tre l'original ou dj une version prpare par nos soins conformment au
protocole susmentionn.
Remarque: La dnomination "groupe de travail" n'est pas trs heureuse: il vaudrait mieux
parler d'un "espace de travail", terme utilis dans Visual Basic. Le mot groupe peut prter
confusion, car on va dfinir des groupes d'utilisateurs l'intrieur du "groupe de travail"
Trois informations sont ncessaires pour gnrer le nouveau fichier:
1.
Le nom
2.
L'organisation
3.
L'Identificateur de groupe de travail doit assurer que l'espace de travail que l'on cre est
rellement unique, car la mme personne (Nom), dans la mme entreprise (Organisation),
peut crer plusieurs "groupes de travail". Ce code est donc le seul moyen de les distinguer !
Ensuite, le logiciel va nous demander o le sauvegarder et sous quel nom:
MS Office Access
340/564
Vincent ISOZ
On peut donner un nouveau nom au fichier cr et le stocker dans le mme rpertoire que le
fichier System.mdw d'origine, ou enregistrer le nouveau System.mdw dans un rpertoire
particulier qui sera partag par les diffrents utilisateurs de ce "groupe de travail" (cas le plus
communment utilis).
Il est vital de conserver les paramtres utiliss, par crit et dans un endroit sr.
En effet, si le fichier "d'informations du groupe de travail" venait tre dtruit ou corrompu,
la seule faon de pouvoir accder aux bases de donnes partageant cet espace de travail - si la
scurit est correctement mise en place (avec l'assistant de scurit par exemple) - est de
reconstruire un fichier identique !
Attention: Il faut ds lors absolument respecter les majuscules et les minuscules d'origine.
Remarque: Si le fichier *.mdw est cr de manire classique (c'est--dire sans l'assistant), une
simple suppression de celui-ci permettra tout le monde d'accder la base de donnes avec
tous les droits.
Nous avons maintenant plusieurs espaces (groupes) de travail. Comment faire pour indiquer
celui avec lequel on veut travailler ? Dans sa version franaise, Microsoft parle de "rejoindre
un groupe de travail Microsoft Access".
Deux mthodes sont possibles:
Premire mthode: Utiliser le programme "Administrateur de groupe de travail"
1.
MS Office Access
341/564
Vincent ISOZ
2.
3.
2.
3.
Ces diffrentes oprations s'effectuent dans MS Access, une fois que l'on est "connect" au
groupe de travail dsir !
MS Office Access
342/564
Vincent ISOZ
C'est le Menu Outils qui donne accs aux options Scurit.
Rappel: Lorsque l'on cre pour la premire fois un fichier d'information de groupe de travail,
on est considr par le systme comme tant le fameux "Administrateur" qui dispose de tous
les droits. Il faut user de ces droits avec discernement et agir avec mthode pour ne pas se
trouver coinc par une mauvaise manipulation.
1re opration (dj mentionn au dbut de ce chapitre):
Crer un nouvel Administrateur, diffrent de l'administrateur par dfaut (pige classique)!
Choisir un nom symbolique du genre: BigBoss, Patron, Chef, etc. ou utiliser le nom du
vritable administrateur du groupe de travail
Le N personnel permet de distinguer des utilisateurs qui auraient le mme nom. Comme on
l'a dj vu, Il faut conserver cette information dans un endroit sr, pour le cas o il faudrait
recrer le fichier d'information du groupe de travail ainsi que les utilisateurs qui le
composent !
2me opration:
Inscrire absolument cet utilisateur dans le groupe des Administrateurs !
MS Office Access
343/564
Vincent ISOZ
5me opration:
Attribuer un mot de passe l'Administrateur, puisque l'on est connect sous son nom.
MS Office Access
344/564
Vincent ISOZ
MS Office Access
345/564
Vincent ISOZ
Il n'y a donc pas besoin de dfinir individuellement le dtail des droits de chaque utilisateur: il
suffit de le prvoir pour son groupe et de lui faire rejoindre ce groupe !
Remarque: Droits et autorisations seront traites plus loin.
Maintenant que l'espace de travail est dlimit, il faut encore y incorporer les bases de
donnes que les utilisateurs vont utiliser ! Deux cas de figure non exclusifs peuvent se
prsenter:
On veut utiliser, en les scurisant dans cet espace de travail, des bases de donnes
existantes.
Dans les deux cas pourtant la procdure est la mme: il faut faire une copie de la base de
donnes existante en la passant par le protocole vu plus haut ou par une moulinette
particulire: un "Assistant scurit" qui a t apparu avec Access 2002.
Donc pour scuriser une base de donnes existante une autre possibilit plus simple que le
protocole consiste utiliser ce fameux assistant (qui cependant n'efface pas les groupes et
utilisateurs dont tout le monde connat les noms l'avance ce qui n'est pas vraiment trs
trs astucieux en termes de scurit):
1.
2.
3.
MS Office Access
346/564
Vincent ISOZ
MS Office Access
347/564
Vincent ISOZ
On choisir les groupes types d'utilisateurs que l'on voudra pouvoir utilisateur par la suite (voir
la description plus bas). Et on clique sur Next:
MS Office Access
348/564
Vincent ISOZ
Il nous demande si on veut faire quelque chose de particulier avec le Groupe Utilisateurs qui
a un statut un peu spcial dans Access puisqu'il existe sur tous les PCs. Il vaut mieux ne rien
changer afin que ce groupe n'ait aucun droit. On clique sur Next:
MS Office Access
349/564
Vincent ISOZ
On assigne chaque utilisateur des groupes spcifiques de scurit. On clique sur Next:
Il propose de faire une copie non scurise de la base de donnes (heureusement car certains
oublient). On clique sur Finish et on aura dans notre dossier de travail, la base Access avec
son espace de travail (*.mdw) + un raccourci spcial pour l'ouvrir:
MS Office Access
350/564
Vincent ISOZ
La base ainsi cre est la proprit de l'Administrateur: tant qu'il n'aura pas dtermin les
droits d'accs, nul autre ne sera autoris pntrer et, plus forte raison, utiliser cette base
de donnes:
Donc l'assistant redfinit directement la scurit dans la structure JET de la base de donnes !
Si l'on veut grer correctement une base de donnes scurise, il faut dterminer pour chaque
utilisateur et pour chaque groupe quels sont leurs droits prcis sur chaque objet de la base!
La meilleure mthode est de dfinir les droits et les autorisations pour un groupe, d'assigner
un utilisateur ce groupe et de tester si les manipulations des donnes ncessaires sont toutes
possibles pour cet utilisateur. En cas de problmes, modifier les autorisations du groupe.
Quand tout fonctionne, tous les autres utilisateurs assigns ce groupe pourront travailler sans
soucis.
1.
2.
3.
Cliquer sur le type d'objet dans la bote Type de l'objet, puis sur le nom de l'objet
auquel les autorisations d'accs se rapporteront dans la bote Nom de l'objet.
Conseil: On peut slectionner plusieurs objets dans la bote Nom de l'objet en faisant glisser le
pointeur de la souris sur les objets que l'on veut slectionner ou en maintenant la touche
CTRL enfonce et en cliquant sur les objets souhaits.
Dans Autorisations d'accs, slectionner les autorisations d'accs que l'on veut accorder, ou
effacer les autorisations d'accs que l'on veut retirer au groupe ou l'utilisateur, puis cliquer
sur Appliquer.
MS Office Access
351/564
Vincent ISOZ
Rpter les tapes 4 et 5 pour accorder ou retirer au groupe (ou l'utilisateur) en cours
d'autres autorisations d'accs portant sur d'autres objets.
Remarques:
Lire les donnes s'accompagne automatiquement de Lire la structure. Dans le cas des
macros, Lire la structure s'accompagne automatiquement de Ouvrir/Excuter.
Lorsque l'on modifie un objet et qu'on l'enregistre, il conserve les autorisations d'accs
qui lui sont accordes (heureusement)
MS Office Access
Permet un utilisateur de
S'applique
352/564
Vincent ISOZ
Autorisation
Permet un utilisateur de
excuter une macro.
S'applique
Ouvrir en mode
exclusif
Lire la structure
Modifier la structure
Tables et requtes
Supprimer des
donnes
Administrer
Dfinir un mot de passe pour une base de donnes, copier une base de
donnes et modifier les proprits de dmarrage
Tables et requtes
Ne pas oublier
MS Office Access
353/564
Vincent ISOZ
Une fois ceci fait, reste l'aspect utilisateur. La connexion rclame plusieurs conditions:
1.
2.
3.
Il est possible d'automatiser cette procdure pour un utilisateur particulier au moyen d'un
raccourci sur le bureau ou dans la barre des tches.
Exemple 1:
Groupe de travail
Utilisateur
Base
Groupe de travail
Utilisateur
MS Office Access
354/564
Vincent ISOZ
F:\MsOffice\Office\Msaccess.exe G:\Ecole\Ecole.mdb /runtime /wrkgrp
G:\Ecole\System.mdw /user %username%
Lorsqu'un utilisateur tente d'ouvrir, de modifier ou de dtruire un objet auquel il n'a pas accs,
il reoit un message lui signifiant son viction:
Attention!!! Si vous crez un raccourci entre une base de donnes et un espace de travail
scuris comme montr prcdemment et que aprs ouverture vous allez ensuite dans le menu
Outils/Scurit/Administrateur du groupe de travail vous verrez qu'il peut arriver qu'il est
encore connect peut-tre un autre fichier *.mdw (qui n'est pas celui spcifi dans le
raccourci). Ds lors, n'ayez aucune inquitude, le bon fichier *.mdw a quand mme t
charg correctement en mmoire!
En consquence, il vaut mieux tre mthodique et respecter cette consigne: dans une base de
donnes scurise, les actions des boutons doivent tre gnres par une procdure
vnementielle qui comporte un traitement des erreurs !
MS Office Access
355/564
Vincent ISOZ
MS Office Access
356/564
Vincent ISOZ
Relations: les descriptions de toutes les relations existant entre toutes les tables
Visual Basic pour Access permet de traiter tous les objets de toutes les manires possibles:
cration, modification, suppression !
VBA offre une systmatique remarquable pour:
Avant de passer en revue les proprits et les mthodes de tous ces objets, il faut tout d'abord
s'occuper de deux besoins lmentaires pour la gestion des droits d'accs:
MS Office Access
357/564
Vincent ISOZ
Dans de rares cas il arrive que le fichier ldb ne soit pas supprim automatiquement par
MS Access la sortie du dernier utilisateur, dans ce cas vous pouvez le supprimer
manuellement.
MS Office Access
358/564
Vincent ISOZ
17.3 Dploiement
Installez un dossier partag sur le serveur du rseau. Peut-tre aurez-vous besoin de
l'administrateur de votre rseau (il peut dfinir des droits d'accs sur NT ce qui peut s'avrer
tre une couche de scurit supplmentaire) ?
Copiez la base de donnes sur le serveur du rseau ou un des disques rseaux qui y sont
disponibles.
Vrifiez que la base de donnes est dfinie pour une ouverture en mode partag, qui est le
paramtre par dfaut (Outils/Options/Avanc/Mode partag):
Pour accder la base de donnes MS Access partage depuis un autre ordinateur, vous devez
disposer sur cet ordinateur de l'une des configurations suivantes:
1. une installation locale de MS Access
MS Office Access
359/564
Vincent ISOZ
2. une installation rseau de MS Access (avec licence pour chaque utilisateur) ou une
application d'excution
Vous pouvez obtenir une licence libre de droits pour installer votre application d'excution sur
tous les ordinateurs en achetant Microsoft Office 2000 Developer (MOD).
Maintenant, pour chaque participant de la salle de formation, crez un scnario d'utilisation
avec droits, rles et mots de passe respectifs. Soyez rigoureux et mthodique dans votre
travail. Une fois le dploiement termin, faites des essais et vrifiez que tout marche
correctement.
Par exemple: insrez des donnes dans la table articles (faites jouer votre imaginaire mais tout
en restant srieux) et vrifiez que les articles de vos collgues s'y trouvent aussi.
Attention ! Vous aurez remarqu la partie suivante de la capture d'cran:
MS Office Access
360/564
Vincent ISOZ
18 Synchronisation (rplication)
Nous avons vu pas mal de choses jusqu'ici mais avec la multiplication des ordinateurs
portables, la mobilit croissante des employs et leur manque de connaissance des outils de
l'informatique, il devient indispensable de trouver un moyen de poser la base de donnes sur
plusieurs ordinateurs et d'avoir la possibilit de faire tout moment une "rplication".
La rplication est une technique qui consiste dupliquer une base de donnes sur plusieurs
postes. Ainsi, plusieurs personnes sur le rseau peuvent chacun avoir leur copie de la base de
donne sans avoir ouvrir le mme fichier, et rcuprer ou envoyer les donnes supprimes,
ajoute ou modifies l'aide d'une synchronisation avec une base commune que l'on place sur
le rseau commun aux utilisateurs.
361/564
Vincent ISOZ
Vient alors:
MS Office Access
362/564
Vincent ISOZ
Alors, aussi bien dans le Design Master que dans le Replica il y a alors partout le symbole de
la rplication:
MS Office Access
363/564
Vincent ISOZ
Nous voyons galement dans la capture ci-dessous, que si nous activons l'affichage des tables
cachs, apparat alors une certaine quantit de nouvelles tables permettant MS Access de
grer la synchronisation.
Dans le rplica que ce soit dans le cadre de tentative de modification de la structure d'un
formulaire ou d'une table ou autre chose:
MS Office Access
364/564
Vincent ISOZ
Si vous essayez de supprimer vous aurez (si la case cocher de Prvention de la suppression
a bien t active) le message suivant:
Une fois les modifications effectues, pour synchroniser le rplica, vous retournez dans le
menu Outil tel que:
Il y a pas mal de choix et elles sont toutes triviales utiliser. Nous allons cependant cliquer
sur Synchroniser maintenant.
Apparat alors la bote de dialogue suivante vous demandant de chercher ou valider le chemin
d'accs vers la base de donnes d'origine. Suite quoi tout ce fait seul !
Par ailleurs, nous pouvons constater qu'une nouvelle table cre dans le rplica ne sera pas
rplique dans le Design Master:
MS Office Access
365/564
Vincent ISOZ
mais dans le Master on peut rendre la table rplicable en allant dans ses proprits et en
cochant l'option ad hoc:
et ensuite si depuis le rplica on synchronise, cette nouvelle table sera disponible. A l'inverse
si on dcoche la table disparatra du rplica.
MS Office Access
366/564
Vincent ISOZ
MS Office Access
367/564
Vincent ISOZ
MS Office Access
368/564
Vincent ISOZ
table ou la requte est prsent rplicable. Les proprits Replicable et ReplicableBool sont
interchangeables.
KeepLocal: Proprit ajoute dans une table ou une requte. Si la proprit est renseigne par
V, elle indique que l'objet ne doit pas tre rpliqu lorsque la base de donnes est rplique.
La proprit KeepLocal d'un objet dj rpliqu ne peut pas tre renseigne par T.
ReplicaID: Proprit qui attribue une identification unique chaque membre du jeu de
rplicas. Cette proprit est en lecture seule et est stocke dans la table systme
MSysReplicas.
DesignMasterID: ID de rplica (ReplicaID) du rplica-matre. Cette proprit est stocke dans
la table systme MSysRepInfo comme SchemaMaster.
ColumnLevelTracking: Proprit de base de donnes ou de table. Lorsque cette proprit est
renseigne par Vrai (valeur par dfaut), elle indique que les conflits sont suivis au niveau des
colonnes d'une table.
Replication ConflictFunction: Proprit qui permet de remplacer l'observateur de conflits de
Microsoft Access par une procdure personnalise qui assiste les utilisateurs dans la
rsolution des conflits de synchronisation.
Modifications du comportement des champs NumroAuto en cas de rplication d'une base de
donnes:
Lorsque vous rpliquez une base de donnes, tous les champs NumroAuto incrmentiels de
vos tables deviennent des champs de numrotation alatoire. Tous les champs NumroAuto
des enregistrements existants conservent leurs valeurs, mais les valeurs NumroAuto des
enregistrements ajouts sont alatoires. En d'autres termes, les numros des enregistrements
ne refltent pas l'ordre dans lequel les enregistrements ont t ajouts et, par consquent, le
dernier enregistrement ajout ne prsente pas forcment la valeur la plus leve:
MS Office Access
369/564
Vincent ISOZ
MS Office Access
370/564
Vincent ISOZ
MS Office Access
371/564
Vincent ISOZ
MS Office Access
372/564
Vincent ISOZ
En ralit, le seul moment o le rplica peut modifier un enregistrement avec le matre est
quand il est le seul modifier ou supprimer une donne.
MS Office Access
373/564
Vincent ISOZ
MS Office Access
374/564
Vincent ISOZ
Quel est l'objectif de mon code?
N'est-il pas plus rapide de raliser cet objectif manuellement? (calcul du ROI)
Cet objectif a-t-il rellement un intrt?
Ce programme n'existe-il pas dj sous une autre forme?
Ce programme est-il ralisable?
La ralisation de ce programme n'est-elle pas trop coteuse?
Bien videmment, il existe de nombreux cas o vous pourrez crire un programme sans vous
poser toutes ces questions. Ainsi, quand vous voudrez rdiger un code trs simple pour
automatiser une tche prcise qui n'est pas complexe, vous pourrez foncer bille en tte. En
revanche, ds que le projet de code devient un peu plus amitieux, il vaut vraiment mieux se
poser des questions avant de commencer crire du code.
Ils auront travaill avec des formulaires et manipul des composants utilisateurs simples
comme des boutons et des champs texte.
Le VBA est un langage de programmation (non objet) utilis par et pour les applications MS
Office: MS Word, MS Excel, MS Access, MS Visio, MS Publisher, MS Project, MS Outlook
( partir de la version 2002 du moins facilement), MS FrontPage, MS PowerPoint
D'autres applications ne faisant pas parties de la suite MS Office acceptent aussi le VBA et
son environnement de dveloppement (exemple: Business Objects).
Le langage est simple d'utilisation et n'a absolument aucun rapport avec le langage Visual
Basic .Net (nous considrons le langage Visual Basic 6 comme mort dans ce cours). La plus
grosse diffrence tant que le VBA ne permet pas de faire ce que l'on nomme des applications
en "Standalone".
Remarques pralables:
1. Avant de commencer ce cours, il est suppos connu, les macros automatiques (pour
toute la gamme de la suite MS Office), les XLA (pour MS Excel), les groupes de
Macros (pour MS Access).
2. la partie dbogage et la conception "objet" (je sais, je sais, VBA n'est pas un
langage POO) ainsi que la protection des projets n'est traite qu'oralement par le
formateur en classe.
3. Nous utiliserons le VBA ds que les outils WYSIWYG des logiciels de la suite MS
Office ne satisfont plus nos besoins (le problme c'est que souvent les gens ne
connaissant mme pas parfaitement le logiciel incrimin avant de prendre un cours
VBA). L'inconvnient d'une formation VBA, c'est que autant vous pouvez effectuer
une formation de niveau moyen sur MS Access, Excel ou Word sur 7 jours 8 heures
par jour et avoir vu 90% des fonctionnalits WYSIWYG, autant en ce mme laps de
temps, vous verrez 10% (et encore!!!) des possibilits du VBA dans chacun de ces
logiciels.
MS Office Access
375/564
Vincent ISOZ
19.1 Objectifs
A la fin de ce chapitre, les participants sauront parfaitement utiliser les macros automatiques
et macro complmentaires et connatront les notions et structures standards de la
programmation VBA, telles que les variables, les boucles, les conditions et les fonctions.
Ils sauront ce que sont la programmation objet et la programmation vnementielle et auront
raliss quelques exercices utilisant ces notions.
Ils auront travaill avec des formulaires et manipul des composants utilisateurs simples
comme des boutons et des champs texte.
Remarque: On sait que le nombre de mots d'une langue est limit. Le vocabulaire d'un enfant
de 10 ans tourne autour de 5'000 mots, celui d'un adulte cultiv de 10'000-15'000, et les
dictionnaires en plusieurs volumes peuvent monter de 130 000 200 000. Le VBA d'aprs de
rumeurs contiendrait environ 800'000 mots ( vrifier quand mme!).
19.2 Historique
En programmation, BASIC est un acronyme pour Beginner's All-purpose Symbolic
Instruction Code qui dsigne une famille de langages de programmations de haut niveau.
Le BASIC a t conu la base en 1963 par John George Kemeny (1926-1993) et Thomas
Eugene Kurtz (1928-) au Dartmouth College pour permettre aux tudiants qui ne travaillaient
pas dans des filires scientifiques d'utiliser les ordinateurs et apprendre les techniques de
programmation. En effet, l'poque, l'utilisation des ordinateurs ncessitait l'emploi d'un
langage de programmation rput rserv aux seuls les spcialistes, en gnral un langage
d'assemblage ou Fortran.
L'acronyme BASIC est li au titre d'un article de Thomas Kurtz qui n'a pas t publi et n'a
aucun rapport avec les sries intitules Anglais basic de C. K. Ogden. Les concepteurs du
langage souhaitaient qu'il soit du domaine public, ce qui favorisa sa diffusion.
Le BASIC est indissociable de l'apparition, dans les annes 1980, de la micro-informatique
grand public. En effet, la plupart des micro-ordinateurs vendus durant cette priode taient
fournis avec un Interprte BASIC, et quelques calculatrices programmables en furent mme
dotes.
Ce n'tait jamais l'intention des crateurs du langage qu'il s'agit d'un langage professionnel.
Pourtant il s'est propag rapidement et est disponible dans les centaines de dialectes sur de
nombreux types d'ordinateurs. La BASIC a volu et s'est amlior au cours des annes.
l'origine, c'tait un langage interprt (chaque ligne tait interprte avant son excution ce
qui est le cas du VBA par exemple) qui impliquait une excution lente. La plupart des
dialectes modernes de BASIC permettent au code d'tre compil. Par consquent, l'excution
est beaucoup plus rapide et la portabilit des programmes amliore.
Les huit principes de conception du BASIC taient:
1. tre facile d'utilisation pour les dbutant(e)s (Beginner)
2. tre un langage gnraliste (All-purpose)
MS Office Access
376/564
Vincent ISOZ
3. Autoriser l'ajout de fonctionnalits pour les expert(e)s (tout en gardant le langage
simple pour les dbutant(e)s)
4. tre interactif
5. Fournir des messages d'erreur clairs et conviviaux
6. Avoir un dlai de raction faible pour les petits programmes
7. Ne pas ncessiter la comprhension du matriel de l'ordinateur
8. Isoler (shield) l'utilisateur du systme d'exploitation
Le BASIC a gagn sa respectabilit en 1991 lorsque Microsoft a lanc VISUAL BASIC pour
MS Windows. Ce produit a t trs populaire parmi les dveloppeurs d'applications
autonomes. Si VBA ressemble peu ces langages, le BASIC reste la base sur laquelle VBA a
t labor.
EXCEL 5 a t la premire application sur le march proposer VBA et il est maintenant
inclus dans presque toutes les applications de la suite bureautique depuis MS Office 97 et
mme chez d'autres fournisseurs. Par consquent, si vous matrisez l'utilisation de VBA, vous
pouvez crire des macros avec toutes sortes d'applications (Microsoft et autres).
Il est important de noter l'information suivante (capture d'cran du site web de Microsoft):
Type de donnes
MS Office Access
Taille d'enregistrement
Plage
377/564
Vincent ISOZ
Type de donnes
Taille d'enregistrement
Plage
Byte
1 octet
0 255
Boolean
2 octets
True ou False
Integer
2 octets
Long
(entier long)
4 octets
Single
( virgule flottante
en simple
prcision)
4 octets
Double
( virgule flottante
en double
prcision)
8 octets
-1,79769313486231E308
-4,94065645841247E-324 pour les
valeurs ngatives ; 4,94065645841247E324 1,79769313486232E308 pour les
valeurs positives
Currency
(entier dcalage)
8 octets
Decimal
14 octets
+/79 228 162 514 264 337 593 543 950 335
sans sparateur dcimal ;
+/-7,9228162514264337593543950335
avec 28 chiffres droite du sparateur
dcimal ; le plus petit nombre diffrent
de zro est +/0.0000000000000000000000000001.
Date
8 octets
Object
4 octets
String
10 octets + longueur de la
(longueur variable) chane
0 environ 2 milliards
String
(longueur fixe)
Longueur de la chane
1 environ 65 400
Variant
(nombres)
16 octets
Variant
(caractres)
22 octets + longueur de la
chane
MS Office Access
378/564
Vincent ISOZ
Remarque: Quel que soit le type de donnes, les tableaux ncessitent 20 octets de mmoire,
auxquels viennent s'ajouter quatre octets pour chaque dimension et le nombre d'octets occups
par les donnes. L'espace occup en mmoire par les donnes peut tre calcul en multipliant
le nombre d'lments par la taille de chacun d'eux. Par exemple, les donnes stockes dans un
tableau unidimensionnel constitu de quatre lments de type Integer de deux octets chacun
occupent huit octets. Ajouts aux 24 octets d'espace mmoire de base, ces huit octets de
donnes portent la mmoire totale ncessaire pour le tableau 32 octets.
Une variable de type Variant contenant un tableau ncessite 12 octets de plus qu'un tableau
seul.
Remarque: Utilisez la fonction StrConv pour convertir un type de donnes de chane en un
autre
L'existence d'une variable peut se drouler sur trois niveaux:
1. Niveau Procdure: cela veut dire que la variable est locale. Ds que l'on quitte la
procdure en question, la variable disparat, et son contenu avec elle. Pour dclarer
une variable au niveau procdure, on tape l'intrieur de la procdure:
Dim NomVariable as Type
2. Niveau Module: la variable est disponible pour toutes les procdures d'un Module,
mais pas pour les procdures se situant sur un autre Module. Pour dclarer une
variable au niveau Module, on tape tout en haut du Module, dans la partie (General):
Private NomVariable as Type
3. Niveau Projet: la variable est disponible, et sa valeur est conserve pour toutes les
procdures de l'application, quel que soit leur emplacement. Pour dclarer une variable
globale, il faut d'abord crer un module. Sur ce module, donc, on crit:
Public NomVariable as Type
Naturellement, il ne faut pas raisonner en termes de facilit, et dclarer toutes les variables au
niveau projet: car l'excs de place mmoire, ralentira votre application, au besoin
considrablement. Il faut donc pour chaque variable se demander quel niveau on en a
besoin, et faire les bonnes dclarations en fonction.
L'existence d'une procdure peut se drouler quant elle que sur deux niveaux:
1. Niveau Module: une procdure prive ne pourra tre invoque que dans le module
dans lequel elle est dclare:
Private Sub NomProcdure()
End Sub
2. Niveau Projet: une procdure publique peut tre invoque de n'importe quel endroit
du projet.
Public Sub NomProcdure()
MS Office Access
379/564
Vincent ISOZ
End Sub
MS Office Access
b ou bln Boolen
bSuccess
c ou cur Monnaie
cAmount
380/564
Vincent ISOZ
d ou dbl Double
dblQuantity
dtDate
f ou flt
fRatio
Flottant
l ou lng Long
lMilliseconds
i ou int
Entier
iCounter
s ou str
Chane
sName
a ou arr Tableau
aUsers()
oPipeline
Connexion
cnnPubs
rst
Jeu d'enregistrements
rstAuthors
cmd
Commande
cmdEmployee
fld
Champ
fldLastName
Description
g_
Usage Public
m_
Usage Local
19.5 Commentaires
Les commentaires du code est un point trs important du dveloppement que l'on comprend
seulement avec l'exprience. Effectivement, les dveloppeurs dbutants n'ont dans un premier
temps pas l'habitude de travailler trs rigoureusement et trs proprement et ce d'autant plus sur
des codes rarement suprieur 1000 lignes et ne voient donc pas quelle est l'intrt futur de
bien commenter leur code. Cet tat des faits a lieu chez la grand majorit des dveloppeurs.
MS Office Access
381/564
Vincent ISOZ
Ne pas commenter est une norme erreur pour le dveloppeur lui-mme et tous ceux qui
seraient amens intervenir ou poursuivre son travail.
Certaines rgles sont mettre en place il convient immdiatement de mettre en pratique ds
que l'on commence rdiger un code. Voici ces rgles:
Tout procdure, fonction, classe, doit tre accompagne d'une cartouche de description telle
que dans l'exemple ci-dessous
Chaque ligne de code doit tre commente avec indication en initiales du commentateur et de
la date de cration du commentaire tel que dans l'exemple ci-dessous
Au besoin, un schma procdural doit tre fait dans un logiciel adapt (MS Visio pour VBA
suffit) pendant le travail afin de savoir qui appelle quoi en faisant usage de quelles variables
Exemple de code:
'*******************************
'Crateur(s): Vincent Isoz
'Dernire modification: 18.09.2004
'Nom fonction: TestDeVariable()
'Appele par: 'Commentaires: exemple de danger de conversion de donnes
'*******************************
Dim sng As Single 'Nombre rel simple prcision
Dim dbl As Double 'Nombre rel double prcision
Sub SigngleToDouble()
'on affecte 1.9 a la variable sng
sng = 1.9
'on affecte la valeur de sng a dbl
dbl = sng
'on Affiche dbl
MsgBox dbl
'ou encore pour les sceptique
dbl=Cdbl(sng)
MsgBox dbl
End Sub
'*******************************
'Crateur(s): Vincent Isoz
'Dernire modification: 28.10.2003
'Nom fonction: factitfor()
'Appele par: mettre ici les nom de procdures (avec les modules) qui appellent la fonction
'Appelle: mettre ici le nom des de procdures (avec les modules) qui sont appel par la
fonction
'Commentaires: Calcul de la factorielle d'un nombre n par la mthode itrative "for"
'Objectif de cours: apprendre a crer des fonction itratives
'*******************************
Function factitfor(n)
'V.I.(28.10.03): On ne dclare pas la variable factit qui a le mme nom que la fonction!!
Dim i As Integer
factitfor = 1
MS Office Access
382/564
Vincent ISOZ
'V.I.(28.10.03): On utilise la mthode itrative classique vue l'cole primaire
'Attention, n et i doivent tre des variables du mme type !
For i = 1 To n
factitfor = factitfor * i
Next i
End Function
Signification
Icne
Signification
Type personnalis
Proprit standard
Projet
Mthode
Icne Projet
Mthode standard
Classe
Mthode par dfaut
Module
Icone Module
Enumration
Ensemble de constants numre
(voir dessous)
Constante
Globale
Membre appartenant tous les
sous membres en principe les
constantes
Evnement
Valeur nomme:
Ex: vbBlack = 0
Avantage si la valeur est modifie le
code continue fonctionner
Proprit
MS Office Access
383/564
Vincent ISOZ
Tableau 10 Tableau ASCII Standard
000
(nul)
016
(dle)
032
(sp)
048
064
080
096
112
001
(soh)
017
(dc1)
033
049
065
081
097
113
002
(stx)
018
(dc2)
034
"
050
066
082
098
114
003
(etx)
019
(dc3)
035
051
067
083
099
115
004
(eot)
020
(dc4)
036
052
068
084
100
116
005
(enq)
021
(nak)
037
053
069
085
101
117
006
(ack)
022
(syn)
038
&
054
070
086
102
118
007
(bel)
023
(etb)
039
'
055
071
087
103
119
008
(bs)
024
(can)
040
056
072
088
104
120
009
(tab)
025
(em)
041
057
073
089
105
121
010
(lf)
026
(eof)
042
058
074
090
106
122
011
(vt)
027
(esc)
043
059
075
091
107
123
012
(np)
028
(fs)
044
060
<
076
092
108
124
013
(cr)
029
(gs)
045
061
077
093
109
125
014
(so)
030
(rs)
046
062
>
078
094
110
126
015
(si)
031
(us)
047
063
079
095
111
127
(127)
144
160
129
145
'
161
130
146
'
131
147
132
133
176
192
208
224
240
177
193
209
225
241
162
178
194
210
226
242
"
163
179
195
211
227
243
148
"
164
180
196
212
228
244
149
165
181
197
213
229
245
134
150
166
182
198
214
230
246
135
151
167
183
199
215
231
247
136
152
168
184
200
216
232
248
137
153
169
185
201
217
233
249
138
154
170
186
202
218
234
250
139
155
171
"
187
"
203
219
235
251
140
156
172
188
204
220
236
252
141
157
173
189
205
221
237
253
142
158
174
190
206
222
238
254
143
159
175
191
207
223
239
255
Objets MS Access:
Tableau 12 Objets MS Access
Constante
MS Office Access
Valeur entire
384/564
Vincent ISOZ
acTable
acQuery
acForm
acReport
acMacro
acModule
acDataAccessPage 6
acServerView
acDiagram
acStoredProcedure 9
Objet MS Access en mode ouverture:
Tableau 13 Objets MS Access en mode ouverture
Constante
acCurViewDesign
Valeur entire
Support
acCurViewFormBrowse 1
acCurViewDatasheet
acCurViewPivotTable
acCurViewPivotChart
acCurViewPreview
Comme vous avez pu vous en apercevoir jusqu' maintenant, MS Access est un outil fort
complet dont la combinaison de l'ensemble des possibilits fait de son utilisation un outil de
mtier.
Cependant mme si nous avons vu quantits de choses jusqu' maintenant, il est possible que
vous trouviez que MS Access manque d'outils spcifiques vos besoins (qui sont comme c'est
trs souvent le cas: particuliers!).
Nous utilise ds lors le VBA (Visual Basic Application) qui est un langage de programmation
volu dit abusivement oriente objet (a y ressemble et cela en a presque les possibilits).
Cependant, l'inconvnient, c'est que autant vous pouvez effectuer une formation en MS
Access sur 7 jours 8 heures par jour et avoir vu 90% des fonctions, autant en ce mme laps
de temps, vous verrez 10% (et encore!!!) des possibilits du VBA d'Access.
MS Office Access
385/564
Vincent ISOZ
Remarque: prcisons que MS Access VBA utilise aussi un autre langage pour fonctionner qui
est le langage SQL (Stuctured Query Language) qui en lui-mme fait l'objet d'un cours d'au
moins 5 jours.
Avant de commencer passer des exercices pratiques, il est ncessaire de voir les bases
lmentaires de l'algorithmique afin de savoir ce qu'est une structure conditionnelle, une
itration, la rcursivit, les boolens et autres points importants du domaine de la
programmation
Nous allonsa galement crer des modules VBA afin de se faire la main pour voir la structure
du langage et la faon dont on crit des routines et fonctions simples (appeles avec
arguments passs en paramtres et les fonctions rcursives et plein d'autres choses).
Nous allons dfinir les notions de mthodes, proprits, vnements et les botes de dialogue.
Nous allons galement apprendre utiliser l'explorateur d'objets, l'aide, le dbuguer (la
fentre d'excution, la fentre des variables locales, les espions, les points d'arrt, l'excution
pas pas, la mise en commentaires), la gestion des erreurs (la commande GoTo).
Le lecteur se reportera ici au cours PDF MS Excel VBA disponible gratuitement au format
PDF au mme endroit qu'il a trouv le prsent document
Donc Maintenant avec votre formateur voyons:
-
MS Office Access
386/564
Vincent ISOZ
l'ordre de tri est dtermin par la page de code. L'exemple suivant dcrit un ordre de tri binaire
typique:
A<B<E<Z<a<b<e<z<<<<<<
R5. L'instruction Option Compare Text fournit des comparaisons de chanes bases sur un
ordre de tri qui ne distingue pas les majuscules des minuscules et qui est dtermin par les
paramtres rgionaux de votre systme. Si les caractres ci-dessus sont tris l'aide de
l'instruction Option Compare Text, l'ordre de tri de texte suivant est utilis:
(A=a) < ( =) < (B=b) < (E=e) < (=) < (Z=z) < (=)
Activer la bonne option est trs utile lorsque vous dveloppez un systme de gestion des mots
de passe et que vous souhaitez comparer un mot de passe saisi un mot de passe stock. Par
exemple, le code ci-dessous ne fera pas la diffrence entre les deux chanes de caractres (peu
importe quelle soit leur provenance) si l'on crit toto comme mot de passe:
Option Compare Database
Option Explicit
Sub ComparaisonMotDePasse()
Dim strPassReference, strPasseSaisi As String
strPassReference = "Toto"
strPasseSaisi = InputBox("Merci de saisir votre mot de passe")
If strPasseSaisi = strPassReference Then
MsgBox "Mot de Passe OK", vbInformation
Else
MsgBox "Mot de passe pas OK", vbCritical
End If
End Sub
Alors que le code suivane fera la diffrence des majuscules et minuscules entre toto et Toto:
Option Compare Binary
Option Explicit
Sub ComparaisonMotDePasse()
Dim strPassReference, strPasseSaisi As String
strPassReference = "Toto"
strPasseSaisi = InputBox("Merci de saisir votre mot de passe")
If strPasseSaisi = strPassReference Then
MsgBox "Mot de Passe OK", vbInformation
Else
MS Office Access
387/564
Vincent ISOZ
MsgBox "Mot de passe pas OK", vbCritical
End If
End Sub
Faisons maintenant quelques exemples de codes pures et "inutiles" dans MS Access mais
utiles pour l'apprentissage de la saisie de code et pour se "faire la main" (il faut toujours
commencer par la base):
388/564
Vincent ISOZ
For I = 1 To n
factitfor = factitfor * I
Next I
End Function
'--------------------------------------------------------------------------'ou encore avec un boucle "Do"
Function factitdo(n)
Dim I As Integer
factitdo = 1
I=0
Do
I=I+1
factitdo = factitdo * I
Loop While I <> n
End Function
'--------------------------------------------------------------------------Sub SelectCase()
Select Case Hour(Time)
Case 0 To 6
Message = "Bonne nuit..."
Case 7
Message = "Bonjour..."
Case 8 To 11
Message = "Bonne matine..."
Case 12, 13
Message = "Bon apptit..."
Case 14 To 19
Message = "Bon aprs-midi..."
Case Else
Message = "Bonne soire..."
End Select
MsgBox Message
End Sub
'--------------------------------------------------------------------------Sub id()
Dim reponse as String
reponse = InputBox("Identifiez vous:", "ID Box", "Nom Utilisateur",
100, 100)
If reponse = "Maud" Or reponse = "maud" Or reponse = "MAUD" Then
idok
ElseIf reponse Like "*soz" Then
idok
Else
idnul
End If
End Sub
MS Office Access
389/564
Vincent ISOZ
Sub idok()
msgbox "C'est ok vous avez t reconnu"
End Sub
Sub idnul()
msgbox "Access va tre ferm", vbcritical
Quit
End Sub
'--------------------------------------------------------------------------Sub utilisateur()
Dim textlen, renverse, id As String
Dim I As Integer
id = InputBox("Identifiez-vous")
'On met en majuscules le UserName
id = UCase(id)
'On affiche le tout dans une message box (voi l'aide!! pour le retour
chariot par exemple)
'On compte combien de lettres il y a dans le nom de l'utilisateur
textlen = Len(id)
'Premire structure de boucle de type For
'Par pas de 1 on analyse en reculant les lettres du nom de l'utilisateur
For I = textlen To 1 Step -1
'Vous n'tes pas obligs de choisir i comme variable d'itration
'On parcour 1 par 1 les caractres et on les concatne avec le
caractre prcdent
renverse = renverse & Mid(id, I, 1)
MsgBox renverse
Next I
MsgBox renverse
End Sub
-------------------------------------------------------------------'Ce programme renvoie le nombre de voyelles comprises dans un texte
'Objectif: apprendre la command "Mid" + "Like" + "Debug.Print"
'Commandes que l'on retrouve dans les autres logiciels de la suite office
Sub comptevoyelles()
Dim compte As Integer
Dim ch, texte, result As String
texte = InputBox("Tapez le texte duquel vous voulez enlever les
voyelles")
'On initialise une variable (ce qui n'est pas tjrs) obligatoire
compte = 0
'On va compter les voyelles
For I = 1 To Len(texte) ' comparer avec l'exercice prcdent...
ch = Mid(texte, I, 1)
'on test la caractre pour voir si c'est une variable
If ch Like "[aeiou]" Then
compte = compte + 1
'on affiche le rsultat intermdiaire dans la fentre d'excution
Debug.Print ch, I
MS Office Access
390/564
Vincent ISOZ
Else
result = result & ch
End If
Next I
'Ecrivez la fonction dans une feuille et appelez dans l'argument une cellule contenant un
texte
MsgBox "il y avait " & compte & " voyelles"
MsgBox result
End Sub
'-------------------------------------------------------------------Sub afficheascii()
Dim I As Integer
Dim debutascii, finascii As Integer
debutascii = 33
finascii = 126
For I = debutascii To finascii
Debug.Print I, Chr(I)
Next I
End Function
'-------------------------------------------------------------------'Ce programme supprime les espaces contenu dans un texte
'Objectif: apprendre utiliser les valeurs ascii (de 33 126)
'Commandes que l'on retrouve dans les autres logiciels de la suite office
Sub suprespaces()
Dim Temp, ch, texte As String
texte = InputBox("Tapez une phrase avec des espaces")
For I = 1 To Len(texte)
ch = Mid(texte, I, 1)
'32 est la valeur ascii du l'espace vide
If ch <> Chr(32) Then
Temp = Temp & ch
End If
Next I
MsgBox Temp
'Si vous connaissiez bien les instuctions VB le contenu ci-dessus aurait pu s'abrger
MsgBox Replace(texte, " ", "")
End Sub
'--------------------------------------------------------------------------Sub divisedeux()
'Essayez aprs en changeant "double" en "integer"
Dim nb1, nb2, resultat As Double
On Error GoTo GestionErreurs
nb1 = InputBox("Saisissez le dividende")
nb2 = InputBox("Saisissez le diviseur")
If IsNumeric(nb1) = False Or IsNumeric(nb2) = False Then
MsgBox "Une des deux entres n'est pas un nombre", vbCritical + vbRetryCancel,
"Attention!"
End If
MS Office Access
391/564
Vincent ISOZ
resultat = nb1 / nb2
MsgBox "Le rsultat de la division est " & resultat
'N'oubliez pas de quitter la fonction sinon quoi la gestion des erreurs va tre execute
Exit Sub
GestionErreurs:
MsgBox Str(Err.Number) & ": " & Err.Description, , "Erreur"
'Testez la fonction avec une division par zro, et des saisies de caractres
End Sub
Voyons maintenant une srie de codes propres MS Access que l'on me demande trs
frquemment.
DoCmd.ApplyFilter "", "[Nom du champ filtrer] LIKE '*' & '" &
Me.NomChampAvecCritere & "' '& '*'"
etc.
MS Office Access
392/564
Vincent ISOZ
MS Office Access
393/564
Vincent ISOZ
SQL = "CREATE table tblSuccursale (idSuccursale LONG, strVille CHAR(80),
CONSTRAINT idSuccursalePK PRIMARY KEY (idSuccursale) );"
DoCmd.RunSQL SQL
End Sub
394/564
Vincent ISOZ
'Il faut ajouter la rfrence Microsoft DAO 3.6 Object Library au projet (Outils/Rfrences)
Dim fl as DAO.Field
'Cre la dfinition de la table
Set tdfClient = CurrentDb.CreateTableDef("tblEffClients")
'Cre le 1er champ
With tdfClient
'Cre le premier champ
Set fld = .CreateField("strNomClient", dbText, 40)
.Fields.Append fld
'Cre le deuxime champ en utilisant une deuxime mthode
.Fields.Append .CreateField("intEffectif",dbInteger)
End With
CurrentDb.TableDefs.Append tdfClient
Set fld = Nothing
Set tdfClient = Nothing
End Sub
19.15 Imports/Exports
19.15.1 Import de donnes de MS Excel
'Vous vous rappelez de la table tblSorties80 que nous devions importer manuellement dans
MS Access ? Si oui, essayez de suite le code suivant:
Sub btnImport_Click()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel10,
"tblNouveuxVendeurs", _
"C:\TableNouveauxVendeurs.xls", True, "tblNouveuxVendeurs!A1:D4"
End Sub
'Si des lignes vides persistent vous pouvez faire lors de la requte d'ajout un nettoyage
pralable l'aide d'une requte de suppression.
MS Office Access
395/564
Vincent ISOZ
dlgSaveAs.Show
strFilePath = dlgSaveAs.SelectedItems(1)
' Export de la liste des e-mails de la newsletter
DoCmd.OutputTo acOutputQuery, "qrData", "ExcelWorkbook(*.xlsx)", strFilePath, True,
"", 0, acExportQualityPrint
End Sub
dont nous ne connaissons pas obligatoire l'emplacement mais dont le nom est suppos fixe et
le nombre de colonnes aussi et fourni avec la ligne d'en-tte de donnes dans une table
existante dans notre base appele tblTable dont les champs sont dj existants et dont le
contenu doit tre vid avant chaque import.
Voici le code qui peut tre gnralise relativement facilement:
MS Office Access
396/564
Vincent ISOZ
Sub ImportFile()
On Error Resume Next
Dim strFilePath As String, strFileName As String, strFullPath As String, strTableName As
String, strSeparator As String
Dim intFieldsNumber As Byte, i As Byte
Dim valSelect As Variant, MyDB As DAO.Database, MyRS As DAO.Recordset
'Target table name
strTableName = "tblTable"
'Separator for the csv file
strSeparator = ";"
Set MyDB = CurrentDb()
Set MyRS = MyDB.OpenRecordset(strTableName, dbOpenDynaset)
'The *.csv file must have the same number of columns as the target table and the columns
must be in the same order!
'The *.csv file is supposed to have column headers
strFilePath = ""
strFileName = "CSVANSIDonnees.csv"
intFieldsNumber = MyDB.TableDefs(strTableName).Fields.Count
If strFilePath = "" Then
strFilePath = GetDirectory
End If
strFullPath = strFilePath & "\" & strFileName
'First we clean the content of the existing target table (main practical situation)
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM " & strTableName
DoCmd.SetWarnings True
Open strFullPath For Input As #1
row_number = 0
Do Until EOF(1)
Line Input #1, LineFromFile
LineItems = Split(LineFromFile, strSeparator)
If row_number <> 0 Then
MyRS.AddNew
For i = 0 To intFieldsNumber - 1
MyRS(i) = LineItems(i)
Next i
MyRS.Update
End If
row_number = row_number + 1
Loop
End Sub
MS Office Access
397/564
Vincent ISOZ
Public Function GetDirectory(Optional OpenAt As Variant) As Variant
'Function purpose: To Browser for a user selected folder.
'If the "OpenAt" path is provided, open the browser at that directory
'NOTE: If invalid, it will open at the Desktop level
Dim ShellApp As Object
'Create a file browser window at the default folder
Set ShellApp = CreateObject("Shell.Application"). _
BrowseForFolder(0, "Merci de pointer le dossier contenant le fichier de donnes", 0,
OpenAt)
'Set the folder to that selected. (On error in case cancelled)
On Error Resume Next
GetDirectory = ShellApp.self.Path
On Error GoTo 0
'Destroy the Shell Application
Set ShellApp = Nothing
'Check for invalid or non-entries and send to the Invalid error
'handler if found
'Valid selections can begin L: (where L is a letter) or
'\\ (as in \\servername\sharename. All others are invalid
Select Case Mid(GetDirectory, 2, 1)
Case Is = ":"
If Left(GetDirectory, 1) = ":" Then GoTo Invalid
Case Is = "\"
If Not Left(GetDirectory, 1) = "\" Then GoTo Invalid
Case Else
GoTo Invalid
End Select
Exit Function
Invalid:
'If it was determined that the selection was invalid, set to False
GetDirectory = False
End Function
MS Office Access
398/564
Vincent ISOZ
Dim strPath As String
On Error GoTo ManageErrors
Set objDialog = Application.FileDialog(3)
With objDialog
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Access Databases", "*.mdb"
.Show
If .SelectedItems.Count = 0 Then
MsgBox "No file selected."
Else
strPath=Dir(.SelectedItems(1))
Call Attach_Tables(strPath)
End If
End With
Set objDialog = Nothing
Exit Sub
ManageErrors:
MsgBox "Failure with this version of MS Access! Contact administrator to update the
application", vbCritical + vbOKOnly, "Demo"
End Sub
Ce qui donne l'excution:
MS Office Access
399/564
Vincent ISOZ
Ensuite, nous rcuperons le fichier slectionn par l'utilisateur et le passons en paramtre dans
une autre routine qui va mettre jour le lien de toutes les tables et qui l'aide d'une fonction
va aussi nous permettre d'afficher si besoin est dans la fentre de dbuggage les chemins de
liaisons prcdents:
Function GetLinkedDBName(TableName As String)
'Ne pas oublier la Bibliothque d'objets Microsoft DAO 3.6
Dim db As DAO.Database, Ret As Variant, strLength As Integer
Set db = CurrentDb()
strLength = VBA.Strings.Len(CStr(db.TableDefs(TableName).Connect))
If strLength <> 0 Then
GetLinkedDBName = VBA.Strings.Right(db.TableDefs(TableName).Connect, strLength
- 10)
Debug.Print GetLinkedDBName
End If
End Function
Sub Attach_Tables(strPath As Variant)
Dim db As Database
Dim TD As TableDef
Dim i As Integer, Reponse As Variant, Ret As Variant
Set db = DBEngine.Workspaces(0).Databases(0)
Reponse = SysCmd(acSysCmdInitMeter, "Attache les tables", db.TableDefs.Count - 1)
MS Office Access
400/564
Vincent ISOZ
'boucle sur toutes les tables, rattachant celles dont chane
'de connection est non vide, les autres tant des tables locales
For i = 0 To db.TableDefs.Count - 1
Set TD = db.TableDefs(i)
GetLinkedDBName (db.TableDefs(i).Name)
If TD.Connect <> "" Then
TD.Connect = ";DATABASE=" & strPath
TD.RefreshLink
If Err <> 0 Then
MsgBox TD.Name
End If
End If
Reponse = SysCmd(acSysCmdUpdateMeter, i + 1)
Next i
DoCmd.Hourglass False
Reponse = SysCmd(acSysCmdClearStatus)
End Sub
401/564
Vincent ISOZ
En considrant le formulaire frmFournisseurs et le sous-formulaire frmArticlesEntrees (si
vous les avez pas faites-les, l'esthtique ne nous intresse d'ailleurs pas dans cet exemple):
Nous souhaiterions que tant que le Pays (strPays) n'est pas renseign, les contrles du sousformulaire (tblArticleNb, intNbUnites, datDateIn) soient bloqus. Pour ceci, sur l'vnement
Enter du champ tblArticleNb du sous-formulaire saisissez le code suivant:
MS Office Access
402/564
Vincent ISOZ
Aidez-vous de l'exemple suivant:
Dim ctl As Control
Dim frm As form
Set frm = Screen.ActiveForm
For Each ctl In frm
With ctl
Select Case.ControlType
'Etiquettes
Case acLabel
.ForeColor = vbBlue
'Zones de texte
Case acTextBox
.ForeColor = vbYellow
'Listes droulantes
Case acListBox, acComboBox
.ForeColor = vbRed
End Select
End With
frm.Caption = "Ceci est un exemple"
Next ctl
Remarque: si vous dsirez mettre un raccourci sur le "r" de Enregistrement il vous faudra dans
les proprits du bouton dans l'onglet Format et la proprit lgende, mettre un & devant la
lettre dsire comme on le fait dans Word, Excel, Outlook, etc.
Maintenant effacez ce bouton (il fonctionne videmment!) et crez un bouton de type Ajouter
enregistrement
Une fois ce bouton cr avec l'assistant, lorsque l'utilisateur cliquera dessus, le focus sera
toujours sur le bouton et malheureusement pas sur le champ strPrenom. Ce qui peut s'avrer
tre une source de perte de temps phnomnale et irritante de plus. Changeons cela! Allez
dans le code VBA vous y trouverez:
MS Office Access
403/564
Vincent ISOZ
Ces procdures vnementielles sont principalement intressantes lorsque l'on cre un code
vnementiel sur un nouveau bouton vierge de toute action.
Par exemple, en crant un nouveau bouton avec le code suivant:
Sub EditRecord_Click()
'Active l'dition des enregistrements du formulaire actif
Me.AllowEdits = True
Prnom.SetFocus
End Sub
MS Office Access
404/564
Vincent ISOZ
Nous avons vu l, un exemple d'vnement d'un bouton, mais il en existe galement pour le
formulaire dans son ensemble. Ds lors gauche slectionnez:
Les vnements relatifs "Form" (le formulaire en cours slectionn dans le projet) sont
visibles dans le menu de droite de la feuille de code. Vous comprenez donc que ces
vnements sont trs importants car ils vous ouvrent nombre de possibilits.
Par exemple, nous pourrions ajouter le code suivant (attention!!! prenez l'habitude d'insrer
des commentaires dans votre code!!):
Sub Form_AfterUpdate()
Me.AllowEdits = False
'voir les options de msgbox !!!
msgbox "L'enregistrement a bien t valid", vbok, "Confirmation"
End Sub
Ce code a pour effet de bloquer l'ajout de nouveaux enregistrements l'utilisateur une fois que
ce dernier en a entr un.
19.21 Filtres
Maintenant regardons ce que nous pouvons faire avec les filtres.
MS Office Access
405/564
Vincent ISOZ
Maintenant nous allons crer une macro avec l'assistant de macro: choisissez Appliquer un
filtre et informez le nom de la requte qui sera utilis comme filtre pour le formulaire.
Enregistrez ensuite la macro sous le nom mcrFiltre:
MS Office Access
406/564
Vincent ISOZ
Revenons maintenant notre bouton. Affichez les proprits de ce dernier et dans l'vnement
Sur clic cliquez sur la flche qui pointe sur le bas et slectionnez la macro mcrFiltre.
Testez maintenant votre bouton (si vous avez tout fait correctement, ce dernier doit
parfaitement fonctionner).
Revenons maintenant au VBA.
Affichez les proprits vnementielles du bouton filtre et sur l'vnement Sur clic cliquez sur
les trois petits points pour y saisir le code suivant:
Sub applicfiltr_Click()
Beep
MsgBox "Attention, vous allez activer un filtre par pays", _ vbOKOnly + vbInformation,
"Information"
DoCmd.RunMacro "mcrFiltre"
End Sub
Enregistrez le tout et testez votre bouton.
Maintenant crez comme vous le souhaitez un bouton sur le formulaire qui doit pouvoir
dsactiver le filtre!
Voici quand mme le code:
Forms!Contacts.FilterOn = False
MS Office Access
407/564
Vincent ISOZ
Vous pouvez travailler en groupe pour trouver la solution. Le premier qui trouve explique aux
autres comment il l'a fait. Je validerai la mthode si elle est bonne.
Lors de la cration de la zone, n'oubliez simplement pas de donner l'assistant une valeur
chaque option. Dans cet exemple, nous avons donn la valeur 1 l'option Tous les pays et la
valeur 2 l'option France.
Ce groupe d'option ne fait rien si on ne lui ajoute pas du code VBA vnementiel. Attachons
nous la tche. Mais d'abord nommez-le (proprits de l'ensemble) filteroptions
Affichez VBAE l'cran allez au sommet de la page de code et choisissez dans la liste
droulante des objets filteroptions et dans la liste droulante des vnements AfterUpdate et
saisissez le code suivant:
Sub filteroptions_AfterUpdate()
If filteroptions = 2 Then
resp = MsgBox("Vous avez activ le filtre par pays:" & Chr(13) & "France" & Chr(13)
& "Etes vous sr de vouloir continuer?", vbOKCancel + vbInformation, "Activation Filtre")
If resp = vbOK Then
Me.Filter = "[strPays]=France"
Me.FilterOn = True
Else
Exit Sub
End If
Else
Me.FilterOn = ""
MsgBox "Le filtre est dsactiv"
End If
End Sub
MS Office Access
408/564
Vincent ISOZ
Sub Form_ApplyFilter(Cancel As Integer, ApplyType as Integer)
If ApplyType = acShowAllRecord Then
'Active le bouton radio "Tous les pays"
filteroptions = 1
Else
'Tous les boutons radios sont dsactivs
filteroptions = Null
End If
End Sub
Nous avons maintenant un systme cohrent!
Lors de la cration de la zone, n'oubliez simplement pas de donner l'assistant une valeur
chaque bouton. Dans cet exemple, nous avons donn la valeur 1 au bouton Avec garantie et la
valeur 2 au bouton Sans garantie.
Nommez cette zone filteroptions galement et allez dans le VBA du formulaire pour activer
l'vnement After_Update et saisissez:
Private Sub filteroptions_AfterUpdate()
If filteroptions = 2 Then
Me.Filter = ""
Me.Filter = "[bolGarantie]=True"
Me.FilterOn = True
Else
Me.Filter = ""
Me.Filter = "[bolGarantie]=False"
Me.FilterOn = True
End If
End Sub
MS Office Access
409/564
Vincent ISOZ
et nous crivons:
MS Office Access
410/564
Vincent ISOZ
Private Sub strPays_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
With Me.strPays
.SetFocus
.Dropdown
End With
End Sub
19.21.5.3 Filtrage d'une liste droulante sur la de la saisie dans la liste droulante
L'ide est la mme qu'avant mais cette fois-ci nous allons filtrer la liste droulante des cantons
strCantons par rapport ce qui est tap dans cette mme liste car il y a des petites subtilits
prendre en compte pour ce type de scnario trs important et trs demand par les crateurs de
bases de donnes ds que le contenu des listes devient non ngligeable.
D'abord, il faut aller dans les proprits de la liste droulante strCantons du formulaire
frmClients pour mettre sa proprit Limit to list (Limiter la liste) No et enlever aussi le
code SQL se trouvant dans la proprit Row Source:
MS Office Access
411/564
Vincent ISOZ
Nous allons donc dfinir la procdure vnementielle suivante en y ajoutant par la mme
occasion l'vnement Form_Load la main:
Option Compare Database
Dim strChaine As String
Private Sub fkCanton_KeyDown(KeyCode As Integer, Shift As Integer)
strChaine = strChaine & Chr(KeyCode)
'Si l'utilisateur fait un "Home" (code ASCII 36) sur le clavier on considre
'qu'il veut recommencer et on lui expliquera au pralable que cela fonctionne ainsi
If KeyCode = 36 Then
strChaine = ""
Me.fkCanton = Null
End If
sqlCantons = "SELECT tblCantons.strCanton FROM tblCantons WHERE
tblCantons.strCanton like '" & strChaine & "*'"
Me.fkCanton.RowSource = sqlCantons
End Sub
Private Sub Form_Load()
sqlCantons = "SELECT tblCantons.strCanton FROM tblCantons"
MS Office Access
412/564
Vincent ISOZ
Me.fkCanton.RowSource = sqlCantons
End Sub
MS Office Access
413/564
Vincent ISOZ
et celui qui se nomme Sur absence dans liste. Si vous activez l'dition VBA de cet vnement,
saisissez-y le code suivant:
Private Sub strPays_NotInList(NewData As String, Response As Integer)
On Error GoTo cboJobTitle_NotInList_Err
Dim intAnswer As Integer
Dim strSQL As String
intAnswer = MsgBox("La rgion " & Chr(34) & NewData & _
Chr(34) & " n'existe actuellement pas dans la liste." & vbCrLf & _
"Souhaiteriez vous l'y ajouter?", vbQuestion + vbYesNo)
If intAnswer = vbYes Then
strSQL = "INSERT INTO tblRegions([strRegions]) " & "VALUES ('" & NewData &
"');"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
'La commande RunSQL ne fonctionne que pour des requtes d'action pour info
DoCmd.SetWarnings True
MsgBox "La rgion a bien t ajoute la liste", vbInformation
Response = acDataErrAdded
Else
MS Office Access
414/564
Vincent ISOZ
MsgBox "Veuillez choisir un lment existant dans la liste.", vbInformation, Response =
acDataErrContinue
End If
cboJobTitle_NotInList_Exit:
Exit Sub
cboJobTitle_NotInList_Err:
MsgBox Err.Description, vbCritical, "Error"
Resume cboJobTitle_NotInList_Exit
intReponse = MsgBox(NewData & " ne figure pas dans la liste, souhaitez-vous l'ajouter ?",
vbYesNo)
End Sub
Ds lors, si vous saisissez quelque chose qui n'est pas dans la liste:
Remarque: Il est possible maintenant que vous souhaitiez empcher tout utilisateur de changer
votre code VBA. Pour ce faire, cliquez avec le bouton droit de la souris dans le VBAE sur un
des modules et slectionnez Proprits de.. Vous y verrez un onglet nomm Protection:
MS Office Access
415/564
Vincent ISOZ
Attention n'oubliez pas d'activer la case cocher et d'y mettre un mot de passe convenable (12
caractres minimum, mlange de majuscule, minuscules et de chiffres).
On rappelle galement que lorsque l'on utilise du VBA, il est prfrable lors du dmarrage de
l'application MS Access de restreindre au maximum la libert de l'utilisateur (cela vite les
problmes).
Pour cela (cela est cens tre un rappel) allez dans:
Outils/Dmarrage
1. Dfinissez un titre pour l'application
2. Choisissez une icne (vous pouvez en tlcharger sur www.sciences.ch)
3. Choisissez le formulaire afficher au dmarrage de l'application
4. Dcochez absolument tout
Au besoin, il est possible de crer un fichier MDE de votre base MS Access (mais faites en
une copie de sauvegarde au pralable) ce qui pour avantage (entre autres) de crypter le code
VBA:
MS Office Access
416/564
Vincent ISOZ
Crez aussi une requte qryMultiple depuis la table tblSorties. Vous n'avez pas besoin de
spcifier de paramtres ils seront automatiques supprims avec le code VBA.
Crez enfin un bouton nomm btnQuery sur le formulaire frmReqMultiple qui ouvre la
requte:
Dans l'vnement After_Update (Aprs MAJ) de la liste choix multiple, crivez le code
suivant:
Private Sub btnQuery_Click()
MS Office Access
417/564
Vincent ISOZ
Dim MyDB As DAO.Database
Dim qdef As DAO.QueryDef
Dim i As Integer
Dim strSQL, strWhere, strIn As String
Dim varItem As Variant
Set MyDB = CurrentDb()
strSQL = "SELECT * FROM tblSorties"
For i = 0 To lstArticles.ListCount - 1
If lstArticles.Selected(i) Then
strIN = strIN & "'" & lstArticles.ItemData(i) & "',"
End If
Next i
strWhere = " WHERE [tblArticleNb] in (" & Left(strIN, Len(strIN) - 1) & ")"
MyDB.QueryDefs.Delete "qryMultiple"
Set qdef = MyDB.CreateQueryDef("qryMultiple", strSQL)
DoCmd.OpenQuery "qryMultiple", acViewNormal
For Each varItem In Me.lstArticles.ItemsSelected
Me.lstArticles.Selected(varItem) = False
Next varItem
End Sub
MS Office Access
418/564
Vincent ISOZ
Comme vous pouvez le voir, les vnements existants sont nombreux et il faudrait plusieurs
heures de cours pour faire un exemple intressant et concret de chaque vnement. On vous
demandera donc de vous rfrer l'abondante littrature disponible dans MS Access.
Dfinissons un vnement Sur Entre de la liste des pays du formulaire frmClients de telle
faon ce qu'il redevienne blanc lorsque l'utilisateur ouvre la liste.
Il vous suffit de taper le code suivant l'endroit o vous savez:
Sub strPays_Enter()
strPays.BackColor=1677215
End Sub
Lorsque l'utilisateur sort de la liste droulante on met cette dernire en gris clair (pourquoi
pas?):
Sub strPays _Exit()
strPays.BackColor=12632256
End Sub
MS Office Access
419/564
Vincent ISOZ
L'vnement qui a lieu lorsque l'utilisateur sort d'un champ de formulaire aprs avoir chang
sa valeur est l'vnement: APRES MAJ (Mise A Jour)
Voyons maintenant les vnements du clavier. Nous allons faire en sorte que lorsque
l'utilisateur fait la combinaison de touches CTRL+1 dans les champs strCanton et strPays se
remplissent automatiquement en fonction de notre choix.
Voici le code saisir dans l'vnement du champ ville:
Sub strCanton_KeyDown(KeyCode as Integer, Shift as Integer)
If KeyCode = 49 and Shift=2 then
strCanton = "Vaud"
strPays = "Suisse"
End If
End Sub
Evidemment, par choix cette combinaison de touches ne fonctionne que dans le champ
strCanton et non pas dans le formulaire en entier. Pour ce faire, nous pouvons taper le code
suivant:
Sub Form_KeyDown(KeyCode as Integer, Shift )
If KeyCode = 49 and Shift=2 then
strCanton = "Vaud"
strPays = "Suisse"
End If
End Sub
Simple non ?
Quand l'utilisateur essaie de sauver un enregistrement, l'vnement Aprs MAJ s'excute.
Ecrivez le code suivant:
Sub Form_BeforeUpdate(Cancel as Integer)
'Si l'utilisateur entre un adresse on fait un check sur le CP
Dim bytchoice as Byte
If IsNull(strRue) Xor IsNull(strNPA) Then
bytchoice = msgbox("Vous avez oubli le NPA. Sauvegarder quand
mme?", vbquestion+vbokcancel, "Message")
If bytchoice = vbcancel Then
'On pointe le focus sur le NPA
strNPA.SetFocus
'On annule l'enregistrement
Cancel = True
End If
End If
End Sub
MS Office Access
420/564
Vincent ISOZ
19.24 Fonctions
Maintenant intressons nous un petit peu aux fonctions et voyons leur utilit. Si vous ouvrez
le notre formulaire frmClients et passez en mode cration. Si vous descendez l'aide de la
barre dfilement vous verrez la chose suivante:
On va s'intresser au code contenu dans le champ Nom Contact et le remplacer par un appel
de fonction de notre cr.
Basculez en mode VBAE et tapez le code suivant:
Function Fullname() As String
Fullname = Prnom & " " & Nom
End Function
Rappel: Le "private" force la fonction tre reconnue uniquement dans ce formulaire.
Maintenant en lieu et place du code barbare et peu esthtique du champ de formulaire, tapezy:
=FullName()
Avouez que c'est plus esthtique quand mme!
Si vous souhaitez utiliser une fonction (qui peut faire plusieurs milliers de lignes de code car
il n'y a pas de limite l'imagination) dans plusieurs formulaires il faudra remplacer le
"Private" par "Public".
MS Office Access
421/564
Vincent ISOZ
Ce qui il faut le dire, est trs clair pour un non-initi
Changeons un peu cela. Passez le formulaire en mode cration et affichez les proprits
vnementielles du formulaire. Il y a un champ qui se nomme Sur erreurs (il est presque en
dernier dans la liste). On va y taper du code VBA de faon avoir la chose suivante:
Sub Form_Error(DataErr As Integer, Response As Integer)
MsgBox "Erreur de saisie! Veuillez contacter votre responsable informatique",
vbRetryCancel + vbCritical, "Message"
Debug.Print "DataErr= "; DataErr
End Sub
Evidemment, nous pouvons faire beaucoup mieux mais partir de l il suffit d'utiliser son
imagination et de la faire correspondre au cahier des charges.
Mais il reste un problme c'est que l'on a un seul et unique message pour toutes les erreurs?
Eh bien, maintenant le code du debug.print va nous permettre d'identifier le numro de
l'exception (ou erreur) engendre pas Access. Comme vous pouvez le voir il s'agit de l'erreur
3314 qui est l'erreur gnre par dfaut lorsqu'un champ obligatoire n'a pas t rentr. Ds
lors, avec cette mthode on peut faire quelque chose de beaucoup mieux comme:
Sub Form_Error(DataErr As Integer, Response As Integer)
Const ErrFielrequired = 3314
If DataErr = ErrFielrequired Then
MsgBox "Erreur de saisie! Veuillez contacter votre responsable informatique",
vbRetryCancel + vbCritical, "Message"
Response=acDataErrContinue
Else
'Force les messages d'erreurs standards d'Access
Response = acDataErrDisplay
End If
End Sub
19.26 Calendriers
Rappelez-vous de la requte que nous avions cre avec le formulaire:
Le systme tait bon mais avec un formulaire de type calendrier par fomulaire partir d'un
certain moment cela devient indigeste non ?
MS Office Access
422/564
Vincent ISOZ
Avec nos connaissances actuelles nous allons pouvoir considrablement allger le systme
afin d'avoir qu'un seul formulaire.
La procdure est la suivante:
Dans un module nomm modCalendar crivez le code suivant:
'Varaible globale
Public global_value As Integer
Public Sub RmpFormulaire(insert_value As Integer)
global_value = insert_value
End Sub
Dans le code du bouton d'ouverture du premier calendrier du premier champ rajoutez au dbut
(il faut changer la valeur passe en paramtre chaque fois entre paranthses):
Public Sub btnNomBouton_Click()
modCalendar.RmpFormulaire(1)
End Sub
et faites de mme avec le deuxime bouton du deuxime champ mais cette fois avec la valeur
(2) par exemple. Enfin, dans l'vnement OnClose du calendrier saisissez cette fois le code:
Private Sub Form_Close()
If global_value = 1 Then
Forms!frmNomFormulaireAvecDate!NomChampDateDbut = NomCalendrier.Value
Else
Forms!frmNomFormulaireAvecDate!NomChampDateFin = NomCalendrier.Value
End If
End Sub
Pour ceux qui n'aiment pas le VBA, il est toujours possible d'utiliser une petite macro simple
(alternative). Effectivement, sur le formulaire frmRapport contenant les deux boutons pour
ouvrir le calendrier nous avons un champ texte masqu l'utilisateur et nomm txtCalendrier.
Considrons le formulaire frmCalendrier avec le calendrier objCal ci-dessous avec une macro
macCalendrier execute la fermeture du formulaire:
MS Office Access
423/564
Vincent ISOZ
MS Office Access
424/564
Vincent ISOZ
3. Quand le calendrier est ferm, la macro macCalendrier.OuvreFormtxtDebutPeriode
continue a s'executer. Elle va ensuite copier la valeur qui se trouve dans notre champ
masqu, dans le champ qui correspond au date de dbut de priode tel que:
Item: [Forms]![frmRapport]![txtDebutPeriode]
Expression: [Forms]![frmRapport]![txtCalendrier]
4. Ensuite la macro s'arrte et c'est termin
19.27 Identification
L'ide est de construire un formulaire d'identification (demandant un mot de passe), pour
limiter l'accs d'autres formulaires ou tats. Par exemple:
-
Au pralable, un formulaire Identification s'affiche. Tant que l'utilisateur n'a pas fourni
un mot de passe correct, il n'accde pas frmClients ou rptClients.
L'autre objectif est que ce formulaire soit rutilisable: pas question d'en crer un pour chaque
formulaire ou tat "protger" !
La procdure dveloppe dans les lignes qui suivent doit tre vue comme une protection
lmentaire. Si vous souhaitez vraiment scuriser votre base de donnes, consultez plutt le
chapitre consacr la scurit.
Pour des raisons de programmation vnementielle, nous simplifierons la gestion du mot de
passe en passant par une variable globale, laquelle indiquera si le mot de passe a t trouv ou
non par l'utilisateur:
Dans la fentre de Base de donnes, cliquez sur l'onglet Modules, puis sur le bouton Nouveau.
Tapez le code suivant dans le module:
Public blnPasswordOK As Boolean
Enregistrez le module sous le nom modPassword, par exemple.
On dclare ici une variable globale (donc visible depuis tout endroit de la base de donnes).
Cette variable est boolenne: elle vaudra False (Faux) tant que le mot de passe n'est pas
trouv, et True (Vrai) si le mot de passe a t tap correctement.
MS Office Access
425/564
Vincent ISOZ
Construisez maintenant le formulaire d'identification. Le formulaire comporte 3 objets
principaux, dtaills ci-dessous.
Il sera enregistr sous le nom frmPassword.
Nom de l'objet
Type d'objet
Icne
Remarques
txtMotDePasse
Zone de texte
btnOK
Bouton de
commande
btnAnnuler
Bouton de
commande
Si le formulaire frmPassword s'ouvre, c'est qu'un mot de passe va tre demand puis vrifi.
On suppose donc qu' l'ouverture, le mot de passe n'est pas encore connu.
1. Ouvrez le formulaire frmPassword en mode Cration.
2. Faites apparatre les proprits du formulaire, et cliquez sur l'onglet Evnement.
3. "Entrez" dans l'vnement Sur ouverture, et faites en sorte qu'il reprenne le code
suivant:
Sub Form_Open(Cancel As Integer)
'Rinitialiser l'tat du mot de passe
' (blnPasswordOK est une variable globale)
blnPasswordOK = False
End Sub
Le code du bouton OK:
1. Faites apparatre les proprits du bouton btnOK, et cliquez sur l'onglet Evnement.
2. "Entrez" dans l'vnement Sur clic, et tapez ce qui suit:
Sub btnOK_Click()
If IsNull(Me.txtMotDePasse) Then
MsgBox "Tapez un mot de passe !", vbInformation
Me.txtMotDePasse.SetFocus
Exit Sub
End If
If Me.txtMotDePasse = "TopSecret" Then
MS Office Access
426/564
Vincent ISOZ
' Fermer la bote de dialogue "Identification"
DoCmd.Close
blnPasswordOK = True
Else
MsgBox "Mot de passe incorrect.", vbExclamation
Me.txtMotDePasse.SetFocus
End If
End Sub
Attention!!! Grer les utilisateurs et les mots de passe directement dans VBA est un
dgueulasse comme mthode. Il vaut mieux avoir une table aloue ce travail l.
Comme vous le voyez, 2 conditions sont appliques:
1. La premire vrifie qu'un mot de passe a bien t tap, et ramne sinon sur la zone de
saisie.
2. La seconde vrifie que le mot de passe est exact, et ferme le formulaire si c'est le cas.
Sinon, un message est affich, et l'utilisateur est nouveau ramen sur la zone de
saisie.
Comme il a t dit plus haut, il ne s'agit pas d'une scurit ultime ! Vous notez que le mot de
passe est simplement tap en clair dans le code VBA.
Vous pouvez amliorer le tout en crant une table de mots de passe, et en la lisant par ADO,
DAO, SQL ou une fonction de domaine (ce que vous voulez, quoi !), mais dans ce cas,
n'oubliez pas que l'utilisateur peut y accder encore plus facilement.
Le code du bouton Annuler:
Ce code sert juste fermer le formulaire. Il suffit donc d'crire:
DoCmd.Close
Rappelez-vous que la variable blnPasswordOK a t rgle False lors de l'ouverture du
formulaire. Par consquent, un appui sur le bouton Annuler suppose galement que
l'utilisateur n'a pas trouv le mot de passe.
Maintenant que la gestion du mot de passe est en place, il suffit d'y faire appel lorsqu'on ouvre
un formulaire ou un tat quelconque.
1. Ouvrez un formulaire ou un tat.
2. Faites apparatre les proprits (notamment les vnements) de ce formulaire ou de cet
tat.
3. Programmez l'vnement Sur ouverture comme suit:
Sub Form_Open(Cancel As Integer)
DoCmd.OpenForm "frm Password", acNormal, , , , acDialog
Cancel = Not blnPasswordOK
MS Office Access
427/564
Vincent ISOZ
End Sub
Le paramtre acDialog est important:
MS Office Access
428/564
Vincent ISOZ
MS Office Access
429/564
Vincent ISOZ
'ncessite librairie DAO
Dim wrk As Workspace
Dim grp As DAO.Group
Set wrk = DBEngine.Workspaces(0)
With wrk
Set grp = .CreateGroup("Mongroupe", "AZERty12456")
Groups.Append grp
End With
End Sub
'***********************
'Crer un utilisateur
'***********************
Sub CreerUtilisateur()
'ncessite librairie DAO
Dim wrk As Workspace
Dim usr As DAO.User
Set wrk = DBEngine.Workspaces(0)
With wrk
Set usr = .CreateUser("Jacques", "567AzeRTY89", "mon_motdepasse")
.Users.Append usr
End With
End Sub
'***********************
'Supprimer un groupe utilisateur
'***********************
Sub SupprGroupe()
'ncessite librairie DAO
Dim wrk As Workspace
Set wrk = DBEngine.Workspaces(0)
With wrk
.Groups.Delete "Mongroupe"
End With
End Sub
'***********************
'Supprimer un utilisateur
'***********************
Sub SupprUtilisateur()
MS Office Access
430/564
Vincent ISOZ
'ncessite librairie DAO
Dim wrk As Workspace
Set wrk = DBEngine.Workspaces(0)
With wrk
.Users.Delete "Jacques"
End With
End Sub
'***********************
'Affecter un utilisateur un groupe
'***********************
Sub AffectUserGroupe()
'ncessite librairie DAO
Dim Wrk As Workspace
Dim Usr As DAO.User
Dim Grp As DAO.Group
Dim grpAffect As DAO.Group
Set Wrk = DBEngine.Workspaces(0)
With Wrk
Set Usr = .Users("Jacques")
Set Grp = .Groups("Mongroupe")
Set grpAffect = Usr.CreateGroup("Mongroupe")
Usr.Groups.Append grpAffect
End With
End Sub
'***********************
'Lister des groupes et des utilsateurs
'***********************
Sub ListeGrpUsr()
Dim Wrk As Workspace
Dim Grp As DAO.Group
Dim Usr As DAO.User
Set Wrk = DBEngine.Workspaces(0)
With Wrk
Debug.Print "Groupes:"
For Each Grp In .Groups
Debug.Print " " & Grp.Name
Debug.Print " Contient les membres suivants:"
If Grp.Users.Count <> 0 Then
For Each Usr In Grp.Users
Debug.Print " " & Usr.Name
Next Usr
MS Office Access
431/564
Vincent ISOZ
Else
Debug.Print " Aucun Membre"
End If
Next Grp
End With
End Sub
'***********************
'Bloquer l'utilisation de la touche Shift au dmarrage (code activer qu'une seule fois)
'Pour ractiver la fonctionnalit, il faudra crer un bouton qui sera visible que par certains
utilisateurs
'***********************
Sub DisableShiftKey()
Dim db As DAO.Database
Dim prp As DAO.Property
Set db = CurrentDb
db.Properties.Delete "AllowBypassKey"
Set prp = db.CreateProperty("AllowBypassKey", dbBoolean, False, True)
db.Properties.Append prp
db.Properties.Refresh
Set prp = Nothing
Set db = Nothing
End Sub
19.29 Automation
19.29.1 Ouvrir MS Excel et y faire des tratements
Sub OuvreFichierExcel1()
Dim strPath, strFileName As string
Dim objExpWorkb As Workbook
strPath="C:\"
strFileName="FichierExcelOuEcrire.xls"
Set objExpWorkb = Excel.Workbooks.Open(strPath & strFileName)
objExpWorkb.Worksheets("sheet1").Range("A1").Value="a marche ! O_o"
objExpWorkb.Save
objExpWorkb.Close
Set objExpWorkb = Nothing
'Et on ouvre le fichier...
Call Shell("C:\Program Files\Microsoft Office\OFFICE11\excel.exe c:\test.xls", 1)
MS Office Access
432/564
Vincent ISOZ
End Sub
Si vous dveloppez une nouvelle application, vous pouvez utiliser le modle ADO mme si
votre application accde une base de donnes locale de type MS Access. Si vous souhaitez
par la suite migrer vos donnes sous MSDE (Microsoft Data Engine) ou SQL Server, votre
code fonctionnera de faon optimale.
La bibliothque d'objets D.A.O. prend en charge deux environnements de bases de donnes
diffrentes, appeles "espaces de travail":
1. Les espace de travail "Microsoft Jet": ils permettent d'accder des bases de donnes
de type MS Access, des serveurs de bases de donnes ODBC (Open Database
Connectivity) et des bases de donnes externes telles que dBase, MS Excel et
Paradox accessibles via un pilote ISAM (Indexed Sequential Access Method)
2. Les espaces de travail ODBCDirect: ils permettent d'accder des serveurs de base de
donnes ODBC de faon "directe", c'est--dire sans charger le moteur de base de
donnes Microsoft Jet. Cet espace de travail est par consquent recommand pour
excuter des requtes, des procdures stockes, ou des fonctions spcifiques ODBC
sur un serveur distant de type SQL Server.
Frquemment en VBA, on peut avoir besoin de lire ou de parcourir le contenu d'une table afin
d'y extraire ou d'y crire une donne et de manipuler cette dernire afin de l'afficher l'cran
ou de la remplacer par une autre.
Pour cela, le code devient un petit peu plus complexe. Prenons le morceau de code suivant:
433/564
Vincent ISOZ
'N'oubliez pas d'ajouter si ce code ne fonctionne pas la rfrence Microsoft D.A.O 3.6 (et
non pas la Access Object Library!)
'Variable qui contient ce que l'on veut insrer dans la table (string arbitrairement)
Dim NewData As String
'le dbs est ici pour signifier DataBaSe (cela simplifie la relecture)
Dim dbs As DataBase
'le rst est ici pour signifier RecordSeT (cela simplifie la relecture)
Dim rstNomLigne As DAO.Recordset
Dim tdfNomTable As TableDef
Dim fldNomTable As Field
T = Timer 'juste pour le plaisir de compter le temps que cela prend!
'Pour ouvrir virtuellement la table utilise par le formulaire en cours, il faut d'abord dfinir
la base de donne que l'on souhaite ouvrir (le 99% du temps il s'agit de la courante)
Set dbs = CurrentDb' 'Evidemment si ce sont des tables externes lies il faudra mettre le
chemin du fichier *.mdb
'On peut afficher dans la fentre d'excution chaque champ de la table
Set tdfNomTable = dbs.TableDefs!NomTable
For Each fldNomTable In tdfNomTable.Fields
Debug.Print fldNomTable.Name
Next fldNomTable
'Maintenant on souhaite ajouter une valeur dans un des champs
de la table donc on ouvre virtuellement cette dernire
Set rstNomLigne = dbs.OpenRecordset("NomTable")
rstNomLigne.AddNew
'Attention ici il faut faire attention selon la table remplir chacun des champs du recordset
rstNomLigne!NomChamp = NouvelleDonnee
rstNomLigne.Update
'Si la table se trouve dans un sous-formulaire il faut alors faire un refresh du formulaire
'principal en utilisant NomDuFormulaire.Refresh
msgbox "Routine excute en: " & Timer - T & " s"
'Maintenant on souhaite lire un des champs de la table ligne par ligne
Set Rs = dbs.OpenRecordset("tblLangues", dbOpenTable)
Rs.MoveFirst
Do Until Rs.EOF
MsgBox Rs![NomDuChamp]
'ou msgbox Rs.Fields(NomDuChamp)
Rs.MoveNext
Loop
End Sub
Si vous souhaitez faire des importations dans MS Word ou tout autre programme MS Office,
vous pouvez galement utiliser les proprits, objets et mthodes DAO de la mme faon que
vous utilisez les proprits, objets et mthodes Microsoft Word et que vous leur faites
rfrence. Une fois que vous avez cr une rfrence la bibliothque d'objets DAO, vous
pouvez ouvrir des bases de donnes, crer et excuter des requtes pour extraire un ensemble
d'enregistrements et renvoyer les rsultats Word.
Avant de pouvoir utiliser DAO, vous devez crer une rfrence la bibliothque d'objets
DAO. Pour ce faire, effectuez la procdure suivante.
MS Office Access
434/564
Vincent ISOZ
Activez Visual Basic Editor dans MS Word par exemple. Ensuite, dans le menu Outils,
cliquez sur Rfrences. Dans la zone Rfrences disponibles, cliquez sur Microsoft DAO 3.6
Object Library.
Si Microsoft DAO 3.6 Object Library n'est pas affich dans la zone Rfrences disponibles,
excutez le programme d'installation d'Office Professional pour installer Data Access Objects
pour Visual Basic. La bibliothque d'objets Microsoft DAO 3.6 Object Library n'est pas
incluse dans la version autonome de Word ou dans l'dition Microsoft Office 2000 Standard.
Cet exemple montre comment ouvrir la base de donnes depuis MS Word et insrer les
lments de la table tblArticles dans le document actif.
Sub EcrireAccess()
'N'oubliez pas d'ajouter la Microsoft D.A.O 3.6 (et non pas la Access Object Library!)
Set Db = DBEngine.OpenDatabase(Name:="C:\" & "base.mdb")
Set Rs = Db.OpenRecordset(Name:="tblPays")
'Attention Microsoft recommande lorsqu'on utilise RecordCount de faire un move last
avant (rs.MoveLast) et de refaire un MoveFirst juste aprs
For I = 0 To Rs.RecordCount - 1
Selection.InsertAfter Text:=Rs.Fields(1).Value
Rs.MoveNext
Selection.Collapse Direction:=wdCollapseEnd
Selection.InsertParagraphAfter
Next I
Rs.Close
Db.Close
Set Rs. = Nothing
Set Db = Nothing
End Sub
Utilisez la mthode OpenDatabase pour tablir une connexion une base de donnes et
l'ouvrir. Une fois la base de donnes ouverte, utilisez la mthode OpenRecordset pour accder
un tableau ou excuter une requte. Pour vous dplacer dans l'ensemble d'enregistrements,
utilisez la mthode Move. Pour rechercher un enregistrement donn, utilisez la mthode Seek
(cette mthode ne fonctionne pas sur une table lie). Si vous n'avez besoin que d'un sousensemble d'enregistrements et non de la totalit de l'ensemble d'enregistrements, utilisez la
mthode CreateQueryDef pour crer une requte personnalise afin de slectionner les
enregistrements rpondant vos critres. Lorsque vous avez fini d'utiliser une base de
donnes, nous vous conseillons de la fermer en utilisant la mthode Close, afin d'conomiser
de la mmoire.
Autre exemple qui consiste transformer en majuscules les caractres d'un champ de donne
nomme "Catgories" d'une table nomme "Employs":
Sub Majuscules()
Dim bd As Database
Dim rs As DAO.Recordset
Set bd = CurrentDB 'Evidemment si ce sont des tables externes lies il faudra mettre le
chemin du fichier *.mdb
Set rs=bd.OpenRecordset("Employs", dbOpenTable)
Rs.MoveFirst
MS Office Access
435/564
Vincent ISOZ
Do Until rs.EOF
Rs.edit
Rs![catgorie]=Ucase(rs![catgorie])
Rs.update
Rs.MoveNext
Loop
Rs.Close
End Sub
Autre exemple consistant mettre jour certains enregistrements en utilisant une requte
pour les slectionner. Le code est affecter un bouton de commande. Il permet d'augmenter
le salaire d'une catgorie d'employs d'un certain pourcentage. La catgorie et le pourcentage
d'augmentation sont slectionns dans deux zones de liste modifiable du formulaire (ce
dernier est bien entendu rfrenc par le mot-cl Me). Une requte paramtre "Employs
d'une catgorie" permet de slectionner les enregistrements mettre jour.
Sub MiseAJourAvecQuery()
Dim bd As Database
Dim rs As Recordset
Dim Q As QueryDef
Set bd = CurrentDb
If IsNull (Me![lstCatgorieAugmentation]) Or IsNull(Me![lstPourcentage]) Then
MsgBox "Vous devez slectionner une catgorie et un pourcentage", , "Attention erreur"
Else
Set q = bd.QueryDefs("Employs d'une catgorie")
q.Parameters(0)=Me![lstCatgorieAugmentation]
Set rs = q.OpenRecordset()
Rs.MoveFirst
'La structure For I=0 To ne fonctionne pour les requtes priori donc on passe par un
Do Until pour lire la requte ligne par ligne
Do Until rs.EOF
Rs.Edit
Rs![Salaire] = rs![Salaire].*(1+Me![lstPourcentage])
Rs.update
Rs.MoveNext
Loop
Rs.close
End if
End Sub
436/564
Vincent ISOZ
rstCli.MoveFirst
With rstCli
Do Until .EOF
.Edit
rstCli("strNom") = UCase(rstCli("strNom"))
.Update
.MoveNext
Loop
End With
End Sub
Et voici le code:
Sub RechercheInfo1()
'Ce programme recherche une info
Dim dbs As Database
Dim rstCli As DAO.Recordset
Dim strCodeCli As String
Set dbs = CurrentDb
Set rstCli = dbs.OpenRecordset("tblClients", dbOpenTable)
With rstCli
strNomClient = InputBox("Saisissez le nom du client")
.Index = "indNom"
.Seek "=", strNomClient
If .NoMatch Then
MS Office Access
437/564
Vincent ISOZ
MsgBox "Client non trouv"
Else
MsgBox "Prnom: " & rstCli("strPrenom")
End If
End With
rstCli.Close
End Sub
Nous pouvons faire galement un autre moteur de recherche en utilisant la mthode Find:
Sub RechercheInfo2()
Dim dbs As DAO.Database
Dim rstCli As DAO.Recordset
Dim strsoc As String
Dim strCrit As String
Set dbs = CurrentDb
Set rstCli = dbs.OpenRecordset("tblClients", dbOpenSnapshot)
With rstCli
'saisi du nom client
strsoc = InputBox("Saisissez les 1re lettres de du nom du client")
.MoveLast
'Recherche
strCrit = "strNom Like '" & strsoc & "*'"
.FindFirst strCrit
'Enregistrement non trouv
If .NoMatch Then
MsgBox "Client non trouv"
Else
'Si trouve: recherche des suivants
Do While True
MsgBox rstCli("strNom")
.FindNext strCrit
If .NoMatch Then Exit Do
Loop
End If
End With
End Sub
438/564
Vincent ISOZ
Set query1 = db.QueryDefs("qryCreateBackUp")
'Sets reference to query name specified
query1.Execute 'runs query
Set db = Nothing
Set query1 = Nothing
End Sub
19.30.2 A.D.O
La bibliothque d'objets A.D.O. vous permet d'crire une application qui accde des
donnes situes sur un serveur de bases de donnes et de manipuler celles-ci par les biais d'un
fournisseur OLE DB.
ADO a l'avantage d'tre facile d'emploi, performant et d'utiliser peu de mmoire et d'espace
disque. ADO offre les fonctionnalits de base permettant de crer des applications
client/serveur et des applications Web.
Pour pouvoir utiliser la bibliothque d'objets ADO, il est ncessaire de cocher la rfrence
Microsoft ActiveX Data Objects 2.x Library:
dans la liste des rfrences aux bibliothques d'objets. Si cette rfrence n'est pas disponible,
vous devez slectionner le fichier MSA-DO15.dll parti du bouton de commande Parcourir.
OLE DB est une technologie permettant un accs uniforme aux donnes stockes dans
diverses sources d'informations: bases de donnes relationnelles ou non, messageries,
systmes de fichiers Quasiment toutes les donnes de l'entreprise sont accessibles par OLE
DB.
ADO est l'interface de rfrence de programmation utilis pour accder aux donnes de tous
les fournisseurs de donnes OLE DB:
MS Office Access
439/564
Vincent ISOZ
Exemples:
Voici le morceau de code ncessaire la cration d'une rfrence sur la base de donnes
courante en ADO:
Dim cncMagasin as ADODB.Connection
Set cncMagasin = CurrentProject.Connection
une base de donnes MS Access:
Dim cncMagasin as ADODB.Connection
Set cncMagasin = New ADODB.Connection
cncMagasin.Open Provider=Microsoft.Jet.OLEDB.4.0.; Data Source = C:\Magasin.mdb
une base de donnes SQL Server
Dim cnn as ADODB.Connection
cnn.Open Provider=SQLOLEDB.1;Data Source=SRV; Initial Catalog=NomBase;
Integrated Security=SSPI; Persist Security Info=False
Voici un exemple plus tendu o nous allons dans notre base de donnes Magasin changer le
champ strPays de la table tblClients pour mettre tous les "France" la valeur "Suisse":
Sub MiseAJour()
Dim cnc as ADODB.Connection
Dim strSQL as String
Set strMessage As String
Set cnc = CurrentProject.Connection
StrSQL = "UPDATE tblClients SET strPays = 'Suisse' WHERE strPays='France' "
cnc.Execute strSQL
'Demande l'utilisateur s'il veut confirmer la mise jour
MS Office Access
440/564
Vincent ISOZ
If MsgBox("Confirmez-vous la mise jour des pays ?", vbYesNo) = vbYes Then
'Enregistre les modifications
cnc.CommitTrans
Else
'Annule les modification
cnc.RollbackTrans
End If
End Sub
Le but des exercices qui vont suivre sera de faire communiquer MS Excel et MS Access dans
un sens unique et ensuite par complexit croissante, dans les deux sens.
MS Office Access
441/564
Vincent ISOZ
'On ouvre la base de donnes clients
ADOCnn.Open ("c:/Magasin.mdb")
Set ADOTab = New ADODB.Recordset
'On ouvre la base table tblClients de la base de donnes Magasin.mbd
ADOTab.Open "tblClients", ADOCnn, adOpenDynamic, adLockOptimistic
msgbox
Do While ADOTab.EOF = False
Index = Index + 1
ADOTab!strPrenom = Vincent
ADOTab.MoveNext
Loop
ADOCnn.Close
Set ADOCnn = Nothing
End Sub
Et mettez un point d'arrt sur la ligne suivante:
Donc l'utilisateur devra annuler ses modifications (avecla touche ESCdu clavier) sur la ligne
que le code est entraint de traiter. adLockPessimistic est donc un mode exclusif pour le code
VBA
Avec adLockReadOnly le code VBA ne marchera simplement pas car ce curseur ne permet
que la lecture d'informations par le code et non pas la modification. Les utilisateurs peuvent
bien videmment faire n'importe quelle modification et la valider lorsque le code ne fait que
de lire des informations.
MS Office Access
442/564
Vincent ISOZ
Avec adLockBatch les mises jour et blockages des lignes ne sont font qu'une fois le code
totalement termin avec une commande spciale.
MS Office Access
443/564
Vincent ISOZ
Set ADOCnn = Nothing
End Sub
MS Office Access
444/564
Vincent ISOZ
videmement il est possible de faire beaucoup mieux avec des connaissances de VBA
supplmentaires (suivre un cours MS Word ou VBA pour cela).
MS Office Access
445/564
Vincent ISOZ
8me exemple:
Dim Result as variant
Result = DLookup("FieldName","TableName","Criteria= " &
Format(Forms!FormName!ControlName, "\#mm-dd-yyyy hh:mm:ss\#"))
9me exemple:
Dim Result as variant
Result = DLookup("FieldName","TableName","Criteria1= " &
Forms!FormName!Control1 & " AND Criteria2 = '"& Forms!FormName!Control2 & "'" & "
AND Criteria3 = #" & Forms!FormName!Control3 & "#")
Les syntaxes ci-dessus ont t prises sur le site web www.mvps.org (heureusement qu'il y en a
qui ont cherch avant nous)
Crez maintenant dans la base Magasin.mdb une table tblCrediteurs qui sera une copie de la
table clients au niveau de la structure des champs mais videz-y les enregistrements existants.
Crez une fomulaire frmCrediteurs permettant de remplir cette table de deux manires:
1. Dans une liste droulant la possibilit de choisir comme crditeur un individu qui est
client du magasin ou de saisir dans cette liste mme un individu qu'un n'est pas client
2. Si le crditeur est un client, tous les champs correspondants doivent se remplier
respectivement ce qui est indiqu dans la table tblClients sinon quoi l'utilisateur doit
pouvoir saisir les informations du crditeur.
19.32 tats
Si vous ouvrez la base Magasin.mdb il y a un tat normalement qui ressemble grosso modo
la figure reprsente ci-dessous:
MS Office Access
446/564
Vincent ISOZ
Ce qui est regrettable dans cet tat c'est que les enregistrements (un par ligne) ne sont pas
distinctivement spars par des couleurs par exemple (c'est le cas le plus frquent).
Si vous passez en mode cration vous avez une ligne de section nomme Dtail. Double
cliquez sur cette barre pour en afficher les proprits. Dans l'onglet des vnements activez
Sur impression et slectionnez l'option Gnrateur de code.
Saisissez-y le code suivant (attention il arrive parfois dans Access que si l'on ne passe pas par
la mthode indique dans le paragraphe suivante le code ne marche pas):
Sub Dtail_Print(Cancel As Integer, PrintCount As Integer)
Const conltGray = 13816530
If Dtail.BackColor = conltGray Then
Dtail.BackColor = vbWhite
Else
Dtail.BackColor = conltGray
End If
End Sub
A ma grande stupfaction et sans pouvoir donner d'explication, Microsoft dcider de
diffrencier le franais et l'anglais lors de la manipulation d'tats. Comme vous pouvez le voir
"Dtail" comporte un accent aigu !!!
19.33 Requtes
Voyons quelques exemples VBA de ce qu'il est possible de faire avec les requtes:
MS Office Access
447/564
Vincent ISOZ
19.33.2 ReQuery
Nous allons ici limiter le contenu d'une liste (combo ou zone de liste) partir du contenu
d'une autre liste (utilisation du SQL et du VBA) sans utiliser les macros requery (dont nous
avions fait usage lors de notre tude des requtes).
Soit les tables lies selon le schma:
448/564
Vincent ISOZ
Supposons que:
1. le champ de liste combo "Pays" se nomme "strPays"
2. le champ de liste combo "Ville" se nomme "strVille"
Dans le procdure vnementielle "Sortie" du champ de liste combo "Pays", insrez le code
suivant (pour la procdure SQL on peut s'aider d'une requte qui affiche les villes en fonction
du paramtre "id_ville" puisque c'est ce que retourne le champ de liste modifiable pays):
Sub strPays_Exit(Cancel As Integer)
Dim strSQL As String
strSQL = "SELECT tbl_ville.strVille FROM tblPays INNER JOIN tblVille ON tblPays.ID
= tblVille.idVille WHERE (((tblVille.idVille)=" & Me!strPays
strSQL = strSQL & "))"
Me!strVille.RowSourceType = "Table/Query"
Me!strVille.RowSource = strSQL
strSQL = "SELECT strPays FROM tblPays"
Me!strPays.RowSourceType = "Table/Query"
Me!strPays.RowSource = strSQL
MsgBox "L'ajout a bien t effectu. Veuillez maintenant le saisir dans la liste"
End Sub
Ce systme est gnralisable n'importe quoi mais ne fonctionne pas avec les champs de type
texte !!! Pour sortir une information unique dans un champ de formulaire partir du script
prcdent, il faut utiliser une zone de liste et utiliser la procdure vnementielle "Sur
changement".
Maintenant que nous avons une petite ide de comment faire du VBA et du SQL poussons un
petit peu plus loin le sujet pour crer des formulaires de recherche multi-critres (concept trs
important dans Access et non disponible par assistant ce jour).
MS Office Access
449/564
Vincent ISOZ
'on enlve le dernier segment
strSQL=left$(strSQL,len(strSQL)-12))
.
19.35 Calendrier
MS Access ne contient toujours pas d'tat ou de formulaire adapt gnrer un calendrier
quel qu'ilsoit. Voici le code pour en gnrer un la vole dans votre base:
Public Function Getdate() As Variant
' edit to get what ever return you want
Dim stFRmName As String
stFRmName = CreateCalForm
Do Until IsDate(Forms(stFRmName).Tag) ' check to see if date selected
DoEvents
Loop
Getdate = Forms(stFRmName).Tag
DoCmd.Close acForm, stFRmName, acSaveNo
End Function
Public Function CreateCalForm() As String
Dim frm As Form
'creates form
Set frm = CreateForm
With frm 'set any additional form properties you need here
.Caption = "POP UP Calender"
.RecordSelectors = False
.NavigationButtons = False
.Width = 2.5
.Section(acDetail).Height = 3
CreateCalForm = .Name
End With
Call LoadControls(frm)
End Function
Public Function LoadControls(ByVal frm As Form)
Dim txt(42) As Control, ctlMonth As Control
Dim ctlYear As Control
Dim txtLeft As Integer, TxtTop As Integer
Dim xPos As Integer, yPos As Integer, X As Integer
Dim TxtHeight As Integer, TxtWidth As Integer
Dim stFRmNam As String
stFRmNam = frm.Name
'Adjust to size boxes. Could base on size of form
TxtHeight = 1000
TxtWidth = 1000
TxtTop = 1000
txtLeft = 5
'creates 6x7 grid of text boxes
For yPos = 1 To 6
For xPos = 1 To 7
MS Office Access
450/564
Vincent ISOZ
Set txt(X) = CreateControl(stFRmNam, acTextBox, , "", "", txtLeft, TxtTop, TxtWidth,
TxtHeight)
txtLeft = txtLeft + TxtWidth 'sets with of text boxes
'set any additional properties or events here
txt(X).OnClick = "=Clicked()" 'add on click event to each box
txt(X).Name = "d" & X + 1 'name boxes like an array
X=X+1
Next xPos 'next box
txtLeft = 5 'go back to left start position
TxtTop = TxtTop + TxtHeight 'drop down height
Next yPos 'next row
'create additional txtboxes to hold Month & year
Set ctlMonth = CreateControl(stFRmNam, acTextBox, , "", "", 100, 10, 1000, 300)
ctlMonth.Name = "txMonth"
Set ctlYear = CreateControl(stFRmNam, acTextBox, , "", "", 1100, 10, 1000, 300)
ctlYear.Name = "txYear"
'load module to load dates and open form
Call LoadModule(frm)
DoCmd.OpenForm stFRmNam
End Function
Public Function LoadModule(ByVal frm As Form)
Dim Mdl As Module
Dim stBld As String
'creates module
Set Mdl = frm.Module
'creates eventprocedures This is ugly to save space. You can see it better
'Once form is created click on design view
stBld = stBld & "Private Function LoadCal(dtMonth as integer, dtyear as integer)" &
vbCrLf
stBld = stBld & "Dim Curday as Variant, dtFirst as variant" & vbCrLf
stBld = stBld & "curday = DateSerial(dtyear, dtmonth, 1)" & vbCrLf
stBld = stBld & "dtFirst = curday" & vbCrLf
stBld = stBld & "me![txMonth] = Format(dtFirst, ""m"")" & vbCrLf
stBld = stBld & "me![txYear] = Format(dtFirst, ""YYYY"")" & vbCrLf
stBld = stBld & "Do Until curday = DateSerial(dtyear, dtmonth + 1, 1)" & vbCrLf
stBld = stBld & "'Paramtrer ici -1 pour systme amricain ou -2 pour europen" & vbCrLf
stBld = stBld & "me(""D"" & Day(curday) + WeekDay(dtFirst) - 2) = Day(curday) & "" ""
& Left(Format(Curday, ""DDDD"", vbMonday), 3)" & vbCrLf
stBld = stBld & "If Weekday(Curday, vbMonday) = 6 Or Weekday(Curday, vbMonday) = 7
Then" & vbCrLf & "me(""D"" & Day(Curday) + Weekday(dtFirst) - 2).BackColor =
RGB(255, 255, 0)" & vbCrLf & "Else" & vbCrLf & "Me(""D"" & Day(Curday) +
Weekday(dtFirst) - 2).BackColor = RGB(255, 255, 255)" & vbCrLf & "End If" & vbCrLf
stBld = stBld & vbCrLf & "curday = DateAdd(""d"", 1, curday)" & vbCrLf & "Loop" &
vbCrLf
stBld = stBld & "End Function" & vbCrLf
stBld = stBld & "Private Sub Form_Load()" & vbCrLf
stBld = stBld & "DoCmd.RunCommand (acCmdSizeToFitForm)" & vbCrLf
stBld = stBld & "Call LoadCal(Month(date),Year(date))" & vbCrLf & " End Sub" &
vbCrLf
MS Office Access
451/564
Vincent ISOZ
stBld = stBld & "Public Function Clicked()" & vbCrLf
stBld = stBld & "me.tag = txmonth & ""/"" & me.activecontrol.value & ""/"" & txYear" &
vbCrLf & "End Function"
stBld = stBld & vbCrLf & "Private Sub txMonth_AfterUpdate()" & vbCrLf
stBld = stBld & "call ClearCal()" & vbCrLf & "call LoadCal(me!txmonth, me!txYear)" &
vbCrLf
stBld = stBld & "End Sub" & vbCrLf
stBld = stBld & "Private Sub txYear_AfterUpdate()" & vbCrLf
stBld = stBld & "call ClearCal()" & vbCrLf & "call LoadCal(me!txmonth, me!txYear)" &
vbCrLf
stBld = stBld & "End Sub" & vbCrLf
stBld = stBld & "Private Sub ClearCal()" & vbCrLf
stBld = stBld & "Dim X as integer" & vbCrLf & "for x = 1 to 42" & vbCrLf
stBld = stBld & "me(""D"" & x) = """ & vbCrLf
stBld = stBld & "next x" & vbCrLf & "End Sub"
'can also use ( insertlines addfromfile addfromstring) in place of inserttext
Mdl.InsertText stBld
End Function
19.36 Connexion
Nous avons vu page 328 comment fractionner une base entre vue logique et utilisateur (tables
et interface). Cependant lorsqu'un fichier MDE est envoy un client et que l'ensemble des
menus et barre d'outils sont bloqus il faut pouvoir par le VBA redfinir le chemin de
connexion des tables chaque fois au dmarrage de la base en fonction du choix du client en
ce qui concerne la localisation du fichier contenant les tables.
Si nous supposons que vous ne pouvez intervenir physiquement chez le client ou distance
par prise de contrle du serveur et que vous ne pouvez laisser faire celui-ci le travail votre
place, la seule manire d'y remdier en connaissant l'avance le chemin du disque rseau vers
le fichier des tables est de lancer le code suivant au dmarrage de la base:
Sub Attache_Tables()
Dim db As Database
Dim TD As TableDef
Dim i As Integer, Rponse As Variant
Set db = DBEngine.Workspaces(0).Databases(0)
On Error GoTo ErrAT
Reponse = SysCmd(acSysCmdInitMeter, "Attache les tables", db.TableDefs.Count - 1)
'boucle sur toutes les tables, rattachant celles dont la chane de connection est non vide, les
autres tant des tables locales
For i = 0 To db.TableDefs.Count - 1
Set TD = db.TableDefs(i)
' si c'est une table attache, on essaie de la rattacher
If TD.Connect <> "" Then
MS Office Access
452/564
Vincent ISOZ
TD.Connect = ";DATABASE=" & ("k:\tables.mdb")
TD.RefreshLink
If Err <> 0 Then
MsgBox TD.Name
End If
End If
Reponse = SysCmd(acSysCmdUpdateMeter, i + 1)
Next i
DoCmd.Hourglass False
Reponse = SysCmd(acSysCmdClearStatus)
Exit Sub
ErrAT:
MsgBox "L'application n'a pas pu trouver le fichier tables.mdb sur le serveur K:\." &
Chr(13) & "Veuillez contacter le responsable de la base.", vbCritical + vbOKOnly
End Sub
MS Office Access
453/564
Vincent ISOZ
MS Office Access
454/564
Vincent ISOZ
20 Confusions courantes
Dans MS Access suivant le niveau d'utilisation que nous faisons du logiciel, certaines
fonctionnalits peuvent paratre faire doublon avec d'autres.
Une analogie de se problme peut tre faire avec le tableaur MS Excel o finalement la
fonctionne MOYENNE ne sert objectivement pas grand chose puisqu'il s'agit d'une somme
divise par un comptage. Mais dans certaines situations particulires cela ne convient plus
et alors il faut opter pour d'autres solutions. Il en va de mme pour MS Access.
J'ai souhait dans le prsent chapitre faire un petit listing avec des captures d'cran des outils
que les utilisateurs trouvent trs souvent comme faisant doublons avec d'autres existants tout
en expliquant le pourquoi du comment.
Donc par exemple notre masque de saisie des codes articles est le suivant:
>LLL-000;0;
Il est clair que jamais un utilisateur ne pourra crer d'articles sans mettre au moins 3 lettres et
3 chiffres. Ds lors vaut-il la peine de mettre un Valide Si du type suivant dans le champ de la
table:
NBCAR([strNbArticle])=7
La rponse est: Non. Quelque soit la situation (macros, VBA, SQL) les deux feront doublon.
Evidemment, les utilisateurs experts en VBA savent que ce langage permet de faire des
masques de saisie dans les formulaires beaucoup plus complexes et pertinents que le masque
de saisie par dfaut intgr dans les tables (ou celui intgr par dfaut dans les formulaires).
Pour ces utilisateurs, l'utilisation du masque de saisie standard de MS Access est donc un
doublon et de plus un outil inutile tant donn le peu de flexibilit dont il dispose.
MS Office Access
455/564
Vincent ISOZ
Enfin, si nous avons le masque de saisie standard ci-dessus ou gr avec du VBA est-il utile
de mettre l'option Null Interdit dans le champ concern de la table?
La rponse est: Cela dpend.
Effectivement, si vous savez que votre base de donnes ne sera jamais migre dans une autre
technologie, c'est inutile. Par contre si vous migrez votre base de donnes MS Access dans
Oracle ou SQL Server, tout ce qui est relatif aux masques de saisies ou critires de validations
sera supprim. A l'oppos, les proprits Null Interdit et Chane vide autorise sont
normalement un standard international dans le monde des bases de donnes relationnelles.
Enfin, tant donn le masque, il parat clair que mettre la proprit Chane vide autorise
Non fait doublon. Qu'en-est-il?
La rponse est: Cela dpend et ce pour exactement les mmes raisons que la proprit
Null Interdit.
La question tant de savoir si cela ferait doublon avec un code VBA qui ferait la mme type
de contrle mais dans un formulaire.
La rponse est: Oui. Mais le problme des Valide Si c'est qu'on ne peut pas le paramtrer
dynamiquement partir de variables qui seraient contenues dans des tables diffrentes (par
exemple ci-dessus le dlai de 2 mois devrait pas tre crit en dur!) et que les messages
d'erreurs sont catastrophiques en termes de plus value. Donc le VBA reste toutefois
indispensable et beaucoup plus flexible et puissant.
Maintenant une autre question se pose. Cette condition de validation semble imposer qu'une
date existe. Au fait, il n'en est rien. Donc la question de savoir si cette validation ferait
doublon avec un Null Interdit Oui la rponse est Non.
MS Office Access
456/564
Vincent ISOZ
Par contre, ceux qui choisiraient de mettre un masque de saisie standard (non VBA)
obligatoire pour la date du type:
00.00.0000;0;
et qui auraient activ le Null Interdit Oui se trouveraient alors dans une situation de doublon
puisque le masque de saisie ne laisserait pas l'utilisateur valider l'enregistrement sans aucune
date. Ceci dit, il est quand mme ncessaire de mettre le Null Interdit Oui si nous savons
qu'un jour la base de donnes MS Access sera migre sur une autre technologie car les
masques n'existent pas dans la majorit des progiciels de type SGBDR.
457/564
Vincent ISOZ
MS Office Access
458/564
Vincent ISOZ
sous-objets est un travail trs trs trs laborieux qui ncessite mme sur une petite base de
donnes un petite centaine d'heures de travail.
Ceci dit, pour ceux qui travaillent avec des fichiers *.mdb/*.mde associe des espaces de
travail de scurit *.mdw, le VBA reste quand mme un complment souvent indispensable.
Donc les deux ne font jamais effet de doublon et ce mme dans les anciens fichiers.
Enfin pour clore cette partie, il faut savoir qu'avant la 2007 il y avait une tendance
privilgier la scurit intgre - quand cela tait possible - car elle permettait d'conomiser
beaucoup de temps pour les dveloppeurs et donc beaucoup d'argent aussi mme si elle tait
moins flexible que le VBA.
MS Office Access
459/564
Vincent ISOZ
21 VBScript
Code pratique en VBScript (cours d'initiation de 2 jours) pour au dmarrage de l'ordinateur
(au fait l'ide est plutt d'utiliser les tches automatiques de Windows pour lancer le script
une heure donne sinon il suffit de mettre le fichier dans le dossier Dmarrage), ouvrir un
fichier MS Excel et excuter une macro spcifique l'intrieur de celui-ci:
Set accDB = CreateObject("Access.Application")
accDB.Application.Visible = True
accDB.OpenCurrentDatabase("c:\db1.mdb")
accDB.DoCmd.RunMacro "Macro1" 'pour lancer une macro
accDB.DoCmd.OpenModule "Module1","test" 'pour lancer une routine VBA
accDB.usercontrol = True 'si on enlve cette ligne Access se ferme
Si on veut faire un script qui se lance toutes les minutes:
Set accDB = CreateObject("Access.Application")
Do
WScript.Sleep (60*1000)
accDB.Application.Visible = False
accDB.OpenCurrentDatabase("c:\db1.mdb")
accDB.DoCmd.RunMacro "Macro1" 'pour lancer une macro
accDB.DoCmd.OpenModule "Module1","test" 'pour lancer une routine VBA
loop
Pour arrter le script dans le gestionnaire des tches il suffit d'arrter le process wscript
MS Office Access
460/564
Vincent ISOZ
22 XML XSL
Le XML fait l'objet d'un cours lui seul (2 jours) o l'on apprend traiter celui-ci dans les
logiciels MS Word 2003 (pour la cration de documents), dans MS Excel 2003 (pour la
gestion des donnes) et dans MS InfoPath 2003 (pour la cration de formulaires). Cependant,
dans le cadre d'un cours MS Access pour dveloppeurs, nous prendrons pour rfrence le
support de cours de "Sup. Info Paris" ou celui de Luc Van Lancker complt par les exercices
et la prsentation de Vincent Isoz.
Le mta-langage XML est absolument incontournable aujourd'hui dans les nouvelles
technologies s'impose comme standard international dans l'change des donnes. Ainsi, MS
Access est-il directement concern. Cette voie vers le XML que prennent tous les logiciels
dans le domaines de l'informatique se fait particulirement ressentir pour les utilisateurs
bureautiques avec la version MS Office 2003 o il est omniprsent mme dans MS Word et
MS Excel. Il convient ds lors d'acqurir des nouvelles mthodes de travail. Malheureuses,
l'inertie d'adaptation des utilisateurs moyens fait que probablement cette technologie sera
omniprsente chez le grand public vers 2010.
Dmonstration de l'utilisation simple XML:
1. Ouvrez une table quelconque dans un base Access (pour l'exemple nous nous sommes
servis d'une table nomme tblArticles)
2. Allez dans le menu Fichier/Exporter et choisissez l'option XML (si MS Access vous
demande de gnrer un fichier XSL et XSD laissez tomber !!! Le code y est
catastrophique et c'est inutilisable):
MS Office Access
461/564
Vincent ISOZ
Nous voyons que le code est beaucoup plus propre que celui gnr automatique par les
autres logiciels de la suite MS Office (ce qui est logique par ailleurs).
Voici une premire mthode pour exporter en XML:
Sub ExportTable()
'Ce code va crer un fichier XML, XSL et HTML
Application.ExportXML ObjectType:=acExportTable, DataSource:="tblArticles",
DataTarget:="C:\tblArticles.xml", PresentationTarget:="C:\tblArticles.xsl",
Encoding:=acUTF8
End Sub
MS Office Access
462/564
Vincent ISOZ
Pour pouvoir affichier correctement la liste des clients, vous devez soit utiliser le fichier
tblArticles.htm qui fait le lien entre les fichiers xml et xsl, soit modifier le fichier
tblClients.xml afin de lui associer le fichier tblClietns.xsl.
Une autre manire de gnrer un fichier XML de faon trs modulable partir de VBA est la
suivante (exemple gnrique pris sur Internet et facilement gnralisable):
Option Compare Database
Option Explicit
Sub MainXML()
Dim kvl_tabledef As New TableDef
Dim kvl_xml As Integer
Dim kvl_recordset As New ADODB.Recordset
Dim kvl_sql As String
Set kvl_tabledef = CurrentDb.CreateTableDef("stefan_ram_table")
kvl_tabledef.Fields.Append kvl_tabledef.CreateField("name", dbText)
kvl_tabledef.Fields.Append kvl_tabledef.CreateField("phone", dbText)
On Error Resume Next
CurrentDb.TableDefs.Append kvl_tabledef 'ajoute la table la base
kvl_recordset.Open "stefan_ram_table", CurrentProject.Connection, adOpenKeyset,
adLockOptimistic
kvl_recordset.AddNew
kvl_recordset.Fields("name").value = "Peter"
kvl_recordset.Fields("phone").value = "123456"
kvl_recordset.Update
kvl_recordset.AddNew
kvl_recordset.Fields("name").value = "Mary"
kvl_recordset.Fields("phone").value = "987654"
kvl_recordset.Update
kvl_recordset.Close
Set kvl_recordset = Nothing
kvl_xml = FreeFile()
Open "stefan_ram.xml" For Output As kvl_xml
Print #kvl_xml, "<table>"
kvl_recordset.Open "stefan_ram_table", CurrentProject.Connection, adOpenKeyset,
adLockOptimistic
Do While Not kvl_recordset.EOF
Print #kvl_xml, " <record>"
Print #kvl_xml, " <name>" & kvl_recordset.Fields("name") & "</name>"
Print #kvl_xml, " <phone>" & kvl_recordset.Fields("phone") & "</phone>"
Print #kvl_xml, " </record>"
kvl_recordset.MoveNext
Loop
Print #kvl_xml, "</table>"
Close kvl_xml
MS Office Access
463/564
Vincent ISOZ
kvl_recordset.Close
Set kvl_recordset = Nothing
End Sub
Inversement, il est possible d'importer une ficher XML par le code suivant (le nom de la table
sera celui du nom du fichier XML):
Sub ImportTable()
Application.ImportXML "C:\tblArticles.xml"
End Sub
C'est beau non.
MS Office Access
464/564
Vincent ISOZ
Pour crer un validateur (car en XML un fichier conforme et un fichier valide sont deux
choses diffrentes), voici le fichier validateur XSD (obligatoire pour travailler dans MS Excel
et MS Word 2003):
MS Office Access
465/564
Vincent ISOZ
Il existe maintenant une infinit de possibilit pour mettre en forme notre fichier XML dans
MS Word ou Internet Explorer l'aide d'une feuille de mise en page XSL tel que:
MS Office Access
466/564
Vincent ISOZ
MS Office Access
467/564
Vincent ISOZ
MS Office Access
468/564
Vincent ISOZ
4. Slectionner la base de donnes qui a t cre lors des cours prcdent et lui dfinir
un nom ("Notre base" par exemple) et en donner un descriptif.
5. Cliquer sur le bouton "OK" et fermer l'application des sources de donnes ODBC et
ouvris MS Visio
6. Dans MS Visio 2000 version Entreprise ou MS Visio 2002/2003 version Architecte
crer un nouveau document vide partir du modle de base de donnes.
7. Aller dans le menu "Database" et slectionner l'option "Reverse Engineer". Doit alors
apparatre la bote de dialogique ci-dessous:
MS Office Access
469/564
Vincent ISOZ
8. Effectuer les mmes choix de drivers et de donnes sources que ce qui est prsent sur
la figure ci-dessus et cliquer sur "Next".
9. MS Visio va vous demander le nom d'utilisateur et le mot de passe d'accs la base de
donnes. S'il n'y en a pas, cliquer simplement sur le bouton "OK".
10. MS Visio vous demande quels sont les types d'lments que vous souhaiteriez pouvoir
importer. Prenez tout dans un premier temps et cliquez nouveau sur "Next".
11. MS Visio vous demande maintenant parmi les types d'lments choisis prcdemment,
quels sont les objets que vous souhaiteriez importer dans MS Visio. Slectionnez tout
(bouton: "Select All") et cliquez sur le bouton "Next".
12. et cliquez sur le bouton "Finish"
13. Voil quoi devrait ressembler MS Visio une fois les oprations d'import effectues:
MS Office Access
470/564
Vincent ISOZ
24 A.S.P. et MDB
Pour se connecter une base de donnes en ASP 3.0 (le langage lui-mme fait l'objet d'un
cours de plusieurs semaines) il faut crer de nouveaux objets:
<%
Dim objConn
Set ObjConn = Server.CreateObject("AdoDB.Connection")
.
La mthode la plus souple pour se connecter une base de donnes quelconque est de crer
un D.S.N. (Data Source Name) en passant galement par l'application:
et par la fentre:
Mais avant de continuer, il faut placer la base MS Access dans un rpertoire donn du
wwwroot du serveur.
Comme il s'agit de crer une nouvelle source de donnes, cliquez sur le bouton Ajouter. Une
liste de pilotes apparat comme pour le chapitre prcdent, la diffrence qu'il faudra nommer
la connexion "magasin.dsn" comme ci-dessous:
MS Office Access
471/564
Vincent ISOZ
et cliquez sur OK. Dans le liste des Sources de donnes utilisateur, il y devra y avoir
magasin.dsn.
Nous disposons maintenant d'une source de donnes systme. L'appel l'objet Connection
s'effectue ainsi:
<%
Dim objConn
Set ObjConn = Server.CreateObject("AdoDB.Connection")
objConn.ConnectionString = "DSN=magasin.dsn"
.
MS Office Access
472/564
Vincent ISOZ
Il existe une alternative la source de donnes systme. Au lieu de placer les informations de
connexion dans cette source, vous pouvez les placer dans une chane de connexion.
<%
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" &
"DBQ=magasin.mdb"
MS Office Access
473/564
Vincent ISOZ
MS Office Access
474/564
Vincent ISOZ
<TD><%=objRS("mem_designation") %></TD>
<TD><%=objRS("int_moq") %></TD>
<TD><%=objRS("cur_unitprice") %></TD>
</TR>
<%
objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
</TABLE>
</BODY>
</HTML>
MS Office Access
475/564
Vincent ISOZ
<TD><%=objRS("int_nbfournisseur") %></TD>
<TD><%=objRS("int_moq") %></TD>
<TD><%=objRS("cur_unitprice") %></TD>
</TR>
<%
objRS.MoveNext
Loop
objRS.MoveFirst
objRS("txt_nbarticle") = "gen007"
objRS("mem_designation") = "Livre ASP.Net"
objRS("int_nbfournisseur") = "5"
objRS("int_moq") = "5"
objRS("cur_unitprice") = "120"
objRS.Update
objRS.MoveFirst
%>
</TABLE>
<P>
<B>Entres dans la table APRS mise jour</B>
<P>
<TABLE>
<% Do While Not objRS.EOF %>
<TR>
<TD><%=objRS("txt_nbarticle") %></TD>
<TD><%=objRS("mem_designation") %></TD>
<TD><%=objRS("int_nbfournisseur") %></TD>
<TD><%=objRS("int_moq") %></TD>
<TD><%=objRS("cur_unitprice") %></TD>
</TR>
<%
objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
</TABLE>
</BODY>
</HTML>
Et pour supprimer un enregistrement:
<% @Language=VBScript %>
<% Option Explicit %>
<%
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};" &
"DBQ=C:\Inetpub\wwwroot\asptraining\magasin.mdb"
MS Office Access
476/564
Vincent ISOZ
objConn.Open
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
Const adCmdTable=2
Const adLockOptimistic=3
objRS.Open "tbl_articles", objConn, , adLockOptimistic, adCmdTable
%>
<HTML>
<BODY>
<B>Entres dans la AVANT LA SUPRESSION:</B>
<P>
<TABLE border="1">
<TR>
<TD>Article</TD>
<TD>Dsignation</TD>
<TD>Numro fournisseur</TD>
<TD>M.O.Q.</TD>
<TD>Prix l'unit</TD>
</TR>
<% Do While Not objRS.EOF %>
<TR>
<TD><%=objRS("txt_nbarticle") %></TD>
<TD><%=objRS("mem_designation") %></TD>
<TD><%=objRS("int_nbfournisseur") %></TD>
<TD><%=objRS("int_moq") %></TD>
<TD><%=objRS("cur_unitprice") %></TD>
</TR>
<%
objRS.MoveNext
Loop
objRS.MoveFirst
objRS.Delete
objRS.MoveFirst
%>
</TABLE>
<P>
<B>Entres dans la APRES LA SUPRESSION:</B>
<P>
<TABLE border="1">
<% Do While Not objRS.EOF %>
<TR>
<TD><%=objRS("txt_nbarticle") %></TD>
<TD><%=objRS("mem_designation") %></TD>
<TD><%=objRS("int_nbfournisseur") %></TD>
<TD><%=objRS("int_moq") %></TD>
<TD><%=objRS("cur_unitprice") %></TD>
</TR>
<%
objRS.MoveNext
Loop
MS Office Access
477/564
Vincent ISOZ
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
</TABLE>
</BODY>
</HTML>
MS Office Access
478/564
Vincent ISOZ
25 P.H.P. et MDB
Considrons toujours la base de donnes Magasin.mdb avec la table suivante:
Crons ensuite un dossier nomm phpaccess dans notre sur notre serveur Apache (voir la
procdure avec le formateur) dans lequel vous mettrez la base de donnes Magasin et dans
lequel nous vous demandons de crer deux fichiers PHP vides pour l'instant: odbc.php et
query.php.
Avant de continuer installons le pilote ODBC tel que nous l'avons fait pour l'exemple en ASP:
MS Office Access
479/564
Vincent ISOZ
et validez le tout par OK. Ensuite, dans fichier odbc.php saisissez le code suivant (attention
la version du PHP !):
<?
$odbc = odbc_connect ('TestDB', 'root', '') or die( "Could Not Connect to ODBC Database!");
if (function_exists('odbc_fetch_array'))
return;
function odbc_fetch_array($result, $rownumber=-1) {
if (PHP_VERSION > "4.1") {
if ($rownumber < 0) {
odbc_fetch_into($result, $rs);
} else {
odbc_fetch_into($result, $rs, $rownumber);
}
} else {
odbc_fetch_into($result, $rownumber, $rs);
}
$rs_assoc = Array();
foreach ($rs as $key => $value) {
$rs_assoc[odbc_field_name($result, $key+1)] = $value;
}
return $rs_assoc;
}
?>
et dans le fichier query.php:
<?
include 'odbc.php';
$query = odbc_exec($odbc, "SELECT * FROM Customers") or die (odbc_errormsg());
while($row = odbc_fetch_array($query)){
echo "Customer First Name: ".$row['customer_first_name']."<br />";
echo "Customer Last Name: ".$row['customer_last_name']."<br />";
echo "Customer Email: ".$row['email_address']."<br />";
echo "<hr />";
MS Office Access
480/564
Vincent ISOZ
}
odbc_close($odbc);
?>
Tapez ensuite http://localhost dans votre navigateur Internet (exemple effectu avec EasyPHP
1.7):
Cliquez sur le dossier phpaccess et ensuite sur query.php. Le rsultat suivant devrait
apparatre l'cran:
MS Office Access
481/564
Vincent ISOZ
26 MS Infopath
Infopath est un des trois nouveaux lments de la suite MS Office System 2003 (InfoPath,
OneNote, Business Contact Manager). Il met trivialement en vidence la stratgie de
Microsoft de proposer des outils bureautiques performants de gestion et traitement de donnes
au format XML.
MS Infopath est un logiciel de cration de formulaires dont les possibilits sont infiniment
plus grandes que MS Word et mme Adobe Acrobat 6.0.
Nous allons ainsi faire deux exemples. Le premier sera quasi-statique simple ("plat") et
utilisera des connaissances accessibles presque n'importe qui. Le second exemple,
compltement dynamique, demandera des connaissances de MS Access.
Remarque: l'utilisation ayant t grandement simplifie depuis la sortie de son SP1 il est
important de savoir que les exemples donns ci-dessous ont t tirs des captures d'cran de la
version MS InfoPath 2003 SP1.
MS Office Access
482/564
Vincent ISOZ
et allez chercher le fichier XSD. Une fois ceci fait vous devriez avoir dans le volet Office:
MS Office Access
483/564
Vincent ISOZ
MS Office Access
484/564
Vincent ISOZ
Ensuite retournez dans Data Source et faites un glisser-dplacer du nud dataroot dans la
feuille en slectionnant Section with controls:
et voil la rsultat (aprs avoir un peu chang les texte des libells):
MS Office Access
485/564
Vincent ISOZ
Enregistrez les modification et fermez InfoPath. Faites ensuite un double clique sur le fichier
InfoPath:
et saisissez les donnes. Au besoin, en faisant cliquant sur la flche bleue, vous pouvez
ajouter des nouveaux enregistrements (c'est ce qui fait d'InfoPath un outil trs puissant):
MS Office Access
486/564
Vincent ISOZ
MS Office Access
487/564
Vincent ISOZ
Tout est parfait (mis part la ligne propritaire de Microsoft) pour un traitement par MS
Excel 2003, pour un formatage web par un XSL, pour une utilisation de pagination dans MS
Word 2003 ou pour un import dans MS Access 2003. Rien de nouveau donc de ce ct.
L'employ n'a qu'a envoyer ce document XML par e-mail son responsable ou des
collgues.
MS Office Access
488/564
Vincent ISOZ
MS Office Access
489/564
Vincent ISOZ
Cliquez sur Next, donnez un nom votre connexion (Fournisseurs par exemple) et sur Finish.
Vous devrez avoir le rsultat suivant dans le volet Office:
MS Office Access
490/564
Vincent ISOZ
A gauche sur la feuille (InfoPath SP1), vous avez une zone Drag data fields here (vous
pouvez effacer la partie concernant la Query). Glissez-y le nud d:tblFournisseurs:
Dans la bote de dialogue, slectionnez Repeating Section with Controls. Vous aurez:
MS Office Access
491/564
Vincent ISOZ
Vous pouvez changer le nom des tiquettes.et supprimer le champ id Fournisseur (puisque
c'est un cl primaire AutoNumber dans notre base Access):
Maintenant nous aimerions que lorsque l'utilisateur cliquer sur Canton ou Pays que la liste des
cantons ou pays disponibles dans la base Access (dans les tables tblCantons et tblPays)
s'affiche l'cran (pour que l'utilisateur n'ait pas les saisir).
Pour ce faire, il faut aller dans le menu Tools/Data Connection:
MS Office Access
492/564
Vincent ISOZ
Addensuite Receive Data ensuite Database (Microsoft SQL Server or Microsoft Access
only) ensuite Select Database et allez chercher la base tables.mdb et la table tblPays:
Cliquez sur Next, donnez un nom la connexion et recommencez l'opration pour la table des
cantons. Vous aurez alors dans la fentre des connexions (Tools/Data connections) trois
connexions:
MS Office Access
493/564
Vincent ISOZ
Cliquez sur Close.
Pour relier les champs Cantons et Pays du formulaire InfoPath aux tables de la base Access
et les transformer en listbox voici comment il faut procder:
Il faut d'abord transformer les champs texte en Drop Down Listbox. Pour ce faire, bouton
droit et:
MS Office Access
494/564
Vincent ISOZ
Ensuite:
MS Office Access
495/564
Vincent ISOZ
et maintenant pour la saisie de donnes ? Eh ben c'est trs simple, on saisit le premier Record
et le deuxime (cliquez sur Insert Item) etc:
MS Office Access
496/564
Vincent ISOZ
on a:
MS Office Access
497/564
Vincent ISOZ
Et si nous allons ouvrir notre table Access tblFournisseurs, nous avons bien:
Remarque: pour supprimer le bouton d'dition de MS InfoPath sur les postes clients allez dans
Tools/Options et activez Enable protection.
Voil pour les bases de MS InfoPath et XML.
Bien sr il faut avoir en tte que tout cela communique avec l'ensemble des produits de la
gamme MS Office 2003.
MS Office Access
498/564
Vincent ISOZ
27 MS SQL Server
27.1 Reverse engineering vers SQL server
Nous allons voir maintenant comment envoyer notre base de donnes MS Access vers SQL
Server. Pour l'exemple, nous disposons de MS Access 2003 en anglais, de notre base
Magasin.mdb habituelle et de MS SQL Server 2000 SP3 (le serveur s'appelant "ISOZ").
Rappelons que le schma de notre base est (grosso modo) le suivant:
Pour la migrer vers MS SQL Server nous allons dans le menu suivant:
MS Office Access
499/564
Vincent ISOZ
Nous allons donc crer une nouvelle base de donnes sur notre Server SQL et nous cliquons
sur Next. La fentre suivante apparat o nous saisissons le nom du Serveur et le nom de la
future base (aucun paramtre de scurit n'a t dfini):
MS Office Access
500/564
Vincent ISOZ
Nous cliquons alors nouveau sur Next. MS Access nous demande alors quelles tables
doivent tre envoyes vers le serveur:
Nous les prenons bien videmment toutes et cliquons nouveau sur Next. La fentre suivante
apparat demandant si nous souhaitons prendre quelques proprits particulires de la base et
certaines manires de grer les relations entre les donnes:
MS Office Access
501/564
Vincent ISOZ
Sans rien changer cliquez sur Next. La prochaine fentre est trs intressant elle nous permet:
1. D'automatique lier le fichier *.mdb en cours afin de travailler sans presque rien
changer aux codes et requtes existantes
2. La seconde propose de crer un fichier *.adb c'est--dire les fichiers d'accs aux
donnes dont nous avions parl tout au dbut de ce document.
Sans rien changer, cliquez sur Finish. L'ordinateur va alors travailler pendant un petit
moment:
MS Office Access
502/564
Vincent ISOZ
Ensuite il va vous afficher un rapport, fermer votre fichier *.mdb, ouvrir automatiquement le
fichier *.adp et voil ce que vous aurez dans SQL Server Entreprise Manager:
Nous y retrouvons donc bien notre base Magasin avec toutes ses tables plus de nombreuses
tables relatives aux proprits de scurit de MS Access.
Voyons quelque chose de pertinant maintenant:
Cration d'une nouvelle vue partir du dossier Diagrams (bouton droit de la souris dessus et
New Diagram):
MS Office Access
503/564
Vincent ISOZ
MS Office Access
504/564
Vincent ISOZ
MS Office Access
505/564
Vincent ISOZ
Problme vident:
et choisir l'option ODBC dans la liste droulante Type de fichier. apparat alors
automatiquement la bote de dialogue suivante:
MS Office Access
506/564
Vincent ISOZ
et choisissez le pilote SQL Server et cliquez sur Suivant. Ensuite, donnez un nom la
connexion:
MS Office Access
507/564
Vincent ISOZ
MS Office Access
508/564
Vincent ISOZ
bien videmment il faut connatre les informations saisir Ensuite faites Suivant et laissez
(car c'est le cas majoritaire) les options par dfaut:
MS Office Access
509/564
Vincent ISOZ
28 AS/400
Dans le genre base de donnes prhistoriques () il existe une technologie appele AS/400
encore utilise par certaines entreprises (qui n'ont aucun intrt changer et elles ont bien
raison!).
Pour ceux qui n'ont jamais vu quoi cela ressemble, en voici une image:
Ce que nous allons voir maintenant c'est comment se connecter une telle base de donnes.
Dans le panneau de configuration cliquez sur:
MS Office Access
510/564
Vincent ISOZ
MS Office Access
511/564
Vincent ISOZ
Une fois ceci fait, en thorie il suffit de valider le tout et de retourner dans MS Access et aller
dans Fichier/Donnes externes et choisir Lier les tables:
et de choisir:
MS Office Access
512/564
Vincent ISOZ
MS Office Access
513/564
Vincent ISOZ
Dans notre installation, le nom d'utilisateur sera system et le mot de passe sera root (choisi au
dbut de l'installation).
D'abord dans MS Access il faut aller dans Fichier/Donnes Externes/Lier les tables...:
MS Office Access
514/564
Vincent ISOZ
et choisir ODBC:
MS Office Access
515/564
Vincent ISOZ
Ensuite dans la bote de dialogue suivante:
Prenez Source de donnes systme (pour cette machine uniquement) Slectionner le Driver
ODBC Oracle:
MS Office Access
516/564
Vincent ISOZ
MS Office Access
517/564
Vincent ISOZ
Nous cliquons sur Test Connection pour avoir la bote de dialogue suivante (avec Oracle
Express le nom du service est presque toujours XE):
Sin nous cliquons sur OK il vient alors si les informations ci-dessus ont t correctement
saisies:
MS Office Access
518/564
Vincent ISOZ
Si nous validons par OK il se peut que les informations suivante vous soit redemandes:
MS Office Access
519/564
Vincent ISOZ
Si nous slectionnons un table et validons par OK nous avons alors la table qui va se retrouver
lie dans Microsoft Access aprs un petit moment d'attente:
MS Office Access
520/564
Vincent ISOZ
MS Office Access
521/564
Vincent ISOZ
30 MySQL
Toujours dans le cadre de l'utilisation de MS Access en tant que base frontale, passons la
connexion de plus en plus courante avec MySQL (souvent utilis comme SGBRD web).
Remarque: Le texte ci-dessous a t entirement copier/coller du site http://blogmotion.fr
Pour permettre l'accs la base MySQL de faon transparente au travers d'une application
Microsoft nous devons installer un connecteur ODBC.
MySQL propose justement de tlcharger ce connecteur MySQL ODBC gratuitement:
http://dev.mysql.com/downloads/connector/odbc
Installez-le!
Ensuite, rendez-vous dans le menu Dmarrer/Outils d'administration/Source de donnes
(ODBC), ou via Dmarrer/Excuter et tapez odbcad32.exe
Cliquer sur Ajouter:
MS Office Access
522/564
Vincent ISOZ
Vous devrez obtenir Connection Successful si vous cliquez sur le bouton Test.
Si ce n'est pas le cas, pensez vrifier que votre serveur MySQL fonctionne et que celui-ci est
accessible partir de l'extrieur, l'accs est parfois restreint sur l'interface de boucle local
(localhost) 127.0.0.1. Si vous ne connaissez pas le nom ou le port de votre serveur MySQL
vous pouvez crir les deux commandes suivante dans le systme de requte de MySQL pour
obtenir ces deux informations:
MS Office Access
523/564
Vincent ISOZ
MS Office Access
524/564
Vincent ISOZ
Pour tablir une liaison synchrone, slectionner Lier la source de donnes en crant une
table attache:
MS Office Access
525/564
Vincent ISOZ
Attention: chaque modification effectue sera rpercute sur votre base MySQL!
MS Office Access
526/564
Vincent ISOZ
31 PocketPC
Voici trs probablement le point le plus intressant de ce support de cours: comment rendre
votre base de donnes MDB mobile sur PocketPC.
Nous allons synchroniser notre base Magasin.mdb situe dans notre dossier Mes documents
avec notre PocketPC. Pour cela, dans ActiveSync 3.7.1 voici comment effectuer l'opration:
S'ouvre une bote de dialogue vous demandant o se situe votre base. Il vous suffit de cliquer
sur Ajouter:
MS Office Access
527/564
Vincent ISOZ
MS Office Access
528/564
Vincent ISOZ
et cliquez sur OK. Une fois ceci fait, en allant dans l'explorateur de votre PocketPC vous
aurez:
MS Office Access
529/564
Vincent ISOZ
Nous retrouvons donc leurs tables avec leurs donnes respectives par contre, les requtes et
formulaires que nous avions cr ne sont plus disponibles.
Aprs avoir jou deux ou trois minutes avec DB Anywhere (qui vous permet quand mme
d'utiliser des filtres, requtes, formulaires mais ne gre pas les relations entre les tables ce
jour) nous pouvons faire un petit formulaire (attention dans les options de le mettre en Full
Access sinon vous ne pourrez pas ajouter de donnes par la suite!):
MS Office Access
530/564
Vincent ISOZ
Faites attention aux cls primaires usant de champ de numration qui taient automatiques
dans MS Access car dans DB Anywhere cela n'existe pas et alors lors de la synchronisation
vous aurez un message d'erreur.
L'ajout d'une nouvel article (n'oubliez pas de l'enregistrer en cliquant sur la petite disquette
):
MS Office Access
531/564
Vincent ISOZ
32 Business Objects
Nous allons observer dans ce chapitre comment connecter une base de donnes MS Access au
logiciel BusinessObjects 5.0
Nous allons donc continuer avec notre base de donnes Magasin.mdb. Dans les outils
d'administration de MS Windows allez dans Source de donnes (ODBC) nous en aurons
besoin pour que BO se connecte notre base et suivez les tapes indiques ci-dessous:
MS Office Access
532/564
Vincent ISOZ
MS Office Access
533/564
Vincent ISOZ
Slectionnez la premire option et lorsque vous cliquez sur Commencer choisissez SQL la
carte:
Dans la fentre suivante, cliquez sur le bouton indiqu ci-dessous par aller cherche la source
de donnes utilisateur Magasin.mdb:
MS Office Access
534/564
Vincent ISOZ
MS Office Access
535/564
Vincent ISOZ
crivez votre requte SQL (exemple pris du cours MS Access plus haut):
MS Office Access
536/564
Vincent ISOZ
MS Office Access
537/564
Vincent ISOZ
33 Crystal Reports
L'utilisation de Crystal Reports pour notre base Magasin.mdb tient nouveau par les mmes
procdures initiales de cration d'un driver ODBC nomm Magasin comme montr ci-dessous
(assistant obtenu en cliquant sur le bouton Nouveau en haut gauche de l'cran de
CrystalReports et ensuite sur le bouton Database).
MS Office Access
538/564
Vincent ISOZ
o l'on voit aussi bien les tables que les requtes ! En faisant un double clic sur la table
tblSorties, vous obtiendrez:
Ensuite, il vous suffit de parcourir les onglets Fields, Group, Total, Top N, Chart, Select et
Style un par un et de lancer la machinerie et c'est du CrystalReports standard !
MS Office Access
539/564
Vincent ISOZ
34 Runtime
Il n'est pas possible toutes les entreprises de payer une licence MS Access leurs employs
et honntement cela n'a gure d'intrt... D'o le fait qu'il existe un runtime (tlchargeable
gratuitement sur le site internet de Microsoft).
Dj avant de dployer le runtime, il faut vrifier que sa base de donnes, fonctionne bien
avec le runtime. Pour cela vous pouvez simuler le runtime en cration un raccourci
MS Windows avec la syntaxe suivante:
"C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE" _
"C:\magasin.mdb" /runtime
bon videmment il vaut mieux travailler avec une frontable en *.mde et une dorsale *.mdb
mais aprs c'est une histoire.
Si jamais depuis voici comment convertir une base *.accdb en fichier runtime excutable avec
MS Access 2010 (attention!! normalement on fait cette manipulation que lorsque l'on a
spar la base en une front-end et une back-end!!!):
1. Vous n'oubliez pas de mettre un formulaire de dmarrage pour votre base de donnes
comme nous l'avons vu plus haut
2. Vous allez dans Fichier/Engregistrer et choisissez l'option Crer ACCDE:
MS Office Access
540/564
Vincent ISOZ
3. Vous enregistrez votre base de donnes l'endroit dsir:
Ce qui vous donner l'ouvertur un fichier protg qui s'ouvre dans le runtime:
541/564
Vincent ISOZ
Par exemple, pour obtenir dans le runtime un menu contextuel au clic droit avec les options
Couper/Copier/Coller comme visible ici:
542/564
Vincent ISOZ
bt.OnAction = "=fCopy()"
bt.FaceId = 19
Set bt = cbar.Controls.Add
bt.Caption = "Paste"
bt.OnAction = "=fPaste()"
bt.FaceId = 22
End Sub
Function fCut()
On Error Resume Next
Application.CommandBars.ExecuteMso ("Cut")
End Function
Function fCopy()
On Error Resume Next
Application.CommandBars.ExecuteMso ("Copy")
End Function
Function fPaste()
On Error Resume Next
Application.CommandBars.ExecuteMso ("Paste")
End Function
Excutez une unique fois le routine principale CreateContextMenu afin de pouvoir par la
suite l'associer n'importe quel formulaire (si nous ne l'excutez pas, vous ne pourrez
associer ce menu un formulaire!!).
Une fois ceci fait, dans les proprits des formulaires de votre choix, vous changez la
proprit Barre de menu contextuel afin d'y prendre la barre que nous venons de crer dans le
module VBA:
et voil...
MS Office Access
543/564
Vincent ISOZ
Le modle conceptel de donnes de la base avec description des tables, des cls (sur
champs ou auto-incrmentes) des contraintes d'intgrit (l'erreur type par exemple sur
les forums internet est de mettre les messages dans la mme table que les titres du
sujet principal).
Le modle physique de donnes de la base avec index et chemins d'accs, tailles des
blocs sur la mmoire morte (clusters).
Des statistiques d'utilisation comme la taille des tables, des index, distribution des
valeurs, les taux de mises--jour, le workload
MS Office Access
544/564
Vincent ISOZ
Remarque: Parmi les techniques prsentes ci-dessous, il n'y a pas de technique meilleure
qu'une autre dans l'absolu.
MS Office Access
545/564
Vincent ISOZ
Voici un exemple d'index squentiel tri dont les informations (donnes) recherches sont
identifies lors de la recherche par des nombres 5 chiffres:
Si nous cherchons rappatrier tous les enregistrements, nous sommes donc moins efficaces
qu'une mthode FAT. Mais si nous devons aller chercher un ou plusieurs enregistrements
spcifiques, nous sommes trivialement gagnants en termes de rapidit mais les i-node
ncessitent par contre de la mmoire A signaler aussi que l'insertion est trs coteuse
lorsqu'on arrive la fin d'un bloc: on peut alors laisser de la place libre dans chaque bloc ou
rserver une zone non trie pour les insertions.
MS Office Access
546/564
Vincent ISOZ
Remarque: Ce systme aurait t utilis (je n'ai pas pu vrifier) dans les dbuts de Linux,
Unix, le systme FAT de MS Windows et les vieux SGBD! Par dfaut MySQL utilise utilise
la technologie ISAM jusqu' la version 5.5.
Le fait d'avoir des blocs qui contiennent que la premire valeur d'un bloc est ce que nous
appelons un "index non-dense" l'oppos des index FAT qui sont des "index denses" car
chaque valeur contient une adresse.
Ainsi, une cl primaire est dans la pratique un index unique, normalement toujours tri (selon
une squence naturelle) de type non-dense ou multi-niveaux (arbre-B ou arbre-B+ que nous
verrons plus loin).
35.3 Arbres
Le principe des arbres (types d'index particuliers donc!) est une version amliore du ISAM
ma connaissance Le principe est bas sur la stratgie du diviser pour mieux rgner
Il existe plusieurs types d'arbres dont voici les plus connus:
Arbres R (gomatique)
Enfin indiquons un exemple de test de performance de l'index par dfaut dans MySQL 5.0 fait
par un collgue avant d'aller plus loin. Le test est effectu sur une table contenant 60'000
lignes et cinq colonnes dont une nomme Type, contenant les valeurs 1, 2 ou 3. La valeur 1
apparat environ 2% des fois dans la colonne, tandis que les valeurs 2 et 3 apparaissent
respectivement 20% et 78% des fois (approximativement). Le test consiste rpter 20 fois
les requtes de slection:
SELECT * FROM NomTable WHERE Type = 1
SELECT * FROM NomTable WHERE Type = 2
SELECT * FROM NomTable WHERE Type =
et mesurer le temps d'excution de chacune d'entre elles. Nous avons test ces trois requtes
avec et sans index sur la colonne Type, ce qui nous fait un jeu de six chantillons. Les
rsultats sont donns en secondes et sont rsums dans le tableau ci-dessous:
MS Office Access
547/564
Vincent ISOZ
35.3.1 Arbre B
L'arbre B est simplement un organigramme dont la taille des branches n'est pas forcment
gale. Nous parlons alors en toute gnralit "d'arbre non balanc". C'est le type d'index
qu'utilisent ma connaissance MS Office Access, MySQL et le systme NTFS. Le problme
avec MS Offce Access c'est qu'au-del de quelques centaines de millier d'enregistrements, il
faut parfois aller changer des valeurs dans la base de registre pour crer des index.
Voici typiquement un exemple d'arbre (celui-ci est balanc!) 2 niveau et 3 feuilles (nondenses) contenant des identifiants (alvoles) associs implicitement des enregistrements
(l'association cl-lments est ce que nous appelons:
MS Office Access
548/564
Vincent ISOZ
Si nous y recherchons de la cl 9: 98 donc nous allons dans n1 et comme 9 < 10 nous allons
dans f3 et 9f3.
Chaque sous-arbre dbute donc avec ce que nous appelons un "nud". Un noeud est donc un
index local, les enregistrements servant de cl (avec une table de hachage ou non), intercals
avec des pointeurs mmoire:
Le sous-arbre point par P2 contient ainsi tous les enregistrements dont la cl est comprise
entre C1 et C2.
Considrons par exemple une table contenant 1'000'000 d'enregistrements o l'administrateur
a pu dfinir un taille de 28 octets par entre (taille d'une alvole) et qu'un cluster a une taille
de 4'096 octets.
Nous avons alors:
4096
146 alvoles / cluster 146 entres / cluster
28
tout en bas de l'arbre. Le niveau d'au-dessus devrait pouvoir indexer ces 6850 clusters aussi
avec des alvoles, il lui faudra donc:
6850
47 clusters
146
Et le niveau d'au-dessus sera simplement un unique cluster avec 47 alvoles. Il s'agit donc
d'un arbre trois niveaux. L'arbre aura donc une taille mmoire utilise pour un millions
d'enregistrement 28 octets l'enregistrement de:
MS Office Access
549/564
Vincent ISOZ
35.3.2 Arbre B+
L'Arbre B+ (R. Bayer et C. McCreight, 1972), appel galement: B-tree ou arbre de Bayer. Le
B+ est l pour indiqu que l'arbre est Balanc (tous les chemins partant de la racine vers une
feuille ont la mme longueur).
Voici comment se remplit un arbre B+ (nous y observons bien que les feuilles sont remplies
au minimum 50%):
MS Office Access
550/564
Vincent ISOZ
Ensuite nous rajoutons encore une personne et puisque toutes les feuilles sont pleines, il
faudra faire une insertion balance (recompalitation de la totalit de l'index):
MS Office Access
551/564
Vincent ISOZ
35.3.3 Arbre-R
L'arbre R permet donc de dcouper des zones gographiques en ensembles et sous-ensembles
et de regroupes celles-ci sous formes d'arbres afin d'accder ensuite plus rapidement aux
donnes. Elles sont utilises non pas pour faire des requtes de noms de pays, villes ou autres
mais utilises pour crer des map visuelles (pensez Google Earth!):
MS Office Access
552/564
Vincent ISOZ
General
Attribute
Maximum
2GB, minus the space needed for system objects
32'768
Number of modules
(including forms and
reports that have the
1'000
HasModule property set to
True)
Number of characters in
an object name
64
Number of characters in a
20
password
Number of characters in a
20
user name or group name
Number of concurrent
users
MS Office Access
255
553/564
Vincent ISOZ
Table
Attribute
Maximum
64
64
255
Table size
255
1 GB
32
10
255
2'048
255
MS Office Access
255
554/564
Vincent ISOZ
Query
Attribute
Maximum
Number of enforced
relationships
32*
16*
1 gigabyte
Sort limit
50*
Approximately 64'000*
*Maximum values might be lower if the query includes multivalued lookup fields.
MS Office Access
555/564
Vincent ISOZ
Maximum
Number of characters in a label
2'048
Number of characters in a text box
65'535
Form or report width
22 in. (55.87 cm)
Section height
22 in. (55.87 cm)
Height of all sections plus section headers (in Design view)
200 in. (508 cm)
7
Number of levels of nested forms or reports
3 in Access 2000
Number of fields or expressions that you can sort or group on in a report 10
1 report
header/footer;
1 page
Number of headers and footers in a report
header/footer;
10 group
headers/footers
Number of printed pages in a report
65,536
Number of controls and sections that you can add over the lifetime of the
754
form or report
Number of characters in an SQL statement that serves as the
Recordsource or Rowsource property of a form, report, or control (both 32'750
.accdb and .adp)
MS Office Access
556/564
Vincent ISOZ
Macro
Attribute
Maximum
Number of actions in a macro
999
Number of characters in a condition
255
Number of characters in a comment
255
Number of characters in an action argument 255
MS Office Access
557/564
Vincent ISOZ
MS Office Access
558/564
Vincent ISOZ
MS Office Access
559/564
Vincent ISOZ
Nouveau contrle de navigateur web (trs utile pour l'aperu des PDF dans les
formulaires)
Nombreuses nouvelles proprits de formatage (typiquement pour les boutons)
et autres pas encore dcouvertes
MS Office Access
560/564
Vincent ISOZ
38 Raccourcis claviers
Vous trouvez que l'utilisation du clavier est parfois plus rapide que celle de la souris ? Les
touches de raccourci vous permettent d'viter les menus et d'excuter des commandes
directement. Vous pouvez utiliser les touches de raccourci de nombreuses fins dans Access,
pour accder aux commandes et aux boutons de la barre d'outils aussi bien que pour insrer la
date du jour. Les touches de raccourci sont parfois rpertories en regard des noms de
commandes dans les menus Access. Par exemple, dans le menu Fichier, la commande
Imprimer indique le raccourci CTRL+P.Pour obtenir la liste exhaustive des raccourcis,
demandez de l'aide au Compagnon Office. Dans Access 2000 ou dans n'importe quelle autre
application Office 2000, appuyez sur F1 pour afficher le Compagnon, puis tapez touches de
raccourci dans la zone de texte. Voici quelques-unes des touches de raccourci les plus utiles
de Access:
TOUCHES DE RACCOURCIS DIVERSES
F2
F7
MAJ+F2
ALT+ENTREE
ALT+F4
CTRL+F2
F11
CTRL+Z
CHAP CHAP
(appuyez deux fois Annuler les modifications apportes l'enregistrement en cours
sur CHAP)
Annuler les modifications apportes au champ en cours
CHAP
Basculer entre Visual Basic Editor et la fentre active
ALT+F11
prcdente
Coller
CTRL+V
Copier
CTRL+C
Enregistrer
CTRL+S
Imprimer
CTRL+P
Insrer la date du jour
CTRL+;
Insrer les donnes du mme champ dans l'enregistrement
CTRL+'
prcdent
Insrer l'heure courante
CTRL+:
CTRL+ENTRE Insrer un retour chariot dans un champ de type mmo ou texte
Ouvrir une base de donnes existante
CTRL+O
MS Office Access
561/564
Vincent ISOZ
CTRL+N
CTRL+F
CTRL+F11
ALT+ESPACE
MAJ+F10
CTRL+W ou
CTRL+F4
ALT+F11
ALT+MAJ+F11
MS Office Access
562/564
Vincent ISOZ
MAJ+HAUT
MAJ+GAUCHE
CTRL+H
MAJ+F4
MS Office Access
563/564
Vincent ISOZ
CTRL+N
CTRL+O
MAJ+F1
MAJ+F1
MS Office Access
564/564