23
1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*. Page web : pagesperso-systeme.lip6.fr/Souheib.Baarir/bdvba/support.htm E-mail : [email protected] Université Paris Ouest Nanterre la Défense. 2009-2010. * Adapté du cours de B. COFFIN. Reproduction interdite sans autorisation écrite de l’auteur.

1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

Embed Size (px)

Citation preview

Page 1: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

1

Initiation aux bases de données et à la programmation

événementielle

Cours N°10 :

Ergonomie, déplacement et recherche.

Support de cours de Soheib BAARIR*.

Page web : pagesperso-systeme.lip6.fr/Souheib.Baarir/bdvba/support.htmE-mail : [email protected]

Université Paris Ouest Nanterre la Défense.2009-2010.

* Adapté du cours de B. COFFIN.Reproduction interdite sans autorisation écrite de l’auteur.

Page 2: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

2

Ergonomie des traitements

• Les choix des composantes d’une interface sont importants.

• Pour construire le schéma d’un formulaire, il faut se demander :

Quelles sont les informations qui doivent être saisies ?

Quelles sont les informations qu’il faut communiquer à l’utilisateur pour qu’il puisse agir comme il faut ?

Quels sont les événements qui doivent ou peuvent se produire ?

Ergonomie : étude de l’interaction homme / ordinateur.

Page 3: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

3

Exemple : enregistrement d’une nouvelle commande (1/2)

tabCommande

CP : N° Commande

CE : Réf Client

Date commande

tabLien_Cde_Pdt

CP :CE : Réf Commande

CE : Réf Produit

Quantité commandée

tabClient

CP : N° client

Nom client

Adresse

tabProduit

CP : Code produit

Nom produit

Prix UnitaireProblème : créer 1. un enregistrement de tabCommande, 2. n enregistrements de tabLien_Cde_Pdt 3. les liens logiques les concernant

Page 4: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

4

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 l’utilisation du formulaire)

Exemple : enregistrement d’une nouvelle commande (2/2)

Page 5: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

5

Recherche d’enregistrements :Approche non automatique

•Source du formulaire = ensemble d’enregistrements.

•Enregistrement actif : par défaut le premier de la relation.

•Les boutons de commande de la fenêtre du formulaire permettent de changer d’enregistrement actif.

Un jeu de boutons pour le formulaire et un autre pour le sous-formulaire

Page 6: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

6

• On peut aussi programmer ces changements d’enregistrement 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 l’objet DoCmd.

Recherche d’enregistrements :approche automatique

Page 7: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

7

La 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.• acDataForm pour un formulaire. • par défaut, l’objet actif.

• chaîne de caractères.• par défaut, l’objet actif.

• Constante ACCESS.• acFirst, • acLast, • acPrevious,• acNext (par défaut),• acNewRec.

Page 8: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

8

Exemples : GotoRecord

• Rendre actif l’enregistrement suivant (du formulaire actif)

DoCmd.GotoRecord , , acNext

Rappel : il s’agit d’une méthode de l’objet DoCmd

Le premier, et le deuxième arguments ne sont pas décrits, c’est la valeur par défaut qui est prise

• Ouvrir un formulaire (appelé forSaisie dans cet exemple) et se préparer à ajouter un enregistrement.

DoCmd.OpenForm "forSaisie"

DoCmd.GotoRecord , , acNewRec

• Si le formulaire forSaisie est déjà ouvert (mais n’est pas le formulaire actif) ?

DoCmd.GoToRecord acDataForm, "forSaisie", acNewRec

La méthode rend le formulaire actif

Donc les valeurs par défaut des deux premiers arguments sont adaptées au traitement souhaité

Page 9: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

9

Gestion des erreurs !

• Que se passe-t-il si on essaye d’atteindre un enregistrement qui n’existe pas ?

• La gestion standard (par le système) : affichage d’un message et fin du traitement.

• Il est possible de gérer soi-même la réaction de l’application en cas d’erreur.

• 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.

Page 10: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

10

• Programmation d’un bouton (appelé btPrécédent pour l’exemple) de commande qui permet d’atteindre l’enregistrement précédent ; en cas d’erreur :

1.Atteindre le dernier enregistrement.

Private Sub btPrécédent_Click() On Error GoTo suite DoCmd.GoToRecord , , acPrevious Exit Sub suite: DoCmd.GoToRecord , , acLastEnd Sub

2.Ne rien faire.

Private Sub btPrécédent_Click() On Error Resume Next DoCmd.GoToRecord , , acPreviousEnd Sub

Étiquette – nom symbolique donné à une instruction pour la

repérer parmi les autres

Fin d’exécution de la procédure événementielle : il ne faut pas exécuter le traitement prévu en cas

d’erreur.

Exemples : Gestion des erreurs !

Ne pas oublier « Next », sinon on relance l’instruction qui a provoqué

l’erreur, et… le programme ne s’arrête jamais !

Page 11: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

11

