Initiation aux bases de données et à la programmation événementielle Cours N°8 : Gestion de la cohérence avec des zones de liste déroulantes. Support de cours de Soheib BAARIR*. Page web : pagesperso-systeme.lip6.fr/Souheib.Baarir/bdvba/support.htm E-mail : souheib.baarir@u-paris10.fr Université Paris Ouest Nanterre la Défense. 2009-2010. * Adapté du cours de B. COFFIN. Reproduction interdite sans autorisation écrite de l’auteur.
Rappel et compléments : lien logique (1/3) Un lien logique établit que des enregistrements de deux relations (tables) sont complémentaires. À un enregistrement de la première table, on associe 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 on parle alors d’un lien logique père/fils
Rappel et compléments : lien logique (2/3) 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 valeur de la clef externe de la table fils doit : soit être égale à la valeur de la clef primaire d’un enregistrement existant de la table père, soit (dans des cas particuliers) être Null.
Rappel et compléments : lien logique (3/3) 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.
Cas 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. Une livraison peut 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 plusieurs commandes).
Cas 2 : 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, on décrit des collectionneurs. Un collectionneur peut posséder plusieurs œuvres, mais elles n’ont qu’un propriétaire : la table Collectionneur est la table père et la table Œuvre est la table fils. la clef externe de la table Œ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
En dehors des deux cas particuliers, Première conclusion. En dehors des deux cas particuliers, 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 !
Garantir la cohérence de la BD Ne pas attribuer à une clef externe une valeur sans être certain qu’elle est égale à la clef primaire d’un enregistrement existant. Ne pas supprimer un enregistrement de la table père tant qu’il est lié à au moins enregistrement de la table fils. Ne pas modifier la valeur d’une clef primaire !
Gestion par imposition d’une contraintes d’intégrité Une valeur insérée dans le champ [référence fournisseur] de la table article doit obligatoirement exister comme clé primaire de la table fournisseur (le champ [N° Siret]) CREATE TABLE Article ( [code article] Autoincrement NOT NULL, [prix article] INT, [date fabrication] DATE, [référence fournisseur] INT NOT NULL, CONSTRAINT A1 PRIMARY KEY ([code article]), CONSTRAINT A2 FOREIGN KEY ([référence fournisseur]) REFERENCES fournisseur ([N° Siret]) )
Gestion de la cohérence par l’application. Plusieurs possibilités (à choisir en fonction de critères ergonomiques) : 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. Saisir la valeur de la clef externe, puis vérifier qu’elle correspond bien à la clef primaire d’un enregistrement existant. Utilisation de : formulaire/Sous-formulaire liés.
Exemple : gestion par zone de liste déroulante.
La zone de liste déroulante C’est un contrôle que l’on peut insérer dans un formulaire C’est un objet lié à un ensemble de valeurs : 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.
La zone de liste déroulante : la propriété Contenu Contenu / RowSource : Pour notre utilisation, 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. Avec VBA
La zone de liste déroulante : la propriété Colonne liée 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 ».
La zone de liste déroulante : la propriété Contrôle source Contrôle source / ControlSource : Utiliser pour gérer la valeur de la clef externe. À chaque instant, la valeur du champ lié est égale à la valeur de la zone de liste déroulante (colonne liée).
La zone de liste déroulante : la propriété Largeurs colonnes 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 de « 0 cm », alors la valeur du champ n’est pas affichée : pendant la sélection, tous les champs affichables sont visibles, sinon, seul le premier champ affichable (largeur >0) est visible.
Astuce… 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. Ainsi, il suffit de taper les premiers caractères de la valeur cherchée pour se déplacer dans le jeu d’enregistrements.