Leçon 47 : Etats : Groupes sur des champs uniques

Temps nécessaire pour suivre cette leçon : Une vingtaine à une quarantaine de minutes

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 avec les groupes, mais cette fois, nous allons voir que, contrairement à ce que j'avais prétendu, il est possible de faire des regroupements sur des champs uniques (Comme le nom, le prénom ou encore la date de naissance).

Sommaire

  1. Création d'un état groupé par année de naissance
  2. Groupe par les premières lettres d'un texte
  3. Astuce pour faire apparaître les initiales même si aucune donnée ne commence par ces lettres

C'est bizarre ce que vous dites, parce que effectivement, j'ai bien compris que les groupes ne peuvent s'appliquer qu'à des champs qui se répètent, autrement, il n'y a pas vraiment d'intérêt... Autant ne pas faire de groupes !

Justement. Imaginons que nous voulions faire un état groupé par date de naissance !

C'est idiot : Il n'y aura qu'une personne par groupe, a moins que par miracle, deux personnes soient nées le même jour... C'est aussi idiot que de grouper par nom !


Création d'un état groupé par année de naissance

Ah oui... MAIS... Que penseriez-vous de grouper les gens non pas par date de naissance, mais par ANNEE de naissance !

Ca, ce serait bien, mais il va falloir un champ dans la table T_Celebrite "Année de naissance", non ?

Eh bien non ! L'assistant état va être assez malin pour récupérer l'année de naissance dans chaque date de naissance, pour justement grouper les gens par année.

Je suis impatient de voir ça !

Demandez un état/Nouveau/Assistant état, basé sur T_Celebrite, cliquez sur suivant, sélectionnez le nom, le prénom et la date de naissance. Vous savez faire ça je suppose ?

Oui ! Autrement, je n'ai qu'à refaire la leçon 44 si j'ai besoin de me rafraîchir la mémoire.

A ce tableau, demandez le groupe par DateNaissance : . En bas gauche, il y a un bouton . Cliquez dessus : Choisissez dans la liste "Année", et cliquez sur OK : . Maintenant, il montre bien qu'il va grouper par année, et CA, c'est un groupe digne de ce nom ! : . Constatez que j'ai encadré en rouge le groupe de date de naissance PAR ANNEE, et j'ai souligné en rouge la date de naissance qui est restée dans la liste des champs (NomClient, Prenom, DateNaissance)

Comme on va grouper par année, ce serait bien de voir la date de naissance précise pour chaque personne, non ?

Vous réfléchissez bien ! Cliquez sur suivant, et triez par date de naissance, cette fois :

Ca va servir à quoi ?

Comme on va avoir plein de gens pour chaque année, ce serait bien de les afficher triés du plus jeune au plus vieux.

Cliquez sur Suivant, Demandez une présentation Bloc,

encore Suivant, demandez une présentation Société, Suivant, donnez comme nom E_CelebriteGroupeParAnnee, et Terminer. Voici un extrait de la première page :

C'est génial, mais c'est juste un peu bête d'avoir ces premières personnes qui n'ont pas de date de naissance..

Si on ne voulait pas qu'elles s'affichent, nous aurions simplement construit une requête basée sur T_Celebrite qui contient l'année de naissance, le nom et le prénom, et comme critère de Année de naissance, on aurait écrit "Pas Null", et c'est aussi simple que ça

Je n'y pense jamais à ces requêtes !

Sur la 2ème page, constatez qu'il y a pas mal de gens nés en 1950 et, comme nous l'avons demandé (), elles sont bien triées de la personne la plus jeune à la plus âgées (Janvier à décembre):


Groupe par les premières lettres d'un texte

Avec les dates de naissance, je comprend.
Mais vous avez dit en début de leçon qu'on pouvait également grouper par Nom ? Comment cela se passe-t-il cette fois ?

C'est simplement par la ou les premières lettres du nom que nous allons grouper.
Par exemple, tous les gens qui commencent par A, puis tous les gens qui commencent par B, etc.

