Applications de bureau, illustration avec Access

Transcription

Applications de bureau, illustration avec Access
Applications de
bureau, illustration
avec Access
Conception de bases de données
http://bdd.crzt.fr
Stéphane Crozat
14 septembre 2016
Table des
matières
I - Applications de bureau, illustration avec Access
1. Introduction à Access
4
................................................................................................................ 4
1.1. Présentation d'Access .......................................................................................................................................... 4
1.2. Avantages et inconvénient d'Access
................................................................................................................. 6
1.3. Séparation base de données et application
..................................................................................................... 6
2. Création de schéma relationnel sous Access
2.1.
2.2.
2.3.
2.4.
2.5.
Exercice ................................................................................................................................................................ 7
Création de tables sous Access
........................................................................................................................ 8
Domaines et types de données sous Access
.................................................................................................. 9
Contraintes ......................................................................................................................................................... 10
Vues et "requêtes" LDD
................................................................................................................................. 11
3. Le langage de requêtes sous Access
3.1.
3.2.
3.3.
3.4.
3.5.
........................................................................... 7
...................................................................................... 12
Exercice ..............................................................................................................................................................
Questions QBE ..................................................................................................................................................
Questions SQL ...................................................................................................................................................
Manipulation des données en QBE
................................................................................................................
Clause GROUP BY en QBE
.........................................................................................................................
4. Création d'application Access (formulaires et macros)
4.1.
4.2.
4.3.
4.4.
4.5.
......................................................... 15
Exercice ..............................................................................................................................................................
Formulaire liés à une table
............................................................................................................................
Formulaires indépendants ..................................................................................................................................
Contrôles listes ..................................................................................................................................................
Macros ................................................................................................................................................................
5. Modules de programmation VBA sous Access
16
16
18
20
21
..................................................................... 22
5.1. Exercice ..............................................................................................................................................................
5.2. Structure d'un programme VBA
.....................................................................................................................
5.3. Fonctions à connaître
......................................................................................................................................
5.4. Objets VBA pour accéder à la BD
..............................................................................................................
5.5. Aide et déboguage .............................................................................................................................................
5.6. Exemple : Parcourir une table ou une requête stockée
..............................................................................
5.7. Exemple : Parcourir une table passée en paramètre
...................................................................................
5.8. Exemple : Parcourir une table et gérer les erreurs
....................................................................................
5.9. Exemple : Exécuter une requête
......................................................................................................................
5.10. Exemple : Créer un schéma de BD et initialiser les données
................................................................
5.11. Exemple : Normaliser des chaînes de caractères
........................................................................................
5.12. Exemple : Accéder à un fichier externe
......................................................................................................
6. En résumé : Access
12
12
13
14
15
23
23
23
23
24
24
25
25
25
26
26
26
.................................................................................................................. 27
7. Bibliographie commentée sur Access
8. Questions-réponses sur Access
II - Application : Access
...................................................................................... 27
................................................................................................ 28
30
1. Exercice : Chaîne alimentaire
.................................................................................................. 30
2. Exercice : L'apprenti chimiste
.................................................................................................. 32
3. Exercice : Réparation de tondeuses
........................................................................................ 33
III - Test : Access
35
IV - Pratique : Initiation à Access (base de données et application)
38
1. Exercice : Création de la base de données
2. Exercice : Mise en place de l'application
........................................................................... 38
.............................................................................. 51
3. Exercice : Formulaire d'alimentation de la BD
.................................................................... 53
4. Exercice : Formulaire d'interrogation de la BD
................................................................... 59
5. Exercice : Automatisation de l'application par les macros
.................................................. 59
6. Exercice : Prise en main de l'environnement VBA
............................................................. 63
7. Exercice : Automatisation de l'application en VBA
............................................................. 63
8. Exercice : Alimentation de l'application en VBA
................................................................. 64
9. Exercice : Manipulation des données en VBA
...................................................................... 65
V - Pratique : Initiation à Access VBA
67
1. Exercice : Déclaration de la base de données en SQL
2. Exercice : Test des instructions SQL
....................................................... 67
..................................................................................... 69
3. Exercice : Programme VBA d'exécution SQL
....................................................................... 74
VI - Compléments
1. Pratique : Approfondissement de la création d'application sous Access 77
........................... 77
1.1. Exercice : Alimentation de la BD (amélioration)
........................................................................................ 77
1.2. Exercice : Interrogation de la BD (amélioration)
........................................................................................ 78
1.3. Exercice : Automatisation de l'application (amélioration)
............................................................................ 79
Questions de synthèse
80
Solutions des exercices
85
Abréviations
101
Webographie
102
Index
103
Applications de bureau, illustration avec Access
Applications de
bureau, illustration
avec Access
I
Access est un SGBDR * du monde Microsoft Windows qui présente des particularités intéressantes
dans le cadre de ce cours. Il propose une implémentation stricte des concepts relationnels, et ce
dans un cadre facile d'accès techniquement : il constitue un bon moyen d'accès aux technologies des
*
BD * . C'est également un outil intéressant pour prototyper des applications de BD ou pour réaliser
des applications finales dans des cadres d'usage restreint ou bureautique.
*
1. Introduction à Access
Objectifs
Découvrir un SGBD simple d'usage
Découvrir des principes de maquettage rapide d'application BD
1.1. Présentation d'Access
Access est un SGBDR et un outil de création d'application qui permet de :
- Créer des schémas relationnels et donc créer des tables, des contraintes sur les champs de ces
tables et des contraintes référentielles entre ces tables
- Saisir des données dans les tables, avec l'instruction standard LMD * INSERT ou à travers
une interface graphique composée de formulaires
- Écrire des requêtes et des vues en utilisant le langage SQL * ou bien le formalisme graphique
*
*
QBE
*
*
- Réaliser des formulaires permettant d'alimenter ou interroger la BD *
- Réaliser des états permettant de mettre en forme des résultats de requête de type SELECT
- Réaliser des macros permettant de programmer une application complète
- Réaliser des modules VBA permettant également de programmer une application complète,
avec un spectre plus évolué que celui des macros
*
4
Avantages et inconvénient d'Access
Liste et fonctions des objets manipulables avec Access
5
Séparation base de données et application
1.2. Avantages et inconvénient d'Access
Avantages
-
Rapidité de mise en œuvre
Facilité de maintenance ou reprise
Rapidité de création d'IHM
Langage graphique permettant un apprentissage rapide
Schéma de données robustes (intégrité référentielle, contraintes, type de données, etc.)
Inconvénient
-
Utilisation restreinte aux plate-formes Microsoft Windows
Fiabilité douteuse
Résistance faible à la montée en charge
Peu adapté à des logiques réseaux
Système de sécurité non standard, complexe et inadapté
Faiblesse des IHM pour des applications complexes
Cas d'usage
Access est recommandé pour :
- L'apprentissage des BD.
- Le prototypage rapide de BD et d'application (précision de cahier des charges, dialogue
démonstratif avec les utilisateurs, phase avant la réalisation avec un SGBD industriel, etc.).
- Les petites applications locales ou LAN, avec peu d'utilisateurs (dizaines) et un volume de
données raisonnable (centaines de milliers d'enregistrements, méga-octets).
- Les applications ne pouvant être maintenues par des informaticiens.
1.3. Séparation base de données et application
Conseil
Access est à la fois un SGBDR * permettant de créer des BD * et à la fois un outil de
développement d'application. Il est recommandé, pour des raisons méthodologiques et pratiques de
bien séparer ces deux aspects du problème.
*
*
Méthode : Séparation BD / Application
Pour créer une application complète sous Access, créer deux fichiers ".mdb", l'un contiendra la base
de données (uniquement les tables et les vues sous forme de requêtes), l'autre l'application (les
formulaires, états, macros et modules VBA).
Pour relier les deux applications, créer des tables liés dans le fichier "application", à l'aide du menu
"Fichier / Données externes / Lier les tables"
6
Création de schéma relationnel sous Access
Avantages de cette séparation
- Séparation des problématiques de développement
On ne fait pas à la fois le travail de modélisation de la BD et le travail de réalisation d'une
application d'exploitation de cette BD.
- Utilisation en réseau LAN
Une BD centrale sur un serveur et N applications clientes locales.
- Diminution des risques de crash
Le crash de l'application cliente n'affecte pas la BD contenant les données.
- Facilité de maintenance
La mise à jour de l'application ne remet pas en cause la BD et ne nécessite pas de couper
temporairement l'accès au données. Les développements d'évolution de l'application Version
N peuvent se poursuivre en parallèle de l'exploitation de la version N-1, sans avoir besoin de
remettre à jour les données. L'extension du schéma relationnel peut se faire de façon
transparente pour les applications.
- Sécurité
Plusieurs applications différentes peuvent utiliser la même base de données, tout en
travaillant sur des tables différentes.
Remarque : Maintenance
Toutes les modifications concernant la structure de la base de données (donc les tables) doivent être
faites dans le fichier de la base de données et toutes les autres modifications doivent être faites dans
le fichier de l'application (formulaires, états, etc.)
2. Création de schéma relationnel sous Access
Objectifs
Connaître les éléments techniques de base pour apprendre à créer une BD sous Access
2.1. Exercice
[solution n°1 p.85]
Que renvoie la procédure VBA suivante sous Access ?
1 Function F() As Integer
2 Dim vCodeSql(2) As String
3 vCodeSql(1) = "create table Table1 (Champs1 Integer)"
4 vCodeSql(2) = "insert into Table1 (Champs1) values (1)"
5 For i = 1 To 2
6
CurrentDb.CreateQueryDef("", vCodeSql(i)).Execute
7 Next i
8 CurrentDb.CreateQueryDef("", vCodeSql(2)).Execute
9 Set vRs = CurrentDb.CreateQueryDef("", "select sum(Champs1) AS result from Table1").OpenRecordset
10 F=vRs!result
11 End Function
7
[ *]
Création de tables sous Access
2.2. Création de tables sous Access
En général la création de la base se fera en utilisant l'interface graphique d'édition de table (mode
Création), puis en déclarant les attributs un par un en mode interactif.
Créer une table en mode interactif (Créer > Création de table)
8
Domaines et types de données sous Access
Créer une table en mode interactif (définition des attributs)
Méthode : Création du schéma en mode interactif
L'inconvénient de cette façon de créer la base est qu'il est impossible de recréer automatiquement le
schéma de la base une seconde fois.
Complément : Création du schéma en utilisant le LDD
Il est possible de créer le schéma relationnel dans Access en utilisant des instructions LDD * . Il faut
*
pour cela créer une nouvelle requête, passer en mode SQL et écrire chaque requête SQL * une par
une. Cette solution est donc peu efficace, à moins d'avoir écrit un petit programme VBA qui lit une
suite d'instructions LDD et peut ainsi procéder à la constitution complète de la base à partir d'un
seul fichier externe.
*
2.3. Domaines et types de données sous Access
Types de données
-
9
Texte
Numérique
Date/Heure
Oui/Non
Monétaire
NuméroAuto
Mémo
Objet OLE
Contraintes
- Lien hypertexte
Remarque : Domaine
Le domaine est un type de données pour lequel on a éventuellement ajouté certaines contraintes
supplémentaires (telles que la taille du champs, la précision d'un numérique, des contraintes de
validité restreignant les valeurs possibles, la présence ou non de la valeur de nullité, etc.)
Remarque : Énumération
Pour créer un type énumération, il faut partir d'un type de données standard, et restreindre le
domaine aux valeurs autorisées spécifiées par l'énumération. On utilise pour cela la propriété "Valide
si" relative à l'attribut concerné, avec une expression du type "Valeur1 ou Valeur2 ou ValeurN".
C'est équivalent à la clause CHECK en SQL standard.
2.4. Contraintes
Contraintes de tables et de colonnes
Access permet d'exprimer les contraintes SQL LDD standard :
- PRIMARY KEY : Sélectionner le ou les attributs concernés puis effectuer un clic droit et
sélectionner Clé primaire.
- NOT NULL : Null interdit = oui dans les propriétés du champs
- UNIQUE : Indexé = Oui - Sans doublons dans les propriétés du champs ou utiliser la
fenêtre Index pour les clés composées de plusieurs attributs
- CHECK : Valide si dans les propriétés du champs ou de la table (pour une contrainte de
table)
Contraintes d'intégrité référentielle
Access permet de spécifier les contraintes d'intégrité référentielle (clause FOREIGN KEY) à travers
la fenêtre Relations (menu Outils de bases de données).
Pour spécifier une contrainte d'intégrité référentielle, il faut
1. afficher les tables concernées
2. glisser-déposer la clé étrangère sur la clé primaire
3. cocher la case Appliquer l'intégrité réferentielle
Contraintes d'intégrité référentielle
10
Vues et "requêtes" LDD
Attention
Dans Access le mot "relation" désigne en fait les contraintes d'intégrités référentielles, et non les
tables comme c'est le cas dans la terminologie relationnelle. Ceci est un abus de langage.
Rappel : Contrôle sur les données
Le contrôle sur les données opéré par un SGBD correspond à divers éléments : contrôle du domaine,
mais aussi de l'intégrité référentielle, de la non nullité, etc.
Ces contraintes peuvent être levées : en spécifiant un domaine très permissif (comme les chaînes de
caractères), en supprimant les clause de non nullité, ou bien en supprimant l'intégrité référentielle
(dans la fenêtre Relations d'Access).
La suppression des contraintes peut être nécessaire pour intégrer temporairement des données qui ne
correspondent pas au modèle. Elles devront bien entendu dans ce cas être mises en conformité au
plus vite, et les contraintes pourront alors être réactivées.
Complément : Enumération
Pour déclarer une énumération dans Access, il faut impérativement la spécifier au niveau de la
structure de la base de données, donc au niveau de la propriété Valide si de l'attribut. La
déclaration de cette énumération au niveau d'une liste déroulante dans l'IHM de saisie de la table (
Liste de choix) n'est pas pertinente car c'est uniquement ce "petit bout d'IHM" qui contrôle les
valeurs de l'énumération et non le moteur du SGBD. Donc une autre partie de l'application avec
une autre IHM pourra permettre des valeurs différentes, ce qui n'est pas souhaité.
2.5. Vues et "requêtes" LDD
Il est possible de spécifier des créations de schémas relationnels en utilisant le LDD de SQL classique
sous Access.
Pour cela il faut créer un objet Requête, puis indiquer que c'est une requête de type Création
de table.
Attention : Types non reconnus
Access n'accepte pas toutes les déclarations de type dans ce cadre. Par exemple il n'est pas possible
de déclarer INTEGER(X), mais seulement INTEGER. La contrainte de taille ne pouvant se faire
qu'en mode interactif.
Vues
Sous Access, les objets Requêtes sont enregistrés.
Pour créer une vue, il suffit donc ce créer un objet Requête de Sélection et de l'enregistrer.
En fait, sous Access, la norme et la vue et l'exception la requête au sens d'évanescent (pour exécuter
une requête qui ne soit pas enregistrée comme une vue, il suffit de ne pas enregistrer la requête).
11
Le langage de requêtes sous Access
3. Le langage de requêtes sous Access
Objectifs
Connaître les principes du langage de requête QBE et savoir lire une requête QBE
3.1. Exercice
[solution n°2 p.85]
[ *]
A quelles opérations relationnelles est équivalente l'instruction QBE sous Access ci-dessous :
Une instruction QBE

Restriction( Produit(T1,T2), T1.a=T2.a ET T1.b=T2.b)

JointureNaturelle (T1, T2)

Projection( Produit(T1, T2), a, b)

Jointure (T1, T2, T1.a=T2.a ET T1.b=T2.b)
3.2. Questions QBE
Remarque
L'on parle de QBE pour désigner le langage graphique proposé par Access, même s'il ne s'agit que
d'une inspiration du "vrai" langage QBE proposé par IBM dès 1977 et implémenté dans la base
Paradox en 1985.
QBE
*
*
permet la création de requête LMD
*
*
en mode interactif, sans écrire de code.
Il faut pour cela :
1. Ajouter les tables
2. Réaliser les jointures en glissant-déposant une des propriétés à joindre sur l'autre (par défaut
l'interface joint les clés étrangères et les clés primaires, il est bien entendu possible de
supprimer la jointure).
3. Glisser-déposer les propriétés à projeter sur la grille
4.
12
Questions SQL
4. Effectuer les restrictions sur la ligne "critère" de la grille.
Exemple : Equivalence QBE-SQL
Une requête QBE annotée en SQL
Remarque : Jointure externe
Pour représenter une jointure externe gauche ou droite, afficher les propriétés de la jointure (doubleclic ou clic droit sur le lien), puis sélectionner l'option adéquate.
Une jointure externe gauche
Attention : Joker
Les jokers sous Access ne sont pas standard, ils s'expriment à l'aide des caractères * au lieu de %
pour 0 à N caractères et ? au lieu de _ pour 1 et 1 seul caractère.
3.3. Questions SQL
Pour écrire une requête en SQL sous Access, il suffit de créer objet requête, puis de passer en mode
SQL (menu Créer).
13
Manipulation des données en QBE
Il est ainsi possible d'écrire du LDD (CREATE TABLE) et du LMD (SELECT, INSERT,
UPDATE).
Remarque : Équivalence QBE / SQL
Il est possible de faire des aller-retour entre le mode SQL et le mode Création (QBE).
1. menu Créer ; icône Création de requête ; fermer la fenêtre Afficher la table qui
apparaît (elle n'est utile que pour écrire des requêtes en QBE)
2. mode SQL (en haut à droite)
3. écrire la requête SQL ; cliquer sur l'icône Exécuter pour l'exécuter
Écrire une requête SQL sous Access
3.4. Manipulation des données en QBE
Pour exécuter une requête autre que de type SELECT, il faut changer son type via le menu Créer
lorsque la requête est en mode Création.
- UPDATE : Mise à jour
- INSERT : Ajout
- DELETE : Suppression
Changer le type de requête
Attention : Problèmes de traduction
Des problèmes de traduction dans certaines versions d'Access conduisent à des formulations
hasardeuses des menus. Ainsi "Mettre à jour une requête" signifie "Requête de mise à jour" et
"Supprimer une requête" signifie "Requête de suppression". L'erreur de traduction vient
probablement du double sens de "Update query" et "Delete query" en anglais...
Ces défaut sont supprimés dans les versions récentes d'Access.
14
Création d'application Access (formulaires et macros)
3.5. Clause GROUP BY en QBE
Appliquer la clause GROUP BY se nomme en Access "faire un regroupement". L'interface QBE ne
le permet pas par défaut, il faut au préalable afficher la ligne Opération, qui fera apparaître une
ligne supplémentaire sur l'interface (menu Affichage > Opérations avant Access 2007, bouton
Totaux depuis)
Activer le GROUP BY
Exemple : Regroupement en QBE sous Access et GROUP BY en SQL
Regroupement en QBE
1 SELECT Effet, Avg(Durée) AS MoyenneDeDurée
2 FROM TPotion
3 GROUP BY Effet;
Remarque : HAVING
Pour ajouter une clause HAVING, il suffit d'utiliser la ligne "critère" sous une propriété à laquelle
est appliquée une opération.
4. Création d'application Access (formulaires et macros)
Objectifs
Connaître les éléments techniques de base pour apprendre à créer une application sous Access
Notons que les états ne sont pas traités ici, mais leur apprentissage est aisé une fois le principe
compris pour les formulaires.
15
Formulaire liés à une table
4.1. Exercice
[solution n°3 p.86]
[ *]
Soit la table tPersonnes et le formulaire fRecherchePersonne suivant. Le formulaire contient un champs
de saisie de texte "Choix" et un bouton "Exec" qui appelle une fonction VBA "fRecherche()".
Table tPersonne et formulaire fRecherchePersonne
1 Function fRecherche()
2 vChoix = "'" + Forms!fRecherchePersonnes!Choix + "'"
3 vCodeSql = "select pkNom from tPersonnes where pkNom=" + vChoix
4 Set vRs = CurrentDb.CreateQueryDef("", vCodeSql).OpenRecordset
5 MsgBox vRs.RecordCount
6 fRecherche = vRs.RecordCount
7 End Function
Quelle est la valeur maximale qui peut-être renvoyée par la fonction fRecherche (répondez "infini" s'il
n'y a pas de valeur maximale) ?
4.2. Formulaire liés à une table
Définition : Formulaire lié
Un formulaire lié est un formulaire qui offre un accès direct à une (et une seule) table.
Pour lier un formulaire à une table il faut désigner le nom d'une table dans la propriété "Source" du
formulaire.
16
Formulaire liés à une table
Source d'un formulaire
Remarque : Contrôle lié
Dans le cadre d'un formulaire lié, il est possible (et c'est même le seul intérêt) de créer des contrôles
liés. De tels contrôles référencent directement un attribut d'une table (grâce à leur propriété "Source
contrôle") et permettent donc une saisie directe d'information dans la base sans écrire de code SQL
*
*
LMD * .
*
Source d'un contrôle
Conseil : Usage des formulaires liés
Il est plutôt déconseillé de recourir aux formulaires liés, qui, s'ils offrent une première approche très
simple pour créer des interfaces de saisie, reste très limités fonctionnellement. On leur préférera
rapidement les formulaires indépendants et les requêtes LMD
*
*
de type INSERT et UPDATE.
Attention : Formulaire lié et pages multiples
Un formulaire lié, lorsqu'il est en "Mode simple" (valeur de la propriété "Affich par défaut")
comporte autant de "pages" qu'il y a d'enregistrements dans la table liée.
17
Formulaires indépendants
Chaque page permet de modifier l'enregistrement qu'elle matérialise, et la dernière page permet
d'ajouter un nouvel enregistrement.
Par défaut le formulaire s'ouvre toujours sur le premier enregistrement, et il faut donc se déplacer
après le dernier pour en ajouter un nouveau.
Il faut pour cela utiliser les boutons en bas à gauche du formulaire :
Déplacement dans les différents enregistrements d'un formulaire lié
4.3. Formulaires indépendants
Définition : Formulaire indépendants
Les formulaires indépendants ne sont pas liés à une table (leur propriété "Source" est vierge).
Ils servent à récupérer des valeurs en mémoire, dans des variables, avant d'en faire un traitement
par programmation : On pourra par exemple utiliser cette valeur dans une requête SQL
type INSERT pour ajouter des enregistrements dans une table.
*
*
LMD
*
*
de
Il est toujours possible de faire, avec un formulaire indépendant et une requête SQL, ce qu'il est
possible de faire avec un formulaire lié (et l'on peut bien entendu faire beaucoup plus).
18
Formulaires indépendants
Syntaxe
Formulaire indépendant
Pour créer un formulaire indépendant, sélectionner Formulaire vierge dans le menu, et/ou
veiller à ce que la propriété Source du formulaire soit vide.
Remarque : Contrôles et formulaires indépendants
Les contrôles d'un formulaire indépendant ne peuvent bien entendu pas être liés à une table. Ils ne
peuvent servir qu'à stocker une valeur en mémoire pour un usage donné. Ils sont de ce fait
comparable à des variables.
Syntaxe : Utiliser une valeur saisie dans le contrôle d'un formulaire indépendant
Pour utiliser les valeurs indépendantes (en mémoire) de contrôle d'un formulaire, dans d'autres
objets (formulaires, états, requêtes, macros ou modules), utiliser l'une des deux syntaxes suivantes :
1 Formulaires!NomDuFormulaire!NomDuContrôle
1 Forms!NomDuFormulaire!NomDuContrôle
Exemple : Mise à jour de plusieurs tables
1. Saisie de valeurs relatives à plusieurs enregistrements, de tables différentes, dans un formulaire
2. Utilisation de ces valeurs dans des requêtes d'insertion pour ajouter les valeurs dans les tables
1 INSERT INTO TVilles (pkVille, aPays)
2 VALUES (Formulaires!FChoix!Ville, Formulaires!FChoix!Pays)
19
Contrôles listes
Exemple : Requêtes paramétrées
1. Saisie de valeurs relatives à des paramètres dans un formulaire
2. Exécution d'une requête de sélection s'appuyant sur ces paramètres
1 SELECT * FROM TVilles
2 WHERE Pays = Formulaires!FChoix!Pays
4.4. Contrôles listes
Les listes déroulantes sont des contrôles très intéressants qui permettent de récupérer des valeurs
dynamiques grâce à une requête ou de spécifier des valeurs statiques parmi lesquelles l'utilisateur
choisira.
- Pour que les valeurs de la liste soit définies dynamiquement à partir du résultat d'une requête,
fixer la propriété "Origine source" à la valeur "Table/Requête", puis écrire la requête dans la
propriété "Contenu".
- Pour que les valeurs de la liste soit définies statiquement, fixer la propriété "Origine source" à
la valeur "Liste Valeurs", puis lister les valeurs en les séparant par des points-virgules dans la
propriété "Contenu".
Contenu d'un contrôle liste
Remarque : Liste à plusieurs colonnes
Il est possible de réaliser des listes déroulantes à plusieurs colonnes. Il suffit pour cela que la requête
spécifiée dans "Contenu" projette plusieurs attributs.
20
Macros
Il faudra dans ce cas régler correctement les propriétés "Nbre colonnes" (le nombre de colonnes) et
"Colonne liée" (le numéro de la colonne principale, qui renvoie la valeur à stocker reéellement dans
la variable associée au contrôle).
Remarque : Récupération de la valeur d'une colonne d'une liste
1 Formulaires!NomDuFormulaire!NomDuContrôleListe.column(X)
2 Avec X de 0 à N-1, N étant le nombre de colonnes
4.5. Macros
Attention
Un objet "macro" est en fait un objet "groupe de macro". Il faudra afficher les colonnes optionnelles
:
- Noms de macros
- Conditions
- Arguments
Une macro est définie par un nom (première colonne) et une succession d'instructions (actions dans
la dernière colonne) éventuellement soumises à des conditions d'exécution (seconde colonne). Chaque
action requiert de fixer un certain nombre de paramètres qui s'affiche dans la partie basse de
l'interface après que l'action ait été sélectionnée.
Interface de création de macros
Exemple
- OuvrirFormulaire
Ouvre un formulaire
- OuvrirEtat
Ouvre un état
- BoîteMsg
Crée une boîte de dialogue avec l'utilisateur.
- AtteindreEnregistrement
Dans un formulaire lié, permet d'atteindre un enregistrement particulier.
21
Modules de programmation VBA sous Access
- DéfinirValeur
Permet de fixer la valeur de n'importe quelle propriété d'un contrôle de formulaire. Cette
action est très utile pour rendre les interfaces plus dynamiques.
- ExécuterMacro
Exécute une autre macro. Cette action est utile pour modulariser le code Macro (bien que
sans passage de paramètres, cela reste sommaire).
- Fermer
Ferme un objet de type fomulaire, état, etc.
- TrouverEnregistrement
Dans un formulaire lié, permet de se rendre à un enregistrement particulier en fonction de la
valeur de l'un de ses contrôles.
- AtteindreContrôle
Permet de sélectionner un contrôle particulier dans un formulaire. Cette action est utile avant
d'effectuer un TrouverEnregistrement par exemple.
- Actualiser
Permet de rafraîchir un contrôle (après un DéfinirValeur ou pour ré-exécuter la requête
source d'une liste déroulante par exemple )
- Avertissements
Active ou désactive les avertissements lors de l'exécution de requêtes.
- ExécuterCommande
Permet d'exécuter une des commandes disponible dans les menu d'Access
- ArrêtMacro
Stoppe la macro, sans exécuter les instructions restantes. Cette actions est utile pour terminer
la macro après un test par exemple.
Appel des macros
Les macros sont en général appelées par des évènements particuliers survenus lors de la
manipulation des formulaires et états (programmation évènementielle des formulaires et états).
Les macros peuvent également être appelées par d'autres macro, voire du code VBA.
Complément : Macro AutoExec
Si une macro porte le nom "AutoExec", elle sera exécutée automatiquement à l'ouverture de la base
de données.
Cette macro peut servir typiquement à afficher un menu général d'entrée dans l'application.
Pour désactiver l'exécution automatique de la macro AutoExec, maintenez la touche "shift" de
l'ordinateur appuyée lors du lancement de l'application.
5. Modules de programmation VBA sous Access
Objectifs
Découvrir les modalités d'accès à une base de données via un langage de programmation
Savoir accéder à une base de données Access depuis un programme VBA
22
Exercice
5.1. Exercice
[solution n°4 p.87]
[ *]
Que renvoie la fonction VBA ci-dessous :
1 Function FonctionSecrete() As String
2 CurrentDb.CreateQueryDef("", "delete from T1").Execute
3 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('1')").Execute
4 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('2')").Execute
5 Set vRs = CurrentDb.CreateQueryDef("", "select * from T1").OpenRecordset
6 x = vRs!a
7 vRs.MoveNext
8 x = vRs!a
9 FonctionSecrete = x
10 End Function
5.2. Structure d'un programme VBA
- Fonction (function)
Retourne une valeur, utilisable dans les requêtes, les formulaires et les états.
- Procédure (sub)
Effectue des opérations, en général sur les tables, notion de procédures stockées
Syntaxe
1 {Sub | Function} nom (param1 As type, ...) {As type retourné}
2 Dim variable1 As type
3 ...
4 {End Sub | End Function}
5.3. Fonctions à connaître
- Traitement de chaîne : LCase(S), UCase(S), Left(S, 1), Right(S, 1), Len(S), +, ...
- Gestion nombre : Cast : Int()...
5.4. Objets VBA pour accéder à la BD
- CurrentDb : Objet base de données
- .CreateQueryDef(nom_requête,code_sql) : Crée un objet requête
"nom_requête" avec le code "code_sql". Si "nom_requête" est renseigné la requête
est enregistrée comme un objet persistant dans la base, si "nom_requête" est vide la
requête n'est pas enregistrée.
- QueryDef : Objet requête
- .OpenRecordset : Exécute une requête de type SELECT
- .Execute : Exécute une requête de type INSERT, UPDATE ou DELETE (ou LDD * )
*
- Recordset : Pointeur sur un résultat de requête
23
Aide et déboguage
- .MoveNext, .MoveFirst, .MoveLast : Atteindre l'enregistrement suivant, le
premier, le dernier
- .RecordCount : Le nombre d'enregistrements du résultat
- .EOF : Booléen permettant de tester si on a atteint à la fin du résultat
- !nom_champ : La valeur du champ "nom_champ"
Syntaxe : Alimentation de la BD
1 CurrentDb.CreateQueryDef("", "INSERT...").Execute
Syntaxe : Interrogation de la BD
1 Set vRs = CurrentDb.CreateQueryDef("", "SELECT...").OpenRecordset
2 Do While Not vRs.EOF
3 ... vRs!MonChamp ...
4 vRs.MoveNext
5 Loop
Remarque : Approche alternative
1 For i = 1 To vRs.RecordCount
2 ... vRs!MonChamp ...
3 vRs.MoveNext
4 Next i
5.5. Aide et déboguage
Attention : Accéder à l'aide en ligne
Pour accéder à l'aide en ligne sur les fonctions VBA demander l'aide (F1) depuis l'éditeur Visual
Basic (Module) et non directement depuis Access.
Attention : Fenêtre d'exécution
La fenêtre d'exécution est indispensable pour tester les programmes VBA.
Pour obtenir la fenêtre d'exécution, faire "Affichage / Fenêtre d'exécution" dans le menu de
l'éditeur VBA / Module.
La syntaxe "Debug.Print" dans un programme permet ensuite d'afficher des informations dans cette
fenêtre (valeur de variable typiquement).
5.6. Exemple : Parcourir une table ou une requête stockée
1 Sub ParcoursTable()
2 Set vRs = CurrentDb.OpenRecordset("MaTable")
3 For i = 1 To vRs.RecordCount
4 Debug.Print vRs!MonChamp
5 vRs.MoveNext
24
Exemple : Parcourir une table passée en paramètre
6 Next i
7 End Sub
5.7. Exemple : Parcourir une table passée en paramètre
1 Sub ParcoursTable(pTable As String, pChamp As String)
2 Set vRs = CurrentDb.OpenRecordset(pTable)
3 Set vChamp = vRs.Fields
4 For i = 0 To vChamp.Count - 1
5 If vChamp(i).Name = pChamp Then NumChamp = i
6 Next i
7 For i = 1 To vRs.RecordCount
8 Debug.Print vRs.Fields(NumChamp)
9 vRs.MoveNext
10 Next i
11 End Sub
5.8. Exemple : Parcourir une table et gérer les erreurs
1 Sub ParcoursTable(pTable As String, pChamp As String)
2 On Error GoTo Erreur_ParcoursTable
3 Set vRs = CurrentDb.OpenRecordset(pTable)
4 Set vChamp = vRs.Fields
5 For i = 0 To vChamp.Count - 1
6 If vChamp(i).Name = pChamp Then NumChamp = i
7 Next i
8 For i = 1 To vRs.RecordCount
9 Debug.Print vRs.Fields(NumChamp)
10 vRs.MoveNext
11 Next i
12 Exit_ParcoursTable:
13 Exit Sub
14 Erreur_ParcoursTable:
15 Debug.Print "Erreur"
16 MsgBox "Erreur"
17 End Sub
5.9. Exemple : Exécuter une requête
1 Sub ExecuterRequete(pTable As String, pChamps As String)
2 Dim vCodeSql As String
3
4 vCodeSql = "select " + pChamps + " from " + pTable
5 Set vRs = CurrentDb.CreateQueryDef("", vCodeSql).OpenRecordset
6 For i = 1 To vRs.RecordCount
7 Debug.Print vRs.Fields(0)
8 vRs.MoveNext
9 Next i
10 End Sub
25
Exemple : Normaliser des chaînes de caractères
5.10. Exemple : Créer un schéma de BD et initialiser les données
1 Sub InitBD()
2 Const NbLignesSql As Integer = 3
3 Dim vCodeSql(NbLignesSql) As String
4 vCodeSql(1) = "drop table Table1"
5 vCodeSql(2) = "create table Table1 (Champs1 String(150))"
6 vCodeSql(3) = "insert into Table1 (Champs1) values (""test"")"
7 For i = 1 To NbLignesSql
8 CurrentDb.CreateQueryDef("", vCodeSql(i)).Execute
9 Next i
10 End Sub
5.11. Exemple : Normaliser des chaînes de caractères
1 Function NormaliserChaine(s As String) As String
2 Result = ""
3 For i = 1 To Len(s)
4 C = Right(Left(s, i), 1)
5 Select Case C
6 Case "é", "è", "ê"
7 C = "e"
8 Case "à"
9 C = "a"
10 Case "ï"
11 C = "i"
12 End Select
13 Result = Result + C
14 Next i
15 Result = UCase(Left(Result, 1)) + LCase(Right(Result, Len(Result) - 1))
16 NormaliserChaine = Result
17 End Function
5.12. Exemple : Accéder à un fichier externe
Cet exemple (extrait de l'aide en ligne d'Access) utilise la fonction Input pour lire un fichier
caractère par caractère et les afficher dans la fenêtre Exécution. Nous supposons que FICHTEST est
un fichier texte comportant quelques lignes de données.
Exemple
1 Sub LireFichier()
2 Dim MyChar
3 Open "FICHTEST" For Input As #1 ' Ouvre le fichier
4 Do While Not EOF(1) ' Effectue la boucle jusqu'à la fin du fichier
5 MyChar = Input(1, #1) ' Lit un caractère
6 Debug.Print MyChar ' Affiche dans la fenêtre Exécution
7 Loop
8 Close #1 ' Ferme le fichier
9 End Sub
26
En résumé : Access
6. En résumé : Access
Access
À la fois un SGBDR pour créer des BD et un outil de développement d'applications
- BD
Dimension relevant de la conception de BD
- LDD
- Tables
- LMD
- Requêtes (Vue)
- Application
Dimension relevant de la conception d'application.
- IHM
- Formulaires
- États
- Programmation
- Macros
- Modules VBA
7. Bibliographie commentée sur Access
Complément : Pratique
Comprendre les jointures dans Access
*
*
Un tutoriel très pédagogique sur l'expression de jointures sous Access, qui peut par ailleurs servir à
comprendre l'opération de jointure en général si besoin.
Complément : Pour aller plus loin
Developpez.com
*
*
Un portail avec de nombreuses ressources.
FAQ de Développez.com
*
*
Une base de questions très intéressante pour la dimension outils de création d'application d'Access.
On consultera en particulier les informations sur la gestion de la sécurité, les formulaires, VBA.
27
Questions-réponses sur Access
8. Questions-réponses sur Access
Comment supprimer les messages d'alertes lors de l'exécution des requêtes ?
VBA : DoCmd.SetWarnings False
Macro : Avertissements=Non
Comment atteindre un contrôle d'un sous-formulaire ?
Forms![NomFormulaire].form![NomSousFormulaire]![MaZoneDeTexte]
(ici pour une zone de texte)
Comment parcourir un "RecordSet" en VBA?
1 Rst.MoveFirst
2 While not rst.EOF
3 ' code
4 rst.MoveNext
5 Wend
1 Do Until rst.EOF
2 ' code
3 rst.MoveNext
4 Loop
Comment calculer la difference entre 2 dates en VBA ?
1 DateDiff("d", date1, date2)
2 'donne le nombre de jour entre date1 et date2
Comment mettre un point d'arrêt dans un code VBA ?
Quand Access passe sur un point d'arrêt l'exécution du code s'arrête et attends une manœuvre de
votre part pour continuer.
- Quand le code est arrêté vous pouvez connaître la valeur des variables de votre code
simplement en passant le pointeur de la souris dessus.
Vous pouvez choisir de continuer à exécuter le code en mode pas à pas en appuyant sur F8.
Vous pouvez poursuivre l'exécution du code normalement avec F5.
Quel est la diference entre "." et "!" ?
L'opérateur "!" (point d'exclamation) indique que l'élément qui suit est défini par l'utilisateur (un
élément d'une collection). Par exemple, vous pouvez utiliser l'opérateur "!" pour faire référence à un
formulaire ouvert, à un état ouvert, ou à un contrôle figurant sur un formulaire ou sur un état.
28
Questions-réponses sur Access
L'opérateur "." (point) indique généralement que l'élément qui suit est défini par Microsoft Access.
Par exemple, vous pouvez utiliser l'opérateur "." pour faire référence à une propriété d'un
formulaire, d'un état, ou d'un contrôle.
29
Application : Access
Application : Access
II
1. Exercice : Chaîne alimentaire
[45 min]
Une base de données Access permet de représenter différentes espèces d'herbivores, ainsi que les
plantes qu'elles consomment et ce en fonction du continent où l'on trouve les plantes et les animaux.
Modèle logique sous Access
Question 1
[solution n°5 p.87]
[ *]
Rétro-concevoir le modèle UML associé à cette base de données.
Formulaires et requêtes
Les formulaires fPlantes et fMange ont été créés, pour alimenter respectivement les tables
tPlantes et tMange.
30
Exercice : Chaîne alimentaire
Formulaire fPlantes
Formulaire fMange
Pour le formulaire fMange, on souhaite que :
- le champ animal ne propose que des animaux existants dans la base ;
- le champ plante ne propose que des plantes situées sur le même continent que l'animal
choisi.
Question 2
[solution n°6 p.88]
[ *]
Écrire la requête rAlimPlantes permettant d'insérer les données dans la table tPlantes à l'aide
du formulaire fPlantes, sachant que les champs du formulaire sont nommés comme leur étiquette
(le texte qui leur fait face).
Question 3
[solution n°7 p.88]
[ *]
Écrire la requête rAnimal permettant d'initialiser la première liste déroulante du formulaire
fMange.
Question 4
[solution n°8 p.88]
[ *]
Écrire la requête rPlante permettant d'initialiser la seconde liste déroulante du formulaire fMange
.
31
Exercice : L'apprenti chimiste
VBA
Le formulaire fNbPlantesMangees permet de savoir combien de plantes différentes sont mangées
par un animal choisi dans un menu déroulant. Il appelle pour cela une procédure comptePlantes
lorsque l'on clique sur le bouton. La procédure comptePlantes exécute une requête pour compter
le nombre de plantes mangées par l'animal saisi dans le contrôle nom et l'affiche dans une boîte de
dialogue de type MessageBox, comme dans l'exemple ci-après.
Formulaire fNbPlantesMangees
Exemple de MsgBox
Question 5
[solution n°9 p.88]
[ *]
Écrire le code VBA de la procédure comptePlantes.
2. Exercice : L'apprenti chimiste
[15 minutes]
Soit la requête suivante exprimée en QBE sous Access :
32
Exercice : Réparation de tondeuses
Requête en QBE
Question 1
[solution n°10 p.89]
[ *]
Qu'exprime cette requête ?
Question 2
[solution n°11 p.89]
[ *]
Écrivez une requête équivalente en SQL.
3. Exercice : Réparation de tondeuses
[20 min]
Une petite entreprise de réparation de tondeuse, située à proximité de Montpellier, souhaite créer
une nouvelle base de données pour s'occuper de son activité, notamment pour gérer la liste de ses
clients et du matériel en leur possession. Elle s'adresse à vous, car elle utilise Access depuis quelques
années, mais le modèle qu'elle a développé (en totale autonomie) est limité et pose certains
problèmes d'intégrité. Votre expertise serait appréciée pour modifier et corriger la base existante.
Actuellement, la base tient sur une unique table, déjà alimentée car fonctionnelle depuis plusieurs
années.
33
Exercice : Réparation de tondeuses
La table tondeuse
Les données de la table tondeuse
À l'aide du schéma de la table et des données, vous parvenez à la liste des dépendances
fonctionnelles suivantes sous la forme d'une fermeture transitive :
- nucli nom, prenom, adresse, cp, ville
- modele marque, puissance, type, bac
- modele, num_serie
nucli, nom, prenom, adresse,
millesime, date_achat, marque, puissance, type, bac
Question 1
cp,
ville,
[solution n°12 p.89]
[ *]
Énoncez les clés candidates. En quelle forme normale est le schéma de la base existante ? Justifiez
votre réponse.
Question 2
[solution n°13 p.89]
[ *]
Afin de préparer la décomposition du schéma relationnel, proposez une couverture minimale des
DFE.
Question 3
[solution n°14 p.89]
[ *]
Décomposez le schéma relationnel de la base existante, en préservant les DF, pour proposer un
modèle relationnel en 3NF.
Question 4
[solution n°15 p.90]
[ *]
Rétro-concevez le MCD qui aurait permis d'aboutir directement à ce schéma relationnel.
34
Test : Access
Test : Access
Exercice
III
[solution n°16 p.90]
[ *]
Soit la table tPersonnes et le formulaire fRecherchePersonne suivant. Le formulaire contient un
champs de saisie de texte "Choix" et un bouton "Exec" qui appelle une fonction VBA
"fRecherche()".
Table tPersonne et formulaire fRecherchePersonne
1 Function fRecherche()
2 vChoix = "'" + Forms!fRecherchePersonnes!Choix + "'"
3 vCodeSql = "select pkNom from tPersonnes where pkNom=" + vChoix
4 Set vRs = CurrentDb.CreateQueryDef("", vCodeSql).OpenRecordset
5 MsgBox vRs.RecordCount
6 fRecherche = vRs.RecordCount
7 End Function
Quelle est la valeur maximale qui peut-être renvoyée par la fonction fRecherche (répondez "infini"
s'il n'y a pas de valeur maximale) ?
35
Test : Access
Exercice
[solution n°17 p.91]
[ *]
A quelles opérations relationnelles est équivalente l'instruction QBE sous Access ci-dessous :
Une instruction QBE

Restriction( Produit(T1,T2), T1.a=T2.a ET T1.b=T2.b)

JointureNaturelle (T1, T2)

Projection( Produit(T1, T2), a, b)

Jointure (T1, T2, T1.a=T2.a ET T1.b=T2.b)
Exercice
[solution n°18 p.92]
[ *]
Que renvoie la fonction VBA ci-dessous :
1 Function FonctionSecrete() As String
2 CurrentDb.CreateQueryDef("", "delete from T1").Execute
3 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('1')").Execute
4 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('2')").Execute
5 Set vRs = CurrentDb.CreateQueryDef("", "select * from T1").OpenRecordset
6 x = vRs!a
7 vRs.MoveNext
8 x = vRs!a
9 FonctionSecrete = x
10 End Function
36
Test : Access
Exercice
[solution n°19 p.92]
[ *]
A quelles instructions SQL est équivalente l'instruction QBE sous Access ci-dessous :
Une instruction QBE

SELECT a FROM T1
WHERE T1.a=[formulaires]![F1]![C1];

INSERT INTO T2 (a)
SELECT T1.a FROM T1
WHERE T1.a=[formulaires]![F1]![C1];

INSERT INTO T2 (a)

SELECT a FROM T1, T2
VALUES ([formulaires]![F1]![C1]);
WHERE T1.a=T2.a AND T1.a=[formulaires]![F1]![C1];
Exercice
[solution n°20 p.93]
[ *]
Que renvoie la procédure VBA suivante sous Access ?
1 Function F() As Integer
2 Dim vCodeSql(2) As String
3 vCodeSql(1) = "create table Table1 (Champs1 Integer)"
4 vCodeSql(2) = "insert into Table1 (Champs1) values (1)"
5 For i = 1 To 2
6
CurrentDb.CreateQueryDef("", vCodeSql(i)).Execute
7 Next i
8 CurrentDb.CreateQueryDef("", vCodeSql(2)).Execute
9 Set vRs = CurrentDb.CreateQueryDef("", "select sum(Champs1) AS result from Table1").OpenRecordset
10 F=vRs!result
11 End Function
37
Pratique : Initiation à Access (base de données et application)
Pratique : Initiation
à Access (base de
données et
application)
IV
Objectifs
Apprendre à se servir d'Access
Expérimenter les concepts de SGBDR
Au cours de de la première partie du TP, vous allez devoir concevoir une BD, puis l'implémenter
sous Access.
L'usage des assistants est formellement interdit (Si un assistant apparaît involontairement, annuler
et continuer manuellement).
1. Exercice : Création de la base de données
Mise en situation
Vous êtes le président de l'association "Objectifs", dont l'objet est d'aider ses étudiants membres à
mener des projets dans le cadre de leurs études. Cette association a besoin d'une base de données
pour gérer ses projets.
38
Exercice : Création de la base de données
État des projets de l'association Objectifs
Vous réalisez un modèle conceptuel permettant de traiter le problème.
Modèle UML de la base de données de gestion de projets
39
Exercice : Création de la base de données
Modèle E-A de la base de données de gestion de projets
Vous décidez de commencer par un sous-ensemble de la base de données, permettant de gérer les
projets, les spécialités et les chefs de projet uniquement, tel que formalisé sur le schéma relationnel
ci-après.
1 Projet (#Num, Nom, Debut, Fin, ChefDeProjet=>Membre, Specialite=>Specialite
2 Specialite (#Intitule)
3 Membre (#Prenom, Nom, Specialite=>Specialite)
Vous décidez d'utiliser Access pour implémenter votre BD.
Question 1
Justifiez le choix d'Access pour votre application en quelques arguments.
Question 2
Créer la base de données assoBd.mdb.
Indice :
À partir de l'écran d'accueil d'Access :
1. Choisir une base de données vide
2. Nommer la base
3.
40
Exercice : Création de la base de données
3. Cliquer sur créer
Créer une base de données
Question 3
Créer les trois tables tProjet, tSpecialite et tMembre.
Indices :
Pour nommer les tables, il est fortement conseillé sous Access d'adopter une convention qui
consiste à préfixer le nom de la table d'un "t" (pour table).
Pour créer une table :
1. Cliquer sur Créer > table
2. Cliquer sur Affichage > Mode Création
3. Saisir le nom de la table
41
Exercice : Création de la base de données
Créer une table
42
Exercice : Création de la base de données
Créer une table (passer en mode création)
Pour déclarer les attributs d'une table
1. Saisir le nom de chaque attribut
2. Associer son type via la liste déroulante
3. Documenter l'attribut dans la colonne description
Les contraintes sont à spécifier dans la zone du bas :
-
43
Taille du champ
Valide si (CHECK)
Null interdit et Chaîne vide autorisée (NOT NULL)
Indexé > Oui - Sans doublons (UNIQUE)
Exercice : Création de la base de données
Déclarer les attributs
Question 4
Déclarer les clés primaires et les clés candidates. Déclarer une clé candidate composée, par exemple
(Nom, Debut) pour la relation Projet.
Indice :
Pour déclarer les clés :
1. Pour la clé primaire (si elle n'est pas composée), sélectionner l'attribut et cliquer sur le
bouton Clé primaire.
2. Pour les clés candidates spécifier : Null interdit > oui (et chaîne vide non
autorisée le cas échéant) et Indexé > Oui - Sans doublon.
3. Plus généralement et notamment pour les clés composées, passer par le menu Création
> Index.
44
Exercice : Création de la base de données
Déclarer la clé primaire
45
Exercice : Création de la base de données
Déclarer une clé candidate
46
Exercice : Création de la base de données
Déclarer une clé composée
Question 5
Déclarer les contraintes d'intégrités référentielles sur les clés étrangères.
Indice :
1.
2.
3.
4.
47
Cliquer sur Outils de base de données > Relation
Ajoutez toutes les tables de votre base de données
Glisser-déposer chaque clé étrangère sur la clé primaire référencée
Cliquez sur l'option "Appliquer l'intégrité référentielle"
Exercice : Création de la base de données
Activation des contraintes d'intégrité référentielle
48
Exercice : Création de la base de données
Déclaration des contraintes d'intégrité référentielle
Question 6
Ajouter une vue vProjet permettant de renvoyer les projets avec leurs membres.
1 vProjet = jointure (Projet, Membre, Projet.ChefDeProjet=Membre.Prenom)
Indice :
Dans Access un objet "Requête" est une vue.
Pour ajouter une vue :
1. Cliquer sur Créer > Création de requête
2. Sélectionner les tables utilisées dans la requête (ou annuler le menu d'ajout de table pour
écrire la requête directement en SQL ou spécifier les tables ultérieurement)
3. Enregistrer (CTRL+S) pour nommer votre requête
La requête peut ensuite être écrite en utilisant le langage graphique d'Access ou directement en
SQL.
49
Exercice : Création de la base de données
Créer une vue
50
Exercice : Mise en place de l'application
Passer en mode SQL
2. Exercice : Mise en place de l'application
Votre BD réalisée, vous décidez à présent de commencer la réalisation de l'application. Pour cela
vous vous faites aider par un membre de l'association, Pierre, qui connaît bien le problème de la
gestion des projets dans "Objectifs", et qui par ailleurs à une bonne expérience de la conception des
IHM.
Prenez connaissance des propositions d'interface pour l'ajout et la recherche de projets que vous a
faites Pierre.
51
Exercice : Mise en place de l'application
Interface d'ajout de projets
Interface de recherche d'un projet
Question 1
Afin de préparer la réalisation de l'application, créez un second fichier "assoAppli.mdb", et reliez-le
à celui contenant votre BD ("assoBd.mdb").
Indice :
Pour relier 2 fichiers Access :
1.
2.
3.
4.
5.
Ouvrir le fichier de l'application qui va référencer le fichier de la base de données
Cliquer sur Données Externes > Access
Sélectionner votre fichier de base de données
Sélectionner l'option Lié à la source de données...
Sélectionner toutes les tables
Les tables apparaissent dans l'application, précédées d'une flèche, qui indique qu'elles sont en
fait physiquement dans un autre fichier.
52
Exercice : Formulaire d'alimentation de la BD
Accès à la base de données depuis l'application
Question 2
Décrivez le processus de conception que vous avez adopté pour réaliser votre base de données, en en
décrivant les différentes étapes, et après avoir rappelé en quoi et pourquoi l'on sépare la conception
de la BD de ses applications.
Donnez un exemple concret dans le cas de votre réalisation de problème qui justifie cette séparation.
3. Exercice : Formulaire d'alimentation de la BD
Réaliser un unique formulaire indépendant permettant de saisir un nouveau projet, avec :
- Son numéro, son nom, son début et sa fin.
- Son chef de projet
- Sa spécialité
Les participations des membres de l'association au projet, les partenaires, et les tâches ne sont pas
à définir à ce stade, ils s'inscriront ultérieurement grâce à un autre formulaire qui n'est pas à
réaliser dans le cadre de cette question.
Formulaires indépendants (cf. p.18)
Question 1
Créer le formulaire en utilisant uniquement des contrôles de type "zone de texte".
53
Exercice : Formulaire d'alimentation de la BD
NB : La réalisation d'interfaces avancées n'est pas le but de ce TP, même si vous avez la possibilité
d'aller plus loin en traitant les questions suivantes.
Indices :
Il est conseillé de préfixer les noms des formulaire par un "f".
Pour créer une formulaire indépendant :
1.
2.
3.
4.
Cliquer sur
Cliquer sur
Enregistrer
Cliquer sur
Créer > Formulaire vierge
Affichage > Mode création
pour le nommer (CTRL+S)
Création > Feuilles de propriétés
Créer un formulaire indépendant
54
Exercice : Formulaire d'alimentation de la BD
Passer un formulaire en mode création
55
Exercice : Formulaire d'alimentation de la BD
Afficher les propriétés du formulaire ou d'un contrôle
Pour ajouter un contrôle :
1. Cliquer sur le type de contrôle dans le menu Création
2. Cliquer sur l'endroit du formulaire où il doit être ajouté
3. Lui donner son nom dans la feuille de propriétés
Penser à donner un nom explicite à chaque contrôle, comme par exemple les trois premières
lettres de l'attribut auquel il correspond.
56
Exercice : Formulaire d'alimentation de la BD
Ajouter un contrôle de type zone de texte
Pour tester un formulaire, passer le en mode formulaire.
Question 2
Créez une requête de type Ajout (INSERT) permettant d'ajouter les nouvelles informations dans
la table tProjet depuis le formulaire.
Indices :
57
Exercice : Formulaire d'alimentation de la BD
Créer une requête de type INSERT
Il est conseillé de préfixer les noms des requêtes par un "r".
Pour écrire une requête directement en SQL, sans passer par l'interface graphique, choisissez
"Affichage > Mode SQL".
Pour l'exécuter cliquer sur Exécuter.
La syntaxe suivante permet de récupérer la valeur courante d'un contrôle d'un formulaire ouvert
: Formulaires!NomDuFormulaire!NomDuContrôle
Dans une instruction SQL on peut donc écrire : INSERT INTO t (attribut) VALUES
(Formulaires!NomDuFormulaire!NomDuContrôle)
où
Formulaires!
NomDuFormulaire!NomDuContrôle sera remplacé par sa valeur courante dans le formulaire.
Le formulaire doit donc être ouvert, et des valeurs doivent être saisies et validées, pour que la
requête s'exécute correctement.
1 INSERT INTO tProjet
2 (pknum, nom, ...)
3 VALUES
4 (Formulaires!fProjet!num, Formulaires!fProjet!nom, ...)
Question 3
Testez votre application en insérant des données, vérifier que les contraintes d'intégrité sont bien
contrôlées.
58
Exercice : Formulaire d'interrogation de la BD
4. Exercice : Formulaire d'interrogation de la BD
Réaliser une vue dont la requête source est paramétrée par un formulaire, afin de rechercher les
projets tels que leur nom contient un (unique) mot clé donné dans le formulaire.
Le numéro et le nom seront projetés.
Question 1
Créer le formulaire de recherche fRecherche.
Question 2
Créer la vue vRecherche.
Indices :
Pensez à l'usage de l'opérateur de comparaison de chaîne LIKE.
Le caractère de concaténation est "&" et le joker "*" désigne plusieurs caractères ("*" est sous
Access équivalent au caractère "%" standard en SQL).
1 SELECT ...
2 FROM tProjet
3 WHERE nom LIKE "*" & Forms!fRecherche!nom ...
Attention : lorsque vous saisissez une valeur dans le formulaire, faites "Entrée" pour valider
avant d'exécuter la requête.
Question 3
Proposer un exemple d'exécution.
Indice :
Un exemple d'exécution dans votre cas est une illustration d'un résultat obtenu (sortie) à partir
du paramétrage (entrée). On pourra par exemple effectuer des copies d'écran.
5. Exercice : Automatisation de l'application par les macros
Question 1
Ajouter un bouton "OK" à vos formulaires d'ajout et de recherche de projet, afin d'exécuter
directement les requêtes SQL.
Indice :
59
Exercice : Automatisation de l'application par les macros
Ajouter un contrôle de type bouton de commande
N'utilisez pas les assistants ! (annuler dès qu'ils se présentent).
Question 2
Automatisez l'ouverture des formulaires avec des Macros.
Indices :
Pour créer une macro :
1. Cliquer sur Créer > Macro > Macro
2. Sélectionner les actions à effectuer
3. Paramétrer les actions dans la zone basse
60
Exercice : Automatisation de l'application par les macros
Créer une macro
61
Exercice : Automatisation de l'application par les macros
Éditeur une macro
En général, dès que l'on a plusieurs macros, il est conseillé de travailler avec des groupes de
macros, plutôt que des macros isolés. Pour cela activer la colonne Noms de macros.
62
Exercice : Prise en main de l'environnement VBA
Activer les options des macros
6. Exercice : Prise en main de l'environnement VBA
Créez un module "test".
Question
[solution n°21 p.94]
[ *]
Écrivez une procédure "HelloWorld()" :
- qui prend en argument une chaîne de caractères
- affiche "Hello Word" suivi de la chaîne passée en argument dans la fenêtre d'exécution
Écrivez une fonction "fHelloWorld2()" qui, en plus, retourne la valeur 0.
Indices :
Affichez la fenêtre d'exécution (CTRL+G ou menu "afficher") dans l'interface d'édition de
module VBA.
Pour exécuter une fonction tapez "? fonction(arg1, arg2)" dans la fenêtre d'exécution.
Pour exécuter une procédure, tapez simplement "proc arg1 arg2" dans la fenêtre d'exécution.
L'instruction "Debug.Print MyString" permet l'affichage dans la fenêtre d'exécution.
Le caractère de concaténation sous Access est "&".
7. Exercice : Automatisation de l'application en VBA
Question
63
Exercice : Alimentation de l'application en VBA
Automatisez l'ouverture des formulaires avec des fonctions VBA.
Indices :
1.
2.
3.
4.
Ajoutez un module VBA ihm
Écrivez les fonctions insertProjet() et rechercheProjet()
Utilisez le commande DoCmd.OpenQuery ("nom de la requête")
Ajoutez l'appel à la fonction sur la propriété "Sur clic" du bouton
Créer un module VBA
Pour appeler une fonction depuis un contrôle, écrire =nomDeLaFonction() dans la propriété
événementielle voulue du contrôle (Sur clic par exemple).
1 Function rechercheProjet()
2 DoCmd.OpenQuery ("vRecherche")
3 End Function
8. Exercice : Alimentation de l'application en VBA
Créez un module "Alimentation".
Question 1
[solution n°22 p.95]
[ *]
Créer une fonction "fAjoutSpecialite" prenant en argument une chaîne de caractère et réalisant
l'insertion dans la base de données.
Testez-la en ajoutant de nouvelles spécialités.
64
Exercice : Manipulation des données en VBA
Indice :
Inspirez vous de l'exemple du cours.
Utilisez l'instruction : CurrentDb.CreateQueryDef("", vSQL).Execute.
Question 2
[solution n°23 p.95]
[ *]
Créer un formulaire indépendant permettant d'ajouter des spécialités (le formulaire ne contient
donc qu'un seul champ).
Indices :
Le formulaire fera appel à la fonction "fAjoutSpecialite()" en lui passant en argument le contenu
du champ de saisie.
La fonction sera appelée sur la propriété "Sur Clic" du bouton "Valider" du formulaire.
Question 3
[solution n°24 p.96]
[ *]
[Cette question est optionnelle]
Ajoutez à votre fonction une gestion d'exception permettant de renvoyer 1 si l'exécution s'est bien
passé et 0 sinon.
Indice :
Inspirez vous de l'exemple du cours.
Utilisez la structure de gestion d'exception ci-après.
1 On Error GoTo ErreurInsertion
2 ...
3 Exit_ParcoursTable:
4 ...
5 Erreur_ParcoursTable:
6 ...
Question 4
[solution n°25 p.96]
[ *]
[Cette question est optionnelle]
Ajoutez à votre fonction un test préliminaire permettant d'alerter l'utilisateur en cas de doublon.
Indices :
Commencez par une instruction SELECT pour vérifier que la chaîne à insérer n'existe pas déjà.
S'il la chaîne existe, alertez l'utilisateur à l'aide de l'instruction "MsgBox vMessage".
9. Exercice : Manipulation des données en VBA
Question 1
[solution n°26 p.97]
[ *]
Créer un module "Manipulation".
Écrivez deux fonctions, l'une permettant de renvoyer le nombre de spécialités actuellement
existantes et l'autre le nombre de spécialités actuellement utilisées.
65
Exercice : Manipulation des données en VBA
Affichez le résultat de ces deux fonctions dans le formulaire "fAjoutSpecialite".
Indice :
Pour afficher le résultat d'une fonction, ajouter un contrôle de type saisie de texte, avec comme
valeur "=fNomFonction()".
Question 2
[Cette question est optionnelle]
Écrivez une fonction permettant de normaliser une chaîne de caractère de la façon suivante :
- La chaîne ne doit pas comporter d'espace (tout ce qui est après le premier espace est
supprimé).
- La chaîne commence par une majuscule et se poursuit par des minuscules.
Utiliser cette fonction pour normaliser la table spécialité.
Indices :
- La fonction Right(S, N) renvoie le N caractères à droites de la chaîne S (idem pour Left à
gauche).
- La fonction Len(S) renvoie la longueur de la chaîne S
- Le caractère de concaténation est le "&"
Appeler la fonction dans une instruction UPDATE.
Vous veillerez à propager les mises à jour dans les tables référençant les spécialités :
- Utilisation de la propriété ON CASCADE,
- ou bien suppression de la contrainte d'intégrité avant mise à jour, et réactivation après.
* *
*
Faire une démonstration de votre réalisation, en montrant vos schémas MCD et MLD, votre code SQL,
le résultat de son exécution dans Access (interface de création de table), votre séparation
BD/application, votre formulaire de saisie, la requête d'insertion depuis ce formulaire, le formulaire
d'interrogation, la requête de question paramétrée associée.
Décrivez le processus général de conception d'une base de données et de ses couches applicatives sous
Access, en soulignant pour chacune des étapes les aspects technologiques qui vous paraissent intéressants
ou au contraire limitants.
Appuyez-vous sur ce que vous avez réalisé pour montrer et argumenter.
66
Pratique : Initiation à Access VBA
Pratique : Initiation
à Access VBA
V
Objectifs
Apprendre à se servir de VBA pour manipuler une base de données Access
Expérimenter l'usage d'un langage de programmation pour manipuler une base de données
La première partie du TP a pour objectif l'écriture d'un programme VBA permettant de lire un
fichier SQL de façon à exécuter une série d'instructions LDD et LMD en vue de la création et de
l'initialisation d'une base de données.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rédigée.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.
1. Exercice : Déclaration de la base de données en SQL
Vous êtes le président de l'association "Objectifs", dont l'objet est d'aider ses étudiants membres à
mener des projets dans le cadre de leurs études. Cette association est dotée d'une base de données
Access pour gérer les projets. Afin d'envisager l'amélioration de l'application, vous décidez d'en
refaire le développement en utilisant le langage de développement d'Access, le VBA.
Votre première action est de redévelopper la création de la base en se basant sur le langage SQL
plutôt que la création interactive qui a été jusque là favorisée. Cela permettra de plus facilement
modifier la base dans le cadre d'évolutions futures.
67
Exercice : Déclaration de la base de données en SQL
Modèle UML de la base de données de gestion de projets
État des projets de l'association Objectifs
La base de données n'a pour le moment été implémentée que partiellement. Le schéma relationnel
ci-dessous décrit ce qui a été traité.
1 Projet (#Num, Nom, Debut, Fin, ChefDeProjet=>Membre, Specialite=>Specialite
2 Specialite (#Intitule)
3 Membre (#Prenom, Nom, Specialite=>Specialite)
68
Exercice : Test des instructions SQL
Question 1
[solution n°27 p.97]
[ *]
Écrivez dans un fichier texte les instructions LDD permettant d'implémenter les trois tables de ce
schéma relationnel.
Indice :
Utilisez un éditeur ASCII pour écrire du code informatique (comme par exemple le logiciel libre
Notepad++). N'utilisez jamais un logiciel de traitement de texte, comme Word, qui ajoute des
caractères non standards, gère mal les tabulations, etc.
Question 2
[solution n°28 p.98]
[ *]
Écrivez dans un fichier texte les instructions LMD permettant d'initialiser la base de données avec
les données existantes.
2. Exercice : Test des instructions SQL
Afin de vérifier la validité de votre SQL et de tester le comportement d'Access, exécutez vos
requêtes SQL une par une via l'interface graphique d'Access.
Question 1
Créez une base de données "assoBdTmp.mdb". Ouvrez une nouvelle requête en mode SQL et copiez
vos instructions SQL une par une afin de les exécuter.
Indices :
Il peut arriver qu'Access bloque une instruction (pour des raisons de "sécurité"), vous pouvez la
débloquer.
69
Exercice : Test des instructions SQL
Gérer les contrôles de sécurité d'Access
Pour écrire une requête directement en SQL, créer une requête puis choisissez le mode SQL.
70
Exercice : Test des instructions SQL
Passer en mode SQL
71
Exercice : Test des instructions SQL
Exécuter une requête
Pour voir les nouvelles données s'afficher dans une table déjà ouverte, après un INSERT par
exemple, utiliser le bouton Actualiser.
72
Exercice : Programme VBA d'exécution SQL
Rafraîchir les valeurs d'une table déjà ouverte.
Question 2
[solution n°29 p.98]
[ *]
Vérifiez au fur et à mesure que la base de données se construit bien conformément à vos
instructions.
Indices :
Tester les types acceptés par Access et ceux qui ne le sont pas. Par exemple
- les types VARCHAR(X) et INTEGER et DATE sont acceptés
- le type CHAR n'existe pas, mais sa déclaration est acceptée et il et est géré comme un
VARCHAR
Veillez au format des dates à l'insertion.
Vérifier les clauses SQL acceptées et celles qui ne le sont pas : Par exemple DEFAULT et
CHECK (correspondant à "Valide Si") ne sont pas acceptés (ils ne peuvent être spécifiés qu'en
mode interactif, pas en SQL).
http://cerig.efpg.inpg.fr/tutoriel/bases-de-donnees/chap18.htm
Pensez à vérifier que les contraintes d'intégrité sont bien déclarées, via la fenêtre "Relations"
(menu Outils > Relations)
73
Exercice : Programme VBA d'exécution SQL
3. Exercice : Programme VBA d'exécution SQL
Vous allez à présent écrire un programme VBA qui permettra d'enchaîner l'exécution des requêtes
SQL sans avoir à passer par l'interface graphique. En effet, vous découvrez qu'il n'est pas prévu
dans Access de créer une BD à partir d'un fichier texte contenant des instructions SQL (alors que
la plupart des SGBD proposent ce genre de fonctions).
Question 1
Créez une base de données "assoBd2.mdb". Créez un module VBA nommé "SQL". Configurez
correctement votre interface d'exécution.
Indice :
Affichez la fenêtre d'exécution (CTRL+G ou menu "afficher") dans l'interface d'édition de
module VBA.
Question 2
[solution n°30 p.99]
[ *]
Écrivez le programme VBA permettant d'enchaîner l'exécution de vos requêtes SQL.
Indices :
Afin de manipuler un fichier, il faut utiliser les instructions Open, Input et Close.
Appuyez vous sur l'exemple de code VBA du cours et sur l'aide d'Access pour avoir un exemple
de programme permettant la lecture d'un fichier. Pour cela écrivez le mot "Open" (par exemple)
et appuyez sur CTRL+F1.
74
Exercice : Programme VBA d'exécution SQL
Aide en ligne d'Access
Notez que le caractère point-virgule est l'élément séparateur entre deux requêtes.
Pour exécuter une requête LDD, utilisez l'instruction : CurrentDb.CreateQueryDef("",
vSql).Execute (avec vSQL l'instruction SQL sous forme de chaîne de caractère).
Testez votre programme à l'aide de deux instructions SQL simples, comme par exemple celles
proposées ci-dessous.
- create table t (a integer);
- insert into t values (1);
Pensez à supprimer les tables créées entre deux exécutions, sinon le moteur de la BD vous
renverra une erreur due à l'impossibilité de créer deux tables de même nom.
Vous pouvez utiliser l'instruction DROP TABLE à cette fin.
Utilisez votre programme pour lire votre (ou vos) fichiers contenant les listes d'instructions SQL et
les exécuter.
Question 3
Créez d'abord le schéma de la base de données.
Question 4
[solution n°31 p.99]
[ *]
75
Exercice : Programme VBA d'exécution SQL
Initialisez les données de la base en utilisant le même procédé.
76
Compléments
Compléments
VI
1. Pratique : Approfondissement de la création d'application sous
Access Objectifs
Approfondir l'usage d'Access
Expérimenter les concepts de SGBDR
Réaliser des applications de bases de données
Ce TP est réservé aux étudiants de NX17, il vise à approfondir l'usage d'Access, notamment dans
sa fonction de création d'applications.
Il est demandé de prendre des notes au niveau de chaque question posée, afin de garder la trace des
réalisations.
Une synthèse finale d'une ou deux pages devra être rédigée.
Une démonstration de 5 minutes devra également être faite à votre chargé de TP.
L'usage des assistants est formellement interdit (Si un assistant apparaît involontairement, annuler
et continuer manuellement).
Ce TP fait suite au premier TP sous Access, il vise à terminer la création de l'application telle que
l'avait spécifié Pierre.
1.1. Exercice : Alimentation de la BD (amélioration)
L'objectif est de compléter le formulaire d'alimentation de la base de données pour qu'il
corresponde à celui préconisé par Pierre.
Question 1
Proposer de choisir le chef de projet et la spécialité dans une liste plutôt que de le saisir en toutes
lettres (pour le chef de projet, on pourra alors afficher selon la sélection son prénom et sa spécialité).
Question 2
Ajouter l'insertion des tâches en même temps que du projet (plusieurs requêtes INSERT devront
être exécutées).
77
Exercice : Interrogation de la BD (amélioration)
Question 3
Pour les tâches, on vérifiera que les débuts et fins des tâches sont cohérents avec le projet. On
vérifiera aussi que tout projet contient au moins une tâche.
Question 4
Pour les chefs de projet et les spécialités, permettre de définir une nouvelle valeur. Une requête
INSERT complémentaire devra insérer donc préalablement insérer cette valeur dans les tables
correspondantes.
1.2. Exercice : Interrogation de la BD (amélioration)
L'objectif est de compléter le formulaire de recherche pour qu'il corresponde à celui préconisé par
Pierre. Réaliser une nouvelle vue dont la requête source est paramétrée par un second formulaire
plus élaboré, afin de rechercher les projets tels que :
-
Leur nom contient un (unique) mot clé donné.
Ils ont commencé avant une date donnée et se sont terminés après une date donnée.
Leur chef de projet est donné.
La spécialité du projet est donnée.
Chacun de ces paramètres peut ne pas être renseigné. Ces paramètres correspondent également aux
données à projeter pour le lecteur.
Question 1
Créer le formulaire de recherche fRecherche2.
Question 2
Créer la vue vRecherche2.
Indices :
Faites une recherche dans l'aide sur l'extension SQL "IIf" proposée par Access, pour tester les
cas de nullité et proposer une valeur par défaut permettant de tout sélectionner si le champ
n'est pas renseigné.
Faites une recherche dans l'aide sur l'extension SQL "IsNull" proposée par Access pour tester la
nullité d'un champ.
Faites une recherche dans l'aide sur l'extension SQL "CDate" proposée par Access, permettant
de saisir des date dans une expression SQL.
Question 3
Réaliser un état permettant de mettre en forme la vue précédente. Appelez cet état plutôt que la
requête depuis le formulaire.
78
Exercice : Automatisation de l'application (amélioration)
1.3. Exercice : Automatisation de l'application (amélioration)
Afin de terminer votre application, vous complétez votre IHM afin que l'utilisateur puisse naviguer
de formulaire en formulaire sans utiliser l'interface par défaut d'Access.
Question 1
Réaliser un menu d'accueil, initialisé à l'ouverture de la base, qui permet soit de rechercher des
projets existants, soit d'en saisir un nouveau.
Indice :
Utilisez la macro "AutoExec".
Question 2
Réaliser les boutons permettant de fermer chaque formulaire et de retourner au menu d'accueil.
79
Questions de synthèse
Questions de synthèse
Citez un bon et un mauvais cas d'usage d'Access.
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
Expliquer pourquoi Access est à la fois un SGBDR et un outil de création d'application. Est-ce que des
précautions particulières doivent-être prises à ce propos ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
Access peut-il être considéré comme un "vrai" SGBDR du point de vue de la création du schéma
relationnel ? Pourquoi ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
Expliquer pourquoi les objets "requête" d'Access sont en fait des vues ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
80
Stéphane Crozat (Contributions : Antoine Vincent)
Questions de synthèse
..............................................................................................................................................................................
..............................................................................................................................................................................
Access peut-il être considéré comme un "vrai" SGBD du point de vue de l'interrogation des données ?
Pourquoi ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Qu'est ce que QBE par rapport à SQL ? Quels sont ses avantages et inconvénients ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
A quoi servent les formulaires ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Quelle est la différence entre un formulaire lié et un formulaire indépendant ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Quel type de formulaire faut-il préférer en général et pourquoi ?
..............................................................................................................................................................................
..............................................................................................................................................................................
81
Stéphane Crozat (Contributions : Antoine Vincent)
Questions de synthèse
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
A quoi servent les macros ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
Faut-il préférer l'usage des macros ou bien de code plus bas niveau ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
A quoi sert le code VBA ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
VBA peut-il être assimilé à un "vrai" langage de programmation ?
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
82
Stéphane Crozat (Contributions : Antoine Vincent)
Questions de synthèse
VBA complète-t-il ou bien remplace-t-il SQL lors de la réalisation d'application ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Que peut-on faire avec un langage comme VBA que l'on ne peut pas faire en SQL en terme de
manipulation de données ?
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Donner quelques exemples illustrant la conformité, et inversement la non-conformité, d'Access avec une
approche SQL classique.
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Synthétisez votre pratique de la réalisation d'application sous Access, en abordant des thèmes tels que les
formulaires indépendants, les requêtes paramétrées par les formulaires, les états, les macros.
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
Apportez une vision critique de cette approche de la réalisation d'application en en soulignant les aspects
positifs et négatifs.
..............................................................................................................................................................................
..............................................................................................................................................................................
83
Stéphane Crozat (Contributions : Antoine Vincent)
Questions de synthèse
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
.............................................................................................................................................................................................
84
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Solutions des
exercices
Exercice p. 7
> Solution n°1
Que renvoie la procédure VBA suivante sous Access ?
1 Function F() As Integer
2 Dim vCodeSql(2) As String
3 vCodeSql(1) = "create table Table1 (Champs1 Integer)"
4 vCodeSql(2) = "insert into Table1 (Champs1) values (1)"
5 For i = 1 To 2
6
CurrentDb.CreateQueryDef("", vCodeSql(i)).Execute
7 Next i
8 CurrentDb.CreateQueryDef("", vCodeSql(2)).Execute
9 Set vRs = CurrentDb.CreateQueryDef("", "select sum(Champs1) AS result from Table1").OpenRecordset
10 F=vRs!result
11 End Function
2
Exercice p. 12
> Solution n°2
A quelles opérations relationnelles est équivalente l'instruction QBE sous Access ci-dessous :
Une instruction QBE

Restriction( Produit(T1,T2), T1.a=T2.a ET T1.b=T2.b)

JointureNaturelle (T1, T2)
85
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices

Projection( Produit(T1, T2), a, b)

Jointure (T1, T2, T1.a=T2.a ET T1.b=T2.b)
Description de l'instruction QBE
1. Une restriction composée avec un produit est équivalent à une jointure
2. Les tables T1 et T2 ayant le même schéma, une jointure naturelle porterai sur a et b, mais aussi
sur c.
3. Une projection composée avec un produit n'est pas équivalent à une jointure
4. La proposition exprime exactement la requête QBE.
Exercice p. 16
> Solution n°3
Soit la table tPersonnes et le formulaire fRecherchePersonne suivant. Le formulaire contient un champs
de saisie de texte "Choix" et un bouton "Exec" qui appelle une fonction VBA "fRecherche()".
Table tPersonne et formulaire fRecherchePersonne
1 Function fRecherche()
2 vChoix = "'" + Forms!fRecherchePersonnes!Choix + "'"
3 vCodeSql = "select pkNom from tPersonnes where pkNom=" + vChoix
4 Set vRs = CurrentDb.CreateQueryDef("", vCodeSql).OpenRecordset
86
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
5 MsgBox vRs.RecordCount
6 fRecherche = vRs.RecordCount
7 End Function
Quelle est la valeur maximale qui peut-être renvoyée par la fonction fRecherche (répondez "infini" s'il
n'y a pas de valeur maximale) ?
1
fRecherche() renvoie le nombre d'occurrences de la chaîne saisie dans le formulaire fRecherchePersonnes
dans le champs pkNom de la table tPersonnes. Or pkNom est la clé primaire, donc une seule occurrence
est possible au maximum.
Exercice p. 23
> Solution n°4
Que renvoie la fonction VBA ci-dessous :
1 Function FonctionSecrete() As String
2 CurrentDb.CreateQueryDef("", "delete from T1").Execute
3 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('1')").Execute
4 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('2')").Execute
5 Set vRs = CurrentDb.CreateQueryDef("", "select * from T1").OpenRecordset
6 x = vRs!a
7 vRs.MoveNext
8 x = vRs!a
9 FonctionSecrete = x
10 End Function
2
Soit la description pas à pas de l'exécution du programme :
1.
2.
3.
4.
5.
6.
7.
8.
Élimination de tous les tuples de T1
Contenu de T1 : (1)
Contenu de T1 : (1) (2)
Création d'un recordset sur T1 (sans projection ni restriction), le recordset contient donc deux
tuples et à l'initialisation pointe sur le premier (1)
Affectation de la valeur de l'attribut "a" dans le premier tuple à la variable "x" (donc x=1)
Le recordset avance au second tuple (2)
Affectation de la valeur de "a" dans le second tuple à "x" (donc x=2)
La fonction retourne la valeur de "x", donc 2
87
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Exercice p. 30
> Solution n°5
Modèle UML
Une classe abstraite Espèce et un héritage peuvent être envisagés.
> Solution n°6
Exercice p. 31
1 INSERT INTO tPlantes (nom, localisation, taille, famille) VALUES (Formulaires!fPlantes!nom,Formulaires!
fPlantes!localisation, Formulaires!fPlantes!taille, Formulaires!fPlantes!famille)
> Solution n°7
Exercice p. 31
1 SELECT nom
2 FROM therbivores;
> Solution n°8
Exercice p. 31
1 SELECT tplantes.nom
2 FROM tplantes, therbivores
3 WHERE therbivores.nom=tplantes.Forms!fMange!animal AND therbivores.provenance=tplantes.localisation;
> Solution n°9
Exercice p. 32
1 Sub ComptePlantes()
2 Dim req As String
88
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
3 Dim ret As Integer
4 req = "SELECT COUNT(*) FROM tmange WHERE tmange.herbivore='" & Forms!fNbPlantesMangees!nom
& "';"
5 Set vRs = CurrentDb.CreateQueryDef("", req).OpenRecordset
6 If vRs.RecordCount = 0 Then
7 ret = 0
8 Else
9 ret = vRs.Fields(0)
10 End If
11 MsgBox (" nombre de plantes mangées : " & ret)
12 End Sub
Exercice p. 33
> Solution n°10
Cette requête permet de sélectionner tous les découvreurs qui ont découvert des molécules stables
contenant au moins trois des atomes spécifiés dans le contrôle "Atome" du formulaire "FChoix".
Exercice p. 33
> Solution n°11
1 SELECT Découvreur, TMolécule.Molécule
2 FROM TMolécule INNER JOIN TAtome ON TMolécule.Molécule = TAtome.Molécule
3 WHERE Stable=True
4 AND Atome=[Formulaires]![FChoix]![Atome]
5 AND Nombre>2;
> Solution n°12
Exercice p. 34
La seule clé possible est (modele, num_serie).
Ce schéma est en 1NF (les attributs sont atomiques et il existe une clé ( modele, num_serie),
mais pas en 2NF (car modele est une partie de clé qui détermine des attributs non clé).
On peut également considérer que l'attribut adresse n'est pas atomique (il contient le numéro et
la rue du client), auquel cas le schéma n'est pas en 1NF.
> Solution n°13
Exercice p. 34
1 nucli → nom, prenom, adresse, cp, ville
2 modele → marque, puissance, type, bac
3 modele, num_serie → nucli, millesime, date_achat
> Solution n°14
Exercice p. 34
1 Client(#nucli:integer, nom:string, prenom:string, adresse:string, cp:string, ville:string)
2 Modele(#modele:string, marque:string, puissance:integer, type:{'electrique', 'thermique', 'manuelle'}, bac:
integer)
89
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
3 Tondeuse(#num_serie:string, #modele => Modele(modele), client => Client(nucli), millesime: integer,
date_achat:date)
Si adresse a été considérée comme non atomique, elle doit également être décomposée en
adresse_num:string et adresse_rue:string : Client(#nucli:integer, nom:
string, prenom:string, adresse_num:string, adresse_rue:string, cp:string,
ville:string)
Exercice p. 34
> Solution n°15
UML de la base tondeuse
> Solution n°16
Exercice p. 35
Soit la table tPersonnes et le formulaire fRecherchePersonne suivant. Le formulaire contient un champs
de saisie de texte "Choix" et un bouton "Exec" qui appelle une fonction VBA "fRecherche()".
90
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Table tPersonne et formulaire fRecherchePersonne
1 Function fRecherche()
2 vChoix = "'" + Forms!fRecherchePersonnes!Choix + "'"
3 vCodeSql = "select pkNom from tPersonnes where pkNom=" + vChoix
4 Set vRs = CurrentDb.CreateQueryDef("", vCodeSql).OpenRecordset
5 MsgBox vRs.RecordCount
6 fRecherche = vRs.RecordCount
7 End Function
Quelle est la valeur maximale qui peut-être renvoyée par la fonction fRecherche (répondez "infini" s'il
n'y a pas de valeur maximale) ?
1
fRecherche() renvoie le nombre d'occurrences de la chaîne saisie dans le formulaire fRecherchePersonnes
dans le champs pkNom de la table tPersonnes. Or pkNom est la clé primaire, donc une seule occurrence
est possible au maximum.
Exercice p. 36
> Solution n°17
A quelles opérations relationnelles est équivalente l'instruction QBE sous Access ci-dessous :
Une instruction QBE

Restriction( Produit(T1,T2), T1.a=T2.a ET T1.b=T2.b)

JointureNaturelle (T1, T2)

Projection( Produit(T1, T2), a, b)

Jointure (T1, T2, T1.a=T2.a ET T1.b=T2.b)
91
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Description de l'instruction QBE
1. Une restriction composée avec un produit est équivalent à une jointure
2. Les tables T1 et T2 ayant le même schéma, une jointure naturelle porterai sur a et b, mais aussi
sur c.
3. Une projection composée avec un produit n'est pas équivalent à une jointure
4. La proposition exprime exactement la requête QBE.
> Solution n°18
Exercice p. 36
Que renvoie la fonction VBA ci-dessous :
1 Function FonctionSecrete() As String
2 CurrentDb.CreateQueryDef("", "delete from T1").Execute
3 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('1')").Execute
4 CurrentDb.CreateQueryDef("", "insert into T1 (a) values ('2')").Execute
5 Set vRs = CurrentDb.CreateQueryDef("", "select * from T1").OpenRecordset
6 x = vRs!a
7 vRs.MoveNext
8 x = vRs!a
9 FonctionSecrete = x
10 End Function
2
Soit la description pas à pas de l'exécution du programme :
1.
2.
3.
4.
5.
6.
7.
8.
Élimination de tous les tuples de T1
Contenu de T1 : (1)
Contenu de T1 : (1) (2)
Création d'un recordset sur T1 (sans projection ni restriction), le recordset contient donc deux
tuples et à l'initialisation pointe sur le premier (1)
Affectation de la valeur de l'attribut "a" dans le premier tuple à la variable "x" (donc x=1)
Le recordset avance au second tuple (2)
Affectation de la valeur de "a" dans le second tuple à "x" (donc x=2)
La fonction retourne la valeur de "x", donc 2
> Solution n°19
Exercice p. 37
A quelles instructions SQL est équivalente l'instruction QBE sous Access ci-dessous :
92
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Une instruction QBE

SELECT a FROM T1
WHERE T1.a=[formulaires]![F1]![C1];

INSERT INTO T2 (a)
SELECT T1.a FROM T1

INSERT INTO T2 (a)
VALUES ([formulaires]![F1]![C1]);

SELECT a FROM T1, T2
WHERE T1.a=[formulaires]![F1]![C1];
WHERE T1.a=T2.a AND T1.a=[formulaires]![F1]![C1];
Description de l'instruction QBE
93
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
> Solution n°20
Exercice p. 37
Que renvoie la procédure VBA suivante sous Access ?
1 Function F() As Integer
2 Dim vCodeSql(2) As String
3 vCodeSql(1) = "create table Table1 (Champs1 Integer)"
4 vCodeSql(2) = "insert into Table1 (Champs1) values (1)"
5 For i = 1 To 2
6
CurrentDb.CreateQueryDef("", vCodeSql(i)).Execute
7 Next i
8 CurrentDb.CreateQueryDef("", vCodeSql(2)).Execute
9 Set vRs = CurrentDb.CreateQueryDef("", "select sum(Champs1) AS result from Table1").OpenRecordset
10 F=vRs!result
11 End Function
2
> Solution n°21
Exercice p. 63
1 Sub HelloWorld(arg1 As String)
2 Myvar = "Hello World " & arg1
3 Debug.Print (Myvar)
4 End Sub
5 Function HelloWorld2(arg1 As String) As Integer
6 Myvar = "Hello World " & arg1
7 Debug.Print (Myvar)
8 HelloWorld2 = 0
9 End Function
94
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Procédure HelloWorld
Fonction HelloWorld2
Exercice p. 64
> Solution n°22
1 Function fAjoutSpecialite(pVal)
2 vSQL = "INSERT INTO tSpecialite(pk_intitule) VALUES ('" & pVal & "')"
3 CurrentDb.CreateQueryDef("", vSQL).Execute
4 fAjoutSpecialite = 1
5 End Function
95
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Exercice p. 65
> Solution n°23
fAjoutSpecialite
Fichier Access de solution disponible en ligne.
[cf. assoBd2.mdb]
> Solution n°24
Exercice p. 65
1 Function fAjoutSpecialite(pVal)
2 On Error GoTo Erreur_Insertion
3 vSQL = "INSERT INTO tSpecialite(pk_intitule) VALUES ('" & pVal & "')"
4 CurrentDb.CreateQueryDef("", vSQL).Execute
5 Exit_fAjoutSpecialite:
6 Debug.Print ("Nouvelle spécialité " & pVal & " insérée")
7 fAjoutSpecialite = 1
8 Exit Function
9 Erreur_Insertion:
10 Debug.Print ("Erreur : " & vSQL)
11 fAjoutSpecialite = 0
12 End Function
> Solution n°25
Exercice p. 65
1 Function fAjoutSpecialite(pVal)
2 On Error GoTo Erreur_Insertion
96
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
3 vSQL = "SELECT pk_intitule FROM tSpecialite WHERE pk_intitule = '" & pVal & "'"
4 Set vRs = CurrentDb.CreateQueryDef("", vSQL).OpenRecordset
5 If (vRs.RecordCount > 0) Then
6 MsgBox ("Spécialité déjà existante, insertion annulée")
7 Else
8 vSQL = "INSERT INTO tSpecialite(pk_intitule) VALUES ('" & pVal & "')"
9 CurrentDb.CreateQueryDef("", vSQL).Execute
10 End If
11 Exit_fAjoutSpecialite:
12 Debug.Print ("Nouvelle spécialité " & pVal & " insérée")
13 fAjoutSpecialite = 1
14 Exit Function
15 Erreur_Insertion:
16 Debug.Print ("Erreur : " & vSQL)
17 fAjoutSpecialite = 0
18 End Function
Exercice p. 65
> Solution n°26
1 Function fSpecialiteTotal() As Integer
2 vSQL = "SELECT count(pk_intitule) AS total FROM tSpecialite"
3 Set vRs = CurrentDb.CreateQueryDef("", vSQL).OpenRecordset
4 fSpecialiteTotal = vRs!total
5 End Function
1 Function fSpecialiteUtil() As Integer
2 vSQL = "SELECT count(pk_intitule) AS total"
3 vSQL = vSQL & " FROM tSpecialite S INNER JOIN tProjet P"
4 vSQL = vSQL & " ON S.pk_intitule=P.fk_specialite"
5 Set vRs = CurrentDb.CreateQueryDef("", vSQL).OpenRecordset
6 fSpecialiteUtil = vRs!total
7 End Function
Fichier Access de solution disponible en ligne.
[cf. assoAppli2.mdb]
Exercice p. 69
> Solution n°27
create.sql
1 CREATE TABLE tSpecialite (
2 pk_intitule varchar(15),
3 PRIMARY KEY (pk_intitule));
4 CREATE TABLE tMembre(
5 pk_prenom varchar(15),
6 nom varchar(15),
7 fk_specialite varchar(15),
8 PRIMARY KEY (pk_prenom),
9 FOREIGN KEY (fk_specialite) REFERENCES tSpecialite (pk_intitule));
10 CREATE TABLE tProjet (
11 pk_num varchar(4),
12 nom varchar(255),
13 debut date,
97
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
14 fin date,
15 fk_cdp varchar(15),
16 fk_specialite varchar(15),
17 PRIMARY KEY (pk_num),
18 FOREIGN KEY (fk_specialite) REFERENCES tSpecialite (pk_intitule),
19 FOREIGN KEY (fk_cdp) REFERENCES tMembre (pk_prenom));
Exercice p. 69
> Solution n°28
insert.sql
1 INSERT INTO tSpecialite (pk_intitule) VALUES ('Sport');
2 INSERT INTO tSpecialite (pk_intitule) VALUES ('Compta');
3 INSERT INTO tMembre (pk_prenom, nom) VALUES ('Paul', 'Eau');
4 INSERT INTO tMembre (pk_prenom, nom) VALUES ('Pierre', 'Elelou');
5 INSERT INTO tMembre (pk_prenom, nom) VALUES ('Marc', 'Noflair');
6 INSERT INTO tMembre (pk_prenom, nom, fk_specialite) VALUES ('Barbara', 'Stressée', 'Sport');
7 INSERT INTO tMembre (pk_prenom, nom, fk_specialite) VALUES ('Helene', 'Deuxtrois', 'Compta');
8 INSERT INTO tProjet (pk_num, nom, debut, fk_cdp)
9 VALUES ('1', 'La nuit du picolo', '25/12/2003', 'Paul');
10 INSERT INTO tProjet (pk_num, nom, debut, fk_cdp)
11 VALUES ('2', 'L''escalade de l''Everest', '01/01/2005', 'Pierre');
12 INSERT INTO tProjet (pk_num, nom, debut, fin, fk_cdp, fk_specialite)
13 VALUES ('3', 'Tournoi de Volley Ball', '01/02/2005', '01/03/2005', 'Marc', 'Sport');
Exercice p. 73
> Solution n°29
Tables créées
98
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
Contraintes d'intégrité référentielle
Données insérées
Fichier Access de solution disponible en ligne.
[cf. assoBdTmp.mdb]
Exercice p. 74
> Solution n°30
1 Function ExecSql(pChemin As String, pFichier As String) As Integer
2 vFichier = pChemin & pFichier
3 Open vFichier For Input As #1
4 Do While Not EOF(1)
5 vNewChar = Input(1, #1)
6 If vNewChar = ";" Then
7 Debug.Print vSql
8 CurrentDb.CreateQueryDef("", vSql).Execute
9 vSql = ""
10 Else
11 vSql = vSql & vNewChar
12 End If
13 Loop
14 Close #1
15 ExecSql = 1
16 End Function
Remarque
Il serait pertinent d'ajouter une gestion d'erreur pour ce type de fonction.
> Solution n°31
Exercice p. 75
Fichier Access de solution disponible en ligne.
99
Stéphane Crozat (Contributions : Antoine Vincent)
Solutions des exercices
[cf. assoBd2.mdb]
100
Stéphane Crozat (Contributions : Antoine Vincent)
Signification des abréviations
Abréviations
BD : Base de Données
LDD : Langage de Définition de Données
LMD : Langage de Manipulation de Données
QBE : Query By Example
SGBDR : Système de Gestion de Bases de Données Relationnelles
SQL : Structured Query Language
101
Stéphane Crozat (Contributions : Antoine Vincent)
Webographie
Webographie
www.developpez.com, Les meilleurs cours, tutoriels et docs sur Access, http://access.developpez.
com/, consulté en 2003.
www.developpez.com, Access FAQ, http://access.developpez.com/faq/, consulté en 2003.
Hubiche Maxence, Comprendre les jointures dans Access, http://mhubiche.developpez.
com/Access/tutoJointures/, consulté en 2009.
102
Stéphane Crozat (Contributions : Antoine Vincent)
Index
Index
Application
Chaîne de caractères
p. 6, 18, 21
p. 26
Contrainte
Critique
CurrentDb
p. 10
p. 5
p. 23, 24, 25
Curseur
DELETE
Domaine
p. 23, 24, 24, 25, 25, 26
p. 14
p. 9
Enumération
Fonction
Formulaire
p. 9
p. 23, 26
p. 18, 20
Formulaires
Gestion d'erreur
GROUP BY
p. 16
p. 25
p. 14
HAVING
INSERT
Intégrité référentielle
p. 14
p. 14
p. 10
Langage de programmation
LDD
Liste déroulante
p. 23
p. 7, 10, 11, 25
p. 20
LMD
Macro
Objet
p. 12, 14
p. 21
p. 23, 24
On Error
Programme
Prototypage
p. 25
p. 23
p. 5
QBE
QueryDef
Question
p. 12, 14, 14
p. 23, 24, 25, 25
p. 12
Recordset
Requête
SELECT
p. 23, 24, 24, 25, 25, 26
p. 12, 23, 24, 25, 25
p. 12
Table
Types
UPDATE
p. 7, 10
p. 9
p. 14
VBA
p. 23, 23, 23, 24, 24, 25, 25
, 25, 25, 26, 26
Vues
p. 11
103
Stéphane Crozat (Contributions : Antoine Vincent)