Title: Initiation aux bases de donnes et la programmation vnementielle
1Initiation aux bases de donnéeset à la
programmation événementielle
- VBA sous ACCESS
- Cours N 10
Support de cours rédigé par Bernard
COFFIN Université Paris 10 Nanterre
2007/2008
2Schéma de la dernière base de données du cours N9
3Ergonomie des traitements
Lors du cours N9, nous avons vu comment ajouter
des enregistrements dans une table (tabNote)
représentant une association de n à n entre les
enregistrements de deux tables (tabElève et
tabEpreuve) Lergonomie proposée était
- Sélection de la classe
- Sélection de lépreuve et de lélève
- Enregistrement ou modification de la note
Une zone de liste déroulante Deux zones de listes
déroulantes avec restrictions / la valeur de la
première zone de liste déroulante Sous-formulaire
dont la source est construite sur tabNote
programmation événementielle pour assurer la
cohérence de lapplication
4Cette ergonomie est bien adaptée à la saisie des
notes au coup par coup Elle nest pas très bonne
sil sagit de saisir toutes les notes dune
épreuve les unes après les autres Lutilisation
de la souris ou du clavier pour sélectionner
lenregistrement cherché dans un formulaire
continu serait plus agréable Cela suppose que les
enregistrements de la table tabNote aient été
créés avant la saisie (avec une valeur de la note
non renseignée) Comment et quand créer ces
enregistrements (pour tous les élèves concernés)
? Cest au moment de la création (insertion de
lenregistrement dans la table) de la description
dune épreuve quon peut créer les
enregistrements des notes Pour créer un ensemble
denregistrements directement (sans passer par
lintermédiaire dune interface et de contrôles
liés) on utilise une requête insertion
5Rappel du cours N 4
Définition générale de la requête
Commande permettant la manipulation
d'informations à l'intérieur d'une base de
données
Il existe plusieurs variétés de requêtes
sélection ajout suppression mise à jour
création
ACCESS parle de types de requêtes
La requête ajout (ou insertion) permet de
créer de nouveaux enregistrements dans une table,
en spécifiant la valeur de un ou plusieurs de
leurs champs les champs dont on ne précise pas
la valeur se voient attribuer leur valeur par
défaut
6Pour exécuter une requête qui nest pas liée à un
objet (formulaire ou zone de liste), on utilise
la méthode RunSQL de lobjet DoCmd
Cette méthode a besoin dun argument la
description de la requête en SQL On la lui
communique à laide dune chaîne de caractères
(String) On peut utiliser indifféremment une
constante, une variable, une expression
En utilisant une constante DoCmd.RunSQL " ici
la requête en SQL "
En utilisant une variable Dim texte_requête As
String texte_requête " ici la requête en SQL
" DoCmd.RunSQL texte_requête
7Syntaxe de la requête Ajout (ou Insertion)
Les autres champs se voient attribuer leur valeur
par défaut
INSERT INTO le nom de la table concernée (liste
des champs concernés)
SELECT liste des valeurs à enregistrer FROM
relations dorigine
WHERE clause de restriction
8Formulaire pour créer une épreuve et enregistrer
les notes des élèves concernés
Formulaire lié dont la source est SELECT FROM
tabEpreuve
Deux zones de texte liées pour la saisie de la
date et du nom de lépreuve
9Un sous-formulaire pour saisir les notes Nom
sfNote Objet source Saisie_toutes_les_notes Sour
ce de Saisie_toutes_les_notes SELECT Réf
épreuve, Note, Nom élève " " Prénom
élève AS Identité FROM tabNote INNER JOIN
tabElève ON tabNote.Réf élèvetabElève.N
élève ORDER BY Nom élève, Prénom élève
Champs père et fils N épreuve / Réf
épreuve
10Programmation événementielle Il faut créer les
enregistrements de la table tabNote après
insertion dans la table du nouvel enregistrement
de tabEpreuve Private Sub Form_AfterInsert()
Dim texte_requête As String texte_requête
"Insert Into tabNote (Réf élève, Réf épreuve)
" _ End Sub
La procédure appartient au module du formulaire
principal lévénement est AfterInsert
Utilisation dune variable pour calculer le texte
de la requête (ce nétait pas obligatoire)
11Programmation événementielle Il faut créer les
enregistrements de la table tabNote après
insertion dans la table du nouvel enregistrement
de tabEpreuve Private Sub Form_AfterInsert()
Dim texte_requête As String texte_requête
"Insert Into tabNote (Réf élève, Réf épreuve)
" _ "Select N élève,
forms!Saisie_d_une_épreuve!N épreuve as
Auxiliaire " _ "From tabElève "
End Sub
12Programmation événementielle Il faut créer les
enregistrements de la table tabNote après
insertion dans la table du nouvel enregistrement
de tabEpreuve Private Sub Form_AfterInsert()
Dim texte_requête As String texte_requête
"Insert Into tabNote (Réf élève, Réf épreuve)
" _ "Select N élève,
forms!Saisie_d_une_épreuve!N épreuve as
Auxiliaire " _ "From tabElève " _ End
Sub
Le nom symbolique est obligatoire parce que la
valeur nest pas un champ de la relation tabElève
13Programmation événementielle Il faut créer les
enregistrements de la table tabNote après
insertion dans la table du nouvel enregistrement
de tabEpreuve Private Sub Form_AfterInsert()
Dim texte_requête As String texte_requête
"Insert Into tabNote (Réf élève, Réf épreuve)
" _ "Select N élève,
forms!Saisie_d_une_épreuve!N épreuve as
Auxiliaire " _ "From tabElève " _
"Where tabElève.Réf Classeforms!Saisie_d_une_ép
reuve!Réf classe" DoCmd.RunSQL texte_requête
sfNote.Requery End Sub
Restriction aux champs de tabElève qui
correspondent à la valeur sélectionnée dans le
formulaire
Exécution de la requête
Mise à jour de laffichage du sous-formulaire
14Programmation événementielle Quest-ce qui
provoque linsertion de lenregistrement décrit
par le formulaire dans la table tabEpreuve
? Linsertion na lieu quau moment de la
fermeture du formulaire, lors dun changement de
lenregistrement actif ou en utilisant une
méthode pour provoquer la mise à jour de
lenregistrement On ne peut pas fermer le
formulaire (il faut saisir les notes)
15Programmation événementielle (1ère
solution) Utilisation dun bouton de commande
Nom btValider Légende Valider la
création Procédure événementielle pour changer
lenregistrement actif et revenir au dernier
enregistrement créé Private Sub
btValider_Click() DoCmd.GoToRecord , , acNewRec
' provoque l'insertion de la nouvelle épreuve
dans la table DoCmd.GoToRecord , , acLast '
retour au dernier enregistrement créé
sfNote.SetFocus End Sub
16Programmation événementielle (2ème
solution) Utilisation dun bouton de commande
Nom btValider Légende Valider la
création Procédure événementielle pour commander
la mise à jour de lenregistrement Private Sub
btValider_Click() DoCmd.RunCommand
acCmdSaveRecord sfNote.SetFocus End Sub
17Requête suppression Permet de supprimer des
enregistrements dune table Ne doit être utilisée
que si cela ne détruit pas la cohérence de la
base de données ! Syntaxe
DELETE le nom dau moins un champ de
lenregistrement à supprimer
FROM le nom de la table concernée
WHERE clause de restriction
Si on ne précise pas de restriction, la requête
détruit tous les enregistrements de la table,
mais pas la table elle-même
18Exemple dutilisation sur le formulaire
Saisie_d_une_épreuve
On souhaite autoriser la suppression dun
enregistrement (celui qui vient dêtre créé en
principe) de la table tabEpreuve par exemple
parce que lutilisateur sest trompé lors de la
sélection de la classe Il faut alors supprimer
aussi les enregistrements de tabNote qui
concernent cette épreuve On utilise un bouton
commande pour déclencher les deux requêtes
nécessaires Propriétés du bouton Nom
btSupprimer Légende Supprimer lépreuve
19Procédure événementielle Private Sub
btSupprimer_Click() DoCmd.RunSQL "Delete From
tabNote " _ " Where Réf épreuve
forms!Saisie_d_une_épreuve!N épreuve"
DoCmd.RunSQL "Delete From tabEpreuve " _
" Where N épreuve forms!Saisie_d_une_épreuve!
N épreuve" Forms!saisie_d_une_épreuve.Requery
pour mettre à jour laffichage End Sub