Faisons ça. Fermez votre état.

Demandez un nouvel état, avec assistant, basé sur T_Celebrite, avec simplement le champ Prenom et NomClient. Groupez par le nom : . Vous constatez que dans la partie de gauche il ne reste plus rien (le champ prénom est maintenant à droite). Cliquez sur

Ah oui, facile : , et je clique sur OK.

Exactement.

Et si on avait choisi 2 lettres initiales ?

Il aurait groupé par les 2 premières lettres : Tous les gens qui commencent par AA, pui AB, puis AC ... Puis BA, puis BB, etc.

Ici, ce n'est pas une bonne idée. Mais si nous avions eu une liste de produits avec des numéros de ce style :

LEG01 - Poireau
FRU01 - Abricots
DES01 - Crème
FRU02 - Pommes
FRU03 - Oranges
DES02 - Gateau
LEG01 - Poireau
LEG01 - Pommes de terre

Les 3 premières lettres du code sont représentatives. On pourrait alors grouper avec les "3 lettres initiales", pour obtenir un état qui ressemblerait à ceci :

FRU
  FRU01 - Abricots
  FRU02 - Pommes
  FRU03 - Oranges

DES
  DES01 - Crème
  DES02 - Gateau

LEG
  LEG01 - Poireau
  LEG01 - Pommes de terre

Dans notre cas, on a pas beaucoup de monde, ce serait un peu nul !

Oui, laissez donc une seule lettre de regroupement Cliquez donc sur OK :

Cliquez sur Suivant, triez par Nom, demandez une perésentation "Echelonné", cliquez sur Suivant, choisissez "Informel", Suivant, appelez votre état E_CelebriteGroupeAlphabetique, et Terminer.

C'est très chouette comme présentation !

Il y a malgré tout quelques imperfections, comme par exemple tout au début une erreur :

Parce que Loana n'a pas de nom de famille, c'est ça ?

Exactement, il n'a pas digéré ce fait. Ceci dit, ce n'est pas très normal non plus d'avoir des clients sans nom !!!

A la dernière page, il y a des initiales non utilisées :


Astuce pour faire apparaître les initiales même si aucune donnée ne commence par ces lettres

Pourrait-on faire apparaître ces lettres même s'il n'y a personne dedans ?

Là tout de suite, non. Il faudra attendre de voir des techniques plus avancées pour ça... Eh oui, Access se laisse dompter jusqu'à un certain point.. Dès que vous désirez des fonctions qui ne sont pas directement prévues, c'est tout de suite un gros travail d'investigation technique!

Quoique dans ce cas précis, c'est simple, je vais dans la table, et je crée les clients suivants : , ce qui fait que quand je relance mon état, j'obtiens cet affichage sur la dernière page : . Vous voyez que je suis malin !

Effectivement, vous avez un tout bel état, c'est vrai. Mais avez vous pensé aux conséquences ? (Qu'on appelle également "Effets de bord").

Vous avez maintenant 4 clients de plus que prévu, ce qui va paraître bizarre, et dans tous les formulaires, dans toutes les rquêtes et dans tous les autres états, vous aurez sans arrêt ces 4 "clients parasites" qui vont venir s'afficher au milieu de tout le monde alors qu'on en a pas besoin ailleurs que dans ce cas précis

Eh bien, je crée mes 4 clients bidons juste avant de lancer l'état, et je les efface juste après, et voilà tout !

Ah oui ? Et si vous lancez l'état 10 fois par jour, vous allez faire ce travail 10 fois par jour ?

Vous allez vite en avoir marre !

D'autant plus que vous risquez bien une fois ou l'autre d'oublier de les enlever !

Ah ce sont des choses auxquelles on ne pense pas... Je pensais avoir trouvé LA solution, et voilà que vous me cassez la baraque !

