Title: Initiation aux bases de donn
1Initiation aux bases de données et à la
programmation événementielle
- Cours N10
- Ergonomie, déplacement et recherche.
Support de cours de Soheib BAARIR. Page web
pagesperso-systeme.lip6.fr/Souheib.Baarir/bdvba/su
pport.htm E-mail souheib.baarir_at_u-paris10.fr
Université Paris Ouest Nanterre la
Défense. 2009-2010. Adapté du cours de B.
COFFIN. Reproduction interdite sans autorisation
écrite de lauteur.
2Ergonomie des traitements
Ergonomie étude de linteraction homme /
ordinateur.
- Les choix des composantes dune interface sont
importants. - Pour construire le schéma dun formulaire, il
faut se demander
- Quelles sont les informations qui doivent être
saisies ? - Quelles sont les informations quil faut
communiquer à lutilisateur - pour quil puisse agir comme il faut ?
- Quels sont les événements qui doivent ou peuvent
se produire ?
3Exemple enregistrement dune nouvelle commande
(1/2)
- Problème créer
- un enregistrement de tabCommande,
- n enregistrements de tabLien_Cde_Pdt
- les liens logiques les concernant
4Exemple enregistrement dune nouvelle commande
(2/2)
Le 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)
5Recherche denregistrements Approche non
automatique
- Source du formulaire ensemble
denregistrements. - Enregistrement actif par défaut le premier de
la relation. - Les boutons de commande de la fenêtre du
formulaire - permettent de changer denregistrement actif.
Un jeu de boutons pour le formulaire et un autre
pour le sous-formulaire
6Recherche denregistrements approche automatique
- On peut aussi programmer ces changements
- denregistrement actif.
- Utilisation de méthodes
- les mouvements commandés par les boutons du
- formulaire sont des actions ACCESS.
- pour les programmer en VBA, on utilise des
méthodes - de lobjet DoCmd.
7La méthode GotoRecord de DoCmd
- Record enregistrement.
- GotoRecord ? atteindre un enregistrement dans la
relation liée à un objet.
DoCmd.GotoRecord type_Objet, Nom_Objet,
mode_déplacement
- Constante ACCESS.
- acFirst,
- acLast,
- acPrevious,
- acNext (par défaut),
- acNewRec.
- Constante ACCESS.
- acDataForm pour
- un formulaire.
- par défaut, lobjet actif.
- chaîne de caractères.
- par défaut, lobjet actif.
8Exemples GotoRecord
- 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.GotoRecord , , 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
9Gestion 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.
- 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.
10Exemples Gestion des erreurs !
- Programmation dun bouton (appelé btPrécédent
pour lexemple) de - commande qui permet datteindre
lenregistrement précédent en cas - derreur
- Atteindre le dernier enregistrement.
- Private Sub btPrécédent_Click()
- On Error GoTo suite
- DoCmd.GoToRecord , , acPrevious
- Exit Sub
- suite DoCmd.GoToRecord , , acLast
- End Sub
- Ne rien faire.
- Private Sub btPrécédent_Click()
- On Error Resume Next
- DoCmd.GoToRecord , , acPrevious
- End Sub
Ne pas oublier  Next , sinon on relance
linstruction qui a provoqué lerreur, et le
programme ne sarrête jamais !
11La méthode FindRecord do DoCmd
- 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 !
DoCmd.FindRecord QueRechercher, OùChercher,
RespecterCasse,
QuelleDirection, RespectFormat, QuelChamp,
ApartirDe
- constante ACCESS,
- acAnywhere,
- acEntire,
- acStart.
- Expression,
- la méthode
- recherche la
- valeur de
- lexpression
- dans les
- enregistrements
- de la relation.
Largument par défaut est en rouge
- Booléen
- True (Ã partir du premier),
- False (Ã partir de
- lenregistrement qui suit
- lenregistrement actif).
- Booléen
- True (champ actif),
- False (tous les champs).
- constante ACCESS,
- acDown,
- acSearchAll,
- acUp.
12Exemple schéma de la base de données
13Exemple construction 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
14Exemple Résultat à obtenir (1/3)
15Exemple Résultat à obtenir (2/3)
16Exemple Résultat à obtenir (3/3)
17Exemple construction du formulaire Saisie_note
(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
18Exemple Construction du formulaire
Enregistrement_des_notes (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
19Exemple Sélection de la classe
Source contrôle est Null Contenu
SELECT N classe, Niveau " / " Indice FROM
tabClasse ORDER BY Niveau, Indice
Colonne liée 1
Pour éviter un affichage incohérent Private Sub
zldChoix_classe_GotFocus() zldChoix_épreuve.Val
ue Null zldChoix_élève.Value Null
sfNote.Requery End Sub
Zone de liste déroulante zldChoix_classe
Mise à jour des contenus des 2 autres
listes Private Sub zldChoix_classe_AfterUpdate(
) zldChoix_épreuve.Requery
zldChoix_élève.Requery End Sub
20Exemple Sélection de lépreuve
Source contrôle est Null Contenu
SELECT N épreuve, Nom épreuve " / "
Date épreuve FROM tabEpreuve
WHERE Réf classezldChoix_classe.Value
ORDER BY Nom épreuve, Date épreuve
Colonne liée 1
Pour éviter un affichage incohérent Private Sub
zldChoix_épreuve_AfterUpdate() sfNote.Requery
zldChoix_élève.Value Null End Sub
Zone de liste déroulante zldChoix_épreuve
21Exemple Sélection de lélève (1/2)
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
Zone de liste déroulante zldChoix_classe
22Exemple Sélection de lélève (2/2)
Private 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 ?
23Exemple Mise à jour de la relation du
sous-formulaire.
- Pas 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_not
es!zldChoix_épreuve.Value - End Sub