La méthode FindRecord do DoCmd• Record = enregistrement

• FindRecord → trouver un enregistrement dans la relation liée à un objet qui est obligatoirement l’objet actif.

• Mais la méthode s’applique à l’objet DoCmd !

DoCmd.FindRecord QueRechercher, OùChercher, RespecterCasse,

QuelleDirection, RespectFormat, QuelChamp, ApartirDe

L’argument par défaut est en rouge

Page 12: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

12

tabClasse

CP : N° Classe

Niveau

Indice

tabNote

CP :CE : Réf Elève

CE : Réf Epreuve

Note

tabEpreuve

CP : N° Epreuve

CE : Réf Classe

Nom épreuve

Date épreuve

tabElève

CP : N° Elève

CE : Réf Classe

Nom élève

Prénom élève

Exemple : schéma de la base de données

Page 13: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

13

Exemple : construction d’un formulaire de saisie des notes

Ergonomie

1. Sélection de la classe

2. Sélection de l’épreuve

3. Sélection de l’élève

4. Affichage de la note si elle a déjà été saisie (modification), création d’un enregistrement de tabNote sinon, et saisie de la note

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 à l’enregistrement de tabClasse sélectionné (prévoir « Requery »).

• Zone de liste déroulante dont le contenu est celui des enregistrements de tabElève reliés à l’enregistrement 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 à l’enregistrement de tabEpreuve sélectionné (prévoir « Requery »); utilisation des déplacements dans la relation source.

Page 14: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

14

Exemple : Résultat à obtenir (1/3)

Page 15: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

15

Exemple : Résultat à obtenir (2/3)

Page 16: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

16

Exemple : Résultat à obtenir (3/3)

Page 17: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

17

Exemple : 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ève]=tabElève.[N° élève]WHERE tabNote.[Réf épreuve]=forms!saisie_des_notes!zlChoix_épreuve.valueORDER BY [Nom élève], [Prénom élève];

3 zones de textes liées, avec des propriétés de « format » d’affichage différentes

En exploitation, la zone de texte ztRéf_élève sera « transparente » pour l’utilisateur :

Couleur de police = couleur de fondEt Private Sub ztRéf_élève_Click()

ztNote.SetFocusEnd Sub

Page 18: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

18

Exemple : Construction du formulaire Enregistrement_des_notes (formulaire principal)

Source : formulaire indépendant, donc la propriété Source n’est pas renseignée

3 zones de listes déroulantes pour faire les choix prévus

dans la description de l’ergonomie de l’interface

Sous-formulaire sfNote

Objet source : Saisie_note

Pas de lien champs pères / fils

Page 19: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

19

Exemple : Sélection de la classe

Source contrôle : est NullContenu : SELECT [N° classe], Niveau & " / " & Indice FROM tabClasse

ORDER BY Niveau, Indice; Colonne liée : 1

Zone de liste déroulante

zldChoix_classe

Pour éviter un affichage incohérentPrivate Sub zldChoix_classe_GotFocus() zldChoix_épreuve.Value = Null zldChoix_élève.Value = Null sfNote.RequeryEnd Sub

Mise à jour des contenus des 2 autres listesPrivate Sub zldChoix_classe_AfterUpdate() zldChoix_épreuve.Requery zldChoix_élève.RequeryEnd Sub

Page 20: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

20

Exemple : Sélection de l’épreuve

Source contrôle : est NullContenu : SELECT [N° épreuve], [Nom épreuve] & " / " & [Date épreuve]

FROM tabEpreuve WHERE [Réf classe]=zldChoix_classe.Value ORDER BY [Nom épreuve], [Date épreuve];

Colonne liée : 1

Zone de liste déroulante

zldChoix_épreuve

Pour éviter un affichage incohérentPrivate Sub zldChoix_épreuve_AfterUpdate() sfNote.Requery zldChoix_élève.Value = NullEnd Sub

Page 21: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

21

Exemple : Sélection de l’élève (1/2)

Source contrôle : est NullContenu : SELECT [N° élève], [Nom élève] & " " & [Prénom élève]

FROM tabElève WHERE [Réf classe]=zldChoix_classe.Value

ORDER BY [Nom élève], [Prénom élève]; Colonne liée : 1

Zone de liste déroulante

zldChoix_classe

Page 22: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

22

Private Sub zldChoix_élève_AfterUpdate() If IsNull(zldChoix_épreuve.Value) Then 'Il faut sélectionner l'épreuve ! zldChoix_épreuve.SetFocus: 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.SetFocus

End SubOn a bien mis à jour [Réf élève], mais [Réf épreuve] ?

Exemple : Sélection de l’élève (2/2)

Page 23: 1 Initiation aux bases de données et à la programmation événementielle Cours N°10 : Ergonomie, déplacement et recherche. Support de cours de Soheib BAARIR*

23

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_notes!zldChoix_épreuve.Value

End Sub

Exemple : Mise à jour de la relation du sous-formulaire.