Mais non, séchez vos larmes ! La conception Access, ça ne s'apprend pas comme le patin à roulettes. Nous y reviendrons. La leçon est terminée, fermez votre état, et surtout, si vous avez fait l'expérience d'ajouter les 4 clients bidons, retirez-les.

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

Les groupes dans les états s'effectuent traditionnellement sur des champs répétitifs, tels que le pays ou le domaine, mais ce n'est pas une règle absolue : il est possible de grouper par des champs uniques, mais dans ce cas, il faut trouver des points de regroupement : Comme l'année de naissance, ou la ou les premières lettres du nom ou du prénom. Ces options se conçoivent lors de l'exécution de l'assistant état ()

Avez-vous bien compris ?

  1. Je voudrais créer un état basé sur T_Celebrite, groupé par la remarque
    a. Il n'y a pas besoin de demander les premières lettres, un simple groupe sur la remarque suffit
    b. Il est nécessaire de grouper la remarque sur la première lettre pour que l'état aie un sens
    c. Il est simplement stupide de vouloir grouper un champ tel que la remarque, quelle que soit l'option de regroupement ***

  2. Je crée un état basé sur T_Celebrite, en groupant par la première lettre du titre
    a. Le résultat est identique au fait de grouper sur le titre, tout simplement
    b. Les titres commençant tous par la lettre M, j'aurai un seul grand groupe unique, autant ne pas grouper ***

  3. Je crée un état basé sur T_Celebrite, et je groupe par Date de naissance, par année, et en plus je sous-groupe toujours par date de naissance, mais cette fois par mois (Essayez...)
    a. C'est simplement impossible
    b. Pas de problème : Vous aurez les gens groupés par mois de naissances, regroupés dans un plus grand groupe qui sera l'année de naissance ***
    c. Il n'est pas possible de regrouper Date de naissance par mois

  4. Je crée un état basé sur T_Celebrite. Je groupe d'abord par Domaine, et je sous-groupe par la première lettre de leur nom de famille
    a. J'obtiens un état qui va séparer les domaines, et pour chaque domaine, il va grouper les gens qui commencent par A, puis par B, etc jusqu'à Z ***
    b. On ne peut pas demander un sous-groupe par les premières lettres quand il y a déjà un premier groupe "normal"
    c. Le sous groupe "Première lettre du nom de famille" sera simplement ignoré

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

Voici un petit fichier au format texte (Aliment.txt). Il va s'agir pour vous de l'importer en tant que table dans votre base de données habituelle Proformation.mdb. Comment ? Vous avez oublié comment importer des données venant d'ailleurs ? Revoyez la leçon 18 pour vous rafraîchir la mémoire. Astuce : Si vous cliquez simplement sur le lien Aliment.txt, votre navigateur va vous en afficher le contenu... Il suffit de faire Fichier/Enregistrer sous pour lui donner un nom, et ainsi l'avoir sur votre propre disque dur afin de pouvoir l'importer dans Access.

Une fois que vous avez réussi à l'importer, appelez votre table T_Aliment. Elle devrait ressembler à ceci (Un seul champ, donc):

Votre travail ? Simplement créer un état avec l'assistant afin d'avoir un état qui ressemble à ceci : (C'est surtout le groupe sur 3 lettres qui m'intéresse, la présentation peut être différente). Vous l'appellerez E_AlimentGroupeParCategorie.

ATTENTION : astuce de la mort-qui-tue : Si vous essayez de créer un état avec assistant basé sur une table qui ne contient qu'UN SEUL champ, l'assistant état va se comporter un peu différemment, et ne carrément PAS vous proposer de faire un regroupement. La seule parade que j'ai trouvé pour avoir l'assistant qui se comporte normalement, et me permette de faire un regroupement, est de créer un nouveau champ que j'appellerai "Bidon", directement dans la table T_Aliment : C'est un champ qui reste tout vide, et ne sert à rien d'autre que de permettre le regroupement sur le champ Aliment.

Téléchargez la solution de l'exercice ici, qui n'est autre que Proformation telle qu'elle devrait être à la fin de cette leçon.

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