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
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. |
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, mais ce que je vais vous montrer, c'est comment le réinitialiser à 1 !
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
?
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 ?
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 ?
Il existe plusieurs astuces pour arriver à ce résultat. Je vous livre la plus "barbare" :
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.
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.
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.
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é...
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 ?
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 :
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é.
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 :
.
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 :
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.
Oui. Essayez : Modifiez la requête comme suit : .
ce qui donne :
.
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...
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. |
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. |
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 ! |
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