Leçon 60 : Compactage, Gestion des NuméroAuto, Requêtes Regroupement

Temps nécessaire pour suivre cette leçon : Environ une 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 continuer ce que nous avons commencé la fois passée : à savoir la création d'une table T_Employe qui va regrouper tous les employés de l'entreprise pour laquelle vous êtes responsable des formations.

Sommaire

  1. Le compactage et les trous dans les NuméroAuto
  2. Faire commencer un NuméroAuto par autre chose que 0
  3. Effets et but du compactage d'une base de données, paradoxe du changement de taille des bases de données
  4. Requête de type Regroupement
  5. Requête de type regroupement qui devient une requête action de type Ajout
  6. La fonction Compte dans le cadre d'une requête Regroupement
  7. La fonction Somme dans le cadre d'une requête Regroupement
  8. Les fonctions Min et Max dans le cadre d'une requête Regroupement
  9. Changement des titres de champs dans les requêtes regroupement

Actuellement, nous avons deux problèmes avec cette importation : D'une part il y a des répétitions du même élève plusieurs fois : Si vous triez votre T_Employe par ordre alphabétique du nom, vous le constatez. Bon c'est vrai que la fois passée, nous avons exécuté notre requête ajout 2 fois de suite, ce qui a doublé les entrées, mais même sans ça, il y avait plusieurs occurrences des mêmes élèves, ce qui est normal, puisqu'un même élève peut suivre plusieurs cours.

Et d'autre part, nous avons toujours le problème des noms et des prénoms qui sont dans un seul champ, et qu'on arrive pas à séparer...

Mais revenons à notre premier problème : L'apparition de plusieurs occurrences du même élève. Pour commencer, effacez tous les enregistrements de T_Employe (Vous les sélectionnez tous en noir en cliquant ici , et appuyez sur la touche DELETE de votre clavier). ATTENTION : Car évidemment, si vous vous rappelez de la leçon 13 sur les NuméroAuto, si vous rentrez maintenant un nouvel enregistrement, il ne va pas être le numéro 1, mais bien le .. 31 : .

Oui, effectivement, c'est normal...

Oui, mais ce que je vais vous montrer, c'est comment le réinitialiser à 1 !

Ben je n'ai qu'à supprimer le champ IDEmploye, et le recréer...

Oui, c'est vrai. Mais l'astuce que je vais vous proposer est plus subtile : ajoutez les enregistrements suivants dans T_Employe :

Maintenant, supprimez André, Charles et Daniel, comme ceci : . Si maintenant vous ajoutez un nouvel enregistrement, quel numéro aura-t-il ?


Le compactage et les trous dans les NuméroAuto

Le 36 ?

Oui. Le 36. Alors moi, ce que je vais vous proposer, c'est une astuce pour que le prochain enregistrement ne soit pas le 36, mais le 34, soit le numéro le plus proche du plus élevé, mais sans renuméroter les enregistrements déjà existants (Truc Machin et Bernard garderont leur numéro).

Fermez la table, et allez dans le menu Outils/Utilitaire de bases de données/Compacter une base de données. Ensuite revenez dans T_Employe, et ajoutez Eugène : Il a NORMALEMENT le numéro 34, MAIS j'ai constaté que suivant l'ordinateur sur lequel je suis, ça ne MARCHE PAS. Donc, s'il vous donne le numéro 36, c'est que c'est votre cas. J'en ignore la raison... J'avais pensé que c'était selon la version d'Access, mais l'erreur à l'air plus compliquée que ça.

Toujours est-il que si ça marche, comment pourrait-on faire pour revenir au numéro 1 ?

On efface tous les engeristrements, et on demande un compactage ?

C'est ça. Faites-le : Effacez tous les enregistrements de T_Employe, Compactez la base de données, rouvrez T_Employe, et réinstallez Alice : . Elle a normalement le numéro 1.

Cette astuce de compactage a une très grand utilité pendant les tests : Lors du développement d'une base de données, vous aurez certainement à entrer des données de tests dans vos différentes tables. Certaines tables auront donc un NuméroAuto qui va s'incrémenter inutilement. Alors, juste avant d'utiliser réellement votre base de données une fois finalisée (On dit "Mettre en production"), vous compactez la base de données, et HOP ! Tous les NuméroAuto de toutes vos tables reviennent à 1, ce qui parait plus propre, non ?


Faire commencer un NuméroAuto par autre chose que 0

Oui, c'est pas mal du tout ! Et si je voulais faire commencer mon NuméroAuto par autre chose que par 1... Par exemple par 1000 ?

