1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 5 Support de cours rédigé par Bernard COFFIN Université Paris 10 – Nanterre 2007/2008
2 un lien logique établit que des enregistrements de deux relations sont complémentaires à un enregistrement de la première table, on associe n (plusieurs) enregistrements de la seconde, alors qu’à un enregistrement de la seconde on n’associe qu’un seul enregistrement de la première le lien doit être réalisé à l’aide de la clef primaire de la table père et d’une clef externe de la table fils Rappels (Cf. cours N° 2) : – on parle d’un lien père / fils Lien logique
3 Si elle existe (n’est pas Null), la valeur de la clef externe de la table fils doit toujours être égale à la valeur de la clef primaire d’un enregistrement existant de la table père Le type de la clef externe de la table fils doit être exactement le même que celui de la clef primaire de la table père Rappel : La clef primaire est un champ qui ne peut pas prendre la même valeur pour deux enregistrements différents de la table Le plus simple est de laisser à ACCESS le soin de gérer ses valeurs en la déclarant « NuméroAuto » La clef externe ne peut être non renseignée (Null) que dans des cas rares et très précis de traitements
4 Autoriser que la valeur de la clef externe (table fils) ne soit pas renseignée (Null) signifie que le champ « père » est créé après les champs « fils » ou bien que le lien décrit une information qui apparaît après la création des enregistrements père et fils
5 Exemple 1 : Le champ père sert à définir un point commun (entre les fils) qui apparaît après leur création dans une table on décrit des commandes dans une deuxième table, on décrit des livraisons supposons qu’une livraison puisse concerner plusieurs commandes alors la table Livraison va être la table père et la table Commande sera la table fils la clef externe de la table Commande ne doit pas être renseignée (Null) au moment de la création de l’enregistrement (une commande) elle sera mise à jour lors de la création de la livraison (concernant n commandes)
6 Exemple2 : Le lien décrit un événement qui n’apparaît qu’après la création du père et du fils dans une table on décrit des œuvres d’art dans une deuxième table, on décrit des collectionneurs un collectionneur peut posséder plusieurs œuvres, mais elles n’ont qu’un propriétaire la table tabCollectionneur est la table père et la table tabOeuvre est la table fils la clef externe de la table tabŒuvre ne doit pas être renseignée (Null) au moment de la création de l’enregistrement (réalisation de l’œuvre) : elle sera mise à jour au moment de la vente de l’œuvre
7 En dehors de cas particuliers comme ceux-là, la clef externe de chaque enregistrement de la table fils doit toujours être renseignée et égale à la clef primaire d’un enregistrement existant de la table père Si la valeur d’une clef externe d’un enregistrement est renseignée mais n’est pas égale à la clef primaire d’un enregistrement existant, alors la base de données est INCOHÉRENTE !
8 1.Ne pas attribuer à une clef externe une valeur sans être certain qu’elle est égale à la clef primaire d’un enregistrement existant 2.Ne pas supprimer un enregistrement de la table père tant qu’il est lié à au moins enregistrement de la table fils 3.On ne modifie pas la valeur d’une clef primaire ! Garantir la cohérence de la BD
9 L’outil « relations » d’ACCESS ACCESS propose un outil nommé « relations »… mais il ne s’agit pas de relations au sens de l’algèbre relationnelle ! Permet de définir des jointures par défaut (utilisées avec l’assistant de construction de requête – hors programme de ce cours, rappelons le) Permet d’imposer des « contraintes d’intégrité » à ces relations par défaut
10 L’outil « relations » d’ACCESS L’ergonomie des traitements (d’erreurs) est souvent médiocre Ne pas utiliser cet outil qui n’est pas au programme du cours… et de l’examen ! Il faut prévoir les traitements nécessaires au maintien de la cohérence de la base
11 Gestion de la cohérence par l’application Trois possibilités à choisir en fonction de critères ergonomiques 1.Saisir la valeur de la clef externe, puis vérifier qu’elle correspond bien à la clef primaire d’un enregistrement existant Utilisation d’un sous-formulaire indépendant pour afficher l’enregistrement père
12 Gestion de la cohérence par l’application 2.Utiliser un objet complexe lié aux deux tables ; les enregistrements créés sont alors forcément cohérents lors de la création (mais on est ramené au problème précédent en cas de modification par une autre interface) Utilisation d’un Sous-formulaire lié à la table fils (le formulaire principal étant, lui, lié à la table père)
13 Gestion de la cohérence par l’application 3.Plutôt que de saisir la clef externe, se rattacher à un enregistrement choisi parmi ceux qui existent dans la base Utilisation dans un formulaire lié à la table fils d’une Zone de liste déroulante permettant d’afficher les enregistrements pères possibles et de sélectionner le bon
14 La zone de liste déroulante Appelée aussi zone de liste modifiable Un contrôle des formulaires Objet lié à un ensemble de valeurs complexes Nous utiliserons toujours les enregistrements d’une relation définie par une requête La zone de liste déroulante permet de sélectionner un des enregistrements (de la relation liée) parmi les autres
15 La zone de liste déroulante Principales propriétés Valeur / Value dépend de l’enregistrement sélectionné peut être modifiée par VBA ; dans ce cas l’enregistrement sélectionné (affiché) est mis à jour automatiquement
16 La zone de liste déroulante Principales propriétés Contrôle source / ControlSource la valeur du champ lié est égale à la valeur de la zone de liste déroulante on utilise la zone de liste déroulante pour gérer la valeur de la clef externe
17 La zone de liste déroulante Principales propriétés Contenu / RowSource (row = rangée) pour nous, uniquement une relation décrite par une requête sélection calculée lors du chargement du formulaire recalculée par programmation à l’aide de la méthode Requery de l’objet Attention : ne pas confondre les propriétés contenu et valeur de la zone de liste !
18 La zone de liste déroulante Principales propriétés Colonne liée / BoundColumn colonne = champ ! les champs de la requête sont numérotés à partir de la gauche en commençant à 1 la valeur de zone de liste déroulante est égale à la valeur du champ repéré par la propriété « colonne liée »
19 La zone de liste déroulante Principales propriétés Colonne liée / BoundColumn si la valeur de la propriété « colonne liée » est égale à zéro, alors la valeur de la zone de liste est égale au numéro d’ordre de l’enregistrement sélectionné dans la relation (les enregistrements sont numérotés à partir de zéro)
20 La zone de liste déroulante Principales propriétés Nbre colonnes / ColumnCount nombre de champs affichables dans la zone de liste déroulante (le plus souvent c’est le nombre de champs de la relation décrite par la requête)
21 La zone de liste déroulante Principales propriétés Largeurs colonnes / ColumnWidths donne la largeur de l’affichage de chacun des champs (de gauche à droite dans l’ordre de la requête) si la largeur d’un champ est zéro cm, alors la valeur du champ n’est pas affichée (mais elle est disponible quand même !) pendant la sélection, tous les champs affichables sont visibles sinon, seul le premier champ affichable (largeur >0) est visible
22 Un contenu classé La zone de liste déroulante permet de sélectionner un des enregistrements (de la relation liée) parmi les autres Pour que la recherche de l’enregistrement désiré soit efficace, il faut trier les enregistrements de la relation Utiliser la clause Order By Il suffit de taper les premiers caractères de la valeur cherchée pour se déplacer dans le jeu d’enregistrements ; on termine la recherche en visualisant les enregistrements voisins
23 Exemple d’utilisation : formulaire de saisie d’un enregistrement d’une table « fils » Table « père » : tabFormation Champs [N° formation] – NuméroAuto ; clef primaire [Nom formation] – Texte de 50 caractères [Niveau] – Entier Long – {1, 2, 3} pour une licence {1, 2} pour un master
24 Exemple d’utilisation : formulaire de saisie d’un enregistrement d’une table « fils » Table « fils » : tabEtudiant Champs [N° étudiant] – NuméroAuto, clef primaire [Nom] – Texte de 50 caractères [Prénom] – Texte de 50 caractères [Formation suivie] – Entier Long ; clef externe Source du formulaire de saisie d’un étudiant : Select * From tabEtudiant;
25 Zones de textes liées aux champs [Nom] et [Prénom] Zone de liste déroulante zlChoix_Formation Il faut gérer le lien avec la table « père » ; donc le contrôle lié doit être la clef externe Formation suivie Il faut pouvoir sélectionner un enregistrement de la table « père », donc : Select [N° formation], [Nom formation], Niveau From tabFormation Order BY [Nom formation], Niveau; Numéro d’ordre du champ qui donne la valeur de la zone de liste soit : [N° Formation]
26 Remplacer la valeur par défaut (1) par le nombre de champs de la requête (contenu) 3 Le premier champ [N° Formation] ne doit pas être affiché ; sa largeur est 0cm Le deuxième champ [Nom formation] est affiché en permanence sur 5cm Le troisième champ [Niveau] est affiché seulement pendant la sélection sur 2cm 0cm; 5cm; 2cm
27
28 Si on veut que le nom et le niveau de la formation soient affichés en permanence, alors il faut modifier la requête qui décrit le « contenu » de la zone de liste en utilisant un champ calculé Select [N° Formation], [Nom formation] & " / " & Niveau From tabFormation Order By [Nom formation], Niveau; Pour une meilleure présentation en mode sélection, modifier aussi les propriétés « Nbre colonnes » et « Largeurs colonnes »