Académique Documents
Professionnel Documents
Culture Documents
Bases de données
TD ACCESS
Marc SOUQUES
souques@ensat.fr
Ci-dessous, les champs des tables avec les VALEURS assurant les Relations.
Clé primaire
SANS doublon
basée sur
2 champs
Démarrer ACCESS .
Clic sur Base de donnée vide, Clic sur pour choisir un dossier puis nommer l'application ESSAI
(l'extension accdb signifie Access Data Base c'est le format 2007 et 2010) et bouton Créer.
- Si besoin, compréhension et configuration de l'environnement de travail :
Bouton Office (Fichier en Version 2010) puis Options Access :
- Standard : Définir le dossier de données par défaut pour ouvrir ou enregistrer des bases
- Base de données active : Cocher Compacter lors de la fermeture (pour réduire la taille du fichier accdb)
- Personnaliser : Définir les icones de la barre d'accès rapide
en haut d'écran et valider OK.
Passer en mode Création pour consulter la structure de la table puis fermer (croix à droite) la table Client.
Ici, il est inutile de passer par Clic sur Index car l'index est
ici MONO-Champ.
Par contre, le résultat est bien stocké dans les index :
ATTENTION :
Num Produit Texte Indexé : Oui sans doublons car Clé Primaire
Désignation Texte Indexé : Oui sans doublons sans être Clé primaire
La clé primaire est le champ qui identifie chaque enregistrement de la table, c'est cette information qui
est utilisée dans une autre table pour pointer (référencer) vers la table Produit.
Enregistrer la table : Produit puis Fermer la table :
Remarque : Les noms des tables sont notés au singulier (Client, Produit) sans préfixe Tab Produits
Faire un effort dans le choix des noms des tables pour que le nom corresponde au contenu de la table :
Les produits Catalogue produit Produits vendus
Visualisation en mode feuille de données
Ouvrir la table Produit par double-clic sur Produit :
Passer en mode Création par le bouton (en haut à gauche) de l'onglet Accueil :
Passer en mode Feuille de données par le même bouton de barre d' outils : (en haut à gauche)
Remarque : les Données saisies sont enregistrées automatiquement (pas besoin d'enregistrer sauf la
mise en forme ou les définitions des champs des tables).
Elargir la colonne Désignation (modification de la mise en forme).
Fils de père
Table Fils Table Père inconnu
Convention perso pour nom Clé étrangère : Ref + (Nom de la table liée) = Ref Père (en italique bleu)
Convention perso pour nom Clé primaire : Num + (Nom de la table) = Num Fils (en gras rouge)
Demander à voir éventuellement exemple diapositive : "PV et sa Voiture".
A l'aide de ces 2 règles de base, nous allons gérer les Commandes de Produits faites par les Clients.
Convention :
gras +
souligné
Table Commande indique une
Table Client clé primaire
Table Commande
Table Produit
Table Croisement : Commande - Produit
On nomme généralement cette table de Croisement en mixant les noms des 2 tables croisées, par
exemple : ComProd ou ProdCom
Donc nous gérerons un champ Ref Client dans la table Commande pour pointer vers le champ
Num Client Clé primaire de la table Client.
Ce champ Ref Client est appelé Clé étrangère car il sera relié plus tard à Num Client.
On gère ici la partie fixe de la Commande, le haut de la commande, son En-tête, sans prendre en
compte les produits commandés car ils sont en nombre variable. Un nombre qui s’incrémente
Nom du Champ Type de données Propriétés automatiquement à chaque nouvelle
Num Commande NuméroAuto commande saisie : 1 puis 2 puis 3
Ref Client Numérique Taille : Entier long ; PAS de valeur par défaut
(pour futur lien vers Num Null interdit : OUI donc saisie obligatoire d'1 valeur de
Client Chaine vide autorisée : NON
de table CLIENT)
(pour future compatibilité avec Num Client de la table
Client qui est NuméroAuto donc en Numérique-Entier long)
Date Commande Date/Heure Format : Date, abrégé (jj/mm/aaaa)
Valeur par défaut : Date( ) (=date du jour)
Afficher le sélecteur : À certaines dates
Date Echéance Date/Heure Format : Date, abrégé Aujourd'hui
Valeur par défaut : Date( ) + 30 + 30 jours
Afficher le sélecteur : À certaines dates
Payée Oui/Non Valeur par défaut : Non
Total Commande : NE PAS gérer car ce n'est pas une DONNEE mais un CALCUL
Remarque : Dans cette table CommandeEnTete, le nom Ref Client est choisi librement.
Je prends la règle 'Ref'+NomTable liée pour la Clé étrangère mais d'autres solutions sont possibles.
(Num Client est souvent utilisé mais confusion possible avec le nom et le rôle de Num Client qui
est clé primaire de la table CLIENT)
Définir la clé primaire sur le champ : Num Commande
Il y a 3 CommandeEnTete.
b) Le Client 3 fait référence à plusieurs Commandes (la 1 et la 2) par le champ Ref Client
Le texte ci-dessous est une explication, il n'y a rien à faire mais tout à lire.
Gestion de la saisie dans la clé étrangère Ref Client :
Pour le champ Ref Client, pour le moment, la saisie est faite au clavier en tapant manuellement 3 par
exemple.
En réalité, pour une liste de clients comme celle ci-contre,
on ne peut faire référence pour Ref Client de la table CommandeEnTete qu'à 1
des 3 clients identifiés (1, 2, 3) dans la clé primaire Num Client de la table
Client.
Une erreur consisterait pour Ref Client à saisir un numéro 4 qui n'existe pas dans Num Client.
Pour éviter cette erreur, nous gérerons plus tard (voir Chapitre 5 LES TABLES AVEC LISTES
DEROULANTES POUR CLE ETRANGERE) la saisie dans Ref Client par une liste déroulante ne
proposant QUE les Clients qui existent dans la clé primaire Num Client de la table Client.
Pour faciliter le choix du client de la commande, nous présenterons en plus de Num Client, le Nom et le
Prénom du client en classant ces clients par ordre alphabétique des Noms – Prénoms.
Si vous relisez ce polycopié pour faire un projet Access, il faut traiter la gestion de ces listes
déroulantes de clés étrangères dès la création des Tables .
Donc nous gérerons dans cette table un champ Ref Commande pour pointer vers le champ
Num Commande Clé primaire de la table Commande.
Ce champ Ref Commande est appelé Clé étrangère car il sera relié avec le champ Num Commande.
Donc nous gérerons dans cette table un champ Ref Produit pour pointer vers le champ
Num Produit Clé primaire de la table Produit.
Ce champ Ref Produit est appelé Clé étrangère car il sera relié avec le champ Num Produit.
On gère ici la structure de la table pour un Produit commandé d' une CommandeEnTete.
C'est la table de croisement entre la table CommandeEnTete et la table Produit.
Nom du Champ Type de Propriétés
données
Ref Commande Numérique Taille : Entier long ; PAS de valeur par défaut
(pour lien vers (pour future compatibilité avec Num Commande de la table
Num Commande CommandeEnTete qui est en NuméroAuto donc en
de table CommandeEnTete) Numérique-Entier long),
Null interdit : OUI ; Chaine vide autorisée : NON
Ref Produit Texte Taille : 6 ; PAS de valeur par défaut ,
(pour lien vers (pour future compatibilité avec Num Produit de la table
Num Produit Produit qui est Texte de longueur 6)
de table Produit) Null interdit : OUI ; Chaine vide autorisée : NON
Quantité Numérique Taille : Réel simple (au cas où on vendrait 1 boite et
(quantité commandée d'un demie de 10 DVD = 15 DVD = 1,5 boite)
produit d'une commande) Valeur par défaut : 1
Ici, la clé primaire n'est pas mono-champ. C'est le couple 1 - CAN001 qui identifie
un Produit commandé (CAN001) dans le cadre d'une Commande (1).
Définir une clé primaire : sélectionner les 2 premiers
champs Ref Commande, Ref Produit par un glissé à la
souris (dans la colonne de gauche) et les définir par le bouton
Clé primaire comme clé primaire composée :
Attention : Ref Commande et Ref Produit ne sont pas individuellement clé primaire
mais le couple Ref Commande + Ref Produit est clé primaire.
Il n'y a qu'1 Clé primaire par Table.
Saisir :
Ref Commande Ref Produit Quantité
1 CAN001 4
1 EPS001 2 Table Produit
2 CAN001 1
2 CAN002 3
2 MIC001 5
Table CommandeLigneProduit
Nous avons donc 5 Produits commandées dans CommandeLigneProduit répartis sur 2 Commandes.
La Commande 1 (Ref Commande) contient 2 Produits, CAN001 et EPS001
La Commande 2 (Ref Commande) contient 3 Produits, CAN001, CAN002 et MIC001
Le Produit CAN001 (Ref Produit) a été commandé 2 fois, dans les Commandes 1 et 2.
Un produit commandé est identifié par la clé primaire composite Ref Commande - Ref Produit .
Le couple 1 - CAN001 identifie la commande du produit CAN001 dans la commande 1.
Il est impossible de ressaisir ce couple 1 - CAN001 sinon Doublon sur clé primaire.
Fermer la table CommandeEnTete
Fermer Access et donc la base essai (croix en haut à droite)
Le texte ci-dessous est une explication, il n'y a rien à faire mais tout à lire.
Gestion de la saisie dans les clés étrangères Ref Commande et Ref Produit :
Pour le champ Ref Produit, pour le moment, la saisie est faite au clavier en tapant manuellement
CAN001 par exemple.
Je mets une majuscule à la première lettre de chacun des mots composant le Champ.
Exemple : Date Echéance avec 2 majuscules, 1 espace entre Date et Echéance et 1 accent.
Remarque : On peut aussi gérer des noms sans espace et sans accent (DateEcheance) pour faciliter
l'écriture de ces noms en programmation VBA et gérer dans ce cas la propriété du champ Légende qui
propose un nom de substitution (avec espaces et accents : Date d'Echéance) pour les affichages dans les
formulaires
Je mets une majuscule à la première lettre de chacun des mots composant la Table.
Je note les noms de table au singulier car une table définit la structure pour 1 enregistrement type.
En effet, une application Access (comme Excel, Word et Powerpoint) peut avoir un contenu (programme
VBA ou autres techniques) potentiellement dangereux.
Donc, ici, du contenu est désactivé. Pour gérer cet aspect, plusieurs solutions :
1. Garder la configuration ci-dessus et cliquer
à chaque ouverture de la base sur le bouton Option…
puis choisir Activer le contenu si vous faite confiance
à l'origine du fichier.
2. Modifier la configuration ci-dessus en activant l'option
Activer toutes les macros. C'est non recommandé et
potentiellement dangereux car ainsi, pour toutes les
applications, du code malsain peut être exécuté.
3. Garder la configuration ci-dessus pour le Paramètre des macros à Désactivé mais définir un
dossier où vous rangerez les applications de confiance (les vôtres par exemple). Dans la fenêtre
du Centre de gestion de la confidentialité, Emplacements approuvés, ajouter un nouvel
emplacement pour un dossier (et éventuellement ses sous-dossiers) pour obtenir un résultat de ce
type. Attention, cette opération peut poser problème sur un disque d’un réseau local protégé.
C'est cette dernière solution qui est recommandée et que vous mettez en place.
Valider ces paramètres et fermer Access.
/ Relations .
Ci-dessus : travail à faire = lier les tables par des Relations ou Jointures
Ajouter (si besoin par bouton +Afficher la table ) les 4 tables: Client, CommandeEnTete,
CommandeLigneProduit et Produit et fermer cette fenêtre d'ajout.
1° lien :
1 Client (Père) peut avoir N CommandeEnTete (Fils) et
1 CommandeEnTete (Fils) est liée à 1 seul Client (Père)
Définir des Liens ( appelés aussi Jointures) :
* Glisser Num Client de Client (clé primaire) sur
Ref Client de CommandeEnTete (clé étrangère)
. Boîte de dialogue :
- cocher Appliquer Intégrité Référentielle,
(vérifications des données des liens, voir TEST plus loin)
- Ne pas cocher 'Mettre à jour en cascade'
- Ne pas cocher 'Effacer en cascade'
- Type de Jointure (consulter seulement) Créer
EGAUX
Un-à-plusieurs : c'est le cas classique
2° lien :
1 CommandeEnTete peut avoir N CommandeLigneProduit et
1 CommandeLigneProduit est liée à 1 seule CommandeEnTete
Définir des Liens ( appelés aussi Jointures) :
* Glisser Num Commande de CommandeEnTete (clé primaire) sur
Ref Commande de CommandeLigneProduit (clé étrangère)
Remarque : Ref Commande n'est pas un champ clé primaire (malgré le symbole clé ) mais la moitié
d'une clé primaire qui elle est composée des 2 champs Ref Commande et Ref Produit
. Boîte de dialogue
- cocher Appliquer Intégrité Référentielle (vérifications des données des liens, voir TEST plus loin)
- Relation 1 à Plusieurs -Pas de Mise à jour et pas d'Effacement en cascade
- Type de Jointure (consulter seulement) Créer
Remarque : On trouvera ailleurs que dans notre établissement des liens (jointures, relations) entre
clé primaire et clé étrangère comme ceci par exemple :
Numxx clé primaire de table-père et Numxx clé étrangère de table-fils ou
Codexx clé primaire de table-père et Codexx clé étrangère de table-fils ou
Idxx clé primaire de table-père et Idxx clé étrangère de table-fils ou
Refxx clé primaire de table-père et Refxx clé étrangère de table-fils.
Soit le même nom de champ pour la clé Primaire et Etrangère !!!
Je n'adhère pas, à titre pédagogique, à cette manière de nommer 2 choses différentes avec le même nom
mais il faut savoir que cette manière de nommer existe même si elle est ambigüe.
Cela vient en partie du fait qu'il existe des logiciels (PowerAMC, WinDesign) qui, à partir d'un MCD, génèrent
automatiquement un MLD Relationnel et que ces logiciels reprennent (faute de règle) automatiquement le nom de
la clé primaire du MCD (l'identifiant pour être exact) pour créer la clé étrangère.
Comme il n'y a pas de règle pour nommer ces 2 types de clés, chacun fait avec sa règle.
Vous trouverez donc toutes les combinaisons possibles de clé Primaire et Etrangère, l'essentiel est de
bien comprendre le rôle différent de chaque clé :
La Clé primaire :
- identifie chaque enregistrement d'une table.
- est SANS doublon.
- est souvent de type numérique et même Numauto
(pour générer AUTOMATIQUEMENT un numéro).
- est définie comme Primaire car clic sur
La Clé étrangère :
- pointe vers 1 enregistrement d'une autre table.
- est AVEC doublon possible (2 fois la valeur 1 car 2 Commandes peuvent pointer vers le même
Num Client 1).
- est d'un type qui dépend obligatoirement du type de la clé primaire pointée, JAMAIS Numauto
car l'objectif est que l'utilisateur choisisse MANUELLEMENT (ou par liste déroulante) un
enregistrement de l'autre table.
- est définie comme Etrangère seulement parce que c'est elle qui est liée à la clé primaire de
l'autre table.
Règle 2 :
Pour qu’une relation (lien ou jointure) puisse être réalisée, les 2 champs liés doivent contenir des
données de même type et même longueur.
Clé primaire (Num xxx) Clé étrangère (Ref xxx)
(NumAuto) donc du Numérique entier Numérique, Entier long
Texte, Longueur 6 Texte, Longueur 6
Numérique, Entier long Numérique, Entier long
Règle 3 :
Les valeurs du champ Ref xxx de la table1 doivent pouvoir être égales …
au champ Num xxx de la table2. =
Clé primaire (Num xxx) Clé étrangère (Ref xxx)
Num Client de Client = 3 Ref Client de CommandeEnTete = 3
Num Produit de Produit = CAN001 Ref Produit de CommandeLigneProduit = CAN001
Etablir un lien entre Num Client (1, 2, 3, 4,…) et Ref Produit (CAN001, EPS001, CAN002, …)
n'a AUCUN sens car les valeurs ne seront jamais égales (=).
Pour modifier ou Supprimer des relations : (Clic droit sur le trait 1-- )
Enregistrer la mise en forme des relations et Fermer cette fenêtre Relation :
IMPORTANT :
Le travail réalisé par Accès au niveau des Relations consiste :
Voir
- à rechercher à partir d'une valeur d'une clé étrangère exemples
l'unique (1) valeur égale (=) dans la clé primaire liée. en bas de
- à rechercher à partir d'une valeur d'une clé primaire page 5 du
les (N) valeurs égales (=) dans la clé étrangère liée. Chapitre I
erreur car, dans la table Fils CommandeEnTete, saisir dans Ref Client la valeur 999 999 alors
que dans la clé primaire Num Client de la table Père "Client" la valeur 999 999 n'existe pas, cela n'est
pas valide.
Un Fils ne peut PAS faire référence à un Père dont la valeur ne peut être retrouvée
dans la table Père.
Remarque : un fils peut ne pas faire référence à un père si on l'autorise, une CommandeEnTete
pourrait ne pas faire référence à un client (pas de saisie dans Ref Client) mais nous l'avons interdit dans
cette application dans le champ Ref Client avec la propriété Null interdit (vide interdit) : OUI et Chaine
vide autorisé : NON donc ici la saisie est obligatoire.
erreur car supprimer dans la table Père une clé primaire CAN001 alors qu'au moins un
enregistrement de la table Fils CommandeLigneProduit y fait référence par la clé étrangère Ref Produit
est une suppression non valide.
Un Père ne peut PAS être supprimé s'il a encore au moins 1 Fils qui fait référence à lui même.
Dans les cas 1) et 2), on ne veut pas d'un Fils pointant vers un Père NON "trouvable".
1. Requête sélection
Elle permet de sélectionner, trier, calculer des enregistrements sur une ou plusieurs tables
reliées entre elles.
A. Requête simple sur une seule table
Créer une Nouvelle requête, onglet Créer, bouton Création de requête basée sur la table Client.
1) Requête "R01 Client Ou"
Question : "Liste des clients avec visualisation des champs Nom, Prénom, Date Entrée et Ville, par
ordre alphabétique de leur nom puis prénom, habitant Clamart OU nommés TERIEUR "
Saisir les noms des champs ci-dessous par double-clic dans la table affichée en haut de l’écran.
Champ: Nom Prénom Date Entrée Ville
Table: Client Client Client Client
Tri: Croissant Croissant
Afficher: X X X X
Critères: clamart
Ou = entre 2 lignes
Ou: TERIEUR de colonnes quelconques
Pour une saisie dans un champ de type TEXTE, les " sont ajoutés comme délimiteur "TERIEUR"
SQL est un langage Standard pour tous les Systèmes de Gestion de Bases de Données pour créer,
interroger et manipuler les Bases de Données (BD). La commande de base permet la
Sélection de Champs de Tables où des conditions sont requises, ordonnés par des critères de tri.
SELECT liste de champs FROM tables WHERE conditions de sélection ORDER BY critères de tri
Dans Access, dans un premier temps, nous n'aurons pas besoin de la syntaxe SQL pour créer une requête
car nous bénéficions du mode Création de la requête sous forme de tableau interactif.
Si vous souhaitez vous formez au langage SQL, je vous propose mon Polycopié à demander :
SQL pour SGBD.pdf
Pour une saisie dans un champ de type DATE, les # sont ajoutés automatiquement
comme délimiteur de date= #15/04/2009#
Opérateurs de comparaison : (faute d’opérateur choisi, c’est l’opérateur = qui est utilisé par défaut)
= , > , < , >= , <= , < > (différent), Comme (comparaison avec caractères joker ci-dessous)
Possibilité d'utiliser les caractères Jokers vus précédemment (pour les champs de type Texte) :
* , ? , # avec l'opérateur Comme pour interpréter ces 'Jokers'
Exécuter la requête, Passer en mode Création :
Enregistrer la requête : R03 Client Entre et fermer cette requête.
« A vous d'essayer... »
Commentaire :
Les résultats ne font apparaître aucune des informations du client (nom, prénom, …) hors mis le numéro.
Ces données sont dans les tables Client.
Nous allons donc faire des requêtes multi-table pour visualiser les informations client depuis une
commande.
Nous avons lié les Clients et les Commandes dans la fenêtre relation.
Ce lien peut être utilisé dans 2 sens :
- Pour 1 Commande, j'obtiens son Unique Client
- Pour 1 Client, j'obtiens ses N (∞) Commandes.
Définir une requête basée sur les 2 tables CommandeEnTete et Client avec les champs suivants.
Ce résultat affiche les Commandes pour lesquelles Ref Client = Num Client
Voir le mode SQL de la requête : SELECT [Num Commande], [Date Commande], [Date Echéance],
[Ref Client], [Num Client], Nom, Prénom FROM Client INNER JOIN CommandeEnTete
ON Client.[Num Client] = CommandeEnTete.[Ref Client];
Clé primaire
Clé étrangère
AVEC doublons SANS doublon
de table "Père"
de table "Fils"
Dans une relation Père - Fils, les Fils pointant vers aucun Père (pas de saisie) ne sont pas affichés
dans une requête basée sur les 2 tables liées. - Ce sont des Fils de Père inconnu -
Ce Problème peut être géré en modifiant le type jointure sur la
Relation Clé primaire - Clé Etrangère.
Nous ne le verrons pas pour le moment.
Définir une requête basée sur les 2 tables Client et CommandeEnTete avec les champs suivants.
Par contre, le client 3 DURAND est affiché plusieurs fois car plusieurs enregistrements du champ
Ref Client contiennent la valeur 3. DURAND possède N commandes : la 1 et la 2.
Dans une relation Père - Fils, les Pères n'ayant aucun Fils pointant sur eux ne sont pas affichés
dans une requête basée sur les 2 tables liées. Ce sont des Pères 'potentiels' sans Fils.
Ce Problème peut être géré en modifiant le Type
jointure sur la Relation Clé primaire - Clé Etrangère.
Nous ne le verrons pas pour le moment.
Mais il n'est pas obligatoire de présenter les paires de champs liés. Simplifier.
On simplifie encore (pour faire de la place sur ce document pour les futurs calculs).
Utilisation du générateur d’expression pour champ calculé ( voir l’enseignant pour explications)
Nom de la colonne
librement choisi
Remarque: le générateur d'expression ne présente dans sa fenêtre QUE les colonnes de la requête
enregistrées sur disque et non pas celles qui sont affichées à l'écran donc, avant chaque
utilisation du générateur, il faut enregistrer la requête.
La fonction VraiFaux a la même logique que le SI d'Excel : (condition ; valeur si Vrai ; valeur si Faux)
La fonction VraiFaux() s'écrit Iif() en version 2010 et en syntaxe anglaise.
Penser à gérer en mode Création pour chacune des 4 colonnes de calcul un format Monétaire par
le bouton Feuille de propriétés :
4) Fonctions de Domaine
Ces fonctions effectuent des regroupements sur des domaines et produisent des résultats analogues aux
requêtes de regroupement.
Gros avantage : en une fonction totalement autonome, on a l'équivalent d'une requête travaillant sur
des données (Table ou Requête), effectuant par le nom de la fonction (Compter, Sommer, …) un calcul
sur un champ (ou une expression) dont les enregistrements utilisés peuvent éventuellement être
sélectionnés par une condition (filtre).
Forme générale :
FonctionDeDomaine ("champ_ou_expression" ; "table_ou_requête" ;" filtre")
5) Fonctions de conversion
Syntaxe anglaise Syntaxe française Définition Exemple Résultats
Nz(expression; Nz( ) Convertir une valeur Nz(Quantité)*2 0 si quantité
valeur de Null en une autre valeur = Null.
remplacement) (0 par défaut pour une Quantité *2 Null si quantité =
(Nz pour Null to Zéro) variable numérique) Null
Val() CNum() Renvoie un nombre à Val("88 rue des 88
partir d'une chaine de corsaires")
caractères
Str() NumChaine() Transforme un nombre Str(12) "12"
en chaine de caractères
6) Fonctions Diverses
Syntaxe anglaise Syntaxe française Définition Exemple Résultats
Iif(condition; VraiFaux( ) Retourner une valeur en Iif(1=1; 6
valeurSiVrai; IIF() en V 2010 fonction de la condition 2*3;
valeurSifaux) Remarque : nous Vraie ou Fausse 4)
avons déjà utilisé Même logique que le SI Excel
cette fonction
page 31 en haut
IsNull(expression) EstNull( ) Tester si la valeur est Null IsNull(champ1 Vrai ou Faux
(vide) )
MsgBox(message; BoîteMsg() Afficher une boite de MsgBox("Ajou
boutons; titre) message t effectué")
NE PAS FAIRE
CETTE PARTIE
Question : "Créer la requête R12_1 Des informations sur les clients permettant d'afficher le type de
résultat ci-dessous en manipulant & et les fonctions VBA".
Exécuter
b) Regrouper les enregistrements ayant même valeur (CAN001 par exemple) pour faire des
traitements sur le groupe.
Ajouter la ligne Opération par le bouton Totaux .
Tester.
Dans l'en-tête de la dernière colonne, transformer "Quantité" en "Total des ventes : Quantité"
pour éviter l'affichage de SommeDeQuantité remplacé par Total des ventes (nom de colonne calculée).
Tester pour la colonne Total des ventes les autres Opérations (autres que Somme) disponibles sur un
Regroupement : Moyenne, Min, Max, Compte, …
H. Exercices à faire
Question : "Créer la requête R14 : Moyenne des
quantités de produits des commandes par client
permettant d'afficher précisément le résultat ci-contre
trié par moyenne".
= = =
Utilisateur
Table ou Requête = affichage brut des données Formulaire = affichage permettant une
en mode Feuille de données (tableau). Mise en Forme des données.
Intérêts du Formulaire :
- être l'interface (l'intermédiaire) entre les Données et l'Utilisateur pour lire et écrire des données
- présenter un affichage optimisé et sophistiqué (Interface graphique Windows)
- faciliter la saisie (aide à la saisie par choix dans liste déroulante par exemple)
C. Modifier un formulaire
Objectif à obtenir à la fin de cette partie Modification :
Modifications
2
3
Passer en mode Création sur le formulaire Client : il y a 3 sections (En tête, Détail, Pied).
Les éléments d'un Formulaire sont appelés des Contrôles
Voir numéros 1,2,3,4 ci-dessous et leur correspondance sur la copie d'écran de la page précédente.
1. contrôle Etiquette
Correspond à du Texte non modifiable par l'utilisateur de l'application et basé sur le texte d'une légende.
Application : .sélectionner l’outil Etiquette (Aa) qui permet d’ajouter du texte figé .créer une
Etiquette à droite du contrôle Num Client par un glissé puis saisir son texte : Automatique (indiquant
ainsi que la génération du Num client est Automatique)
2. contrôle Rectangle
Application : .sélectionner l’outil de dessin Rectangle dans la barre d’outil, .dessiner un
rectangle autour du Nom et Prénom par un glissé .donner une couleur au rectangle puis mettre le
rectangle en arrière plan par onglet Réorganiser, bouton Mettre en arrière plan de zone Position
4. contrôle Logo
Application : Ajouter le logo Clientele.gif (fichier fourni). Le logo est ajouté automatiquement
dans la zone En tête du formulaire. Par la propriété Mode d'Affichage du Logo, affecter successivement
Découpage, Echelle, Zoom à l'image pour comprendre la présentation de l'image.
Le contrôle Logo est en réalité un contrôle Image, positionné automatiquement dans l'en tête du
formulaire, avec une petite taille par défaut. Tester le contrôle Image avec le même fichier .gif puis
effacer cette image.
Bilan sur l'affichage des Images :
-En Découpage : L'image ne rentre pas dans la surface qui lui est allouée, elle est découpée (il manque
ici le haut et le bas). Sa taille de base est gardée.
-En Echelle : L'image est déformée horizontalement et verticalement (mis à l'échelle : ici élargie
horizontalement) pour occuper toute la surface qui lui est allouée. La totalité de l'image est vue.
-En Zoom : L'image n'est pas découpée, n'est pas déformée, elle n'occupe pas toute la zone qui lui est
allouée (à droite et gauche) et elle est zoomée (ici zoom arrière). La totalité de l'image est vue.
Groupe d'options :
Bouton bascule
Bouton d'option
Case à cocher
Liste déroulante :
Zone de liste :
liste de valeurs toujours visible mais prend de la place
Saut de page : utilisable pour les impressions ----< Saut de Page >----
>
Trait à dessiner
Rectangle à dessiner
Graphique
www.fnac.com
Lien hypertexte : lien vers page web par exemple
Lien vers une pièce jointe : un fichier word par exemple
Zone
En-tête
Zone
Détail
Zone
Pied
Des
calculs
Procédure : Ce problème
Eventuellement, en
mode Création, voir
bouton Propriétés
puis Format
avec pour le champ 'Payé': critère : non; affichage désactivé (non affiché), tri sur Date Commande
Essayer de faire la requête ci-dessus seul (sinon consulter ci-dessous) :
Ici, le générateur vous propose d'utiliser les 4 tables de l'application MAIS en réalité vous ne pouvez
utiliser que les 3 tables à la 'source' de votre requête. Table Client interdite d'utilisation !.
De même, vous ne pouvez utilisez aucunes Requête car non présentes à la 'source' de votre requête
Exécuter Enregistrer : R15 Produits commandés avec date puis Fermer.
Nous souhaitons calculer la somme des montants TTC de tous les produits commandés non payés.
Agrandir le pied de formulaire à la souris puis Ajouter un contrôle Zone de texte dans le pied du
formulaire à droite sous le prix TTC avec les propriétés suivantes :
.source contrôle : utiliser le générateur d’expression
(ne pas saisir au clavier) =Somme([Total TTC])
obtenir Somme dans les Fonctions intégrées
obtenir Total TTC par clic sur <Liste de champs> puis Total TTC
Attention: Dans un contrôle avec calcul, on doit utiliser:
- soit les contrôles du formulaire courant
<Formulaire> =contrôles utilisables
- soit les champs de la requête à la source du formulaire si
clic sur <Liste de champs> = champs utilisables
On ne peut utiliser d'autres données que celles du formulaire
ou celles à la source du formulaire (ici la requête ).
On ne doit PAS utiliser les TABLES ou REQUETES par
.nom : TotalGénéral
.format : Monétaire. Fermer fenêtre des propriétés
Changer les propriétés de l’Étiquette du contrôle
.légende : Total des commandes impayées
2) contrôle Trait Tirer un trait comme sur l'exemple pour montrer la synthèse par la somme.
Passer en mode Formulaire, tester, Enregistrer et fermer ce formulaire.
Conclusion : des Calculs peuvent être faits :
1. dans des colonnes de Requête (cas le plus courant)
2. dans des contrôles Zone de texte de Formulaire (quand on ne peut le faire dans une requête)
Voir page suivante des Exercices :
D. Exercices à faire
si vous avez du temps :
2- Question:
Afficher les Produits et les clients l'ayant acheté (avec la date de commande) :
Trier par numéro de produit.
Clé étrangère
AVEC doublons
= Clé primaire
SANS doublon
"Père"
"Fils"
Dans une première version de base, une fois le choix fait, continuer à afficher la valeur 3 dans Ref Client
Num Commande Ref Client Date Commande
Mode Création
Table CommandeEntête, Champ Ref Client.
Onglet Liste de choix
Contenu détermine ce qui va dérouler dans la liste déroulante (ici Num Client, Nom, Prénom de Client)
Pour la propriété Contenu, utiliser le générateur (…en fin de ligne) pour créer la Requête (ajouter
table Client, 3 champs dans l'ordre : Num Client, Nom, Prénom, tri sur Nom puis Prénom), fermer la
requête, OUI pour enregistrer le code SQL ci-dessous (ne pas saisir le texte ci-dessous)
SELECT Client.[Num Client], Client.Nom, Client.Prénom
FROM Client TRI
ORDER BY Client.Nom, Client.Prénom; OBLIGATOIRE
Une fois le client saisi, l'affichage ci-contre est peu significatif (qui est
le client 3 ? Quel est son Nom ?).
Evolution : Nous souhaitons toujours avoir la première colonne (caché à 0 Cm) de Num Client mais
avoir dans une deuxième et dernière colonne le Nom en majuscule concaténé (juxtaposé par &) à un
espace (" ") puis concaténé au Prénom pour que ces 2 informations apparaissent ainsi après saisi.
Tester :
Access propose une nouveauté basée sur 2 nouvelles propriétés de la liste de choix :
Autoriser la modification de la liste : OUI
Nom du formulaire pour saisir des clients : Client
Fermer la table et la ré-ouvrir pour activer les 2 modifications ci-dessus.
Après saisie de ces 2 propriétés, lorsque vous déroulez la liste, vous obtenez un petit bouton en
bas ou haut de liste que vous cliquez et qui ouvre le formulaire Client.
On peut ajouter, (atteindre un nouvel enregistrement par)
ou modifier (se déplacer par les boutons ci-dessous puis modifier)
Tous les mécanismes de la liste déroulante testés ici au niveau de la table CommandeEnTete seront
hérités dans tous les formulaires qui seront construits sur cette table.
B. Exercice à faire…
Faire de même pour Table CommandeLigneProduit, Champ Ref Produit, Onglet Liste de
choix pour saisir un produit commandé parmi les produits de la table Produit.
N'oubliez pas que notre objectif primaire est toujours de stocker dans Ref Produit la valeur du champ
Num Produit (LOG001 pour le Clavier Logitech KZ Noir) de la table Produit même si cela ne se voit
pas sur la copie d'écran ci-dessus !!!
Ce que nous avons fait peut être perçu comme ambigu : Pour Ref Produit par exemple :
Ce qui est stocké LOG001 n'est pas affiché et
Ce qui est affiché Clavier Logitech KZ Noir n'est pas stocké !
Rappel : Ref Produit est Texte, Longueur 6 caractères donc "Imprimante laser Canon type 1" n'est pas le
contenu de ce champ !!!
Ne pas gérer une liste déroulante pour la clé étrangère Ref Commande de la table
CommandeLigneProduit, nous utiliserons une autre technique pour assister la saisie de ces
valeurs.
2. Des Requêtes
Des Requêtes de Sélection
Mono ou multi table
Avec ou sans calcul
3. Des Formulaires
Avec pour Source une Table ou une Requête
Affichage Colonne simple (uniquement 1 enregistrement visible) ou Tabulaire (tableau de N enregistrements)
Avec ou sans Calcul
Utiliser le fichier Fac05a2007.accdb pour la suite
Aller voir le Chapitre "Introduction aux Bases de Données et à ACCESS "
pour comprendre ce qui a été fait.
Remarque : le produit SON002 n'as pas de valeur pour Ref Catégorie !!!
B. Requête multitable
1) Requête "R17 Produit et sa Catégorie"
Question : Liste des produits classée par Num Produit avec affichage de tous les champs de Produit
(y compris Ref Catégorie) et affichage du Nom de la catégorie de la table Catégorie.
Les 2 dernières colonnes
affichent les mêmes
valeurs mais n'ont pas le
même rôle.
Ref Catégorie permet de
choisir pour un Produit
sa catégorie.
Nom Catégorie affiche
la valeur de la table
Catégorie dépendante
(grâce à la Relation) de
la valeur du champ
Ref Catégorie.
Il n'y a QUE 13 enregistrements alors qu'il y en avait 14 en haut de cette page !!! Si l'on souhaite éviter le
doublon, c'est Nom
Catégorie que l'on
SON002 a disparu : pourquoi ? pourrait ne pas afficher.
Etape 1 : Liste des produits classée par Num Produit avec PLUSIEURS prix d'achat car plusieurs
fournisseurs par produit (pour certains).
Ici 2
Ici 3
Fournisseurs
par produit
Etape 2 : Liste des produits classée par Num Produit avec Regroupement des mêmes produits et
calcul de la moyenne des prix d'achat des différents fournisseurs de produits.
Attention à bien
définir et limiter les
colonnes critères de
regroupement.
Ajouter par exemple
la colonne
Ref Produit pour
voir le problème
généré.
14 enregistrements seulement suite au Regroupement
Tables "techniques"
pour gérer lien N-N
Une Commande est liée à au plus 1 Client donc Clé étrangère Ref Client
Un Produit est lié à au plus 1 Catégorie donc Clé étrangère Ref Catégorie
Saisir le nouveau produit ci-dessous et saisir dans Ref Catégorie de Produit avec la liste déroulante sa
catégorie : la valeur Clavier.
Ref Catégorie stocke en réalité la valeur 3 mais affiche le Nom de la catégorie correspondante.
Nom catégorie est une information de la table Catégorie et non pas de la table Produit. Ne pas modifier
cette dernière colonne affichée automatiquement grâce à la Relation.
Fermer ce formulaire et vérifier dans la table
Produit (utiliser éventuellement le bouton
Actualiser) la présence de ce nouveau clavier
LOG003 rangé dans l'ordre de la clé primaire : Num Produit
C. Formulaire "Produit" à compléter
Ajouter un contrôle pour saisir-choisir la Catégorie du produit.
En mode Création, utiliser dans l'onglet Création le bouton
'Ajouter des champs existants' puis glisser sur le formulaire
Ref Catégorie. On obtient automatiquement la liste déroulante
définie dans le champ Ref Catégorie de la table Produit.
Ch8. L'Etat
Utiliser le fichier Fac08a2007.accdb pour la suite
Impression des Données : 3 possibilités
Impression : Table (possible mais brut de présentation donc pas recommandé)
Impression : Formulaire (possible mais pas le plus adapté)
Impression : Etat (le plus performant)
Intérêts de l'Etat :
- représentation synthétique (synthèse par somme ou moyenne de groupements possibles)
- regroupement par catégorie et calculs (totaux et sous-totaux)
- vue d'ensemble des données
L'Etat imprime (Aperçu avant impression aussi) les Données provenant d'une Table ou Requête
1. Créer un Etat
A. Etat basé sur une table
1) Catalogue des produits basé sur la table Produit version1
a) Créer l'état
Depuis l'onglet Créer, bouton Assistant état :
- basé sur la table Produit
.Sélectionner : tous les champs sauf Ref Catégorie Suivant
.Critère de regroupement : (rien) Suivant
.Le tri sera effectué sur : Num Produit Suivant
.Présentation : Tabulaire, Orientation : Portrait Suivant
.Style : Access 2007 Suivant
.Titre (nom d'enregistrement) : Produit 01 sur table produit Terminer
Un Aperçu avant impression est proposé. Fermer l’aperçu et donc Mode Création.
Comme dans un formulaire, il y a :
- plusieurs Sections : 2 En têtes, 2 Pieds, le Détail
- des Contrôles: ne pas confondre les Etiquettes et les Zones de texte.
- une Boite de contrôles disponible : pour ajouter des contrôles
Passer en Mode Etat par (données visibles, PAS de mise en page possible)
Passer en Mode Page (données visibles ET mise en Page POSSIBLE)
Passer en Aperçu avant impression (vue page format A4 et Zoom)
Passer en Mode Création (données Invisibles mais mise en Page POSSIBLE).
b) Personnaliser l'état :
- modifier dans l’en-tête de l'Etat le titre en Produit : version1
- déplacer ce contrôle au centre de la largeur de la page
- tirer un trait sous ce titre avec le contrôle Trait de la boite des contrôles
- cliquer à gauche sur le bouton Affichage pour visualiser le résultat.
Enregistrer et Fermer
B. Etat basé sur une requête
1) Catalogue des produits basé sur la requête R12 Calcul TTC unitaire
Cliquer la requête "R12 Calcul TTC unitaire" à gauche dans la liste des requêtes pour la choisir
comme base du nouvel Etat.
Onglet Créer, bouton Etat et
affichage direct du résultat.
Enregistrer: Produit 02 sur
requête
Rapide mais non personnalisé. Calcul de la
requête
2) Synthèse des ventes de produits
Objectif : "Etat des ventes des produits avec : Voir procédure
- chiffre d'affaire (CA) total par produit page suivante …
- chiffre d'affaire total par catégorie de Produit
- chiffre d'affaire total Général."
Etape 2 : Regrouper par Produit et calculer la Somme des multiplications Quantité X Prix Ht :
Déplacer la colonne Nom Catégorie une colonne à droite pour avoir une colonne vide pour futur calcul :
faire un clic sur le rectangle gris au dessus de Nom Catégorie puis faire un glissé de cette colonne …
Visualiser le résultat.
a)- Il y a regroupement et Somme de Quantité x Prix Ht mais pas de regroupement par catégorie
b)- Il n’y a pas de total général des ventes tous produits confondus.
Les points (a) et (b) vont être gérés par l’Etat (voir exemple plus haut).
b) Créer l'état avec assistant
Créer un Nouvel Etat en mode Assistants Etat
- basé sur la requête R19 Chiffre affaire par produit
.Sélectionner tous les champs: (de la requête) Suivant
.Critère de regroupement : (Ref produit est déjà défini mais)
on supprime le regroupement sur Ref Produit
on ajoute le regroupement : Nom Catégorie Suivant
.Le tri sera effectué sur : Ref Produit (ne pas faire Suivant )
Il existe dans le
regroupement de la
requête le calcul
Compte qui
compte le nombre de
lignes regroupées
(on comptera les
lignes regroupées de
n'importe quelle
colonne de la
requête).
Attention à la gestion de la largeur de l'Etat pour respecter les 21 cm de la page A4 sinon vous
aurez des pages supplémentaires imprimées presque vides pour ce qui dépasse des 21 cm de large.
L'Etat a une structure complexe composée de 3 En-têtes,
une zone Détail pour afficher N Lignes et
en fin 3 Pieds.
Il est donc conseillé de le concevoir automatiquement via
l'assistant puis de le personnaliser manuellement si besoin.
1
Relation
= Père
Relation
1
1
Fils
Procédure à suivre en Assistant Formulaire :
Choisir (pour le Formulaire Principal FP) la table: Client OK
Champs affichés pour FP : tous les champs de Client (PAS Suivant)
ET choisir à nouveau (pour le Sous Formulaire (SF)) la table: CommandeEnTete
Champs affichés pour SF : tous (en initiation, on prend tous les champs, plus tard, nous
éliminerons 1 champ : voir page suivante) les champs de CommandeEnTete Suivant
Afficher : par Client en Formulaire avec SS-Formulaire Suivant
Disposition : Sous-formulaire en Tabulaire Suivant
Style :Access 2007 Suivant
Titre : Formulaire : Client et ses Commandes FP
Titre : Sous-formulaire : Client et ses Commandes SF Terminer
Tous les liens 1-N peuvent être représentés par un Formulaire et Sous-Formulaire :
But 2 : Créer un formulaire présentant, pour 1 En-tête de Commande, ses N Produits commandés
Titre Formulaire : Commande et ses Produits FP
Titre Sous-formulaire : Commande et ses Produits SF
A vous de jouer...
Père
Fils
Saisir, via le formulaire, de nouveaux produits commandés pour des en-têtes de commandes existantes.
Saisir, via le formulaire, de nouvelles Commandes complètes ( en-tête puis leurs produits commandés ).
Remarque: Le champ Ref Commande de la table CommandeLigneProduit n'a pas donné lieu dans
le TD précédent à une liste déroulante car un produit commandé est toujours saisi dans le cadre
d'un Sous-formulaire de CommandeEnTete.
1 Père et …
De même pour les autres Formulaires / Sous-formulaires à venir, NE PAS afficher le champ
Refxxx de la table Fille (celle du Sous-Formulaire) lors de la création avec l'assistant.
NON
affiché
car inutile
NON
affiché
car inutile
Pour le Formulaire Principal (FP), nous avons principalement la table Produit et en plus nous
accédons grâce au lien (Relation) à la table Catégorie pour afficher ici le Num Catégorie du Produit.
Pour le Sous Formulaire (SP), nous avons principalement la table ProdFour, nous n'affichons pas le
champ Ref Produit inutile, et en plus nous accédons grâce au lien (Relation) à la table Fournisseur pour
afficher ici la Ville du Fournisseur.
S'il vous reste du temps du TD, voir ou faire les 3 pages suivantes qui gèrent
des Sous-formulaires complexes.
Les
pères
Les petits
fils
Cette organisation sur 3 niveaux hiérarchisés ne pose aucun problème à générer avec l'assistant en
choisissant les 3 tables, en éliminant de l'affichage les 2 clés étrangères Ref Client et Ref Commande.
Nous avons donc 3 générations présentées : Grands pères, Pères et Petits fils.
C. Version avec 2 sous formulaires de même niveau.
Objectif : Afficher chaque Produit avec sa liste de N Fournisseurs et sa liste de N Commandes.
1 1
N N
SF
3) Enregistrer ce SF
Fin TD5
1) Créer le graphique
Menu Créer / Création de formulaire.
Choisir le contrôle Graphique et le poser sur le formulaire vide
Dans l'assistant démarré : Choisir la table : Produit
Choisir les champs : Num produit ; Prix Ht Suivant
Choisir le type de graphique : Histogramme 3 D Suivant
Cette présentation est proposée:
-Num produit de type texte est proposé comme axe des abscisses :
Fermer l'aperçu puis Suivant et donner un titre au graphique : Les Produits et leur Prix et Terminer
Le résultat est un peu étonnant mais nous sommes en Mode Création donc ce n'est pas l'affichage
final. Passer en mode Formulaire (Affichage)
2) Modifier le graphique :
Double clic sur le Graphique pour appeler l'application Microsoft Graph.
Passer en mode Page (Affichage final + modifications possibles), agrandir le graphique pour voir
toutes les valeurs de l'abscisse, passer en mode Formulaire (Affichage) pour obtenir :
But : Créer un formulaire pour proposer le Menu des opérations possibles dans l’application
Facturation. (Aujourd'hui, les boutons de commande seront SANS effet).
Créer un Formulaire Nouveau en mode Création de Formulaire.Base du Formulaire: pas de table
Seule la section Détail s’affiche, l’agrandir à la taille voulue
Sélectionner Zone détail, Couleur Arrière plan = Bleu ciel
Vérifier que l’outil 'Assistant contrôle' n’est pas actif (Actif = orangé, cliquer pour le désactiver si besoin)
- Outil Bouton de commande (sans Assistant contrôle): poser un contrôle
Le sélectionner puis le dupliquer 6 fois par Copier-Coller
Par les propriétés de chaque bouton (double Clic), donner les 6 légendes et pour le bouton du
bas, pour la propriété Image: choisir en fin de ligne par le générateur le nom de l’image Sortir
Passer en mode Formulaire:
Enregistrer le formulaire : A Menu principal (Je choisis le A devant Menu principal pour avoir ce
formulaire au début de la liste des formulaires classée par ordre alphabétique)
et l'exécuter (passer en mode Formulaire) .
Présentation du Formulaire :
- Colonne simple (dans l'assistant) pour présentation
d'1 enregistrement par
écran.
'Colonne simple'
devient en propriété
"Formulaire unique"
Macro: autoexec
OuvrirFormulaire
Nom formulaire: A Menu principal
Affichage: Formulaire
Nom filtre:
Condition Where:
Mode données:
Mode fenêtre: Standard
Afficher le premier formulaire de l'application : 'A Menu principal'
Agrandir (AgrandirFenêtre en V 2010)
Agrandir la fenêtre active (donc formulaire 'A Menu principal')
Remarque : Cette macro Autoexec (de par son nom particulier) s'Execute Automatiquement au
démarrage de l'application et affiche le formulaire A Menu principal en plein écran.
- Macro Ventes avec action :OuvrirEtat, Etat : Ventes par Catégorie et par Produit,
Affichage : Etat (pas en aperçu)
avec 2°action: Agrandir (AgrandirFenêtre en V 2010)
et l’attacher de même à l’événement SurClic du bouton Etat des ventes
- Macro Fermer formulaire avec action Fermer (FermerFenêtre en V 2010)
Type objet : Nom :
(volontairement, on ne précise pas Type et Nom pour que cette macro serve pour fermer un formulaire quelconque)
Remarque : lorsque le formulaire Menu principal est ouvert (dans une couche 1) c2: Client
et que l'on ouvre le formulaire Client (dans une couche 2), celui-ci est 'devant'
c1: Menu
ou 'dessus' le formulaire Menu principal.
Si on ne veut plus utiliser le formulaire Client et retrouver le formulaire Menu, il ne faut pas exécuter
l'action OuvrirFormulaire Menu (celui-ci est encore ouvert et on laisserait ainsi le formulaire Client
ouvert) mais il faut exécuter l'action Fermer le formulaire Client (fermer la couche 2) et retrouver
automatiquement le Formulaire Menu (en couche 1).
Il faut TOUJOURS fermer un formulaire si on ne travaille plus avec. C'est une ERREUR grave d'ouvrir un nouveau formulaire et laisser
l'ancien ouvert sans raison.
Ajouter (sans assistant contrôle) un bouton libellé Fermer dans le pied du formulaire Client et y attacher
la macro Fermer formulaire.
Remarque : possibilité de copier-coller le bouton Fermer du formulaire Client vers d'autres formulaires
(Produits, facture,…) car il a même libellé et même macro quels que soient les formulaires.
Compléter le menu pour gérer le lancement de tous les Formulaires et Etats disponibles…
Dans une application, il y a des traitements Spécifiques à 1 sujet (par exemple calcul du total d'une
commande) mais il y a aussi des traitements Classiques que l'on retrouve dans tous les sujets.
Proposé automatiquement par Access : mais saisie clavier du critère de recherche, pas de
proposition de valeurs par liste déroulante donc solution à améliorer par un développement personnel.
Rechercher (Filtrer) plusieurs enregistrements :
Proposé automatiquement par Access : mais saisie clavier du critère de recherche, pas de
proposition de valeurs par liste déroulante, donc solution à améliorer par un développement personnel.
Liste
TOUJOURS
Triée
pour
faciliter le
choix
Procédure :
1) Créer une requête sur la table Client avec Num Client, Nom, Prénom,
triée sur Nom puis Prénom
(donc la colonne Nom doit être à gauche du Prénom pour tri prioritaire)
nommée R22 Client pour liste déroulante.
Ce résultat alimentera la liste déroulante (propriété Contenu).
Le Nom-Prénom permettra de choisir un client (visible dans la liste déroulante)
Le Num Client sera le véritable critère de recherche (INvisible dans la liste
déroulante)
2) Ajouter une liste déroulante de recherche sur le Formulaire Client :
Vérifier dans l'onglet Création, Zone Contrôles que l'Assistant controle est ACTIF
( le bouton est orangé s'il est actif lorsque la souris n'est pas dessus, sinon cliquer dessus pour l'activer).
Champ
Indépendant = Vide
Maintenir à jour le contenu de la liste déroulante par rapport aux Ajout/Suppression de client.
ATTENTION : Le principe dans Access est qu'à l'ouverture d'un
formulaire, chaque contrôle exécute les données de sa définition puis
garde cette définition même si les données liées à sa définition changent.
Donc, pour notre liste déroulante, à l'ouverture, elle défini par exemple
Tester en :
- en ajoutant un client (clic en bas de formulaire sur le bouton Nouveau),
saisir le Nom Prénom AAA Alain et l'enregistrer
dans la table Client par bouton Précédent
ou dans onglet Accueil par sans changer
d'enregistrement.
Maintenant, faire de même sur le formulaire Produit pour rechercher un Produit. Fin TD7
2. Recherche mono critère, mono valeur du critère,
multi résultats
A. Rechercher des clients sur leur ville par liste déroulante
Objectifs :
Rechercher automatiquement les enregistrements de CLIENT (Num, Nom, Prénom, Adresse, ...) à partir
de leur Ville saisie (choisie) dans une Liste Déroulante proposant toutes les Villes (sans doublon)
Triées des Clients existants. 3 Etapes :
1) Définir une requête pour une liste de villes pour alimenter une liste déroulante
2) Définir un formulaire avec contrôle liste déroulante pour choisir une ville à rechercher et avec un
contrôle sous-formulaire pour afficher une liste de Clients
3) Définir un programme exécuté sur un évènement pour rechercher après la saisie de la ville
Procédure
1) Une Requête pour alimenter la liste modifiable
Garder ce formulaire ouvert et créer une requête pour filtrer les résultats…(voir page suivante)
Le CONTENANT : le contrôle
Le contenu : le formulaire
Autre représentation : Formulaire Clients à sélectionner par ville et son Sous formulaire (SF):
Problème : Le contrôle sous formulaire ne "regarde" par défaut la valeur de la liste déroulante (ville)
qu'à l'ouverture du sous-formulaire (la ville est vide à ce moment là).
Si on saisit ensuite une ville, la liste des clients reste vide. Tester cette solution temporaire.
Solution : Il faut demander explicitement au contrôle SF d'Actualiser son contenu après chaque
nouvelle saisie de la liste déroulante Ville (donc Après la Mise à jour du contenu de la liste
déroulante).
Problème : Le contrôle sous formulaire ne "regarde" par défaut les valeurs des 2 contrôles de critère
qu'à l'ouverture du sous-formulaire (les 2 contrôle sont vides à ce moment là).
Si on saisit une ville ou une date, la liste des clients reste vide. Tester cette solution temporaire.
Solution : Il faut demander explicitement au contrôle SF d'Actualiser son contenu après chaque
nouvelle saisie de la liste déroulante Ville et du contrôle Zone de texte date (donc Après la Mise à jour
du contenu de ces contrôles ).
Enregistrer et Tester…
Ajouter 1 contrôle
Requête dans le pied du
Sous-Formulaire
(et PAS dans le pied
du Formulaire)
princpak
1) Créer une Requête nommée R26 Facture détail qui sera la source du SF
Remarque:
le champ Ref commande de la table CommandeLigneProduit doit être présent dans la requête pour
pouvoir assurer la relation avec Num Commande de la table CommandeEnTete (base du FP) : voir
relation ci-dessus
Ici, le Taux est
Penser à enregistrer la requête recherché explicitement
avant de faire la colonne dans la table Produit
calculée "Total du produit" pour car la colonne Taux
pouvoir accéder aux colonnes n'est pas présente dans
Quantité et Prix de la requête les colonnes de la
courante requête courante.
4.SGBD…
Access
de Type
Base de Données Base de
Table1
Table2
Données
ACCESS
ACCESS est un Système de Gestion de Bases de Données Relationnelles. (SGBDR)
Les Données contenues dans la base de données peuvent être traitées de 3 manières :
1. à l'aide de commandes SQL stockées dans des Requêtes
génération interactive dans environnement graphique (très simple et très puissant)
3. à l'aide d'instructions du langage VISUAL BASIC (VBA) stockées dans des procédures ou
fonctions : mode programmation niveau 2 (très performant mais complexe) VBA NON vu
dans cette
formation
Les produits majeurs de type SGBD sur microordinateur sont :
-Pour petites applications (mono-utilisateur ou moins de 20 utilisateurs simultanément):
ACCESS,
-Pour grosses applications (plus de 20 utilisateurs, performances +, sécurité +, pour le WEB):
ORACLE (la référence), SQL Serveur (MicroSoft), MYSQL (gratuit), PostGreSQL (gratuit),
SYBASE, …
ACCESS gère les éléments suivants :
La Table : elle stocke les Données de l'application.
La Requête : elle stocke des Traitements basés sur les données des tables.
Le Formulaire : il affiche un Ecran à l'utilisateur mis en forme pour gérer les données.
L'Etat : il met en forme les données pour les destiner à l'Imprimante.
La Macro : elle stocke des Actions simples pour définir des traitements.
Le Module : il stocke des Procédures et Fonctions en langage Visual Basic pour
Application (VBA) pour définir des traitements. C'est le mode Programmation.
A. Choix entre Access et Excel pour développer une application ?
Chaque logiciel a des avantages et des inconvénients, utiliser l'un ou l'autre en fonction :
- du contexte : caractéristiques des Données, caractéristiques des Traitements, Partage entre plusieurs
utilisateurs, volonté de guider l'utilisateurs, compatibilité avec d'autres applications.
- de votre niveau de formation : modélisation des Données nécessaire pour Access
Choisir Excel pour :
- sa simplicité, sa rapidité de développement, sa souplesse, ses graphiques, ses outils particuliers
(Solveur), sa grande diffusion, ses nombreuses fonctions prédéfinies de gestion, sa référence en
entreprise.
Mais ne pas oublier qu'Excel :
- gère mal la cohérence des données, ne gère pas le partage d'une application entre plusieurs utilisateurs,
ne gère pas les liens entre différentes populations, est limité dans le nombre et la complexité des données
Choisir Access pour :
- sa accessibilité par rapport aux autres SGBD, son aspect RAD (Développement Rapide d'Application),
sa référence en entreprise, sa grande diffusion, le modèle Relationnel établissant des liens entre les
populations, le partage des données entre plusieurs utilisateurs, le contrôle de la cohérence des données
(intégrité référentielle) , le nombre et la complexité des données gérées,
Mais ne pas oublier qu'Access :
- est limité à environ 15 utilisateurs simultanés en Partage, n'est pas un SGBD strict mais orienté
fichiers, n'est pas client-serveur de base et surtout nécessite d'abord une étape de modélisation des
données avant de développer.
Remarque : Si aucune des 2 tables Catégorie et Produit n'existait, l'ordre de création serait :
D'abord Catégorie car c'est une table Père et les Pères naissent avant leurs Fils.
Ensuite Produit car c'est une table Fils pointant vers un Père et les Fils naissent après leur Père
Relations :
Un fournisseur de produit ne pointe pas vers 1 seul Produit ou 1 seul Client ou 1 seule Commande ou
1 seul Produit commandé ou 1 seule Catégorie donc pas de clé étrangère vers 1 clé primaire d'une autre table.
Enregistrer la table : Fournisseur (Première lettre de chaque mot en majuscule, sans accent, sans espace,
au singulier) et fermer cette table.
Créer aussi un formulaire Fournisseur par l'assistant.
D. Créer la table Intermédiaire ProdFour Il suffit d'1 cas pour nous
obliger à gérer le problème.
Relations :
Un Produit fait référence à (peut être acheté chez) plusieurs Fournisseurs dans certains cas.
Un Fournisseur fait référence à (peut nous vendre) plusieurs Produits.
Produit Fournisseur
Le produit ACE001 Le fournisseur 2
est fourni fournit
par 1 et 2 ACE001 et ACE002
C'est cette clé primaire sur les 2 champs Ref Produit + Ref Fournisseur qui interdit un doublon sur
le couple ACE001 + 1
MCD Facturation
dessiné avec le logiciel gratuit Looping.
Remarque : le produit SON002 n'as pas de valeur pour Ref Catégorie !!!
1) Requête "R16 Produits sélectionnés"
Question : Liste de produits classée par Num Produit et composée de :
a) produits avec "imprimante" n'importe où dans la désignation et dont le prix est inférieur à 1000 €
et
b) produits de la catégorie Livre traitant
d' "access" : attention à ne pas
sélectionner un clavier avec une
désignation " Clavier accessible"
B. Requête multitable
1) Requête "R17 Produit et sa Catégorie"
Question : Liste des produits classée par Num Produit avec affichage de tous les champs de produit
(y compris Ref Catégorie) et affichage du nom de la catégorie du produit
Etape 1 : Liste des produits classée par Num Produit avec PLUSIEURS prix d'achat car plusieurs
fournisseurs par produit (pour certains).
Etape 2 : Liste des produits classée par Num Produit avec regroupement des mêmes produits et
calcul de la moyenne des prix d'achat des différents fournisseurs.
14 enregistrements seulement
car le doublon est regroupé en 1 enregistrement et le triplet est regroupé en 1 enregistrement.
et surtout pas par liste déroulante proposant les autres numéro d'élève.
On n'identifie pas un enregistrement par l'1 des autres enregistrements !
La valeur de la clé primaire, une fois attribué à un enregistrement et donc pointée par d'autres
enregistrements d'autres tables, n'est généralement JAMAIS modifiée.
(Imaginer, si on changeait votre numéro de Sécurité Sociale, les conséquence qui cela entrainerait !)
Ne pas afficher directement des Données brutes de présentation des Tables ou Requêtes
mais plutôt les afficher par l'intermédiaire de Formulaires qui les mettent en FORME.
Mise en forme :
Hors programmation en VBA, cette affectation est à gérer sous Access par une macro qui utilise l'action
'DéfinirValeur' (= affectation) avec 2 Arguments :
Elément : [ImgPhotoRep].[Image] Affectation '='
Expression : CheminApplication() & "\images\" & [NomPhotoRep]
Attention, pour trouver cette action DéfinirValeur dans la liste déroulante de la macro, il
faut Afficher toutes les actions de cette liste par le bouton ci-contre.
Cette affectation ne doit être faite que si le 'NomPhotoRep' n'est pas Vide,
on utilise donc la partie conditionnelle de la macro avec la condition (voir ce bouton
pour afficher la colonne Condition) : [NomPhotoRep] Est Pas Null Null signifie VIDE
Inversement, si le [NomPhotoRep] est Vide, on utilise aussi la partie conditionnelle de la macro avec :
[NomPhotoRep] Est Null et on affecte le nom d'une image spéciale "Blank.jpg" :
CheminApplication() & "\images\" & "Blank.jpg"
Cet aspect Où/Quand est parfois plus difficile à déterminer que le Quoi faire.
Nous souhaitons réafficher l'image chaque fois que le
Formulaire active (affiche) un nouvel enregistrement.
C'est à partir du Formulaire et
de l'évènement Sur activation que sera déclenchée la
macro sans nom car [Macro Incorporée].
Donc :
- le Formulaire, par son évènement Sur activation, déclenche
- une Macro [Incorporée] au formulaire qui, suivant que le champ 'NomImageRep' de la table
'Représentant' est Vide ou pas,
- affecte, à la propriété 'Image' du contrôle 'ImgPhotoRep' du Formulaire, la valeur du champ
'NomImageRep' contenant un nom de fichier ou l'image spéciale 'Blank.jpg,
- tout en gérant le chemin de dossiers menant aux fichiers des images
(C:\MesDocuments\Access\images\) grâce à
- la fonction VBA 'CheminApplication()' utilisant l'objet 'CurrentProject' et sa méthode
'Path', fonction stockée dans un module VBA (Module accessible par ALT+F11).
On peut lever les 2 contraintes ci-dessus par l'utilisation de la version3 ci-dessous mais c'est un peu plus
compliqué à générer…
Table Représentant
Saisir
dans
Formulaire Représentant
Type de contrôle : Nom : NomPhoto
Zone de texte Source : NomPhotoRep
Image : C:\MesDocuments\Access\images\DupondAlain.jpg
Macro (incorporée)
Logique : ImgPhotoRep.Image = CheminApplication() & "\images\" & [NomPhotoRep]
Technique :
"Affecter"
Condition d'affichage :
Si [NomPhotoRep] est pas VIDE alors
Affecter l'image du champ [NomPhotoRep] C:\MesDocuments\Access
Sinon
Affecter l'image particulière BLANK.jpg
Fin TD8
PUISSE.jpg
Le contrôle peut ne plus être affiché car ni sa
lecture, ni son écriture manuelle ne sont nécessaires.
L'ajout / Modification, via le bouton, ouvre la fenêtre suivante qui :
fait
référence à une ressource de Windows
(Définition de la Boite de dialogue
Ouvrir un fichier dans un fichier .dll) et
définit la fonction Function OuvrirUnFichier (…) qui sera appelée dans le module du formulaire Client
La logique de traitement, hors fenêtre ci-dessus, est ma même que celle de la version2 mais ici elle est
traitée en VBA avec gestion des erreurs…
Vous devez ouvrir l'éditeur VBA (ALT+F11), menu OUTILS > Références… et disposer (au moins)
des Références ci-dessous :
RedimentionnerPhoto
Exit Sub
…
Si vous souhaitez utiliser ce principe, vous pouvez simplement copier le code depuis
le fichier Fac14a2007.accdb de correction et le coller dans votre application sans
maitriser ce code en gardant dans votre application le contrôle Image nommé
ImgPhoto et en gardant le dossier Images.
Formulaire Produit :
Programmation avec
1 Macro de 2 lignes
(donc simple)
Pas Performant avec
saisie clavier du nom
du fichier
Performant avec :
Saisie -taille réduite de .accdb
au clavier Macro [Incorporée] - chemin pour dossier
'images' automatique
VBA
Saisie à
la souris
Comme on le voit ici en mode Affichage, il permet la multi sélections ce qui est
une nouveauté d'Access. Ce type de contrôle (Liste déroulante) a été défini dans
les propriétés ci-dessus du champ Liste de langues.
La source du contrôle est le champ Liste des langues de la table.
Remarque : un champ multi valeurs est HORS NORME des bases de données
Relationnelles. Ici, Access innove pour simplifier certains développements
simples mais est moins performant dans certains cas que la démanche classique ci-dessous.
Nous allons voir la solution classique pour comparer et avoir des critères de choix entre ces 2 démarches.
Pour gérer Les Clients parlent plusieurs langues et les Langues sont parlées par plusieurs Clients, on
veut créer la table intermédiaire entre Client et Langue et y gérer la propriété Niveau pour connaitre,
par Client et par Langue, le niveau pratiqué.
On souhaite que la saisie du niveau soit faite dans une liste de niveaux de référence.
Dans la requête pour Contenu, c'est [Nom] & " " & [Prénom] qui affiche DUMANS Benoit.
Pour appliquer le style à un formulaire existant, ouvrir un formulaire un mode création, ne pas
sélectionner un élément du formulaire puis Menu Organiser> Mise en forme automatique> Assistant
format automatique et choisir 'A mon modèle personnel'.
En plus :
Le formulaire X Formulaire modèle de forme
Tabulaire à été créé comme base pour Créer un
nouveau format (procédure ci-dessus A.) et le
nommer 'A mon modèle personnel Tabulaire'. Il gère
une présentation Tabulaire à appliquer à un
formulaire principal Tabulaire ou pour les sous-formulaires qui sont Tabulaires.
Si l'application est terminée et que l'on doive la confier à un utilisateur débutant, il faut paramétrer
certaines options comme ci-dessous par le Bouton Office (Fichier en V 2010) > Options> Base de
données active pour verrouiller l'application dans la seule UTILISATION sans possibilité de passer en
mode CREATION :
- pas de touches spéciales (comme F7 pour activer le volet de gauche)
- pas de mode Page
- pas de modification de structure des tables
- pas de volet de navigation à gauche
- pas de menu complet
- pas de menu contextuel
Ce verrouillage est donc facilement contournable pour qui connaît l'astuce de la touche MAJ .
On peut annuler l'effet de la touche MAJ pour réellement contrôler l'ouverture de l'application. Il faut
dans ce cas programmer un peu de VBA dans des Modules … (hors cadre de ce cours)
Consulter dans le formulaire Produit TEST EVENEMENTS en mode création les propriétés
d'évènement du Formulaire et de la Désignation pour comprendre le mécanisme.
Consulter depuis l'onglet Macros le groupe de macros AAGroupeMacro Evenement Produit dans lequel
sont stockées toutes les macros utilisant l'Action BoîteMsg.
2) Atteindre le contrôle Code Postal pour proposer à l’utilisateur de le saisir car c’est ce
contrôle qui génère le problème.
3) Annuler l’Evénement qui aurait permis la Modification du Formulaire (Mise A Jour) par
passage par exemple à l’enregistrement précédent ou suivant par les boutons du bas du
formulaire.
4) Arrêter Toutes les Macros qui auraient permis la Modification du Formulaire (Mise A Jour)
comme la macro de Recherche d'un client par Liste déroulante
Sinon
1) Prévenir l’utilisateur par BoîteMessage que le Client est validé.
(Message normalement inutile)
Faire un 'Bip' sonore de manière inconditionnelle (BIP normalement inutile mais ici pour aspect technique)
Bip Bip
Commentaire
2) Attacher cette macro dans le Formulaire 'Client' à l’élément Formulaire (afficher la fenêtre
'Propriétés' puis sélectionner le Formulaire) :
Les noms de certaines actions sont légèrement différents entre les versions 2007 et 2010:
Exemple : BoiteMsg est devenu ZoneMessage, Agrandir est devenu AgrandirFenêtre
1. Modification manuelle
Cette modification est faite de manière interactive par l'utilisateur : ouvrir le formulaire Client, se
positionner sur le client DURAND Alain :
- soit par les boutons standards en bas de formulaire
- soit par notre liste déroulante de recherche
Une fois tapé 92000, dans la marge de gauche, indique 'en cours de saisie' donc 92000 non encore
transféré vers la table source du formulaire. On peut abandonner cette saisie par la touche ESC.
On n'utilise généralement pas ce bouton car tout marche très bien en automatique.
Commentaires : cette requête nous a appris les bases d'une requête Mise à Jour sur une sélection mais
cette requête est peu intéressante car trop spécialisée : sélection figée sur des produits CANON,
MAJ exceptionnelle en multipliant le prix par 2 !
Nous souhaitons créer une requête de portée plus générale, dont les critères (sélection de produits, type
de mise à jour) seront choisis par l'utilisateur de l'application via un formulaire et non pas saisis de
manière figée par le développeur comme ci-dessus.
Remarque : de manière similaire à la requête action de type Mise à jour, il existe la requête de type
Ajout et Suppression d'enregistrement (voir dans le menu Créer en Création de requêtes).
En mode Création (sans assistant), pas de table ou requête pour alimenter en données.
En Mode Affichage
Remarque: un contrôle Zone de texte affiche Indépendant (en mode création) tant que sa propriété
Source contrôle n'est pas définie (par un champ de table ou de requête ou bien par une définition de
calcul).
Après la saisie : seul le contrôle à l’écran est rempli (pas de répercussion de cette saisie dans une
table : Normal on saisit des critères de mise à jour que l'on ne souhaite pas enregistrer)
LOG dans Choix Marque (pour les produits de marque LOGitech comme LOG001 ou LOG002) et
- 10% dans Choix Coef (pour réduire les prix de 10%) et penser à valider la saisie par ENTREE.
Créer une nouvelle requête en mode Création avec la TABLE Produit , transformer la requête Sélection
en requête Mise à jour par le bouton Mise à jour.
Champ Num produit Prix HT
Table Produit Produit
Mise à jour [Produit]![Prix HT]
*( 1+
[Formulaires]!
[Saisie variation des prix v1]!
[Choix Coef] )
Critères Comme ( [Formulaires]![Saisie variation des prix v1]!
[Choix Marque] & "*" )
Exécuter la requête par le bouton exécuter (et non par qui affiche seulement la Sélection).
La requête utilise les valeurs saisies dans le formulaire "Saisie variation des prix v1".
Remarque : pas d’écho à l’écran de l’opération mais effet sur disque consultable depuis la Table Produit.
Remarque : on peut améliorer la saisie par une liste déroulante présentant les 3 lettres des marques prises
dans Num Produit : la liste est basée sur une requête basée sur la table produit avec une colonne :
Permet d'extraire de
Num Produit
3 caractères à partir de
Voir correction du formulaire Saisie variation des prix V2 et la gauche
de la requête R Action Mise à jour Prix paramétrée V2. Permet de ne garder
On peut aussi améliorer en posant un bouton qui lancera depuis le qu'un seul nom de
marque
formulaire la requête de mise à jour.
Table CommandeLigneProduit:
- Modification du champ Quantité (Quantité commandée dans la facture) Valeur par défaut : 0
.Valide si : >=0 , Message si erreur : SVP >=0 ,Null interdit : OUI (pour saisie obligatoire)
Il faut donc garder la valeur du contrôle quantité avant la nouvelle saisie lorsque l'on modifie la
quantité existante 4 par la nouvelle valeur 5 : Qté stock = 100 – 5 (saisie) + 4 (avant saisie)
Nous allons utiliser les Variables (mémoire) et l'action DéfinirVarTemp qui permet d'affecter ( = )
une valeur à une variable : QteEnEntrant = 4 (lire QteEnEntrant reçoit 4 par exemple)
Action : Bip (pour se rendre compte que la macro s'exécute si le haut parleur est actif)
Action : BoiteMessage (ZoneMessage en V 2010) En Test
Message : ="Valeur en entrant : " & [VarTemp]![QteEnEntrant] seulement
Titre : Mouchard
Ici, adresse IMPLICITE pour le Contrôle Pour faire référence à la Variable mémoire, il
(le contrôle est dans le Formulaire courant) faut la préfixer par [VarTemp]!
Action : Bip (En test pour se rendre compte que la macro s'exécute si le haut parleur est actif)
En plus, s'il vous reste du temps, pour tester l'affectation à une propriété de contrôle :
Exécuter la requête :
Résultat final :