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 9
Support de cours rédigé par Bernard
COFFIN Université Paris 10 Nanterre
2007/2008
2Ergonomie des traitements
Ergonomie science du travail (compréhension des
interactions entre lHomme et les autres
composantes dun système) En informatique étude
de linteraction homme / ordinateur Importance du
choix des composantes dune interface Pour
construire le schéma dun formulaire, il faut se
demander
Quelles sont les informations qui doivent être
saisies ? Quels sont les événements qui doivent
ou peuvent se produire ? Quelles sont les
informations quil faut communiquer à
lutilisateur pour quil puisse agir comme il
faut ?
3Retour sur lexemple du cours N 8
enregistrement dune nouvelle commande
- Problème créer
- un enregistrement de tabCommande,
- n enregistrements de tabLien_Cde_Pdt
- les liens logiques les concernant
4Le couple formulaire et sous-formulaire liés
permet de créer un enregistrement de la table
père, les n enregistrements de la table fils et
les n occurrences correspondantes du lien logique
La zone de liste déroulante permet de gérer
facilement les liens logiques vers les
enregistrements de tabClient et tabProduit
(enregistrements existant avant lutilisation du
formulaire)
5Le couple formulaire et sous-formulaire permet
dafficher ensemble les données des champs père
et fils Il est bien adapté à la création du
couple, mais lergonomie est médiocre pour un
ajout de champs fils (a un père déjà existant) La
zone de liste déroulante permet de rattacher un
fils à un père existant mais est peu commode si
on veut en même temps consulter lensemble des
données du père (a fortiori si on veut pouvoir en
modifier certaines)
6Recherche denregistrements
Source du formulaire ensemble
denregistrements Enregistrement actif Les
boutons de commande de la fenêtre du formulaire
permettent de changer denregistrement actif
même en cas daffichage continu
Un jeu de boutons pour le formulaire et un autre
pour le sous-formulaire
La zone de texte permet de saisir le numéro de
lenregistrement cherché, mais il sagit du
numéro dordre dans la relation et non pas de la
clef
7On peut aussi programmer ces changements
denregistrement actif Utilisation de
méthodes Les mouvements commandés par les boutons
du formulaire sont des actions ACCESS Rappel (Cf.
TD1) pour les programmer en VBA, on utilise des
méthodes de lobjet DoCmd
8La méthode GotoRecord (Cf. cours 6)
Record enregistrement GotoRecord ? atteindre un
enregistrement dans la relation liée à un objet
- Arguments de la méthode
- type de lobjet constante ACCESS (acDataForm
pour un formulaire) par défaut, lobjet actif - nom de lobjet chaîne de caractères par
défaut, lobjet actif - mode de déplacement constante ACCESS
- acFirst (le premier), acLast (le dernier),
acPrevious (vers les précédents), acNext (vers
les suivants valeur par défaut), acGoto (accès
direct), acNewRec (ajout dun enregistrement à la
suite des autres dans la relation liée) - nombre entier nombre denregistrements dans le
cas dun déplacement vers les précédents ou vers
les suivants (par défaut 1) ou numéro dordre de
lenregistrement à atteindre dans la relation
liée (accès direct). Nous nutiliserons pas cet
argument
9Exemples dutilisation de la méthode
Rendre actif lenregistrement suivant (du
formulaire actif) DoCmd.GotoRecord , , acNext
Ouvrir un formulaire (appelé forSaisie dans cet
exemple) et se préparer à ajouter un
enregistrement DoCmd.OpenForm "forSaisie" DoCmd.Go
toRecord , , acNewRec
La méthode rend le formulaire actif
Donc les valeurs par défaut des deux premiers
arguments sont adaptées au traitement souhaité
Si le formulaire forSaisie est déjà ouvert (mais
nest pas le formulaire actif) ? DoCmd.GoToRecord
acDataForm, "forSaisie", acNewRec
10Gestion des erreurs !
Que se passe-t-il si on essaye datteindre un
enregistrement qui nexiste pas ? La gestion
standard (par le système) affichage dun
message et fin du traitement (la procédure
événementielle) Il est possible de gérer soi-même
la réaction de lapplication en cas
derreur Utiliser (en VBA) la condition On
error GoTo étiquette en début de
procédure Puis, décrire le traitement à effectuer
en repérant la première instruction par
létiquette
11Exemple Programmation dun bouton de commande qui
permet datteindre lenregistrement précédent
en cas derreur, atteindre le dernier
enregistrement (présentation en boucle des
enregistrements) Private Sub
btPrécédent_Click() On Error GoTo suite
DoCmd.GoToRecord , , acPrevious Exit Sub suite
DoCmd.GoToRecord , , acLast End Sub
12Cest ce qui se passe quand on utilise les
boutons standards
Une autre réaction face à la même erreur ne
rien faire Utiliser linstruction Resume Next
(reprendre après linstruction qui a provoqué
lerreur) Private Sub btPrécédent_Click() On
Error Resume Next DoCmd.GoToRecord , ,
acPrevious End Sub
Attention ! Ne pas oublier Next , sinon on
relance linstruction qui a provoqué lerreur,
et le programme ne sarrête jamais.
13La méthode FindRecord
Record enregistrement FindRecord ? trouver un
enregistrement dans la relation liée à un objet
qui est obligatoirement lobjet actif Mais la
méthode sapplique à lobjet doCmd !
- Arguments de la méthode
- Que rechercher ? expression la méthode
recherche la valeur de lexpression dans les
enregistrements de la relation - Où chercher ? constante ACCESS
- acAnywhere (nimporte où dans le champ)
- acEntire (tout le champ)
- acStart (au début du champ)
- Respecter la casse booléen
- true (on différencie majuscules et minuscules)
- false (pas de différence entre majuscules et
minuscules) - /
Largument par défaut est en rouge
14- Arguments de la méthode FindRecord (fin)
- Dans quels enregistrements ? constante ACCESS
- acDown (en allant vers le dernier
enregistrement) - acSearchAll (en allant vers le dernier
enregistrement puis en repartant du premier) - acUp (en allant vers le premier enregistrement)
- Respect du format (daffichage) ? booléen
- true
- false
- Dans quels champs ? booléen
- true (dans le champ actif seulement)
- false (dans tous les champs)
- A partir de quel enregistrement ? booléen
- true (à partir du premier enregistrement)
- false (à partir de lenregistrement qui suit
lenregistrement actif)
Largument par défaut est en rouge
15Que se passe-t-il si on ne trouve aucun
enregistrement qui respecte la condition cherchée
? Lenregistrement actif reste inchangé ATTENTION
! La méthode FindRecord ne peut être exécutée
quaprès mise à jour donc ne pas lutiliser
dans une procédure _BeforeUpdate
16Exemple schéma de la base de données
17Construction dun formulaire de saisie des notes
- Solution adoptée
- Zone de liste déroulante dont le contenu est
celui de tabClasse - Zone de liste déroulante dont le contenu est
celui des enregistrements de tabEpreuve reliés à
lenregistrement de tabClasse sélectionné
(prévoir Requery ) - Zone de liste déroulante dont le contenu est
celui des enregistrements de tabElève reliés à
lenregistrement de tabClasse sélectionné
(prévoir Requery ) - Sous-formulaire indépendant du formulaire
principal (pas de lien champ père champ fils)
dont la source est la relation constituée par les
champs de tabNote liés à lenregistrement de
tabEpreuve sélectionné (prévoir Requery )
utilisation des déplacements dans la relation
source
- Ergonomie
- Sélection de la classe
- Sélection de lépreuve
- Sélection de lélève
- Affichage de la note si elle a déjà été saisie
(modification), création dun enregistrement de
tabNote sinon, et saisie de la note
18Construction du formulaire Saisie_note (utilisé
comme sous-formulaire du formulaire principal)
Source SELECT Réf élève, 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 WHERE
tabNote.Réf épreuveforms!saisie_des_notes!zlCho
ix_épreuve.value ORDER BY Nom élève, Prénom
élève
3 zones de textes liées, avec des propriétés de
format daffichage différentes
En exploitation, la zone de texte ztRéf_élève
sera transparente pour lutilisateur
Couleur de police couleur de fond Et
Private Sub ztRéf_élève_Click()
ztNote.SetFocus End Sub
19Construction du formulaire Enregistrement_des_note
s (formulaire principal)
Source formulaire indépendant, donc la
propriété Source nest pas renseignée
3 zones de listes déroulantes pour faire les
choix prévus dans la description de lergonomie
de linterface
Sous-formulaire sfNote Objet source
Saisie_note Pas de lien champs pères / fils
20Zone de liste déroulante zldChoix_classe
Source contrôle est Null Contenu SELECT N
classe, Niveau " / " Indice FROM tabClasse
ORDER BY Niveau, Indice Colonne liée 1
etc.
Pour éviter un affichage incohérent Private Sub
zldChoix_classe_GotFocus() zldChoix_épreuve.Value
Null zldChoix_élève.Value Null
sfNote.Requery End Sub
Mise à jour des contenus des 2 autres
listes Private Sub zldChoix_classe_AfterUpdate(
) zldChoix_épreuve.Requery zldChoix_élève.Requer
y End Sub
21Zone de liste déroulante zldChoix_épreuve
Source contrôle est Null Contenu SELECT N
épreuve, Nom épreuve " / " Date épreuve
FROM tabEpreuve WHERE Réf classezldChoix_cla
sse.Value ORDER BY Nom épreuve, Date
épreuve Colonne liée 1 etc.
Pour éviter un affichage incohérent Private Sub
zldChoix_épreuve_AfterUpdate() sfNote.Requery
zldChoix_élève.Value Null End Sub
22Zone de liste déroulante zldChoix_classe
Source contrôle est Null Contenu SELECT N
élève, Nom élève " " Prénom élève FROM
tabElève WHERE Réf classezldChoix_classe.Value
ORDER BY Nom élève, Prénom élève Colonne
liée 1 etc.
23Private Sub zldChoix_élève_AfterUpdate() If
IsNull(zldChoix_épreuve.Value) Then 'Il faut
sélectionner l'épreuve ! zldChoix_épreuve.SetF
ocus Exit Sub End If If IsNull(sfNote!Réf
élève) Then ' Au cas où la relation liée
serait vide sfNote!ztRéf_élève.Value
zldChoix_élève.Value sfNote!ztNote.SetFocus
Exit Sub End If sfNote.SetFocus
sfNote!ztRéf_élève.SetFocus ' Le champ
Réf_élève doit être actif DoCmd.GoToRecord , ,
acNewRec ' Pour être prêt à une création si on
ne trouve pas l'élève DoCmd.FindRecord
zldChoix_élève.Value ' Recherche de l'élève pour
éviter les doublons (interdits) If
IsNull(sfNote!Réf élève) Then ' On est en
création sfNote!ztRéf_élève.Value
zldChoix_élève.Value End If sfNote!ztNote.SetFoc
us End Sub
On a bien mis à jour Réf élève, mais Réf
épreuve ?
24Pas de gestion automatique par le couple champs
pères / champs fils Il faut donc programmer la
mise à jour Dans le formulaire Saisie_note (objet
source du sous-formulaire) on utilise la
procédure événementielle Private Sub
Form_BeforeInsert(Cancel As Integer) Réf
épreuve Forms!Enregistrement_des_notes!zldChoix
_épreuve.Value End Sub
25(No Transcript)
26(No Transcript)
27(No Transcript)