1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 6 Support de cours rédigé par Bernard COFFIN Université Paris 10 – Nanterre2007/2008
2 Sous-formulaire Un formulaire est un objet complexe composé de contrôles Un formulaire peut être lui-même un contrôle d’un autre formulaire ; on parle alors de sous-formulaire Si le formulaire et le sous-formulaire ont tous les deux une relation source, alors ils peuvent être liés (une valeur d’un champ de l’un correspond à une valeur d’un champ de l’autre)
3 Un sous-formulaire lié permet de gérer automatiquement un lien logique lors de la création des enregistrements Un sous-formulaire indépendant permet d’afficher des informations complémentaires à celles du formulaire principal sans que leur lien soit géré Par exemple, il permet d’afficher le détail d’un enregistrement d’une table après la saisie de sa clef (pour vérifier qu’il existe et que c’est bien celui qui est cherché) Ce sont deux nouvelles façons de gérer la cohérence de la base de données
4 Construction d’un Sous-formulaire C’est un contrôle d’un formulaire que nous appelons formulaire principal On le crée en le dessinant sur la grille de construction du formulaire principal Par défaut le nom de ce contrôle est de la forme « fille0 »; on peut bien entendu le modifier Dans la propriété « objet source » on saisit le nom du formulaire qui doit être inséré dans le formulaire principal Donc le sous-formulaire doit avoir été construit avant… pour pouvoir devenir sous-formulaire Ne pas confondre le contrôle et le formulaire qui en est l’objet source ; ils n’ont pas le même nom et n’ont pas non plus les mêmes propriétés, événements, méthodes
5 Propriétés d’un sous-formulaire Le contrôle sous-formulaire n’a pas de propriété « valeur » Il ne peut donc pas avoir de propriété « Source Contrôle » Cependant, si on utilise un sous-formulaire, c’est parce qu’il permet de consulter ou saisir des informations complexes complémentaires de celles du formulaire principal
6 Lien entre le formulaire principal et son sous-formulaire Le lien se fait : 1.Entre enregistrements pour des formulaires qui ont une relation source (utilisation des propriétés « champs pères » et « champs fils » du contrôle sous-formulaire 2.Par l’intermédiaire de la requête décrivant la relation source du sous-formulaire si le formulaire principal est indépendant
7 Sous-formulaire lié Le lien avec le formulaire principal est la réalisation d’un lien logique Il faut que la source du formulaire principal soit construite sur une table « père » La relation source du formulaire qui est lui-même l’objet source du contrôle sous-formulaire doit être construite sur une table « fils » La valeur attribuée à la propriété « champs pères » du contrôle sous-formulaire doit être le nom de la clef primaire de la table père La valeur attribuée à la propriété « champs fils » du contrôle sous-formulaire doit être le nom de la clef externe correspondante dans la table fils
8 Exemple d’utilisation Exemple extrait d’une base de données gérant l’approvisionnement d’une entreprise Choix de gestion : un produit ne peut venir que d’un fournisseur On est bien dans un lien père (tabFournisseur) / fils (tabProduit) En général on saisit à la fois un nouveau fournisseur et ses premiers produits. L’ergonomie de ce traitement est bien adaptée à un formulaire comprenant un sous-formulaire
9 Déclaration des tables tabFournisseur [Code fournisseur] – texte de 6 caractères; clef primaire [Nom fournisseur] – texte de 50 caractères [Adresse fournisseur] – texte de 100 caractères [Ville] – texte de 50 caractères [Code postal] – entier long
10 Déclaration des tables tabProduit [N° produit] – NuméroAuto ; clef primaire [Libellé produit] – texte de 50 caractères [Commentaire] – texte de 255 caractères [Référence fournisseur] – texte de 6 caractères ; clef externe ; valeur par défaut Null [Prix achat] – monétaire
11 Formulaire de création d’un produit formProduit Source du formulaire : Select * From tabProduit Order BY [Libellé produit]; Trois zones de textes : ztLibellé, ztCommentaire, ztPrix liées respectivement aux trois champs [Libellé produit], [Commentaire], [Prix achat] Pas de clause de restriction dans la requête source Pas de contrôle pour la clef primaire et la clef externe gérées automatiquement
12 Formulaire de création d’un fournisseur formFournisseur Source du formulaire : Select * From tabFournisseur Order By [Nom Fournisseur], [Code postal], Ville; Cinq zones de textes : ztCode_fournisseur, ztNom_fournisseur, ztAdresse, ztCode_postal, ztVille liées respectivement aux quatre champs [Code fournisseur],[Nom fournisseur], [Adresse fournisseur], [Code postal] et [Ville] Le contrôle lié à la clef primaire est nécessaire parce que le type de cette clef n’est pas NuméroAuto ; c’est donc à l’utilisateur de le fournir (à moins qu’on ne prévoie un algorithme…) Un contrôle sous-formulaire sfProduits pour la saisie des produits du fournisseur
13
14 Propriétés du contrôle sfProduits Objet source : formProduit Champs pères : [Code fournisseur] Champs fils : [Référence fournisseur]
15
16
17 Sous-formulaire indépendant Le lien avec le formulaire principal doit être géré par l’application On l’utilise pour afficher des informations complexes en liaison avec le contenu du formulaire principal Le lien se fait par l’intermédiaire d’une clause de restriction sur la requête de description de la relation source du sous- formulaire La programmation événementielle gère l’utilisation du sous-formulaire
18 Exemple d’utilisation Construction d’un formulaire permettant d’ajouter un produit (le fournisseur étant déjà enregistré) – formAjout_produit – la relation source est construite sur la table « fils » tabProduit L’utilisateur doit saisir directement le code du fournisseur (connu) dans la zone de texte ztRéférence_fournisseur (liée à la clef externe [Référence fournisseur]) L’application doit alors afficher la description complète de l’enregistrement du fournisseur correspondant au code saisi (l’utilisateur pouvant alors mettre à jour une partie des données) Le contrôle utilisé pour ça est un sous-formulaire dont la relation source est construite sur la table « père » tabFournisseur Le lien entre le formulaire principal et le sous-formulaire se fait par l’intermédiaire de la requête de la source du sous-formulaire
19 Source du formulaire formAfficher_fournisseur SELECT * FROM tabFournisseur WHERE [code fournisseur] = forms!formAjout_produit!ztRéférence_fournisseur; Une zone de texte liée à chacun des champs (sauf la clef primaire qui doit être égale au contenu du contrôle ztRéférence_fournisseur du formulaire principal)
20 Source du formulaire formAjout_produit SELECT * FROM tabProduit; Une zone de texte liée à chacun des champs (sauf la clef primaire qui est gérée par l’application – NuméroAuto) Un contrôle sous-formulaire sfFournisseur Objet lié : formAfficher_fournisseur Pas de lien « champs pères » / « champs fils » ! Le lien se fait par l’intermédiaire de la requête source du formulaire formAfficher_fournisseur
21
22 Programmation événementielle Elle concerne uniquement le formulaire principal formAjout_produit Lors de l’ouverture du formulaire, il faut se placer sur un nouvel enregistrement (derrière ceux qui existent déjà) Private Sub Form_Load() DoCmd.GoToRecord acDataForm, "formAjout_produit", acNewRec ´ on peut laisser vide les deux premiers arguments ´ parce qu’il s’agit de l’objet actif ; on écrit alors ´ DoCmd.GoToRecord,, acNewRec End Sub
23
24 Programmation événementielle Après modification de la valeur de la zone de texte ztRéférence_fournisseur, il faut mettre à jour le contenu du contrôle sous-formulaire Private Sub ztRéférence_fournisseur_AfterUpdate sfFournisseur.Requery End Sub Le contrôle (pas le champ) est mis à jour quand on le quitte. Alors, le sous-formulaire est mis à jour à son tour par la méthode Requery