Il existe plusieurs astuces pour arriver à ce résultat. Je vous livre la plus "barbare" :

  1. Créez 10 enregistrements idiots, comme ceci :
  2. Sélectionnez les en noir :
  3. Allez dans le menu Edition/Copier
  4. Allez dans le menu Edition/Coller par ajout

Vous voici avec 20 enregistrements. Sélectionnez ces 20 enregistrements en noir, et recommencez : Edition/Copier, Edition/Coller par ajout, et en voilà 40. Recommencez encore une fois la même chose, et vous en aurez 80, puis 160, puis 320, puis 640. Si vous doublez encore 640, vous aurez 1280, ce qui est trop. Alors, simplement, vous sélectionnez 1000-640-1 enregistrements (359 premières lignes), et à nouveau Edition/Copier, Edition/Coller par ajout. Vous avez alors normalement 999 enregistrements : . Maintenant c'est simple : Vous effacez tous les enregistrements d'un coup, et donc, le prochain enregistrements sera le ... 1000 !

Mais dans notre cas, il s'agit deffecaer toute la table, et d'avoir le prochain NuméroAuto à 1. Vous savez comment faire maintenant.


Effets et but du compactage d'une base de données, paradoxe du changement de taille des bases de données

D'accord ! C'est donc à ça que sert le compactage ! Nous revenons à notre problème d'insérer une seule occurrence de chaque élève dans notre T_Employe toute vide, toute neuve maintenant ?

Oui, mais avant ça je termine mon explication sur le compactage. Parce qu'en fait, le compactage, c'est bien plus que ça. Faisons une expérience intéressante : Fermez votre T-Employe, et allez dans le menu Fichier/Ouvrir, et regardez la taille de votre base de données (Elle peut-être différente de la mienne). Demandez l'affichage des détails pour voir les tailles : . Dans mon cas, ma base de données mesure . Bon, cliquez sur Annuler, tout ce qu'on voulait, c'était voir la taille.

Maintenant, vous allez importer une table qui contient pas mal de données... Tiens ben, notre bonne vieille T_Celebrite fera l'affaire ! Importez-là dans votre base de données actuelle (ou importez une autre table de votre cru, ce n'est pas important, c'est juste pour faire grossir notre base). La leçon 18 vous rappellera comment on fait.

La table T_Celebrite se trouve par exemple dans Cette base de données que vous pouvez télécharger.

Une fois cette table importée, retournez dans le menu Fichier/Ouvrir, et constatez qu'évidemment elle a grossi : . La mienne est passée de 156 à 316 Ko... Soit le double !

Mais attention : Plus plus paradoxal arrive ! Effacez purement et simplement T_Celebrite de votre base ! Pas ses enregistrements mais carrément la table (Cliquez dessus, et DELETE). Et allez encore une fois dans Fichier/Ouvrir : . Non seulement la base n'est pas revenue à sa taille d'origine (156 Ko), mais elle a CARREMENT augmenté encore de 8 Ko : 324 Ko.

C'est dingue, ça !!!

Oui. Ce qu'il faut savoir, c'est qu'Access fonctionne un peu comme un gamin dans sa chambre : Il sort tous les jouets des armoires, et il ne range rien... Ce qui fait qu'on dirait qu'il a besoin de plus en plus de place, et même s'il range, il le fait tellement mal que ça prend encore plus de place que quand il jouait... Alors, il ne faut pas passer un rouleau compresseur sur tous ses jouets, mais il faut ranger bien tout dans ses armoires. Une fois que tout est rangé, non seulement ça prend moins de place, mais l'enfant ira plus vite encore pour ressortir les jeux, vu que c'est tout bien rangé. C'est donc tout bénéfice.

Ce rangement, dans Access, nous l'appelons Compactage !

Ainsi, allez dans le menu Outils/Utilitaires de bases de données/Compacter une base de données, et allez ensuie encore une fois dans le menu Fichier/Ouvrir : . Surprise ! La base de données est maintenant plus petite que jamais ! Au début elle faisait 156, après elle est apssée à 316, puis 324, et maintenant : Régime : 152 Ko ! Et en plus elle est théoriquement plus rapide (en plus !)

Et donc, l'effet secondaire du compactage est la réinitialisation des NuméroAuto, comme nous l'avons vu plus haut.

Mias alors... On pourrait se demander pourquoi Access ne compacte pas automatiquement les bases de données régulièrement automatiquement... Pourquoi doit-on le faire manuellement ?

Parce que si vous avez une grosse base de données (Style 500 Mo), il va mettre peut être plusieurs minutes à la compacter... Et je ne suis pas sûr que vous soyez très content de ce temps d'attente qui vous est imposé...

