Cours gratuits » Cours informatique » Cours bases de données » Cours ACCESS » Support de cours Base de Donnée Access avec Exemple\n1. Les systèmes de Gestion de Bases de Données\n?? Données structurées : les informations contenues dans une base de données sont réparties en enregistrements , chaque enregistrement ayant une structure bien définie\n?? Données non redondantes : Une même information ne sera pas répétée plusieurs fois dans la base de données.\n?? Données cohérentes : Il ne doit pas être permis d’enregistrer dans une base des informations incohérentes entre elles\n?? Données accessibles directement selon de multiples critères\n?? Indépendance des programmes et des données : La base de données doit être indépendante des programmes qui y ont accès, on doit pouvoir utiliser un autre programme pour traiter différemment ces données sans avoir à toucher à ces données\n?? Sécurité des données stockées : la base de données doit permettre un système de sécurité permettant de gérer les droits d’accès aux informations par les utilisateurs.\n1.2 Le Système de Gestion de Bases de Données\nUn Système de Gestion de Bases de Données (S.G.B.D.) représente un ensemble coordonné de logiciels qui permet de décrire, manipuler, traiter les ensembles de données formant la base. Il doit également assurer la sécurité et la confidentialité des données dans un environnement où de nombreux utilisateurs ayant des besoins variés peuvent interagir simultanément sur ces données.\nIl doit pouvoir être utilisé par des non-informaticiens. Il doit assurer la définition des structures de stockage et des structures de données et le suivi de leur évolutions ; c’est ce qu’on appelle l’administration des données. Il doit pouvoir au maximum vérifier la cohérence des données. Le SGBD sert donc d’interface entre les programmes d’application des utilisateurs d’une part, et la base de données d’autre part.\nMicrosoft Access est un SGBD dont nous allons étudier le fonctionnement.\n2. L’organisation des données dans la base de données\n2.1Présentation de l’exemple\nAvant de pouvoir exploiter les données contenues dans la base, il va falloir les modéliser, par modéliser, je veux dire trouver le meilleur moyen de représenter le monde réel en structurant la base de données de manière à pouvoir l ‘exploiter la plus simplement par la suite.\n2.2L’organisation des données dans un SGBD\nDans Access, comme dans les autres SGBD, les informations doivent être segmentées en données qui sont stockées dans des tables. Une tableest donc un ensemble de données, organisées en lignes et en colonnes. On peut stocker dans une table n’importe quel type d’information (texte, chiffres, graphisme, son, etc )\nChaque table est divisée en enregistrements, les enregistrements étant l’ensemble des données relatives à la même information. Prenons l’exemple d’un carnet d’adresses. Pour ce carnet d’adresses, nous allons utiliser une table « contacts » qui contiendra toutes les informations concernant chaque contact, chaque enregistrement contiendra les informations relatives à un (et un seul) contact (nom, adresse, téléphone, date de naissance, etc.…).\nComme on vient de le voir, chaque enregistrement contient un ensemble d’informations (nom, adresse, téléphone) qui ont elles-même diviser l’enregistrement en plusieurs parties, chaque partie s’appelle un champ. Le champ contient une partie des informations de chaque enregistrement.\nSi on reprend notre exemple de carnet d’adresse, nous allons avoir une table qui peut ressembler à ça :\nDeuf John Rue Barbe – 75001 Paris 01.02.03.04.05 Enregistrement\nCovert Harry Rue Minant – 59000 Lille 02.03.04.05.06\nDalors Homère Rue Tilant – 75003 Paris 03.04.05.06.07\n??La base de données : C’est l’ensemble des tables utilisées pour gérer l’information\n??La table : c’est un ensemble de données organisées en rangées et en colonnes\n??Le champ (ou colonne) : C’est l’unité d’information dans une table. Une table est constituée de différents champs\n??L’enregistrement (ou la ligne) : C’est l’ensemble des données relatif à la même information (le 1er enregistrement de la table contient les informations relatives au contact « John Deuf »)\n2.3 Diviser pour mieux régner\nIl faut toujours segmenter l’information en éléments les plus petits possibles. On aurait très bien pu créer une table contact avec un seul champ par enregistrement qui contiendrait toutes les informations en même temps. Mais une des règles d’or dans la création de la structure d’une base de données est de diviser le plus possible l’information pour pouvoir la traiter par la suite le plus simplement et le plus efficacement possible.\nLe SGBD, pour retrouver les données qu’on lui demande, travaille avec le contenu des champs, il lui sera donc difficile, dans la table « Contacts » telle qu’elle est de retrouver les contacts habitant à Lille, la ville se trouvant mélangée au reste de l’adresse, de même, on ne pourra pas récupérer le nom seul de chaque contact, celui-ci se trouvant dans le même champ que le prénom.\nComme on ne peut pas toujours prévoir, lors de la création de la structure de la table, de l’usage qui en sera fait plus tard, il faut diviser le plus possible les données, sachant qu’il sera toujours compliqué (et risqué) de modifier la structure de la table par la suite lorsqu’elle sera remplie.\nUne meilleure organisation de la table serait la suivante :\nL’organisation de la table est optimale, elle est décomposée en éléments aussi petits que possible, la ville est clairement séparée de l’adresse et le nom du prénom.\n2.4 Utiliser plusieurs tables\nPrenons l’exemple de la gestion d’une collection de disque. On pourrait être tenté de créer une seule table contenant les informations suivantes :\nEt nous n’aurions pas spécialement tort, toutes les informations relatives à un album s’y trouvent. Pourquoi faire plus compliqué ?\nNéanmoins, nous allons voir qu’il est plus judicieux de créer ici deux tables :\nOn va regrouper ensemble dans une même table toutes les informations relatives au même « sujet ». On voit bien ici qu’on peut regrouper ensemble les données concernant uniquement l’identité de l’auteur et, dans une autre table, les informations relatives uniquement à l’album (par exemple, l’année de sortie d’un album n’a pas de rapport direct avec l’identité de l’auteur, on la trouvera dans une autre table).\nUn bon moyen pour trouver les tables utilisées est de partir de la situation existante :\nUn auteur fait des albums, a un auteur peut correspondre plusieurs albums\nOn en déduit directement une table « auteurs » et une table « albums ».\nCe qui, au passage, nous permet d’enrichir les informations sur les auteurs, on peut en profiter pour par exemple ajouter la date de naissance ou son adresse, ce qui aurait été pénible dans la 1ère version, en effet, il aurait fallu, pour chaque album d’un auteur, ressaisir à chaque coup sa date de naissance et son adresse (sans compter les erreurs de frappe d’un album à l’autre), là les informations ne sont saisies qu’une fois, ce qui est d’abord moins fatiguant (et ça, c’est le plus important) et ensuite, évite les fautes de frappes.\nBon, c’est bien, maintenant on a deux tables, mais du coup, on ne sait plus qui a fait quoi, les informations sont éparpillées. Il va donc falloir trouver un moyen pour savoir exactement à quel auteur correspond chaque album. Pour cela on va ajouter dans la table auteur un champ qui va identifier de façon unique chaque enregistrement, ce champ d’identification unique est appelé clef primaire.\nA quoi sert cette clef ? A pouvoir retrouver de façon non équivoque n’importe quel enregistrement dans la table « Auteurs », on ne peut en effet utiliser le nom ou le prénom comme clef primaire car deux auteurs peuvent avoir le même nom (rare mais pas impossible).\nLe numéro de sécurité sociale est un bon exemple de champ clef primaire car il identifie de manière unique un individu. Même si deux individus ont le même nom et le même prénom, ils ne peuvent avoir le même numéro de sécurité sociale.\nLa table « Auteurs » ressemble alors à ceci (la clef primaire est en gras)\nEt pour pouvoir associer un album à un auteur, il va falloir ajouter un champ dans la table « Albums », ce champ contient le n° de l’auteur de l’album\nOn voit ici que cette organisation répond à une des exigences des bases de données, à savoir la non redondance des informations, dans la première organisation, le nom et le prénom de l’auteur étaient répétés autant de fois qu’ils avait fait d’albums, ici il ne sera présent qu’une seule fois. Lorsqu’on voudra afficher les caractéristiques d’un album, Access, grâce au numéro de l’auteur présent dans l’enregistrement de la table « Albums » ira chercher automatiquement les informations le concernant dans la table « Auteurs ». Cette organisation a un énorme avantage, le jour ou on veut modifier le nom ou le prénom d’un auteur, cette modification sera répercutée automatiquement sur les albums qu’il aura fait.\nClef primaire réalisée à partir de plusieurs champs\nLorsqu’on est sûr que le contenu d’une combinaison de champs ne se répétera pas dans une table, on peut utiliser cette combinaison de champs comme clef primaire. On aurait pu, à la place d’un n° d’auteur, utiliser la combinaison « nom + prénom + date de naissance », parce qu’il est rare que deux auteurs différents aient le même nom et le même prénom et la même date de naissance. Mais ce type de combinaison complexe est difficile à maintenir (il est plus simple de taper un numéro qu’une combinaison complexe de noms et de date, sans parler des erreurs de frappes) et en plus prendrait plus de place dans la base de données (on ne voit pas trop l’intérêt de découper les informations en deux tables si c’est pour retrouver dans le n° de l’auteur utilisé dans la table « Albums » quasiment toutes les informations contenues dans la table\n« Auteurs » !). Et pour terminer, ce genre de clef primaire complexe fonctionne mal dans Access.\nGrâce a cette clef, on va pouvoir mettre les deux tables en relation.\nÉtablir une relation entre les tables de la base de données va permettre de réunir (pour les exploiter ensemble, les analyser, ) les informations réparties dans différentes tables. La liaison se fait entre les tables à partir de la clef primaire, ici, on obtiendra la liste des albums d’un auteur grâce à la liaison entre la table Auteur et la table Album sur la clef primaire n° auteur.\n2.5 Il existe trois types de relations entre les tables :\nEnregistrement 1 Enregistrement 1\nEnregistrement 2 Enregistrement 2\nExemple : a un auteur correspond un ou plusieurs albums (plusieurs flèches partent du même auteur), a chaque album ne correspond qu’un seul auteur.\nLa relation entre les deux tables se présente sous cette forme :\nExemple : On aurait pu avoir le cas où un album a plusieurs auteurs, là, ça ne marche plus, car telle que la table « Albums » est structurée, à un album ne peut correspondre qu’un auteur. Si on veut permettre qu’à un album correspondent plusieurs auteurs (on a alors une relation n – m), deux solutions s’offrent à nous :\n1. La plus simple et la plus inélégante (les trucs les plus simples sont souvent inélégants) : ajouter quelques champs « auteurs » supplémentaires dans la table album pour arriver à quelque chose de ce genre, histoire de conserver une relation 1 – n :\nN° Auteur 2\nN° Auteur 3\nCe genre de plaisanterie est à éviter à tout prix, en effet, si il n’y a qu’un seul auteur, les champs n° auteur 2 et n° auteur 3 ne vont rien contenir, et on va perdre de la place dans la base de données, et que va-t-il se passer si il y a quatre auteurs ? ? vous répondrez qu’on peut prévoir quatre champs, ce à quoi je vous répondrez qu’il peut y avoir 5 auteurs, etc…\n2. Il va donc falloir (on y coupe pas) créer une troisième table qui va servir d’intermédiaire entre la table « auteurs » et la table « albums « :\nJ’en entends déjà hurler !\nNous sommes bien d’accord qu’avec un seul numéro d’auteur dans la table « albums » nous ne pouvions pas avoir plusieurs auteurs pour le même album. La solution 1 étant à proscrire (sauf dans le cas où on était sûr qu’il y aurait toujours 3 et seulement 3 auteurs), la troisième table est la seule solution.\nComment ? et bien, à chaque album correspond n enregistrements dans la nouvelle table « Auteursalbums », chaque enregistrement renvoyant sur un seul enregistrement de la table « auteurs ». Votre esprit curieux aura noté qu’on a, pour les besoins de la création de cette nouvelle table, crée une clef primaire dans la table « albums ».\nPourquoi ? Pour faire correspondre un enregistrement de la table « Auteurs-albums » avec la table\n« Albums », il faut le faire sur la clef primaire, et comme on n’avait pas de clef primaire dans « Albums », il a bien fallu en créer une. Aucun des champs présents ne pouvait être utilisé comme clef primaire (la clef primaire, je le répète, doit identifier de façon UNIQUE un enregistrement) : deux albums peuvent avoir le même titre (rare mais pas impossible), peuvent être sortis la même année, être du même genre, etc…, on aurait pu utiliser une clef primaire complexe avec un couple (titre + année), plutôt rare que ce couple se retrouve deux fois, mais pour les raisons vues plus haut, on évitera d’utiliser ce type de clef.\nPar exemple, on va avoir dans ces tables :\nTop NAZ Compil\nAvec cette méthode, on peut affecter sans aucun problème n auteurs à m albums. (ici Sheryl Crow a deux albums, KS’ Choice un seul, et l’album Top NAZ Compil a deux auteurs que je ne citerai pas)\nEnfin, il existe un troisième type de relation, jamais utilisé : la relation de type « un – un » : un enregistrement d’une table est en relation avec un seul enregistrement d’une autre table et inversement. Ce type de relation ne doit pas se produire car les données de la table reliée n’ont aucune raison de se trouver là, comme elles ne correspondent qu’à un seule enregistrement de la 1ère table, elles devraient être déplacées dans cette table.\nEncore un peu de théorie avant de s’amuser avec Accès.\nOn peut encore améliorer le schéma de nos tables. En effet, pour la même raison qui nous avait fait séparer en deux tables « Albums » et « Auteurs » notre table de départ pour éviter à avoir a ressaisir les informations concernant un même auteur pour chacun de ses albums, il est ici possible d’effectuer à nouveau une division de la table « Albums ».\nEn effet, pour chaque album, on va indiquer le genre (rock, pop, reggae, rap etc…) et le support (CD, vinyl, K7, DAT, minidisc, etc…), ces informations vont être redondantes et pourraient être optimisées de la façon suivante :\n1) On crée une table « genre » et une table « support »\n2) On modifie la table « albums »\nMaintenant, au lieu d’indiquer explicitement pour chaque album son support et son genre, on indiquera un n° de genre et un n° de support. L’intérêt est triple : gain de place en mémoire (stocker un numéro prend moins de place que stocker une chaîne de caractères), gain de vitesse (entrer un numéro est plus rapide que taper le mot complet), optimisation de la structure (on pourra changer le nom d’un support, ce changement affectera instantanément l’ensemble des albums).\n2.7 Les index\nComment ? Les index fonctionnent avec une table comme la table des matières avec un livre. Lorsqu’on indexe un champ, Access stocke hors de la table les valeurs de ce champ. Lorsqu’on effectue une recherche sur ce champ, plutôt que de le chercher dans la table, Access va faire sa recherche dans l’index, une fois qu’il aura trouvé, il affichera le contenu de l’enregistrement associé à cet index.\nPetit crobard :\nSupposons que la table « Albums » soit indexée sur le titre de l’album\nIndex Table Albums\nLorsqu’on cherchera un enregistrement de la table albums à partir du titre de l’album, Access parcourra l’index et affichera l’enregistrement correspondant à l’index qu’il aura trouvé.\nUn index peut être composé d’un ou de plusieurs champs, on aurait pu indexer la table albums sur un index\n« titre + année » par exemple (si ça peut servir à quelque chose), de même, on peut utiliser plusieurs index pour une table, par exemple, on aurait pu indexer la table album sur les champs Titre, Genre et Support.\nPourquoi alors ne pas tout indexer ? L’idée peut sembler bonne, cela accélérerait les recherches et les tris mais ralentirait toutes les mises à jour de la table, en effet, à chaque fois qu’un champ index est modifié dans la table, il faut le modifier également dans l’index, ce qui peut coûter très cher en temps. On utilisera donc les index avec parcimonie et uniquement si ils s’avèrent utiles.\nMaintenant que vous avez tout compris au film, nous allons nous pencher sur un autre cas de figure. Supposons qu’on veuille gérer un magasin avec Access. Créez donc les tables et les relations pour notre magasin, au cas où certains ignoreraient le fonctionnement d’un magasin, voici comment ça marche :\n?? Un client commande des produits\n?? Un fournisseur livre des produits\n?? Le stock contient des produits\nEt voilà une solution qui semble honnête :\n(Les clefs primaires sont en gras, les indexes sont soulignés)\nLe choix des index est totalement subjectif, il sera surtout fait en fonction des besoins ultérieurs. Ce n’est pas grave si on n’a pas choisi les bons index, il est toujours possible de les modifier ultérieurement.\nUne table « clients »\nUne table « produits »\nUne table « Commandes » qui va indiquer ce qu’a commandé le client\nOn est d’accord, une commande peut avoir plusieurs lignes (plus d’un produit commandé par commande, ca vaut mieux), pour cela, on va avoir une table « lignes de commande » qui va « relier » la commande aux produits.\nPourquoi n’avoir pas mis ça directement dans la table commande ? on retombe sur notre problème de tout à l’heure : parce qu’on ne sait pas par avance le nombre de lignes qu’on peut avoir dans une commande.\nO peut voir qu’un produit peut se retrouver dans n commandes, et que une commande peut faire référence à m articles, on a donc entre les tables « commandes » et « articles », une relation n – m (plusieurs à plusieurs) qu’Accès ne peut gérer (ni d’ailleurs aucun autre SGBD), il faut donc transformer cette relation en deux autres relations 1-n et n-1 en utilisant une table supplémentaire, d’où l’apparition de cette table.\nPour les fournisseurs, on a quelque chose de très ressemblant\nUne table « fournisseurs »\nMême problème que précédemment, un fournisseur peut livrer plusieurs produits et le même produit peut être livré par plusieurs fournisseur, donc relation n-m, donc création d’une table intermédiaire\nEt voilà le travail d’artiste, les relations entre tout ce beau monde donnent ceci\nOn aurait pu dire qu’un produit pouvait être livré par un seul fournisseur, dans ce cas, la table intermédiaire « Fournisseurs-Produits » aurait été inutile, pour savoir quel était le fournisseur d’un produit, il suffisait d’ajouter un champ « n° fournisseur » dans la table produit. Il aurait contenu, pour chaque produit, le n° de fournisseur le livrant.\nOn veut modéliser le problème d’une partie de la gestion de la scolarité d’un établissement. On connaît les règles suivantes :\n?? Les enseignements sont dispensés sous forme de cours\n?? Un étudiant peut s’inscrire à plusieurs cours\n?? Un enseignant est rattaché à un ou plusieurs établissements et peut enseigner plusieurs cours\n?? Un cours peut être enseigné par plusieurs enseignants\n?? Certains enseignants peuvent être responsables des autres\nA vous de jouer Donnez les différentes tables qui vont être utilisées et les relations entre elles (on s’intéresse pas spécialement au contenu exact des tables)\nLes tables qui vont être utilisées sont :\nEnseignants - cours\n(fait avec Access !)\nCREATION D’UNE BASE DE DONNEES AVEC ACCESS\nNous allons créer la base de données « Magasin » qui va contenir les tables dont nous avons vu la structure plus haut.\nCliquer sur "Nouvelle base de données" et entrer « » comme nom de la base.\nLa fenêtre Base de Données s’affiche, elle contient tous les « objets » qui peuvent composer une base Access :\nChaque table de la base va contenir les données se rapportant à un sujet particulier, la table « clients » va contenir les informations sur les clients. C’est l’objet fondamental de la base de données, toute requête, formulaire ou état va être basé sur une ou plusieurs tables.\nLes requêtes vont être utilisées pour obtenir des données contenues dans une ou plusieurs tables à partir d’une question. Par exemple, une requête va pouvoir nous afficher la liste des clients habitant à Paris.\nLe formulaire est utilisé pour faciliter la saisie et la modification des données d’une table, par exemple, le formulaire "client" va permettre d’entrer de façon conviviale les informations concernant un client. On peut les saisir sans formulaire, ce que nous verrons, mais cette méthode est moins conviviale.\nLes états permettent d’imprimer des données contenues dans des tables selon une présentation définie en y intégrant éventuellement des calculs.\nLes macro commandes permettent d’automatiser une suite d’opérations répétitives.\nLes modules sont des programmes écrits en Visual Basic for Application (VBA) pour réaliser des opérations qui seraient trop complexes en utilisant les seules fonctionnalités d’Access.\n3.1 Création d’une table\nAccess propose 5 méthodes pour créer une table :\n?? Mode feuilles de données : ce mode permet de saisir directement des informations dans la table sans se préoccuper du nom ou du format des champs, la définition du nom et du format sera faite plus tard.\n?? Mode création : On utilisera cette méthode le plus souvent, elle permet de créer les noms et la structure de chaque champ de la table.\n?? Assistant Table : Access propose différent modèles de tables prédéfinis (carnet d’adresses, factures, etc ) et crée la table, vous devrez la personnaliser ensuite pour qu’elle réponde à vos besoins.\n?? Importer la table : Si les données de votre table sont déjà contenues dans une autre table, dans un fichier ou dans une autre base de données, vous pouvez utiliser cette méthode pour importer vos données dans une nouvelle table.\n?? Attacher une table : Cette option sert à attacher une table avec une autre table contenue dans une autre base de données, nous ne l’utiliserons pas.\nNous utiliserons ici le mode création :\nLa création de la table s’effectue en remplissant les trois colonnes « Nom du champ », « Type de données » et « Description »\nChaque ligne de ce tableau contient les informations de chaque champ :\n?? Le nom de chaque champ de la table (de 1 à 64 caractères)\n?? Le type de données (voir plus bas) à choisir parmi 9 types proposés par Access\n?? La description du champ (255 caractères maximum)\nChaque champ peut contenir des données de différents types : le nom du client va contenir des caractères alphabétiques, le code postal va contenir des chiffres, la date de livraison une date, un champ prix va contenir des valeurs monétaires.\nIl faut choisir, pour chaque champ de la table, le type de données le plus approprié, en effet, rien n’interdit de choisir comme type de données pour un champ contenant une date ou un code postal un type « texte » ou pour champ contenant un prix un type « numérique », mais autant utiliser les types les plus appropriés !\nPour un champ destiné à contenir des caractères alphanumériques (lettres et/ou chiffres), attention, le champ de type texte ne peut contenir plus de 255 caractères, on l’utilise pour un nom, une adresse, etc…\nMême utilisation que le type texte, mais le champ de type mémo peut contenir jusque\n65535 caractères (64 Ko). Utilisé pour une description longue par exemple.\nLe champ ne pourra contenir que des nombres avec ou sans décimales. (un code postal, un n° d’identification par exemple)\nLe champ ne pourra contenir que des dates ou des heures (Access vérifie la validité des dates ou des heures saisies)\nValeurs présentées sous format monétaire (exemple : 1 23,45F)\nValeur numérique incrémentée automatiquement lors de la saisie de chaque enregistrement. Si vous choisissez ce type de champ, vous ne pourrez rien saisir dedans, c’est Access qui y placera un nombre automatiquement à chaque fois que vous créerez un nouvel enregistrement. On l’utilisera lorsqu’on veut être sur que le contenu de ce champ ne se retrouvera pas dans un autre enregistrement de la table, par exemple pour le numéro de client : chaque nouveau client aura un numéro unique automatiquement affecté par Access, c'est un champ de ce type qui sera le plus souvent utilisé pour être une clef primaire.\nSeules deux données sont autorisées dans ce champ : Oui et Non (on utilisera ce type de données par exemple avec un champ « réglé » qui indiquera si une facture a été réglée ou non)\n??Objet OLE :\nOLE (Object Linked and Embbeded) est une technologie utilisée par Windows, elle permet d’insérer dans une application des objets provenant d’autres applications, on utilisera un champ de ce type pour insérer dans la table une image, un son, un fichier Word, etc\nUn champ de ce type contiendra une adresse Internet sur laquelle on pourra cliquer\nLa liste de choix n’est pas vraiment un type de données, nous l’étudierons plus tard.\nUne fois la table « Clients » correctement renseignée, on devrait avoir quelque chose qui ressemble à ça :\n3.3 Les propriétés des champs\nComme vous pouvez le constater, chaque champ a des propriétés qui dépendent de son type de données, ces propriétés vont déterminer la façon dont les données qu’il contient vont être affichées ou comment les données vont être saisies dans ce champ. Ces propriétés sont affichées dans l’onglet « Général » en bas de la fenêtre. L’onglet « Général » affiche chaque propriété du champ et, à côté, dans des champs modifiables, la valeur de cette propriété.\nCes propriétés varient selon le type de données (par exemple, un champ numérique aura une propriété « décimales » qui indiquent le nombre de chiffres après la virgule que ne peut avoir évidemment un champ de type texte)\nPropriétés des champs de type Texte et Mémo\nNombre de caractères maximum qui peuvent être saisis\nTexte qui sera contenu par défaut dans ce champ\nExpression pour valider la saisie, exemple : <> « machin », interdira la saisie du mot « machin » dans ce champ\nMessage d’erreur qui va être affiché si l’expression saisie n’est pas valide, dans notre exemple, on pourrait mettre ici «saisie de machin interdite »\nSi oui, il faudra obligatoirement saisir une valeur dans ce champ\nLa chaîne vide est "", on peut l'utiliser lorsqu'on n'a rien à entrer dans un champ obligatoire, si cette propriété est non, il faudra obligatoirement saisir du texte dans ce champ\nLe champ est un index avec ou sans doublons, si l'index n'a pas de doublons, il ne sera pas possible de saisir deux fois le même contenu pour ce champ dans la table\nVa définir comment le contenu du champ va être affiché (voir plus loin)\nOblige à saisir le contenu du champ selon un format précis (par exemple un numéro de téléphone), on verra ça plus loin\nTous les autres types de données ont des propriétés similaires, certains ont des propriétés supplémentaires :\nPropriétés des champs de type numérique\nDéfinit la valeur maximale qui va pouvoir être contenue dans ce champ. Il faudra faire attention et bien penser à l'avance quelle sera la valeur maximale permise dans ce champ pour pouvoir ajuster au mieux cette propriété :\nOctet : de 0 à 255\nde –32767 à +32768\nde –2147483648 à +2147483649\nRéel Simple :\nde –3.48E38 à +3.40E38\nRéel Double : de –1.79E308 à + 4.96E324\nPlus on descend, plus le champ occupera de la place en mémoire et sur le disque dur (le Réel Double prend 8 fois plus de place que l'octet), pensez-y si la table contient des milliers de lignes\nNombres de chiffres après la virgule\nPropriétés des champs de type NuméroAuto\nIndique quelle sera la prochaine valeur contenue dans un champ de type NuméroAuto : avec Incrément, la valeur sera égale à la valeur créée dans le précédent enregistrement+1, avec Aléatoire, Accès remplira ce champ avec une valeur tirée au hasard (mais qui ne se retrouvera pas dans un autre enregistrement).\n3.4 Le format d'affichage\nNous avons vu plus haut qu'on peut modifier la façon dont les données contenues dans les champs peuvent être affichées ou forcer leur saisie selon un format précis.\nLa façon dont les données sont affichées se fait par l'intermédiaire de la propriété "Format d'affichage".\nAttention, la façon dont les données sont affichées dans un champ ne modifie en rien le contenu de ce champ dans la table. Par exemple, si vous forcez à afficher un '1' avant le contenu d'un champ, si ce champ contient '234', la valeur affichée sera '1234' mais le contenu du champ dans la table sera toujours '234'. La propriété 'format d'affichage' n'influe que sur la façon dont les données d'un champ vont être affichées.\nPour modifier le format d'affichage, on utilise les codes suivants (quand ils marchent ) :\nCodes du format d'affichage\nAffiche le texte "texte" dans le champ\nJustifie à droite le contenu du champ\nRemplace les espaces par le caractère c\nAffiche le contenu du champ dans la couleur "couleur"\nIl y a des formats d'affichages plus spécifiques à certains types de données :\nPour les champs texte et mémo\nFormats d'affichage spécifiques aux champs Texte et Mémo\nVa afficher un espace si on a rien saisi\nVa afficher le texte en minuscules\nVa afficher le texte en majuscules\nPour les champs Numériques et Monétaires\nFormats d'affichage spécifiques aux champs Numériques et Monétaires\nAffiche le nombre tel qu'il a été saisi\nNombre avec séparateur de milliers + 2 chiffres après la virgule + symbole monétaire\nAffiche au moins un chiffre + 2 chiffres après la virgule\nNombre avec séparateur de milliers + 2 chiffres après la virgule\nMultiplie le nombre par 100 et ajoute le symbole %\nNombre au format décimal avec exposant\nOn peut définir son propre format d'affichage pour les champs numériques ou monétaires si le format que l'on désire ne fait pas partie des formats proposés ci-dessus.\nPour cela, on utilise un format d'affichage spécial, ce format est défini par une chaîne de caractères qui a le format suivant (vous tapez cette chaîne de caractères dans le champ 'format' de la propriété du champ) :\n> 0 < 0 = 0 NULL\nLa première partie (avant le premier symbole ";") va définir comment va être l'affichage si le contenu du champ est supérieur à 0, la deuxième partie, si le contenu du champ est inférieur à 0, la troisième partie si le contenu du champ = 0 et la dernière partie si le contenu du champ est vide.\nChaque partie est une combinaison des symboles suivants :\nUn chiffre ou zéro\nUn chiffre ou rien\nPourcentage (* 100) + symbole %\nAffichage scientifique, exposant positif non signé\nAffichage scientifique, exposant positif signé\nQue va-t-il se passer avec ce format d'affichage ?\n?? Si le nombre est supérieur à 0, il sera affiché en vert avec au moins un chiffre avant la virgule et deux après la virgule.\n?? Si il est inférieur à zéro, il sera affiché en rouge, entre parenthèses avec au moins un chiffre avant la virgule et deux après la virgule.\n?? Si il est égal à zéro, il sera affiché "Zéro".\n?? Si le champ est vide, il sera affiché "Vide".\nNotez que les symboles # et 0 symbolisent chaque chiffre du nombre qui doit être affiché.\nPour les champs de type Date / Heure\nFormats d'affichage spécifiques aux champs Date / Heure\nPar défaut, affiche la date sous le format JJ/MM/AA HH:MM:SS (si il n'y a pas d'heure, affiche seulement la date)\nAffiche la date complète comme prévue dans le panneau de configuration de Windows\nPar exemple : lundi 1 janvier 1999\nAffiche : 1-jan-99\nAffiche la date abrégée comme prévue dans le panneau de configuration de\nPar exemple : 1/1/99\nAffiche l'heure comme prévue dans le panneau de configuration de Windows Par exemple : 17:34:22\nExemple : 5:34 PM\nExemple : 17:34\nComme pour les champs de type numériques ou date, on peut définir son propre format d'affichage en utilisant une combinaison des symboles suivants :\nIdentique au format "Date, Général"\nJour du mois (1 à 31)\nJour du mois sur deux chiffres (01 à 31)\nTrois premières lettres du jour (dim à sam)\nNom entier du jour de la semaine (dimanche à samedi)\nIdentique au format "Date, Abrégé"\nIdentique au format "Date, Complet"\nSemaine de l'année (1 à 53)\nMois de l'année (1 à 12)\nMois de l'année sur 2 chiffres (01 à 12)\nTrois premières lettres du mois (jan à déc)\nNom entier du mois (janvier à décembre)\nJour de l'année (1 à 366)\nDeniers chiffres de l'année (00 à 99)\nAnnée complète (0100 à 9999)\nHeure sur 2 chiffres (00 à 23)\nMinutes (0 à 59)\nMinutes sur 2 chiffres (00 à 59)\nSecondes (1 à 59)\nSecondes sur 2 chiffres (00 à 59)\nIdentique au format "Heure, Complet"\nHeure sur 12 heures + AM ou PM\nHeure sur 12 heures + A ou P\nHeure sur 12 heures + indicateur matin/après-midi défini dans le panneau de configuration\nFormat d’affichage des dates / heures dans Windows\nPour définir le format d'affichage par défaut dans Windows, allez dans le panneau de configuration et double cliquez sur l'icône "paramètres régionaux" (une planète habituellement) :\nIl y a deux onglets : Date et Heure qui définissent comment vont s'afficher la date et l'heure dans tous les logiciels Windows.\nPour les champs de type OUI/NON\nAccess propose pour ce type de champ, trois types d'affichage par défaut : à la place de OUI ou NON, on peut afficher "Vrai" ou "Faux" ou alors "Actif" ou "Inactif", si on veut afficher un autre message, il faut dans le champ format de la propriété du champ taper la commande suivante :\n"texte 1" sera affiché à la place de Oui et "texte 2" à la place de Non.\nOn peut, bien sur, utiliser des codes d'affichages supplémentaires, par exemple :\naffichera OK en vert à la place de Oui et NON en rouge à la place de Non.\nN'oubliez pas que la ligne commence par le symbole ";"\n3.5 Le Masque de saisie\nLe masque de saisie permet de faciliter la saisie dans un champ en forçant l'utilisateur à entrer les données selon un format déterminé, les informations stockées dans la table auront le format défini dans le masque de saisie contrairement au format d'affichage qui affectait seulement la façon dont les données contenues dans un champ allaient être affichées.\nLe masque de saisie, comme le format d'affichage est constitué d'une combinaison de caractères :\nChiffre de 0 à 9 obligatoire\nChiffre ou espace facultatif\nChiffre ou espace ou + ou -\nLettre de A à Z obligatoire\nLettre de A à Z non obligatoire\nLettre ou chiffre obligatoire\nLettre ou chiffre facultatif\nCaractère quelconque obligatoire\nCaractère quelconque facultatif\nPasse en minuscules\nPasse en majuscules\nSaisie à partir de la droite\nPar exemple, si on veut saisir 5 chiffres obligatoirement pour un code postal, on utilisera : 00000, si on veut saisir une suite de 3 chiffres et de 3 lettres : 000LLL, si on veut saisir un numéro de téléphone :\n00-00-00-00-00, ou un nom de famille dont la première lettre est toujours en majuscules : >L<????????????? (prévoir autant de ? que le nom peut comporter de lettres)\nAprès avoir choisi le type "Liste de Choix" pour le champ "Titre", la fenêtre suivante s'affiche\nIl y a une ligne par enregistrement, et une colonne par champ, on se positionne sur le champ désiré en cliquant dessus et on saisi directement les données.\nEt que se passe-t-il lorsqu'on clique sur "Titre" ? La liste de choix apparaît, on peut choisir ici un des titres proposés en cliquant dessus directement.\nOn peut voir que "Monsieur" a été entré directement dans le champ "Titre".\nUne fois ces clients saisis, nous allons aller modifier le type de données du champ "N° Client" de la table commande pour y mettre une liste de choix.\nOn change le type de données du champ "N° Client" dans la table "Commande" et on choisit "Liste de Choix". Cette fois-ci, nous n'allons pas saisir tous les éléments de la liste, ça n’aurait pas de sens, il faudrait remodifier cette liste à chaque fois qu’on ajoute un nouveau client. Nous allons dire à Access de construire sa liste de choix en allant chercher les éléments de cette liste dans une autre table, pour ça on clique juste sur "Suivant".\nAccess nous affiche les autres tables de la base :\nJusqu'à présent, nous avons saisi rapidement des enregistrements dans les tables, attardons nous sur la saisie et les recherches / filtres .\nPour se déplacer parmi les enregistrements de la table, on utilise les icônes fléchés en bas à gauche de la fenêtre de saisie:\nOn peut cacher une colonne, pour ça, on va dans le menu "Format", et on clique sur l'option "Afficher les colonnes "\nAutre truc interessant, on peut "figer" une colonne, à quoi ça sert ? Si pendant la saisie nous voulons avoir en permanence le numéro client , nous allons sélectionner la colonne en question en cliquant sur son titre :\nSi la colonne n'était pas figée, on aurait eu :\nLa colonne "N° Client" a bougé quand on a déplacé l'ascenseur, lorsqu'elle était figée, elle était bloquée. Pour autoriser le déplacement de toutes les colonnes et annuler l'option "Figer les colonnes", dans le menu "Format", cliquez sur l'option "Libérer les colonnes".\n3.7 Tri parmi les enregistrements\nCeci est l'état de notre table après l'avoir trié de façon croissante sur le champ "Nom"\nLe filtre sur un seul critère :\nEn cliquant sur l'onglet "Ou", vous obtenez un nouvel enregistrement vide dans lequel on va pouvoir saisir les critères de notre deuxième condition, le but étant d'avoir les clients qui s'appellent "Machin" OU qui habitent à Saint-Quentin, dans le deuxième onglet, on va sélectionner "Saint-Quentin" dans le champ ville :\n??Tout : dans toute la table\n??Bas : à partir de l'enregistrement courant jusque la fin de la table ??Haut : à partir du début de la table jusque l'enregistrement courant.\n??Champ entier : La valeur cherchée doit être le contenu exact du champ\n??Début de champ : La valeur cherchée est le début du champ\n??N'importe où : La valeur cherchée peut se trouver n'importe où dans le champ\nActivez cette option si vous souhaitez qu'Access retrouve les données telles qu'elles sont affichées dans la table (en utilisant la propriété "Format" du champ) ou telles qu'elles sont stockées (c'est-à-dire telles qu'elles ont été saisies).\nPar exemple : pour le code postal, on a défini un format d'affichage : 00000 pour que si le code postal commence par 0 (comme 02100), il soit affiché correctement et pas sous la forme 2100. Si on active l'option "Rechercher champs comme formatés", on pourra rechercher le code postal 02100, sinon, il faudra chercher le code postal 2100.\nChamp en cours\nIndique si la recherche doit s'effectuer uniquement dans le champ en cours ou dans tous les champs de la table\nOn clique sur "Rechercher"\nAccess se positionne sur le premier enregistrement dont le contenu du champ "Nom" est "Delune"\nPour trouver le suivant, on clique sur "Suivant"\nOn peut faire des recherches approximatives, pour cela on utilise des caractères génériques :\nRemplace une chaîne de valeur quelconque\nRemplace un chiffre unique\nRecherche des caractères parmi plusieurs\nExclu certains caractères de la recherche\nMais ne retrouve pas\nProchain chapitre : les formulaires\n2. Création d'une requête .2\n3. Définition des critères de sélection .5\n3.1 Opérateurs 5\n3.2 Les Fonctions 6 3.3 Plusieurs critères portant sur des champs différents 7\n3.4 Requête paramétrée ..8\n4. Les requêtes multitables ..9\n5. Les fonctions de regroupement . 10\n5.1 Les opérations 11 5.2 Quelques exemples .. 12\n6. Les requêtes d'analyse croisée . 13\n7. Les requêtes ACTION .. 14\n7.1 Les requêtes Création .. 14\n7.2 Les requêtes Ajout 15\n7.3 Les requêtes Mise à Jour . 16\n7.4 Les requêtes Suppression 17\nLes requêtes vont servir à afficher uniquement certaines données contenues dans les tables selon certains critères. Elles peuvent aussi faire des calculs sur vos données, ainsi que créer des sources de données pour les formulaires, les états ou même d'autres requêtes (on peut faire une requête sur le résultat d'une autre requête). Elles servent encore à modifier des tables existantes ou à en créer des nouvelles.\nIl existe différents types de requêtes que nous allons détailler après :\n?? La requête sélection : C'est celle qu'on utilisera le plus souvent. Elle permet de sélectionner des enregistrements, de faire des calculs et des regroupements. Elles ressemblent beaucoup aux filtres, mais permettent, en plus, de travailler sur plusieurs tables simultanément.\n?? La requête d'Analyse croisée : Cette requête présente ses résultats sous forme de tableau (de type Excel). On l'utilisera pour comparer des valeurs, dégager des tendances.\n?? La requête de Création de table : Cette requête crée une table à partir des données qu'elle a extraites dans une ou plusieurs autres tables.\n?? La requête Mise à Jour : Cette requête modifie le contenu d'un ou plusieurs champs d'une ou plusieurs tables. C'est le moyen le plus efficace pour mettre à jour un grand nombre d'enregistrements en une seule opération.\n?? La requête Ajout : Cette requête ajoute les données qu'elle a extraites à la fin d'une table déjà existante.\n?? La requête Suppression : Cette requête supprime un ou plusieurs enregistrements dans une ou plusieurs tables.\nLes trois derniers types de requêtes ne seront pas étudiés :\n?? La requête SQL direct\n?? La requête de définition de données\n?? La requête UNION\n2. Création d'une requête\nDans la fenêtre principale d'Access, cliquez sur l'onglet "Requêtes", puis sur le bouton "Nouveau".\n?? Mode création : nous allons créer la requête de A à Z par nous-mêmes\n?? Assistant de Requête simple : Crée une requête simple sur une ou plusieurs tables, on pourra, dans cette requête simple, faire des calculs, des regroupements.\n?? Assistant de Requête d'analyse croisée : Aide à la création d'une requête d'analyse croisée\n?? Assistant de Requête trouver les doublons : Localise les enregistrements doublons dans une table ou une requête.\n?? Assistant de Requête de non-correspondance : Localise les enregistrements d'une table auxquels ne correspond aucun autre enregistrement d'une autre table. On peut, par exemple, utiliser un tel type de requête pour localiser les clients qui n'ont pas passé de commande.\nComme nous ne reculons pas devant l'effort, nous allons créer les requêtes par nous même, nous cliquons donc sur Mode Création, puis, sur OK :\nAccess nous affiche la liste des tables de la base. Nous choisissons ici les tables sur lesquelles vont porter la\nrequête. Nous allons prendre pour exemple la requête "liste des clients habitant la ville de Paris". La requête va donc porter sur la table "Clients", on la sélectionne, et on clique sur "Ajouter", comme il n'y a aucune autre table à ajouter, on clique sur "Fermer".\nNotez qu'on peut aussi faire porter la requête sur le résultat d'une autre requête, dans ce cas, on choisira la requête dans l'onglet "Requête".\nDans la partie supérieure de la fenêtre se trouvent la ou les tables avec la listes de leur champs, c'est sur ces tables que vont porter les requêtes. Dans la partie inférieure, se trouve la description de la requête.\nPour ajouter un champ, on peut, soit le sélectionner dans la table et l'amener avec la souris sur une colonne, soit on clique sur la ligne "Champ", la liste de tous les champs s'affiche alors et on en sélectionne un dans la liste. Un des champs proposé s’appelle '*', ce champ signifie "tous les champs de la table", si on choisi ce champ, tous les champs de la table apparaitront dans le résultat de la requête, en plus des autres champs que vous aurez choisis.\nLa ligne "Table" sert à selectionner la table à laquelle appartient le champ sélectionné, dans notre cas, il n'y a qu'une table, le choix est vite fait.\nLa colonne "Tri" indique de quelle façon vont être triés les champs dans le résultat de la requête : il y a trois sortes de tri : Croissant (de A à Z), Décroissant (de Z à A) et non trié. On a choisi ici de trier le résultat de la requête par nom et par prénom de façon croissante. Le tri se fait toujours de gauche à droite : le résultat de la requête sera d'abord trié par nom, puis par prénom.\nLa colonne "Afficher" indique si le champ doit être affiché ou non, ici on veut afficher le nom et le prénom de chaque client habitant à Saint-Quentin, mais on a pas besoin d'afficher, pour chaque client, la ville dans laquelle il habite, puisqu'il s'agira toujours de Saint-Quentin, on a donc déselectionné l'affichage du champ "Ville".\nEnfin la colonne "Critères" va indiquer le critère de la requête, on veut la liste des clients habitant SainQuentin, le critère est donc : le champ ville doit être égal à Saint-Quentin, d'où le critère = "Saint-Quentin".\nPour éxecuter la requête, on clique sur l'icône :\nAccess affiche le résultat :\nLe résultat de la requête s'affiche sous la forme d'une table que l'on peut modifier comme si il s'agissait d'une table normale, on peut ajouter des enregistrements, les modifier, faire des filtres, des tris, etc\nAttention: Les résultats des requêtes, même si ils sont présentés sous forme de tables ne sont pas de véritables tables qu’aurait généré la requête. Ils ne sont qu'une "vue" faite à partir des tables qui ont servi à faire la requête. Autrement dit, si vous modifiez quelque chose dans le résultat de la requête, la modification se repercutera dans la table qui a servi à faire la requête, si on change ici le nom du client, la modification sera reportée dans la table Clients, si on ajoute un client au résultat de la requête, un nouvel enregistrement va être crée dans la table Clients, et en plus, cet enregistrement sera incomplêt car seuls deux champs auront pu être saisis dans le résultat de la requête (les champs nom & prénom).\nAccess met à notre disposition d'autres opérateurs :\nSélectionne les enregistrements pour lesquels la valeur d'un champ est comprise dans un intervalle de valeurs.\nEntre "A" et "C"\nEntre #01/01/99# et #31/12/99#\nSélectionne les enregistrements pour lesquels la valeur d'un champ est comprise dans une liste.\nSélectionne les enregistrements contenant une donnée approximative.\nSélectionne les enregistrements ne correspondant pas au critère\nPas Entre "A" et "C"\nOn peut intégrer des fonctions dans les critères de sélection. Access met à notre disposition un très grand nombre de fonctions (pour en avoir la liste complète, consultez l'aide intégrée à Access). Ce sont les mêmes fonctions que celles qui sont utilisés dans les contrôles des formulaires (et d’ailleurs dans tous les logiciels de la gamme Microsoft Office).\nPar exemple, parmi ces fonctions, on trouve la fonction Mois ( ), à qui on passe une date en paramètre, cette fonction renvoie le mois de cette date, par exemple Mois (#10/2/98#) renvoie 2. Une autre fonction, Date ( ) renvoie la date du jour. On peut utiliser ces deux fonctions dans des critères de sélection :\nPar exemple, pour obtenir la liste des commandes du mois d'octobre :\nNotez que pour faire référence au champ "Date de la commande" dans la fonction Mois ( ), on a écrit le champ entre crochets [ ]. On utilise les crochets lorsqu’on travaille avec un champ dont le nom comporte des espaces. Par extension et par mesure de précaution, on les utilisera avec tout type de champ.\nOu pour obtenir la liste des commandes passées il y a moins d'un mois :\nIl existe un très grand nombre de fonctions, pour en avoir la liste et la syntaxe, consultez l'aide intégrée à Access.\nOn peut avoir plusieurs critères de sélection, ces critères étant séparés entre eux par des OU ou des ET, par\nexemple : "liste des clients habitant à Saint-Quentin OU à Paris", "Liste des clients s'appelant Dupont ET vivant à Paris".\n1- Liste des clients s'appelant Dupont et vivant à Saint-Quentin\nLa requête ressemble à la précédente, sauf que là, il y a deux critères : le premier Nom = "Dupont" ET le deuxième Ville = "Paris". Vous noterez au passage qu'il n'est pas nécessaire d'afficher le contenu du champ "ville" puisqu'on sait que ce sera toujours Paris. Vous me direz que c'est la même chose avec "Nom", certes, mais c'est mieux d'avoir une liste de nom + prénom qu'une seule liste de prénom.\n2- Liste des clients habitant Saint-Quentin OU Paris\nLes deux critères ne sont plus sur la même ligne. Ils sont sur deux lignes séparées. Le premier est sur la ligne "Critères", le second sur la ligne "Ou". Si on avait voulu ajouter un troisième critère (Liste des clients habitant Saint-Quentin OU Paris OU Lille), on aurait ajouter le critère = "Lille" sur une troisième ligne et ainsi de suite.\n?? Si deux critères sont séparés par des ET, on les place sur la même ligne. ?? Si deux critères sont séparés par des OU, on les place sur des lignes différentes.\nPour l'instant, les critères de chaque requête que nous avons fait étaient indiqués explicitement dans la requête. Supposons maintenant que nous voulions faire une requête du type :\n« Liste de tous les clients qui habitent dans une ville » mais qu’on veuille entrer nous même la ville.\nOn ne connaît pas par avance la ville en question, et on ne va pas préparer autant de requêtes qu'il peut y avoir de villes (on n'est pas sorti de l'auberge), la solution la plus simple est alors de demander à l'utilisateur (l'utilisateur, c'est celui qui va utiliser votre requête plus tard) d'entrer la ville, et de faire la requête en fonction de ce qu'il a entré.\nPour faire ça, on procède ainsi :\nAu lieu d'indiquer une ville, on a mis =[Entrez la ville]. Que va-t-il se passer lorsqu'on va exécuter la requête?\nHabituellement, pour Access, tout ce qui est indiqué entre crochets est le nom d'un champ, si on avait mis par exemple = [Nom], il aurait cherché les clients qui habitent une ville qui s'appelle comme leur nom. Or ici, [Entrez la ville] n'est pas un nom de champ, Access ne sait donc pas ce que c'est, et il demande à l'utilisateur d'entrer la valeur de ce champ inconnu :\nL'utilisateur va entrer ici la ville (notez que le message affiché est ce qui était indiqué entre crochets dans la requête). Maintenant, à chaque fois que Access va rencontrer dans la requête [Entrez la ville], il va le remplacer par ce qu'à saisi l'utilisateur. Si l'utilisateur a saisi Paris, Access va remplacer dans son critère =[Entrez la ville] par = "Paris".\nPour l'instant, nos requêtes ne portaient que sur une seule table, il est possible de faire des requêtes qui portent sur plusieurs tables simultanément. Dans ce cas, les requêtes peuvent être très complexes.\nOn va choisir ici toutes les tables entrant en jeu pour pouvoir faire la requête. Ici on veut la liste des clients, il faut donc la table clients. "ayant commandé", il faut donc la table commandes, "le produit n°1", il faut donc la table produits. Il faut aussi faire intervenir la table "Lignes-commandes".\nPourquoi ? parce que c'est elle qui fait la liaison entre la table commande et la table produits. De façon générale, lorsqu'on fait une requête portant sur plusieurs tables, il faut respecter deux règles :\n?? Il ne doit pas y avoir de tables n'ayant rien à faire dans la requête, sinon, Access va se baser sur les relations entre ces tables n'ayant rien à voir avec la choucroute et celles ayant à voir et va donner des résultats erronés.\nVous pouvez noter que, une fois les bonnes tables installées avec les bonnes relations entre elles, la requête est fort simple, il suffit d'indiquer produits=1, et Access, grâce aux relations, va retrouver la liste des clients ayant commandé ce produit.\nJusqu'à présent, nos requêtes nous permettaient de répondre à des questions du type : "Liste des clients habitant Paris", "Liste des produits commandés par le client 1". Grâce aux fonctions de regroupement, nous allons pouvoir répondre à des questions du type : "Combien de clients habitent Paris ?" ou\n"Pour combien à commandé chaque client ?".\nUne nouvelle ligne "Opération" apparaît dans la requête, c'est grâce à elle que nous allons faire nos opérations.\n1- Combien de clients habitent Paris\nQu'y-a-t-il de différent ?\nNous avons deux champs : nous allons compter le nombre de clients, chaque client a un numéro, on insère donc dans la requête le numéro de client, c'est le nombre de ces numéros que nous allons compter, il faut qu'on compte les clients habitant Paris, d'où le deuxième champ Ville.\nElle indique comment va se faire l'opération, si nous voulons compter, on va choisir l'opération "compte". Dans tous les champs où il y a un critère de sélection (ici Ville = "Paris"), on choisira l'opération où. Le résultat de la requête sera une table avec un unique champ, non modifiable, qui indiquera le nombre de clients habitant Paris.\n2- Montant commandé par chaque client\nIci, on veut, par client, la somme de ses commandes. A partir du moment où on veut un résultat par catégorie (une somme par client, un nombre de clients par ville, etc…), il y a regroupement, ici on veut la somme des commandes regroupées par clients, c'est pour ça qu'on a choisi comme opération pour numéro de client "Regroupement".\nPourquoi a-t-on ajouté le champ "nom" ? Simplement pour ne pas avoir une liste de numéros avec un montant correspondant. Pourquoi dans ce cas, n'a-t-on pas regroupé les clients par leur nom au lieu de le faire par numéro et nom ? parce que plusieurs clients peuvent avoir le même nom et qu'on ne veut pas cumuler le montant des commandes par clients homonymes, on regroupe donc les clients par numéro et nom.\nEnfin, le troisième champ : on veut la somme du montant des commandes : qu'est-ce qu'une commande ? c'est une liste de prix unitaires * une quantité. A la place d'un champ, on indique donc qu'on veut les prix unitaires * les quantités. La syntaxe est [nom de la table]![champ de la table], une commande, c'est donc une liste de [produits]![prix unitaire] * [lignes_commandes]![quantité]. Et on veut la somme de toutes ces commandes, on choisi donc l'opération "Somme".\nEn plus de la somme et de compte, il existe d'autres opérations possibles :\nCompte le nombre de valeurs\nValeur du dernier enregistrement\nValeur du permier enregistrement\nNombre de clients nommés "Dupont" par ville\nListe des clients ayant commandé plus de 1000 F du produit 1\n6. Les requêtes d'analyse croisée\nLes requêtes d'analyse croisée permettent de répondre à des questions du type "qui à commandé combien de quoi ?". Elles retournent le résultat sous forme d'un tableau comportant des champs en abscisse et en ordonnée, avec, dans chaque case la réponse à notre question.\nExemple : Qui a commandé combien de quoi ?\nL'en-tete "Qui" va contenir le nom des clients\nL'en-tête "Quoi" va contenir la liste des produits\nEt combien va donner, pour chaque client, le nombre de produits qu'il a commandé.\n1. D'abord on crée une requête standard : pour cette requête nous avons besoin du nom dans la table clients, du libellé du produit dans la table produit et de la quantité commandé dans la table lignescommandes.\n2. On transforme la requête en requête d'analyse croisée en allant dans le menu "Requête" et en choisissant "Analyse croisée".\n3. Une nouvelle ligne apparaît dans la requête : la ligne "Analyse"\n4. Dans cette ligne, on va indiquer si le champ qu'on a choisi va être l'en-tête des colonnes, l'en-tête des lignes ou la valeur contenue dans les cases du tableau.\n5. L'Opération pour les en-têtes est toujours "Regroupement"\n6. L'Opération pour les valeurs des cases dépend de ce qu'on cherche, ici on cherche le nombre de produits acheté, l'opération est donc "Somme"\nLes requêtes faites jusqu'à présent se contentent de retourner le résultat d'une sélection sous forme de table, cette table, étant, selon le type de requête, modifiable. Il existe cependant d'autres types de requêtes, les requêtes action, ces requêtes vont permettre de :\n?? Créer une table à partir du résultat d'une requête\n?? Ajout des enregistrements à une table à partir des résultats de la requête\n?? Mettre à Jour une table en fonction de certains critères\n?? Supprimer des enregistrements répondant aux critères de la requête\nUne requête création crée une table à partir des résultats qu'elle produit à partir d'une table existante. Supposons que nous voulions créer une table "Commandes réglées" qui contiendrait la liste des commandes déjà réglées.\n1. Créer la requête normalement : nous voulons la liste des commandes réglées :\n2. On la transforme en requête Création (Menu Requête / Requête Création de table)\n3. Access nous demande le nom de la table à créer :\nAttention, si vous sélectionnez une table existante, la table va être écrasée par cette opération\n4. Exécutez la requête avec l'icône point d'exclamation : la table va être créée avec le résultat de la requête. Si vous vous voulez vérifier avant de créer la table quel sera le résultat de la requête, cliquez sur l'icône:\nUne fois que le résultat sera conforme à vos attentes, vous pourrez cliquer sur l'icône point d'exclamation.\nUne requête Ajout copie tout ou partie des enregistrements d'une table (la table source) à la fin d'une autre table (la table cible).\nToujours dans notre table "Commandes réglées", nous voulons ajouter les commandes qui ont été réglées depuis la semaine dernière :\n1. Création de la requête normale :\n2. On la transforme en requête Ajout (Menu Requête / Requête Ajout)\n3. Access nous demande le nom de la table à laquelle il faut ajouter le résultat de la requête :\n4. Comme précédemment, avec les icônes Affichage et point d'exclamation, vérifiez et validez votre requête.\n?? Les enregistrements sont COPIES de la table source vers la table cible et non pas déplacés.\n?? Les deux tables doivent avoir des noms de champs identiques (et les mêmes types de données), les deux structures ne doivent pas nécessairement être identiques.\n?? Si la table source comporte plus de champs que la table cible, les champs supplémentaires sont ignorés\n?? Si la table source comporte moins de champs que la table cible, les champs dont les noms sont identiques sont copiés, les autres sont laissés vides.\n?? Access ne copie QUE les champs que vous avez déclarés dans la requête (d'ou le champ *)\nLes requêtes mise à jour permettent de modifier rapidement tous les enregistrements d'une table ou un groupe d'entre eux :\nSupposons que l'on veuille augmenter de 10% le prix des produits dont le prix actuel est inférieur à 1000 F.\n1. On crée une requête, et dans le menu Requête, on clique sur "Requête Mise à Jour"\n2. Un champ "Mise à jour" apparaît dans la requête, c'est là qu'on va indiquer la modification qui va avoir lieu :\nDans la case Mise à Jour, on a indiqué, qu'à la place du prix unitaire, nous voulions [prix_unitaire]*1.1 (soit une augmentation de 10%), ceci pour les produits dont le prix est inférieur à 1000 (critère).\nLes requêtes suppression vous permettent de supprimer un groupe d'enregistrements qui répondent à un critère donné. Supposons que l'on veuille supprimer de la table commande toutes les commandes réglées :\n1. On crée une requête standard, puis dans le menu Requête, on clique sur Requête Suppression :\n2. On exécute la requête ou on vérifie avant que le résultat est conforme à ce que l'on attend.\nVérifiez bien le résultat avant d'exécuter la requête, il n'est pas possible de revenir en arrière après avoir effacé des enregistrements.\nJusqu'à présent, nous avons vu comment créer une requête en utilisant la fenêtre requête d'ACCESS. Il existe une autre façon de faire les requêtes : en passant directement par le langage SQL. D'ailleurs, ACCESS utilise aussi ce langage pour faire ses requêtes, il traduit ce que vous avez entré en SQL, puis exécute la requête SQL.\nSQL est un langage de manipulation de bases de données mis au point dans les années 70 par IBM. Il permet, pour résumer, trois types de manipulations sur les bases de données :\n?? Les manipulations des bases de données : Sélection, modification, suppression d'enregistrements.\n?? La gestion des droits d'accès aux tables : Contrôle des données : droits d'accès, validation des modifications.\nL'intérêt de SQL est que c'est un langage de manipulation de bases de données standard, vous pourrez l'utiliser sur n'importe quelle base de données, même si, à priori, vous ne connaissez pas son utilisation. Ainsi, avec SQL, vous pouvez gérer une base de données Access, mais aussi Paradox, dBase, SQL Server, Oracle ou Informix par exemple (les bases de données les plus utilisées).\nAttention: Le langage SQL a souvent été implémenté de façon différente. Les commandes de base sont toujours les mêmes mais ont parfois des variantes ou des extensions. La version de SQL implémentée dans Access peut parfois être un peu différente de la version ANSI qui est la version standardisée.\nLa première série de commandes sert à la maintenance de la base de données : création des tables et des indexes, modification de la structure d'une table ou suppression d'une table ou d'un index.\nAttention: La maintenance des bases de données dépend étroitement de la base de données utilisée, notamment en ce qui concerne les types de données, vérifiez donc toujours les types de données supportés par votre SGBD avant de créer une table avec SQL. Il se peut qu'il en supporte plus que ceux indiqués plus bas.\nSQL dispose pour cela des instructions suivantes :\n?? ALTER TABLE ?? CREATE TABLE ?? CREATE INDEX\nLa commande CREATE TABLE permet de créer une table dans la base de données courante. Sa syntaxe est la suivante :\n(champ type CONSTRAINT champ propriétés, );\nType de données, dans la plupart des versions de SQL, vous aurez droit aux types de données suivants :\n?? Char(x) : chaîne de caractères, x est le nombre maximum de caractères autorisés dans le champ.\n?? Integer : Nombre entier, positif ou négatif\n?? Decimal (x,y) : Nombre décimal, x est le nombre maximum de chiffres et y le nombre maximum de chiffres après la virgule.\nDecimal ne fonctionne pas avec Access, il ne supporte que le type 'float' (flottant), le type float ne permet pas d'indiquer le nombre de chiffres après ou avant la virgule\n?? Date : Une date et/ou heure\n?? Logical – Deux valeurs possibles : oui / non\nPropriétés du champ :\n?? NULL ou NOT NULL : autorise ou non que le champ puisse être vide.\n?? UNIQUE : indique que deux enregistrements ne pourront avoir la même valeur dans ce champ.\n?? PRIMARY KEY : indique que ce champ est la clef primaire\n?? CHECK (condition) : équivaut à la propriété "ValideSi" d'Access, va forcer SQL a faire une vérification de la condition avant de valider la saisie, exemple : CHECK (prix > 100) interdira la saisie dans ce champ si la valeur contenue dans le champ prix est inférieure à 100.\nCHECK ne fonctionne pas avec Access.\n?? DEFAULT = valeur, place une valeur par défaut dans le champ\n(ne fonctionne pas avec Access)\nDEFAULT ne fonctionne pas avec Access\nExemple : Créer la nouvelle table "table_test" contenant deux champs : un champ avec un entier qui doit toujours être saisi et un champ contenant une chaîne de 5 caractères :\nCREATE TABLE table_test (champ1 integer CONSTRAINT champ1 NOT\nNULL, champ2 char(5));\nLa commande ALTER TABLE permet de modifier la structure d'une table, sa syntaxe est la suivante :\n?? DROPSupprime un champ d'une table\n?? MODIFY Modifie les caractéristiques d'un champ\nAprès l'action, on indique, entre parenthèses, les spécifications du champ de la même façon que pour la commande CREATE TABLE. On ne peut faire qu'une action à la fois (ajout, suppression ou modification dans la même commande).\nAjout d'un champ Date :\nLa commande CREATE INDEX permet de créer un index sur une table, sa syntaxe est :\nPour vous souvenir ce qu'est un index, retournez voir le chapitre 1.\nNom_index est le nom de l'index, table est le nom de la table.\nNous avons vu dans le chapitre 1 qu'un index peut être composé d'un ou de plusieurs champs, la liste de ces champs est indiquée entre parenthèses après le nom de la table.\nEnfin, la clause UNIQUE indique à SQL si l'index créé va être unique ou s'il peut contenir plusieurs fois la même valeur dans la table, s'il peut contenir plusieurs fois la même valeur, il ne faudra pas ajouter la clause UNIQUE.\nExemple : création d'un index sur le champ1\nCREATE UNIQUE INDEX index1 ON table_test (champ1);\nUne fois les tables créées, on peut commencer à y insérer des données, les mettre à jour, les supprimer ou y faire des requêtes. Toutes ces opérations sont des opérations de manipulation des bases de données.\nPour effectuer ces manipulations, SQL dispose de 5 instructions :\n?? INSERT ?? UPDATE ?? DELETE ?? SELECT ?? CREATE VIEW (non utilisé dans Access)\nLa commande INSERT est utilisée pour ajouter des enregistrements ou des parties d'enregistrements dans des tables. Elle est utilisée généralement sous deux formes :\nINTO table (champ1,champ2, )\nVALUES ('valeur1','valeur2', );\nCette forme est utilisée lorsqu'on veut insérer un seul enregistrement ou une partie d'un seul enregistrement. On créera un nouvel enregistrement dont le contenu du champ1 sera valeur1, le contenu du champ2 sera valeur2, etc\nDans cette seconde forme, le résultat de la requête va être inséré dans les champs indiqués de la table. Cette méthode est utilisée lorsque plusieurs enregistrements sont ajoutés simultanément.\nDans les deux cas, les valeurs insérées doivent correspondre au type de données du champ dans lequel l'insertion va être faite, on ne peut pas, par exemple demander l'insertion d'une chaîne de caractères dans un champ de type numérique ou monétaire. Les chaînes de caractères doivent être placées entre apostrophes ( ' ), les champs numériques ou vides (NULL) ne doivent pas être placés entre apostrophes.\nSi des valeurs doivent être insérées dans tous les champs de l'enregistrement de la table, la liste des noms des champs n'a pas besoin d'être explicitement indiquée dans la commande. Les valeurs des champs à insérer doivent cependant apparaître dans le même ordre que les noms des champs lors de la création de la table, sans oublier un seul champ.\nFaites attention en utilisant cette syntaxe, si la structure de la table change plus tard, la commande qui était bonne risque de ne plus fonctionner correctement. Il vaut mieux toujours indiquer explicitement le nom des champs sur lesquels on veut agir.\nVALUES ('valeur1','valeur2','valeur3', );\nPar exemple, dans notre table Client, si nous voulons insérer un nouveau client, nous allons entrer :\nVALUES (100,'Mr','Dupond','Jean','rue de la paix',’75000’,\nLa commande ci-dessus va insérer un enregistrement dans la table 'clients' avec les informations suivantes : Le client 100, dont le titre est 'M.', dont le nom est 'Dupond', dont le prénom est 'Jean', l'adresse est 'Rue de la paix', le code postal est 75000 et la ville est 'Paris'.\nNotez que le numéro de client, qui est un champ de type 'NuméroAuto' a été indiqué explicitement. Lors d'une création d'un enregistrement avec une commande SQL, le numéro automatique n'est pas toujours généré automatiquement, vérifiez les possibilités offertes par votre SGBD.\nNotez aussi l'utilisation de NULL : Si on insère moins de valeurs de champ qu'il y a de champs dans la table, soit on écrit explicitement le nom des champs à insérer, soit on insère la valeur NULL dans le champ où il n'y a rien à mettre, à condition que la propriété du champ "NULL interdit" soit à NON, sinon, il y aura une erreur lors de la création de l'enregistrement.\nLa syntaxe est : INSERT\nINTO table (champ1, champ3)\nVALUES ('valeur1','valeur 3');\nDans notre exemple, le champ 'Observations' à sa propriété "NULL interdit" à NON, on n'est donc pas obligé de saisir des observations, ce qui est le cas ici, on entre donc NULL, ce qui signifie à Access que le champ est vide.\nOn peut insérer simultanément plusieurs enregistrements ou parties d'enregistrements dans une table.\nDans ce cas, les données insérées vont être récupérées dans une ou plusieurs autres tables.\nPar exemple, si nous voulons placer dans une table nommée "Clients_stq" les clients habitant SaintQuentin, nous allons procéder ainsi :\n1) Créer une table "Clients_stq" avec Access, nous allons supposer que cette table comporte 3 champs: le nom, le prénom et l'adresse.\nLa partie entre ( ) est une requête SQL, nous verrons cela en détail plus bas, elle va sélectionner les champs nom, prénom et adresse de la table Client pour les enregistrements dont la ville est "SaintQuentin". Le résultat de cette requête va être inséré dans la table Clients_stq.\nLa commandeINSERT INTOavec requête ne déplace pas les enregistrements de la table "Clients" vers la table "Clients_stq", elle se contente de faire une copie. Pour effacer les enregistrements de la table Clients, nous utiliserons la commande DELETE.\nLa commande UPDATE est utilisée pour changer des valeurs dans des champs d'une table. Sa syntaxe est :\nchamp1 = nouvelle_valeur1,\nchamp2 = nouvelle_valeur2,\nchamp3 = nouvelle_valeur3\nLa clause SET indique quels champs de la table vont être mis à jour et avec quelles valeurs ils vont l'être. Les champs non spécifiés après la clause SET ne seront pas modifiés.\nPar exemple, si nous voulons, dans la table produit, modifier le prix d'un produit dont le nom est "prod1", nous taperons :\nSET prix_unitaire = 1000\nWHERE libelle = 'prod1';\nLa commande UPDATE affecte tous les enregistrements qui répondent à la condition donnée dans la clause WHERE. Si la clause WHERE est absente, tous les enregistrements de la table seront affectés.\nPar exemple, si nous tapons :\nSET prix_unitaire = 1000;\nLe prix unitaire de TOUS les produits de la table produit va être modifié.\nTout comme la commande INSERT, la commande UPDATE peut contenir une requête. Dans ce cas la syntaxe est la suivante :\nLa requête est une requête faite avec la commande SELECT.\nPour supprimer des enregistrements d'une table, utilisez la commande DELETE. La syntaxe est la suivante :\nOn ne peut pas supprimer seulement le contenu de quelques champs des enregistrements. La commande DELETE supprime des enregistrements entiers, c'est pour cela qu'il n'est pas nécessaire d'indiquer ici des noms de champs. La condition spécifiée après WHERE va déterminer quels sont les enregistrements à supprimer.\nPar exemple, pour supprimer tous les clients dont la ville est Saint-Quentin :\nPour supprimer tous les enregistrements d'une table, n'indiquez pas de clause WHERE :\nCette variante de la commande DELETE ne supprime pas la table, elle supprime seulement les enregistrements contenus dans cette table et laisse une table vide.\nOn peut aussi, comme précédemment utiliser une requête qui servira à déterminer la condition de la suppression. La syntaxe est la suivante :\nWHERE condition = ( requête );\nLa commande SELECT est la commande la plus complexe de SQL. Cette commande va servir à faire des requêtes pour récupérer des données dans les tables. Elle peut être associée à une des commandes de manipulation de tables vues avant pour spécifier une condition.\nSELECT champ1, champ2, champ3, FROM table;\nS'il y a plus d'un champ spécifié après SELECT, les champs doivent être séparés par des virgules. Les champs sont retournés dans l'ordre spécifié après la clause SELECT, et non pas dans l'ordre qu'ils ont été créés dans la table.\nPour sélectionner les champs "prénom" et "nom" de tous les enregistrements de la table Clients :\nVa renvoyer les prénom et nom de tous les clients de la table Clients.\nSi on veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est la suivante :\nLes clauses SELECT et FROM doivent obligatoirement apparaître au début de chaque requête, on peut, ensuite, indiquer des critères de sélection avec la clause WHERE :\nPar exemple, pour sélectionner tous les Clients de la table "Clients" dont le code postal est 75000 :\nWHERE code_postal = 75000;\nOn peut utiliser les opérateurs suivants dans les conditions :\nDifférent (parfois noté aussi != )\nPour sélectionner tous les articles dont le prix est supérieur à 100 F :\nWHERE prix_unitaire > 100;\nIl est possible de combiner plusieurs conditions avec des opérateurs logiques :\nL'opérateur AND réunit deux ou plusieurs conditions et sélectionne un enregistrement seulement si cet enregistrement satisfait TOUTES les conditions listées. (C'est-à-dire que toutes les conditions séparées par AND sont vraies). Par exemple, pour sélectionner tous les clients nommés 'Dupond' qui habitent Saint-Quentin :\nWHERE nom = 'Dupond' AND ville = 'Saint-Quentin';\nL'opérateur OR réunit deux conditions mais sélectionne un enregistrement si UNE des conditions listées est satisfaite. Par exemple, pour sélectionner tous les clients nommés 'Dupond' ou 'Durant' :\nWHERE nom = 'Dupond' OR nom = 'Durant';\nAND et OR peuvent être combinés :\nWHERE nom = 'Dupond' AND (ville = 'Saint-Quentin' OR ville =\nNous sélectionnons ici les clients nommés "Dupond" qui habitent soit à Saint-Quentin, soit à Paris.\nPourquoi avons-nous placé des parenthèses ? Pour résumer, on peut dire que l'opérateur AND a une plus grande priorité que l'opérateur OR. Ce qui signifie que SQL va d'abord sélectionner les conditions séparées par des AND, puis celles séparées par des OR, si on avait omis les parenthèses ici, SQL aurait cherché les clients nommés "Dupond" vivant à Saint-Quentin ou les clients habitant à Paris, ce qui n'est pas le but recherché. Pour généraliser, mettez toujours des parenthèses pour bien séparer vos conditions.\nPour sélectionner des enregistrements dont la valeur d'un champ peut être comprise dans une liste ou entre deux valeurs, on utilise les clauses IN et BETWEEN.\nPar exemple : Pour sélectionner les clients vivant à Saint-Quentin ou Paris :\nWHERE ville IN ('Saint-Quentin', 'Paris');\nOu pour sélectionner les produits dont le prix est compris entre 100 et 1000 F :\nWHERE prix_unitaire BETWEEN 100 AND 1000;\nPour sélectionner les produits dont le prix n'est pas dans cet intervalle :\nWHERE prix_unitaire NOT BETWEEN 100 AND 1000;\nDe la même façon, NOT IN sélectionne les enregistrements exclus de la liste spécifiée après IN.\nNotez que NOT a une priorité plus grande que AND :\nNOT Condition1 AND Condition2 sélectionnera les enregistrements ne satisfaisant pas la condition1 et satisfaisant la condition2, alors que NOT (Condition1 AND Condition2) sélectionnera les enregistrements ne satisfaisant pas les deux conditions 1 et 2. Une fois de plus, n'hésitez pas à mettre des parenthèses !\nLa clause LIKE permet de faire des recherches approximatives sur le contenu d'un champ. Par exemple, pour sélectionner les clients dont le nom commence par la lettre D :\nWHERE nom LIKE 'S*';\nTout comme dans les requêtes Access, le symbole * remplace un ensemble de caractères, pour représenter tous les noms commençant par S, on utilisera 'S*', tous ceux se terminant par S, on utilisera\n'*S', et tous ceux comportant la lettre S : '*S*'. Le symbole ? ne remplace qu'un seul caractère. Si on a deux clients nommés Dupond et Dupont, on utilisera 'Dupon?'.\nAttention : certaines versions de SQL n'utilisent pas les caractères * et ? mais d'autres caractères spécifiques, certaines versions utilisent notamment le caractère % à la place de *. Consultez donc la documentation de votre SGBD.\nLa jointure va nous permettre de sélectionner des informations dans plusieurs tables grâce aux relations existant entre ces tables. Il va néanmoins falloir indiquer comment se fait la relation entre ces tables.\nPar exemple : récupérer le nom et le prénom du client ayant passé la commande n°1 :\nFROM Clients, Commande\nWHERE Commande.num_client = Client.num_client AND num_commande = 1;\nLa clause WHERE indique que le numéro de commande doit être égal à 1 et que la jointure va se faire sur le numéro de client : une fois que SQL va trouver la commande n° 1 dans la table commande, il va prendre le numéro de client contenu dans l'enregistrement et avec ce numéro, aller chercher dans la table Clients le nom et le prénom correspondants à ce numéro.\nNotez que lorsqu'on utilise plusieurs tables, il faut faire attention que deux tables n'aient pas de champs ayant le même nom, si c'est le cas, et pour les différencier, on utilise, comme dans l'exemple, la notation: table.nom_du_champ. Si on est sur que le nom ne se retrouvera pas dans plusieurs tables, on peut l'utiliser sans le préfixer avec le nom de la table.\nSupposons que nous voulions la liste des clients ayant acheté quelque chose. Nous voulons que chaque client ayant acheté quelque chose ne soit affiché qu'une seule fois – nous ne voulons pas savoir ce qu'a acheté chaque client – nous voulons juste connaître les clients qui ont acheté quelque chose. Pour cela, nous allons devoir dire à SQL de supprimer les doubles du résultat de la sélection pour n'afficher les clients qu'une seule fois. Pour cela, nous allons utiliser la clause DISTINCT.\nNous allons d'abord faire une jointure entre les tables Clients et Commande, et ajouter la clause DISTINCT sur le champ ou la répétition peut se produire :\nSELECT Client.num_client,nom, prénom\nWHERE Commande.num_client = Client.num_client;\nSi on exécute cette requête directement, SQL va nous renvoyer une liste des numéros, prénom et nom correspondants aux noms et prénoms des clients ayant passé chaque commande, il est clair qu'un client ayant passé plusieurs commandes va se retrouver plusieurs fois dans cette liste.\nSELECT DISTINCT Clients.num_client,nom, prénom\nEn indiquant la clause DISTINCT avant le champ num_client, on indique à SQL qu'on ne veut pas voir apparaître plusieurs fois un client ayant ce numéro dans la sélection renvoyée.\nOn peut même rendre le résultat de la sélection plus agréable à la lecture en utilisant la clause ORDERBY :\nWHERE Commande.num_client = Client.num_client AND num_commande = 1\nORDER BY nom,prénom;\nLa sélection renvoyée va être classée alphabétiquement d'abord sur le nom, puis sur le prénom.\nSQL a cinq fonctions importantes : SUM, AVG, MAX, MIN et COUNT. On les appelle fonctions d'ensemble parce qu'elles résument le résultat d'une requête plutôt que de renvoyer une liste d'enregistrements.\nDonne le total d'un champ de tous les enregistrements satisfaisant la condition de la requête. Le champ doit bien sur être de type numérique\ndonne la moyenne d'un champ de tous les enregistrements satisfaisant la condition de la requête\ndonne la valeur la plus élevée d'un champ de tous les enregistrements satisfaisant la condition de la requête\nDonne la valeur la plus petite d'un champ de tous les enregistrements satisfaisant la condition de la requête.\nRenvoie le nombre d'enregistrements satisfaisant la requête.\nVa retourner le prix le plus petit de la table Produit, le prix le plus élevé et le prix moyen.\nWHERE libelle LIKE 'P*';\nVa retourner le nombre de produits dont le libellé commence par la lettre 'P'.\nUne des utilisations les plus courantes de la clause GROUP BY est son association avec une fonction d'ensemble (le plus souvent COUNT, pour compter le nombre d'enregistrements dans chaque groupe). Par exemple, si nous voulons la liste des vendeurs, avec pour chaque vendeur le nombre de ventes qu'il a fait :\nSELECT num_vendeur,COUNT (*)\nGROUP BY num_vendeur;\nOn peut ajouter une condition à la requête, par exemple, la liste des vendeurs avec leur nombre de vente pour le mois de janvier.\nGROUP BY num_vendeur\nOn utilisera pour cela la clause HAVING.\nOn peut imbriquer autant de requêtes que l'on veut. La condition après la clause WHERE peut porter sur le résultat d'une autre requête (ou sous-requête).\nSupposons les tables suivantes :\nCette table contient, pour chaque acheteur, le produit qu'il a acheté et le prix d'achat.\nNous voulons la liste des acheteurs ayant acheté des articles chers. Nous considérerons qu'un article cher est un article dont le prix est supérieur à la moyenne du prix des produits achetés + 100 francs.\nWHERE prix >\n( SELECT AVG (prix) + 100\nVous pouvez constater que condition de la requête est basée sur le résultat d'une autre requête. Dans cet exemple, à chaque fois qu'un acheteur aura acheté un article cher, son numéro apparaîtra, pour éviter cela, on utilise la clause DISTINCT num_acheteur pour éliminer les doubles.\nAutre exemple avec ces deux tables : nous savons qu'il y a une erreur sur l'orthographe du nom de l'acheteur du produit n° 1, il devrait s'appeler 'Dupont' :\nSET nom = 'Dupont'\nWHERE num_acheteur =\nWHERE num_article = 1);\nN'oubliez pas cette règle à propos des sous-requêtes : Lorsque vous faites une sous-requête dans la clause WHERE, la clause SELECT de cette sous-requête doit avoir un nombre et des types de champs correspondants à ceux se trouvant après la clause WHERE de la requête principale. Autrement dit, si vous avez "WHERE champ = ( SELECT );", le résultat du SELECT doit être un seul champ puisqu'il n'y a qu'un seul champ après le WHERE, ET leur type doit correspondre (les deux doivent être numériques ou être des chaînes de caractères, etc.), sinon, la requête ne renverra rien ou sortira avec une erreur selon les systèmes.\nLorsqu'on veut que les résultats de plusieurs requêtes soient combinés entre eux, on utilise la clause UNION. UNION va fusionner les résultats des requêtes.\nPar exemple, supposons que nous ayons une table pour les clients habitant Saint-Quentin (cette table s'appellera clients_stq) et une table pour les clients habitant Paris (clients_Paris). Pour obtenir les numéros des clients des deux tables, on tapera :\nSELECT num_client FROM clients_paris;\nNotez que SQL requiert que le type des champs sélectionnés dans les clauses SELECT corresponde, colonne par colonne (le premier champ du premier SELECT doit avoir le même type que le premier champ du deuxième SELECT, etc ). Notez aussi que SQL supprime automatiquement les doubles lorsque UNION est utilisé, là où il aurait fallu utiliser la clause DISTINCT pour une requête simple.\nCes commandes ne seront pas détaillées car elles ne sont pas implémentées (ou qu'en partie) dans Access, néanmoins, deux d'entre elles sont très souvent utilisées dans d'autres systèmes : les commandes COMIT et ROLLBACK.\nLa commande COMIT valide toutes les modifications faites depuis le dernier COMIT, à partir du moment où la commande COMIT a été entrée, tout ce qui a été fait sur la base est validé et ne peut plus être modifié. La commande ROLLBACK efface toutes les modifications qui ont été faites sur la base depuis le dernier COMIT. C'est pour cela qu'il faut penser à faire un COMIT des modifications régulièrement.\nCertains systèmes, comme Access, font un COMIT automatique après chaque action, aucun retour en arrière n'est donc possible.\n1. Créer un formulaire à partir d’une table 3\n2. Les contrôles : ..10\n2.1 Le contrôle "Intitulé" ..11 2.2 Le contrôle "Zone de Texte" .12\n2.3 Le contrôle « Groupe d’options » ..14 2.4 Les contrôles « Traits » et « Rectangle » .17\n2.5 Les contrôles « Zone de Liste » et « Zone de Liste Modifiable » ..18 2.6 Le contrôle « Bouton de commande» 23\n2.7 Le contrôles « Sous-Formulaire » ..30\n1. Créer un formulaire à partir d’une table\nColonne simple: Le formulaire va afficher les champs sous la forme : « nom du champ :\n2.Les contrôles :\n2.1 Le contrôle "Intitulé"\n2.2 Le contrôle "Zone de Texte"\n2.3 Le contrôle « Groupe d’options »\n2.4 Les contrôles « Traits » et « Rectangle »\n2.5 Les contrôles « Zone de Liste » et « Zone de Liste Modifiable »\n2.6 Le contrôle « Bouton de commande»\n2.7 Le contrôles « Sous-Formulaire »\n1. Création d'un état .. 2\n2. Création d'un état Instantané Colonnes . 3\n3. Création d'un état Instantané Tableau . 4\n4. Création d'un état avec plusieurs tables 9\n5. Modifier la structure d'un état .11\n6. Insertion d'un sous-état .16\n1. Création d'un état\n2. Création d'un état Instantané Colonnes\n3. Création d'un état Instantané Tableau\n4. Création d'un état avec plusieurs tables\n5. Modifier la structure d'un état\n6. Insertion d'un sous-état\n2. Création d'une macro autonome 2\n3. Exécuter la macro pas à pas . 5\n4. Modifier une macro 5\n5. Création d'une macro associée à un formulaire . 6\n6. Exécuter des actions en fonction de conditions . 7\n7. Afficher un message . 7\n8. Déplacer le curseur .. 8\n9. Affectation de la macro à l'événement . 9\n10. Définir la valeur d'un champ dans une macro 10\n11. Mettre un bouton de commande dans un formulaire ..11\n12. Ouvrir un formulaire et afficher un enregistrement .12\n13. Créer une boite de dialogue 13\nUne macro est composée d'Actions, chaque action correspond à une tâche : lorsque vous exécutez la macro, Access exécute automatiquement les actions qu'elle contient. Certaines de ces actions, plus complexes, vous permettent d'afficher des boîtes de dialogue, de tester la réponse fournie par l'utilisateur, d'afficher une barre de menus personnalisée… et de développer une application autonome sans avoir besoin de programmer des modules en Visual Basic (bien que les actions fassent référence à des instructions en Visual Basic).\nLa méthode de création d'une macro est liée à deux facteurs importants :\n?? L'environnement de départ de la macro : certaines macros peuvent être exécutées quelle que soit la fenêtre active, d'autres sont liées à un objet de la base de données (formulaire, état, …)\n?? L'événement qui va déclencher l'exécution de la macro : dans un formulaire, ce peut être un clic sur un bouton, ce peut être l'ouverture du formulaire, la valeur du contenu d'un contrôle, ou encore en fonction de la mise en page d'un état.\n2. Création d'une macro autonome\n1. Dans la fenêtre principale d'Access, cliquez sur l'onglet Macro et sur Nouveau :\n2. On choisit dans le menu déroulant l'action que l'on veut faire exécuter par la macro :\nComme vous pouvez le constater, il existe un très grand nombre d'actions possible, en fait, tout ce qu'on peut faire dans Access se retrouve dans ce menu. Pour avoir la liste des actions possibles, utilisez l'aide intégrée à Access qui décrit le fonctionnement de chaque action. Nous voulons ouvrir une table, nous choisissons l'action "OuvrirTable".\n3. Saisie des paramètres de l'action\n?? Affichage : détermine si la table sera ouverte en mode création ou en mode feuille de données\n4. Une deuxième action\nVous l'avez remarqué, le tableau de la fenêtre "Macros" contient plusieurs lignes, on peut exécuter plusieurs actions les unes à la suite des autres dans la même macro, maintenant, après avoir ouvert notre table Clients, nous allons ouvrir le formulaire associé à cette table :\n?? Mode fenêtre : indique comment le formulaire va être affiché : Standard (comme défini dans Affichage), Masquée (le formulaire est ouvert et automatiquement caché), Icône (le formulaire est réduit en icône), Boîte de dialogue (nous verrons ça plus tard)\n?? Condition Where : plus tard…\n5. Exécution de la macro\nComme pour les requêtes, cliquez sur l'icône 'Point d'exclamation'. Access va alors exécuter toutes les lignes de la macro et s'arrêter dès qu'il va rencontrer une ligne vide, ou dès qu'il va rencontrer l'action\n3. Exécuter la macro pas à pas\n1. Ouvrir la macro en mode création\n2. Cliquer sur l'icône :\n3. Exécuter ensuite la macro\n?? Pas à pas : pour exécuter cette action et passer à la suivante\n?? Arrêter : pour stopper l'exécution de la macro\n5. Création d'une macro associée à un formulaire\nCertaines macros doivent être exécutées en réponse à un événement lié au formulaire (ouverture, fermeture, fermeture…), d'autres dépendent d'un événement lié à un contrôle du formulaire (clic, valeur du contrôle, etc.). Dans le premier cas, la macro doit être insérée dans la feuille de propriétés du formulaire, dans le second cas, elle doit apparaître dans la feuille de propriétés du contrôle.\nIl faut définir précisément quel est l'événement qui va déclencher l'exécution de la macro (quand tel événement se produit, telles actions vont se dérouler).\nLa question à se poser est : "Quand va-t-on vérifier que le champ date est vide ?", Il n'y a qu'une réponse : "Quand on passera à un nouvel enregistrement, que ce soit pour retourner sur un enregistrement précédent ou pour en créer un nouveau". Donc, lorsqu'on passera à un nouvel enregistrement, si la date est vide, on va afficher un message d'erreur, et positionner le curseur à nouveau sur le champ date pour pouvoir le saisir.\nLa macro doit s'exécuter\nA l'ouverture du formulaire\nA la fermeture du formulaire\nLorsque Access accède à un enregistrement du formulaire\nLorsqu'on précise la valeur d'un champ d'un nouvel enregistrement\nLorsqu'on va supprimer un enregistrement\nAprès avoir quitté un enregistrement modifié et avant l'enregistrement des modifications\nAprès avoir quitté un enregistrement modifié et après l'enregistrement des modifications.\nLes événements liés aux contrôles d'un formulaire sont les suivants :\nLa macro doit s'exécuter :\nQuand on clique sur le contrôle\nQuand on double-clique sur un contrôle\nAvant d'accéder à un contrôle\nLorsqu'on quitte un contrôle\nAprès avoir quitté un contrôle modifié et avant qu'Access ne fasse la mise à jour\nAprès avoir quitté un contrôle modifié et après sa mise à jour\n6. Exécuter des actions en fonction de conditions\n1. On va créer une nouvelle macro pour vérifier la date, une fois la fenêtre de la macro ouverte, cliquez sur l'icône :\n2. Une nouvelle colonne apparaît dans la fenêtre de la macro, c'est la colonne "Condition", c'est dans cette colonne qu'on va taper la condition qui décidera si oui ou non l'action de la macro doit s'exécuter.\n3. On veut qu'un message d'erreur s'affiche lorsque la date de la commande est vide, la condition pour que le message s'affiche est donc : [date de la commande] Est Null. L'action qui va être déclenchée si la condition s'avère vraie va être l'affichage d'un message d'erreur.\n7. Afficher un message\n?? Type : Icône à afficher à côté du texte (point d'exclamation, d'interrogation, etc…)\n?? Titre : titre de la fenêtre où va s'afficher le texte\n8. Déplacer le curseur\nUne fois le message d'erreur affiché, il va falloir positionner le curseur automatiquement sur le contrôle Date, pour que l'utilisateur puisse le resaisir.\nIl existe plusieurs actions pour déplacer le curseur :\nSur la première ligne on a la condition : si la date de la commande est vide, on affiche le message d'erreur, mais après avoir affiché l'erreur que fait-on ? on va faire plusieurs choses, et pour indiquer que les autres actions que l'on va faire vont se dérouler dans le cas où l'erreur s'est produite, on va mettre comme condition "…", autrement dit, à chaque fois qu'Access va rencontrer comme condition "…", il va reprendre la condition spécifiée explicitement plus haut.\nDonc, après avoir affiché l'erreur, on va exécuter l'action "AnnulerEvénement". A quoi sert cette action ?\nNormalement, après avoir modifié le formulaire, Access va mettre à jour les champs correspondants dans les tables liés à ce formulaire. Juste avant de faire cette mise à jour, Access va appeler la macro associée à l’évènement « AvantMAJ ». La macro va être exécutée, puis la mise à jour sera faite. Il faut qu’on annule cette mise à jour, sinon, le message indiquant que la date est vide va être affiché, puis Access va sauvegarder les modifications et sauver dans la table commandes la date vide. L’action\n« AnnulerEvénement » annule la mise à jour qui allait être faite, ainsi, la date vide ne sera pas sauvée.\n9. Affectation de la macro à l'événement\nMaintenant que la macro est créée, on va l'affecter à la macro à l'événement "AvantMAJ" du formulaire "Commandes". Pour afficher les propriétés d'un formulaire, cliquez avec le bouton droit sur le carré noir situé en haut à gauche du formulaire, puis dans le menu, cliquez sur "Propriétés"\n10. Définir la valeur d'un champ dans une macro\n11. Mettre un bouton de commande dans un formulaire\nDans notre formulaire "Bon de commande +", qui contient la commande ainsi que son détail, nous allons ajouter un bouton qui, lorsqu'on cliquera dessus, déclenchera l'impression du bon de commande.\nUn petit peu compliqué pour imprimer un bon de commande ?\nLa macro comporte trois actions, pourquoi ?\n?? Ensuite, on appelle l'action "Imprimer", parmi les paramètres de cette commande, il y a la définition de ce qui a à imprimer : toutes les pages, un groupe, une sélection, … on choisit la sélection.\n12. Ouvrir un formulaire et afficher un enregistrement\nNotez que cette manipulation n’est donnée qu’à titre d’exemple, on peut faire la même beaucoup plus simplement en utilisant l’assistant du bouton de contrôle.\n13. Créer une boite de dialogue\nIl peut être pratique de créer une boîte de dialogue pour répondre à une question par exemple, nous allons créer une boîte de dialogue dans laquelle nous allons entrer un numéro de commande, et qui affichera le formulaire correspondant à cette commande.\n1. Création de la boîte de dialogue\nUne boîte de dialogue est un formulaire standard qui a des propriétés particulières : Dans la fenêtre propriétés du formulaire, cliquez sur l'onglet "Toutes", et mettez la propriété "Fen Indépendante" à oui, "Fen Modale" à oui, "Auto Center" à oui, "Boite Contrôle" à non et "Affich par défaut" à "Mode simple".\nCe qui aura pour effet de créer un formulaire qui sera centré à l'écran, qui n'affichera pas le menu système de windows en haut à gauche et qui n'affichera pas les icones pour se déplacer sur les enregistrements.\nLa liste de choix contient le résultat d'une requête allant chercher les numéros de toutes les commandes.\n2. On crée ensuite la macro\nLa macro est du même type que la précédente, la clause Where ici est :\n[N° Commande]=[Formulaires]![boite]![liste commandes]\noù [N° Commande] est le nom du champ contenant le numéro de commande dans le formulaire "Bond de Commande" et [liste commandes] est le nom de la liste contenant la liste des commandes existantes.\nVoilà, nous avons fait le tour rapidement des fonctionnalités offertes par l'utilisation des macros, on peut, bien sur, pousser plus loin et faire beaucoup d'autres choses avec, à vous d'expérimenter et de trouver d'autres utilisations aux macros.


Kehl (Sundheim) Kaufland Am Sundheimer Fort 9 - BKB Tabak\nVous êtes ici : Accueil1 / Aperçu des sites2 / Kehl (Sundheim) Kaufland Am Sundheimer Fort 9\nTABAC & PRESSE – Filiale Kehl (Sundheim) Kaufland\nDans notre filiale BKB de Kehl (Sundheim), nous vous proposons différents produits à fumer comme des cigarettes, du tabac, des cigares et des accessoires pour fumeurs.\nTABAC & PRESSE – Filiale KAUFLAND\nCourrier électronique :filiale11@bkb-tabak.de\nMo-Sa - 08.00 - 21.00 Uhr\nDans notre filiale BKB Kaufland, nous vous proposons différents produits à fumer comme des cigarettes, du tabac, des cigares et des accessoires pour fumeurs. De plus, nous vendons également des accessoires pour chicha. Des confiseries, des articels cadeaux ainsi qu’un grand choix d’articles de presse font également partie de notre assortiment dans cette filiale. Un service de colis de la Deutsche Post et un point LOTO complètent l’assortiment de celle-ci. Nous nous réjouissons de votre visite !\nA propos de notre magasin Tabac & Presse Kaufland am Sundheimer Fort 9 à Kehl\nDans notre bureau de tabac au Kaufland Kehl, nous vous proposons une large gamme de produits pour fumeurs. Tabac, cigares et cigarettes ainsi que des accessoires pour fumeurs et pour chicha, nous pouvons presque tout vous proposer dans notre succursale. Vous trouverez également un grand choix d’articles de presse, de confiseries et de coffrets cadeaux dans notre succursale se situant dans le Kehler Kaufland. Un service de colis de la Deutsche Post et un point LOTO complètent l’offre de celle-ci. Vous avez d’autres questions ? Alors appelez-nous ou passez simplement à notre bureau de tabac.\nSituation de notre bureau de tabac BKB près du Kaufland Kehl, Sundheimer Fort 9\nJuste à côté du Sundheimer fort, vous nous trouverez au Kaufland à Kehl. Il y a un grand nombre de places de parking à votre disposition. Vous visitez la forteresse « Sundheimer Fort » ? Alors jetez un œil à notre boutique. Vous pouvez également prendre le bus jusqu’à l’arrêt de bus « Sundheim, Rheintalcenter », qui se situe à quelques minutes. Au Kaufland Kehl, nous sommes ouverts pour vous du lundi au samedi de 8h à 21h.


Fermoir Aimanté Interchangeable Hiilos 45 mm Doré x 1 - Elégance de Perles - Accessoires et Bijoux DIY Fermoir Aimanté Interchangeable Hiilos 45 mm Doré x 1 – Elégance de Perles - Accessoires et Bijoux DIY\nSOLDES D'HIVER : -15% sur tout le site. Remise effectuée automatiquement dans le panier. Valable du 20/01 au 16/02/2021 inclus.\nSOLDES D'HIVER : -15% sur tout le site. Remise effectuée automatiquement dans le panier. Valable du 20/01 au 16/02/2021 inclus.Frais de port GRATUIT pour les commandes à partir de 35 € pour la France Métropolitaine, 45 € pour les DOM-TOM et 60 € pour l'étranger\nFermoir Aimanté Interchangeable Hiilos 45 mm Doré x 1\nEntièrement conçu et fabriqué en France ce fermoir Interchangeable vous permettra de glisser et d’enlever tous les liens qui vous font craquer. L'aimant est esthétiquement camouflé à l'intérieur du Fermoir.\nFermoir sans nickel, sans cadmium ni plomb et fabriqué en ABS/PC pour les finitions Doré et Rhodié.\nLes versions Doré et Rhodié sont vernies pour une meilleure durabilité et longévité de votre Fermoir. Les versions couleurs sont teintées dans la masse et donc inaltérable.\nFermoir Compatible avec tous les embouts de 11 mm, 20 mm et 40 mm.