1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 11 Support de cours rédigé par Bernard COFFIN Université Paris 10 – Nanterre 2007/2008
2 Le formulaire est une interface destinée à des traitements conversationnels (traitements qui utilisent le clavier, la souris et l’écran) Il est possible d’en imprimer le contenu, mais le résultat n’est pas facilement contrôlable L’état (en anglais Report) est une interface destinée à des impressions Le contenu de l’état peut être affiché sur l’écran (ouverture en prévisualisation), mais le clavier et la souris sont sans effet (pas d’événement qui leur soit lié)
3 L’état est fait pour imprimer des informations issues de la base de données Il a une propriété source C’est une requête (en SQL) dont le résultat est la relation associée à l’état
4 Comme le formulaire, l’état est un objet complexe Ses éléments sont des contrôles On n’utilise que ceux qui ne nécessitent pas d’action de l’utilisateur : Étiquettes Zones de texte liées (à un champ de la source de l’état ou par une formule – Cf. cours N° 8, diapo N° 23) Sous-état
5 L’état est divisé en trois niveaux (appellation non contrôlée) Chaque niveau est divisé en sections : en-tête contenu du niveau pied Le contenu permet décrit l’impression d’enregistrements de la relation source L’en-tête et le pied décrivent l’impression d’informations communes à l’ensemble des enregistrements du contenu du niveau Les trois niveaux : état page (dans le contenu de l’état) groupe (dans le contenu de la page ; un groupe peut en contenir un autre) La section contenu du niveau le plus bas (page ou groupe qui ne contient pas d’autre groupe) s’appelle « détail » sur la grille de création
6 Affichage sur la grille de création Lors de l’ouverture, seul le niveau « page » est affiché en-tête de page détail (contenu de la page) pied de page L’affichage du niveau « état » (sections en-tête et pied) se fait par la commande Affichage de ACCESS L’option de commande est « en tête/pied de rapport » (traduction littérale de « report ») Mais les noms affichés sur la grille de construction sont bien En-tête d’état Pied d’état Remarque : appliquée aux formulaires, la même commande ACCESS permet d’afficher des sections en-têtes et pieds de page ou de formulaire L’utilisation est la même que pour un état Essentiellement pour un affichage en mode continu
7 Affichage sur la grille de création (suite) Les groupes se définissent au moyen d’une commande d’ACCESS Attention à l’icône : les groupes sont imbriqués les uns dans les autres, ils ne peuvent pas se suivre Pour une présentation séquentielle d’informations groupées, il faut utiliser des sous-états
8 Utilisation des sections A chaque niveau, la section contenu décrit l’impression de plusieurs enregistrements de la relation source (cas général) Les sections en-tête et pied de ce niveau décrivent l’impression des informations de mise en page des informations qui concernent l’ensemble des enregistrements décrits dans la section contenu Utilisation d’étiquettes de fonctions de mise en page (voir le diaporama de construction des états) Utilisation d’étiquettes de zones de texte liées de sous-états Utilisation de fonctions statistiques sur l’ensemble des enregistrements de la section contenu de sous-états ayant pour source les requêtes statistiques ad hoc
9 La section détail Sert à décrire l’impression des enregistrements de la relation source Une fois décrite la relation, on place sur la grille de construction des zones de texte liées aux champs dont on veut imprimer le contenu On ne décrit qu’un enregistrement Ce modèle sera utilisé pour tous les enregistrements, les uns après les autres
10 Premier exemple Schéma de la base de données utilisée CP : N° formation Nom formation Niveau tabFormationtabEtudiant CP : N° étudiant CE : Formation suivie Nom Prénom Construire un état imprimant les identités des étudiants (nom et prénom) et le nom de la formation suivie
11 Source de l’état : SELECT [Nom formation], Nom & " " & Prénom AS Identité FROM tabFormation, tabEtudiant WHERE [N° formation]=[Formation suivie]; Étiquette Zones de texte ayant pour sources les champs de la relation Informations de mise en page Fonction Informations fournies par ACCESS
12 Résultat obtenu En-tête Détail Pied de page Les enregistrements ne sont pas classés (pas de clause Order By) On utilise un autre outil pour trier les informations imprimées
13 Groupe Attention ! ce terme ne doit pas être confondu avec la notion d’agrégation (clause Group By) étudiée au cours N° 8 Le regroupement dans un état consiste à rassembler des enregistrements ayant des informations communes (un ou plusieurs champs) ces informations communes permettent de construire un nouveau niveau de données (groupe portant le nom de ces informations communes) décrire ces informations communes dans les sections en- tête et pied du groupe décrire les autres informations de ces enregistrements dans la section contenu du groupe pour décrire ces informations, on peut recourir à un nouveau groupe, etc. Rappel : la section contenu du dernier groupe (à l’intérieur de tous les autres) s’appelle détail
14 Classement des étudiants par formation Il faut regrouper les enregistrements qui correspondent à la même formation Fenêtre de choix des critères de regroupement Permet aussi de décrire des tris (rend la clause Order BY inutile dans la requête de description de la relation source) Sélection ou frappe des critères (dans une expression, utiliser des crochets pour les noms symboliques) Le choix de l’option « oui » génère une nouvelle section Même chose pour le Pied de groupe Déplacer le contrôle lié au champ [Nom formation] dans l’en-tête
15
16 Les sous-états Le principe est le même que pour les sous-formulaires 1.On crée un contrôle sous-état (même outil que sous-formulaire) 2.On établit un lien avec un état préalablement construit ; on utilise pour ça la propriété objet source du contrôle 3.On lie l’état et le sous-état par des couples champ père / champ fils
17 tabCommande CP : N° Commande CE : Réf Client Date commande tabLigne_commande CP :CE : Réf Commande CE : Réf adresse livraison CE : Réf Produit Qté_commandée tabClient CP : N° client Nom client Prénom client Adresse client tabProduit CP : N° produit Nom produit Description PU HT tabAdresse CP : N° adresse CE : Client concerné Adresse livraison Construction d’un état des commandes regroupées par client Reprise de l’exemple du cours N° 7 (certains noms symboliques ont été modifiés)
18 Construction d’un état des commandes regroupées par client L’état a pour source : SELECT * FROM tabClient, tabCommande WHERE réf_client=[N° client]; En fait on n’a pas besoin de tous les champs de tabCommande, seul la clef primaire est indispensable, mais la requête est plus simple à écrire ainsi… Les enregistrements seront regroupés par Client. On fait donc de la clef primaire [N° client] un critère de regroupement (avec En-tête de groupe et Pied de groupe) Dans l’En-tête de groupe on décrit l’impression des champs de tabClient Dans la section Détail, on imprime le N° de la commande, un sous-état décrivant le détail de la commande, et enfin un second sous-état décrivant l’impression du montant total de la commande Dans le pied de groupe on place un contrôle de « saut de page », qui permet de ne pas avoir les commandes de plusieurs clients sur la même page
19 On commence par créer les sous-états 1.État décrivant le détail d’une commande Source de l’état : SELECT * FROM tabLigne_commande, tabAdresse, tabProduit WHERE [N° adresse]=réf_adresse_livraison And [N° produit]=réf_produit; Regroupement sur les adresses de livraison L’en-tête et le pied de page sont vides : ils ne sont pas imprimés dans un sous-état (c’est l’état principal qui décrit ces sections) Étiquettes (les données apparaîtront en colonnes) Formule : = Qté_commandé * [PU HT]
20 On commence par créer les sous-états 2.État décrivant le montant total d’une commande Source de l’état : SELECT Réf_commande, sum(Qté_commandée*[PU HT]) AS Total_commande_HT FROM tabLigne_commande, tabProduit WHERE Réf_produit=[N° Produit] GROUP BY Réf_commande; Le résultat du calcul sur agrégation est la seule donnée imprimée par l’état
21 Ensuite on décrit l’état principal en utilisant des contrôles sous-états Champs communs à tous les enregistrements regroupés Sous-état Objet lié : État détail commande Champ père : [N° commande] Champ fils : [Réf_commande] Sous-état Objet lié : État total commande Champ père : [N° commande] Champ fils : [Réf_commande] Contrôle saut de page
22
23 Ouverture d’un état à partir d’un formulaire On utilise une procédure événementielle (par exemple liée à un bouton de commande) La commande utilisée en VBA est une méthode de l’objet DoCmd : DoCmd.OpenReport Il est possible d’utiliser les valeurs des contrôles du formulaire pour des restrictions dans la requête source de l’état Il est aussi possible d’utiliser une clause Where comme argument de la méthode OpenReport (c’est également possible pour OpenForm)
24 Propriétés de la zone de liste déroulante : Nom : Choix_commande Contenu : SELECT [N° commande], [N° commande] & " du " & [date commande] FROM tabCommande WHERE Réf_client=Choix_client.value; Colonne liée : 1 Nombre de colonnes : 2 Largeurs colonnes : 0cm; 8cm Propriétés de la zone de liste déroulante : Nom : Choix_client Contenu : SELECT [N° client], [Nom client] & " " & [Prénom client] FROM tabClient ORDER BY [Nom client], [Prénom client]; Colonne liée : 1 Nombre de colonnes : 2 Largeurs colonnes : 0cm; 8cm
25 Procédures événementielles Option Compare Database Private Sub btFermer_Click() DoCmd.Close End Sub Private Sub btImpression_Click() DoCmd.OpenReport " Liste commandes par client", acViewNormal,, _ "[N° commande] = forms![impression commande]!Choix_commande.Value" End Sub Private Sub btPrévisualisation_Click() DoCmd.OpenReport "Liste commandes par client", acViewPreview,, _ "[N° commande] = forms![impression commande]!Choix_commande.Value" End Sub Private Sub Choix_client_AfterUpdate() Choix_commande.Requery End Sub Premier argument : nom de l’état Deuxième argument : Mode d’ouverture Troisième argument : Filtre (pas au programme de ce cours) Quatrième argument : Restriction (clause Where sans le mot Where »)
26 Click