OK. Compris ! Nous revenons à notre problème ?


Requête de type Regroupement

Oui. Pour obtenir une seule occurrence de chaque personne qui a suivi un cours, nous allons utiliser un nouveau type de requête. Demandez une nouvelle requête basée sur T_CoursDetail, avec juste le champ IdentiteEleve : . Cette requête, vous le savez, va fournir la liste de tous les élèves en plusieurs exemplaires. Mais mai ntenant, cliquez sur . Ca fait apparaître une ligne en plus : (Si vous recliquez sur , ça l'enlève). Et ça suffit : Lancez la requête : . Voilà ! Un seul exemplaire de chaque personne ! Et vous savez ce que nous allons faire maintenant ?


Requête de type regroupement qui devient une requête action de type Ajout

On va transformer cette requête en requête Ajout : pour injecter ces élèves dans T_Employe !!!

EX-AC-TE-MENT ! Eh bien allez-y, faites-le : Transfromez cette requête en requête Ajout dans T_Employe (Injectez le champ IdentiteEleve dans NomEmploye), et exécutez là ! Revoyez la leçon 59 si vous avez des doutes. Fermez ensuite cette requête et appelez-là R_InjectionEleve, et allez constater de visu que la table T_Employe contient bien 10 élèves uniques : Chez moi, c'est bien le cas :

Y'a pas a dire, il est fort, cet Access !

Oui. Encore que nous n'avons pas encore réglé le problème des noms et des prénoms qui sont dans un seul champ.

A part ça, j'aimerais bien vous montrer un peu plus en détail les possibilités de la requêtes regroupement, puisque nous en avons parlé.


La fonction Compte dans le cadre d'une requête Regroupement

Pour la tester, vous allez encore importer T_Celebrite (Eh oui, on en fait de l'exercice ! - Vous pouvez récupérer la table T_Celebrite dans cette base de données), et vous allez créer une nouvelle requête basée sur T_Celebrite, et vous allez cliquer sur pour la transformer en requête regroupement : . Lancez-là : Un seul exemplaire de chaque domaine est affiché : . Mais nous pouvons faire mieux ! Afficher dans une 2ème colonne le nombre de personnes par domaine. Pour ce faire, placez à nouveau dans une 2ème colonne le Domaine, et choisissez Compte à la place de Regroupement : . Le résultat est éloquent : .

 

D'accord ! Et on pourrait avoir par exemple la somme des salaires par domaine ?


La fonction Somme dans le cadre d'une requête Regroupement

Oui. D'abord, Enregistrez cette requête sous R_CelebriteComptageDomaine, et ne la fermez pas. Choisissez maintenant SalaireMensuel à la place de Domaine dans la 2ème colonne : , et Somme à la place de regroupement : . Lancez la requête :

Ca me fait un peu penser aux états avec regroupements, comme on les a vu par exemple à la leçon 52, non ?

Oui, ça ressemble. sauf que l'état est nettement plus souple : Par exemple, dans les en-têtes et pieds de groupe et d'état, vous pouvez avoir des sommes totales : Chose que vous ne pouvez pas avoir ici. En fait on n'utilise pas les états et les requêtes regroupement pour les mêmes raisons : Les états, c'est vraiment pour la visualisation, ici, nous avons fait une requête Regroupement un peu avant pour transférer une seule occurrence de chaque élève dans T_Employe. Votre expérience personnelle vous dictera d'utiliser plutôt un état ou une requête... Ca varie vraiment selon les cas.

Allez dans le menu fichier/Enregistrer SOUS, et donnez le nom : R_CelebriteGroupeDomaineSommeSalaire.


Les fonctions Min et Max dans le cadre d'une requête Regroupement

OK. Et donc, je suppose que je peux avoir par exemple un groupe par Pays, avec le salaire moyen, à côté le plus haut, et encore à côté le plus bas...

Oui. Essayez : Modifiez la requête comme suit : . ce qui donne : .


Changement des titres de champs dans les requêtes regroupement

C'est pas très joli les en-têtes de colonne... On ne pourrait pas écrire plutôt La moyenne, le plus petit, le plus élevé ?

Si. Revoyez la leçon 28 pour vous rappeler comment on fait. Autrement, voici comment il faut faire : .

Bien entendu, comme vous pourriez vous en douter, on ne peut absolument rien modifier en mode saisie de données d'une requête Regroupement, puisque chaque ligne de la requête représente plusieurs lignes de la table à la fois. Si malgré tout vous essayez de faire une modification (comme par exemple essayer de préciser que la moyenne salariale de la Belgique est de 2000 à la place de 1800), vous aurez une erreur dans la barre d'état : . Access ne dit pas simplement "Impossible de mettre à jour cette requête - ou cet enregistrement"... Trop simple ;-). Un RecordSet est littéralement un "ensemble d'enregistrements". Ici, c'est un enemble d'un seul enregistrement. Sachez simplement à l'avenir ce qu'Access entend par RecordSet...

Nous allons nous arrêter là. Allez dans le menu fichier/Enregistrer SOUS, et donnez le nom : R_CelebriteStatSalaireParPays.

Oui, je sais, nous n'avons toujours pas réglé le problème du nom et du prénom qui cohabitent dans un seul champ...

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

Nous avons vu dans cette leçon que le compactage permet de réduire fortement la taille de vos bases de données. L'effet secondaire du compactage est qu'il réinitialise les NuméroAuto dans la mesure du possible.
Nous avons ensuite abordé les requêtes de type Regroupement, qui permettent d'obtenir une seule occurrence de chaque enregistrement identique. La requête regroupement permet en outre d'obtenir des sous-totaux, eu peu à la manière des groupes dans les états, mais en un peu moins puissant. Nous avons enfin transformé notre requête regroupement en requête Ajout pour remplir automatiquement T_Employe avec un seul exemplaire de chaque élève qui a suivi au moins un cours.

Avez-vous bien compris ?

  1. La requête regroupement est une requête de type
    a. Action
    b. Visualisation (ou sélection) ***

  2. On peut compacter :
    a. Une base de données ***
    b. Une table
    c. Une requête
    d. Un état

  3. Le compactage d'une base de données permet :
    a. D'accélérer son focntionnement
    b. De réduire sa taille
    c. De réduire sataille en accélérant son fonctionnement ***
    d. De réduire sa taille, mais elle sera plus lente

  4. Est-il possible de modifier le contenu des enregistrements d'une requête de type regroupement ?
    a. Bien sûr puisque comme toute requête, elle est basée sur une table
    b. Non car c'est une requête de type action
    c. Non car chaque ligne de la requête représente à la fois plusieurs enregistrements d'une même table ***
    d. Seulement si on demande une requête de type "Regroupement Dynamique"

  5. J'ai une table T_Client avec un seul champ Prenom, et 4 enregistrements : André, Paul, Jean et Jean-Paul. Je crée une requête toute simple, mais de type Regroupement sur cette table avec le champ prenom,. Combien d'enregistrements la requête regroupement va-t-elle me renvoyer ?
    a. 0
    b. 1
    c. 3
    d. 4 *** (Oui, pusique tous les enregistrements sont différents, il ne pourra rien grouper)

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

L'exercice consiste à créer une base de données NotesExamen.MDB, avec une seule table : T_Resultat, qui va contenir 3 champs : Eleve, NoExa et Note, et les 12 enregistrements suivants :

Il s'agit d'une classe de quatre élèves qui ont subi chacun 3 examens. Il s'agit maintenant de comparer les résultats !

Astuce : Si vous ne voulez pas recopier à la main les données, téléchargez déjà la solution, et importez simplement ensuite T_Eleve dans votre base de données NotesExamen.MDB.

Ensuite, vous allez créer une requête de type regroupement, qui va permettre de visualiser synthétiquement les notes des élèves, comme ceci :

Attention : La dernière colonne (Pourcentage) est un calcul qui n'est pas absolument évident. A vous de voir comment vous allez faire pour obtenir ce pourcentage... (Par exemple Jean à eu un total de 30 points pour les 3 examens, soit 30 sur un total maximum de 60 puisque chaque examen est noté sur 20. Il a donc... 50% de bonnes réponses, d'ou le chiffre 50 dans la dernière colonne)

Remarquez enfin que le tableau est trié sur le total cumulé, du meilleur au moins bon.

Enregistrez cette requête sous R_StatNote.

Remarque : Si vous ne créez qu'une seule requête (comme demandé d'ailleurs) R_StatNote, avec les tous les calculs (PlusBasse, PlusHaute, LaMoyenne, TotalCumule et Pourcentage), Access va vous demander "D'entrer la valeur du paramètre". Pour remédier à cet état de fait, créez d'abord R_StatNote avec tous les calculs SAUF le dernier calcul des pourcentages. Créez ensuite une 2ème requête R_StatNote2, basée sur R_StatNote, dans laquelle vous mettrez le champ élève et tous les champs calculés, et seulement dans cette requête, calculez le pourcentage. Cette fois il ne vous ennuie plus !

Téléchargez la solution de l'exercice ici

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