Leçon 21 : Les requêtes : Opérations de base : Création, mise en place des champs, déplacement, suppression, enregistrement, interaction avec les tables

Temps nécessaire pour suivre cette leçon : Un gros quart d'heure

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données ProFormation.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Aperçu de cette leçon

Dans cette leçon, nous allons aborder le 2ème grand objet d'Access : Les requêtes! Vous allez petit à petit vous rendre compte de leur puissance phénoménale: Vous allez pouvoir extraire, trier et calculer vos données qui sont dans vos tables.

Sommaire

  1. Création d'une requête
  2. Ajuster la taille de l'affichage des tables dans la requête
  3. Injection de champs dans une requête
  4. Visualisation du résultat d'une requête
  5. Enregistrement d'une requête
  6. Interaction des données entre les requêtes et les tables
  7. Suppression d'une requête
  8. Ordre des champs dans une requête
  9. Effacement d'un champ dans une requête
  10. Déplacement d'un champ dans une requête

Création d'une requête

Sans plus attendre, nous allons créer notre première requête. Cliquez sur Requête : . Si vous travaillez avec Access 97, regardez les onglets horizontaux, ou il est également écrit "Requêtes", cliquez dessus, c'est pareil.

Cliquez sur le bouton "Nouveau" : . Avec Access 97, ce bouton est situé plus à droite (Utilisateurs d'Access 97, ne vous en faites pas trop, il n'y a pas beaucoup d'endroits ou ça change par rapport avec Access 2000/XP).

Choisissez "Mode Création", et OK :

J'ai vu qu'il y avait des assistant à disposition. On ne les utilise pas ?

Pas tout de suite. Nous allons d'abord voir la structure basique d'une requête, et, bien après, nous utiliserons ces assistants.

Cliquez une fois sur "T_Celebrite", puis sur "Ajouter", et enfin sur "Fermer" (Vous auriez pu cliquer deux fois sur T-Celebrite et ensuite sur Fermer, ce qui revenait au même).

Vous êtes maintenant dans votre requête en mode création : . Vous avez en haut à gauche la représentation de votre table T_Celebrite. Mais elle est incomplète :


Ajuster la taille de l'affichage des tables dans la requête

Voyez ici, nous n'apercevons que les champs Titre, NomClient, Prenom et Domaine... Il y a les autres champs plus bas. Pour les visualiser, vous allez agrandir la petite fenêtre T_Celebrite en cherchant la double flèche, et en la glissant vers le bas : . Le problème est que vous ne pouvez pas descendre très bas... Vous êtes bloqué ici : . Alors, nous allons descendre toute la partie inférieure de la requête : , ce qui va nous donner plus d'espace pour agrandir la table : . Et si ça ne suffit pas, recommencez l'opération de manière à pouvoir visualiser l'ensemble des champs de la table : .


Injection de champs dans une requête

Double-cliquez maintenant sur le champ Prenom : . Vous le copiez ainsi dans la grille du bas : . Cliquez maintenant également deux fois dans NomClient. Vous obtenez maintenant ce résultat dans la grille du bas : . En fait, chaque fois que vous cliquez deux fois sur un champ, il se rajoute à la droite des champs déjà présents.

C'est votre première requête.


Visualisation du résultat d'une requête

Une requête bien stupide puisqu'elle se contente d'extraire deux colonnes/champs (le prénom et le nom) des célébrités, mais une requête quand même ! Pour visualiser le résultat, c'est très simple : C'est la même icone que dans les tables : . Cliquez donc sur cette icone, vous devriez voir apparaître ceci : .

Ce sont simplement les deux colonnes Prénom et Nom qui sont représentées, sans même être triées, simplement dans l'ordre dans lequel elles sont stockées dans la table sous-jacente.

Comment cela se fait-il que l'en-tête des colonnes soit Prénom et Nom, et pas Prenom et NomClient ?

Rappelez-vous : C'est la propriété Légende que nous avons étudié dans les tables, lors de la leçon 4.

Maintenant, pour revenir en mode création, il vous suffit, comme dans les tables, de cliquer sur . Allez-y, revenez en mode création.


Enregistrement d'une requête

Nous allons à présent enregistrer cette requête. Allez dans le menu Fichier/Enregistrer :

Tiens... Il ne demande pas ou on veut enregistrer cette requête ?

Non. Tout comme les tables, les requêtes ne sont pas des fichiers à part, mais des objets au sein même de ProFormation.MDB. Vous avez nommé toutes vos tables en commençant par T_, les requêtes vont donc toutes commencer par R_. Appelez cette requête R_PremierTest et cliquez sur OK.

Quittez cette requête (Fichier/Fermer), ou la petite croix en haut à droite.

Dans la liste des requêtes, vous visualisez maintenant cette seule et unique requête: ("Créer une requête en mode création" et "Créer une requête à l'aide de l'assistant" ne sont pas des requêtes, mais des raccourcis pour créer des requêtes. (Ces 2 assistants ne sont disponibles sous cette forme qu'à partir d'Access 2000).


Interaction des données entre les requêtes et les tables

Et si maintenant, je vais modifier des données dans T_Celebrite, les changements vont se répercuter dans la requête ?

Absolument ! Nous allons d'ailleurs faire le test :

  1. Cliquez sur "Tables", et cliquez 2 fois sur T_Celebrite pour l'ouvrir en mode saisie de données :
  2. Ajoutez 2 "X" à Bonaparte :
  3. Fermez la table
  4. Cliquez sur Requêtes
  5. Cliquez 2 fois sur votre requête R_PremierTest pour l'ouvrir en mode saisie de données :
  6. Constatez que Bonaparte s'est bien transformé en BonaparteXX :
  7. Restez dans la requête, et cette fois, remplacez BonaparteXX Par Bonaparte YY
  8. Quittez la requête, et retournez dans la table T_Celebrite : Vous constaterez que maintenant, c'est BonaparteYY qui est indiqué ! Bien, profitez que vous êtes dans la table pour enlever purement et simplement les 2 YY de Bonaparte, histoire d'avoir à nouveau un nom correct.

OK OK OK ! Il y a une totale interaction entre les tables et les requêtes !
Je change dans la table - ça change dans la requête...
Je supprime un enregistrement dans la table, ça le supprime dans la requête, et inversement : Tout ce que je fais dans la requête est reporté dans la table !!! C'est génial, c'est totalement dynamique !

Oui. En fait, la requête n'est qu'un filtre sur la table. La requête en elle-même ne contient aucune donnée... Si vous supprimez la table T_Celebrite, vous perdez toutes vos données, mais si vous supprimez R_Premier Test,. vous n'en perdez aucune ! C'est juste un filtre !

Si vous regardez les étoiles avec une longue-vue, et que vous détruisez la longue vue, les étoiles n'ont pas disparu pour autant ! Eh bien, la requête, c'est comme une longue vue : C'est un filtre, une manière de regarder la table. Rien d'autre. Ici, le filtre est simplement : "Voir les prénoms et les noms".


Suppression d'une requête

Essayez : Supprimez carrément la requête R_PremierTest (Cliquez simplement sur R_PremierTest, et appuyez sur DEL de votre clavier , puis répondez oui : )

La requête a disparu, mais regardez les tables, et vous pouvez toujours cliquer deux fois dans T_Celebrite pour constater que tout est bien là. Vous saisissez ?

Oui, oui, je crois que j'ai bien compris : La requête est juste un filtre, mais les données sont toujours stockées bien au chaud, dans l'étable

Je vois que vous avez de l'humour. En effet, quoi qu'il arrive, les données restent toujours dans les différentes tables, et nulle part ailleurs.

Pour mieux illustrer ce concept, nous allons faire une petite expérience amusante :

  1. Créez une nouvelle requête (revoyez le mode d'emploi en haut de cette page si vous avez oublié)
  2. Basez cette requête sur T_Celebrite (comme la dernière fois)
  3. Demandez le champ Prenom et NomClient (Aussi comme la dernière fois)
  4. Lancez cette requête en mode saisie de données
  5. Ajoutez ABC à Bonaparte :
  6. Quittez cette requête avec Fichier/Fermer
  7. A la question , répondez NON

Bien. A votre avis, dans T_Celebrite, y a-t-il Bonaparte, ou BonaparteABC ?

C'est une colle ça ! Je suppose que c'est toujours Bonaparte puisqu'on n'a pas enregistré la requête...

Ah ... Pourtant, dans les tables, nous avons clairement vu que les enregistrements se sauvegardent automatiquement, et que c'est juste la structure des tables qu'il est nécessaire d'enregistrer manuellement...

Oui, c'est vrai, alors, c'est BonaparteABC qui est dans la table ?

Je ne sais pas, qu'est ce que vous en pensez ?

Je ne sais plus...

Allez voir dans la table.

Ah oui ! Effectivement, c'est BonaparteABC... C'est troublant quand même...

Encore une fois, une requête n'est qu'un filtre. Pour que vous compreniez parfaitement bien la manière de fonctionner des requêtes, je vais vous faire un parallèle avec la vie réelle :

Dans Access Dans la vie réelle
Je crée une nouvelle requête (Je crée un nouveau filtre) Je chausse une paire de lunettes de soleil avec des verres teintés en jaune (Je met un filtre sur mes yeux)
Dans cette requête, je change Bonaparte en BonaparteABC (Je change les données) Avec ma paire de lunettes jaune, je plante un clou dans un mur (Je change mon environnement)
Je quitte la requête, et je ne l'enregistrement pas (Je détruit mon filtre) Je jette mes lunettes par terre et je les écrase (Je détruit mon filtre également)
Est-ce que les données ont été modifiées dans la table : OUI Est-ce que le clou est toujours planté dans le mur : OUI (C'est franchement évident ici...)

Cette fois c'est clair ! En fait, il ne faut ABSOLUMENT pas croire qu'on peut faire tout ce qu'on veut dans une requête en croyant être hors des tables !

Exactement. Bien, maintenant, nous allons voir comment gérer un peu mieux les éléments de notre requête :

Créez une nouvelle requête, en mode création, basée sur T_Celebrite (Vous savez comment faire maintenant). Placez les champ Prenom, Domaine et PaysOrigine :


Ordre des champs dans une requête

Si par exemple, maintenant, je voulais poser le champ NomClient entre Prenom et Domaine, comment faire ?

Cliquez sur le champ NomClient dans votre liste de champs, et vous le faites glisser jusque SUR le champ Domaine que vous avez mis en bas dans la grille (Donc vous cliquez sur NomClient, vous laissez le doigt appuyé sur le bouton gauche de la souris, et vous vous déplacez jusque sur le mot Domaine, dans la grille en bas) : . Vous devriez obtenir le résultat suivant : .


Effacement d'un champ dans une requête

Et si maintenant, je voulais effacer la colonne Domaine ?

Vous cliquez juste au dessus de Domaine, dans la grille (Votre souris devient une grosse flèche noire) Et vous appuyez sur DEL (Suppr) de votre clavier : . La colonne Domaine a disparu. (Vous savez comment faire pour la remettre maintenant)

Et si je voulais changer l'ordre des colonnes : Par exemple, je voudrais que Prenom se trouve plutôt à droite de nom, comme ceci : ?

Vous pouvez toujours effacer NomClient, et ensuite le faire reglisser depuis votre table jusque sur PaysOrigine, pour qu'il s'insère entre Prenom et PaysOrigine


Déplacement d'un champ dans une requête

Oui, c'est ce que nous avons vu un peu plus haut. Mais ça fait 2 opérations. On ne peut pas simplement le déplacer horizontalement sur la grille du bas ?

Si. Mais attention, il faut suivre scrupuleusement les instructions :

Cliquez juste au-dessus de Prenom (la souris se transforme en flèche noire) : , et dès que vous lachez le bouton de la souris, la colonne devient noire : . Maintenant, au même endroit, votre souris, n'est plus une flèche verticale noire, mais est redevenue une flèche normale : . Vous allez cliquer a nouveau exactement à cet endroit (donc juste au dessus de Prenom, comme dans le dessin), vous ne lachez PAS le bouton gauche de la souris, et vous faites glisser la souris vers la droite. Vous voyez alors une sorte de petit rectangle grisé qui accompagne votre souris : . Vous allez continuer à déplacer ainsi votre souris jusqu'à ce que vous vous trouviez entre NomClient et PaysOrigine. A ce moment, vous remarquerez une grosse ligne noire au milieu des 2 colonnes : C'est à ce moment que vous lâcherez votre souris. Voilà : vos colonnes se sont interverties:

Bon... Hem... On peut résumer ?

La requête est un filtre. Bon, ici, nous n'avons pas filtré grand chose : Nous nous sommes contentés de placer quelques colonnes en provenance de T_Celebrite.
Nous avons vu que nous pouvons choisir quelles colonnes nous désirons, et nous pouvons à tout moment en ajouter, les supprimer ou les déplacer. Comme dans les tables, les requêtes sont pourvues d'un mode création et un mode saisie de données.
Si nous détruisons une requête, ça n'affecte pas du tout les tables, ni les données qu'elles contiennent, par contre, toute modification des DONNEES effectuées dans les requêtes sera immédiatement répercutée dans les tables correspondantes, et vice-versa : Toute modification des données, suppression ou ajout de données dans les tables affectera les requêtes basées sur cette même table.

Avez-vous bien compris ?

  1. Je crée une requête basée sur T_Celebrite. Dans cette requête, je place juste le champ NomClient. Je recherche Chirac, et je le remplace par Chirak :
    a. La table T_Celebrite contient toujours Chirac
    b. La table T_Celebrite Contient maintenant Chirak ***
    c. Pour que la table T_Celebrite contienne Chirak, il faut que la requête soit enregistrée
    d.
    Cette question n'a pas de sens si on ne travaille pas en réseau

  2. Je crée une requête basée sur T_Celebrite. Dans cette requête, je place juste le champ NomClient, je sauvegarde cette requête sous le nom "R_Exercice". Ensuite j'efface cette requête
    a. La table T_Celebrite n'a pas changé ***
    b. La table T_Celebrite a maintenant perdu le champ NomClient
    c. Il est simplement impossible d'effacer une requête si elle est basée sur une table existante

  3. Je crée une requête basée sur T_Celebrite. Dans cette requête, je place juste le champ NomClient, je sauvegarde cette requête sous le nom "R_Exercice". Je recherche Chirac, et je l'efface carrément (donc en cliquant bien à gauche dans la marge, et en appuyant sur Delete, et en confirmant la suppression de l'enregistrement)
    a. On ne peut pas effacer d'enregistrement dans une requête
    b. Ca efface l'enregistrement Chirac dans la requête mais pas dans la table
    c. Ca efface spontanément l'enregistrement Chirac dans la table également ***
    d. Dans la table, nous aurons maintenant un enregistrement dont tous les champs sont remplis, mais ou le nom sera vide

  4. Puis-je avoir 2 fois le même champ côte à côte dans une requête (Par exemple 2 fois le prénom côte à côte) (Essayez pour le savoir)
    a. Oui *** (Mais il écrit Expr1 en titre de colonne pour le 2ème Prenom)
    b. Non

  5. A quoi sert la petite étoile * qu'il y a juste au dessus de Titre, dans une requête basée sur T_Celebrite ? (Essayez de la mettre dans la grille du bas pour voir)
    a. On ne peut pas la déplacer
    b. Elle représente tous les champs à la fois ***
    c. Elle ne fait rien de spécial dans ce contexte

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Exercice

Pour cet exercice, vous n'aurez pas besoin de créer une nouvelle base de données. Vous allez directement travailler dans ProFormation.MDB

  1. Créez une nouvelle requête basée sur T_Celebrite
  2. Placez y les champs Remarque, DateNaissance et SalaireMensuel
  3. Ajoutez le champ Prenom entre DateNaissance et SalaireMensuel
  4. Déplacez SalaireMensuel pour qu'il soit en première position
  5. Supprimez le champ Remarque
  6. Ajoutez le champ EtatCivil pour qu'il soit en première position
    Vous devriez avoir l'ordre suivant :
  7. Lancez la requête en mode saisie de données
  8. Enregistrez-là sous le nom R_Test
  9. Précisez que le salaire de Napoléon est de 5'140 francs
  10. Fermez la requête
  11. Supprimez cette requête R_Test
  12. Créez une nouvelle requête basée sur T_Celebrite
  13. Placez-y les champs Prenom et SalaireMensuel
  14. Définissez le salaire de Napoléon à 9'500 francs au lieu de 5'140
  15. Quittez la requête mais ne l'enregistrez PAS
  16. Quittez la table T_Celebrite

Il n'y a pas de téléchargement de solution. Au final vous ne devriez plus avoir aucune requête, et Napoléon devrait avoir son salaire à 9500.

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de ProFormation.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Avez-vous une question technique concernant cette leçon ? Cliquez ici !
Une remarque sur cette leçon ? Un problème ? Une erreur ? une ambiguité ? Soyez gentil de m'en informer