Leçon 52 : Etats : Les fonctions Somme, Moyenne, Min et Max, les propriétés d'état Source et Filtre, section insécable, répéter section, sous-groupes

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 effectuer quelques opérations supplémentaires, et voir en détail les fonctions
Somme
Moyenne
Min
Max
qui se comportent de manière identique à Excel, sauf que les références sont ici des champs, et pas des cellules.
Nous verrons également comment modifier les données-source d'un état après coup, nous gérerons l'affichage des sections avec plus de subtilité, et enfin, nous verrons les sous-groupes.

Sommaire

  1. La fonction Somme
  2. Importance de l'alignement vertical des champs
  3. Arrondissement des nombres en cas de champ trop étroit
  4. La fonction Moyenne, et les problèmes inhérents aux champs numériques restés à 0
  5. La propriété Filtre de l'état
  6. Les fonctions Min et Max
  7. Les fonctions dans les groupes
  8. Gestion de la confusion possible entre totaux et sous-totaux
  9. Rappel de l'utilisation du Saut de page
  10. Section insécable des groupes : Particularités et limites
  11. Groupes, sous-groupes, sous-sous-groupes, etc.
  12. Bonne habitude esthétique de mise en place des groupes et des sous-groupes
  13. Méfiez-vous de la surabondance de groupes et de sous-groupes

ommençons par créer un état en mode création, basé sur T_Celebrite, sous forme de liste compressée, comme la dernière fois. Vous supprimerez l'en-tête et le pied de page, et vous ajouterez l'en-tête et le pied d'état. Resserrez l'entête d'état, et ajoutez les champs Prenom, Nom et salaire dans la section détail : . Lancez en aperçu avant impression : C'est pas mal, mais le signe Sfr. au début de chaque salaire n'est pas terrible : . Vous savez comment faire pour afficher les salaires, mais pas la monnaie ?

Je suis un élève studieux !
C'était expliqué à la leçon 37, vers le début. Il s'agissait des formulaires, mais c'est le même principe.

Demandez les propriétés du champ SalaireMensuel, et dans Format, choisissez Standard :

Mais notre propos n'est pas là. Nous allons calculer la somme totale des salaires. Vous savez à quel endroit nous allons installer cette information ?

Dans le pied d'état ?

Exactement. Dans le pied d'état. Nous aurions pu choisir de la placer dans l'en-tête, mais il me parait est plus "normal" qu'elle soit en bas..


La fonction Somme

Installez un champ Ab| dans le pied d'état, et modifiez-le comme ceci : L'étiquette contient : Total des salaires : et le champ : =Somme(SalaireMensuel) : . Les crochets autour de [SalaireMensuel] sont ajoutés automatiquement par Access sauf ?...

... Sauf si le nom du champ contient des espaces comme Salaire mensuel par exemple !

Biennnnnn ! Lancez l'état ! Rende-vous à la fin : votre somme :


Importance de l'alignement vertical des champs

Mais elle n'est pas très bien alignée...

Il y a des choses à redire, en effet !

Elle n'est pas correctement formatée (Pas de séparation entre les milliers et les centaines), et elle est décalée par rapport à la colonne de chiffres.

Faites ceci :

  1. Arrangez-vous pour que le champ qui contient la somme ait exactement la même largeur que le champ SalaireMensuel, et qu'il soit juste en dessous :
  2. Alignez le contenu de =Somme([SalaireMensuel]) à droite avec (car le champ SalaireMensuel est aligné à droite par défaut, simplement parce que c'est un champ de type Monétaire - soit du chiffre)
  3. Mettez-le en évidence en l'écrivant en gras
  4. Dessinez une petite ligne juste au dessus pour séparer le total de la colonne de chiffres avec
  5. Ce qui vous donne , soit en mode aperçu :

Le petit trait de séparation est un peu trop large

Simplement parce qu'elle est de la même taille que les champs de Salaire, qui, eux-mêmes, sont un peu trop larges... On peut les resserer : :


Arrondissement des nombres en cas de champ trop étroit

Vous n'avez plus le même total !!! C'est passé de 1345339.86 à 1345340 !

J'ai un tout petit peu trop resseré, alors il a arrondi le chiffre.

ATTENTION : Si votre champ est trop étroit, il se peut même qu'il manque des chiffres importants : Regardez, je rétrécis encore un peu : . Il a carrément affiché la somme en notation scientifique : 1E+06 veut dire : 1 suivi de 6 zéros : 1000000... Un million, inutile de dire que ça ne va pas... ET ENCORE, on a une approximation parce que nous n'avons pas encore demandé le format correct... Vous vous souvenez ? il s'agissait de demander la séparation entre les milliers et les centaines, en demandant les propriétés du champ de la somme : Format/Format : Choisir Standard. Faites-le (Bouton droit de la souris sur la somme, et "propriétés").

Regardez ce que ça donne, un champ trop court, avec un format Standard : . Il donne carrément une somme de 339.86... Bizarre, non ?

HYPER DANGEREUX, OUI !

Ben oui...

Et on ne peut rien faire contre ça ?

Ben non...

Mais Excel, il fait la même chose ?

Non. Dans Excel, si vous avez une colonne qui contient du chiffre qui devient trop petite, ce sont des dièses qui apparaissent prouvant que la cellule est trop étroite :

Avant le rétrécissement : , et après :

Donc, faites bien attention dans Access à ne pas élargir ni rétrécir les champs exagérément.


La fonction Moyenne, et les problèmes inhérents aux champs numériques restés à 0

Ajoutons maintenant la moyenne des salaires, juste en dessous de la somme. Pour ce faire, il vous suffit de copier/coller le champ contenant la somme en dessous de lui-même : . Maintenant, remplacez l'étiquette "Total des salaires" par "Moyenne des salaires". Remplacez le contenu du champ =Somme([SalaireMensuel]) par =Moyenne(SalaireMensuel) : . Lancez l'état : Ragardez à la fin, la moyenne :

Et en plus, elle est déjà bien formatée(2 décimales, et une séparation avec les milliers et les centaines)

Oui, puisque à la base vous avez copié la somme qui était déjà en bon format, c'est pour ça.

Par contre, je pense à un truc : On a pas mal de salaires à zéro...

Oui, et ?

Et ça doit drôlement influer sur la moyenne... Ce n'est pas très juste de les prendre en compte... On ne peut pas les exclure, ces gens dont on ne connait pas le salaire ?

Il aurait fallu créer une requête qui les exclut, et baser ensuite notre état sur elle...

C'est trop tard maintenant ? On doit tout recommencer si on voulait ça ?

Heureusement, non !

Nous allons pouvoir maintenant créer une nouvelle requête qui exclut les salaires inconnus, et préciser que l'état actuel est maintenant basé sur elle.

Comment fait on ça ?

Marche à suivre :

  1. D'abord, vous fermez l'état, et vous l'Enregistrez sous E_StatSalaire.
  2. Créez une nouvelle requête en mode création basée sur T_Celebrite (Rappel à la leçon 21)
  3. Mettez-y les champs qui nous intéressent : Le nom, le prénom et le salaire
  4. Demandez comme critère de SalaireMensuel : >0 (Rappel à la leçon 22)
  5. Fermez la requête, et appelez-Là : R_StatSalaire (Comme l'état mais avec un R_)
  6. Retournez dans votre état E_StatSalaire en mode création
  7. Demandez les propriétés de l'état ( sur , et propriétés)
  8. Dans l'onglet données, choisissez Source, dans la liste déroulante, choisissez votre requête R_StatSalaire :

Et voilà : Lancez votre état, il n'y a plus un seul salaire à 0, ça ne change pas la somme (C'est normal), mais la moyenne vient de passer de 13'453.40 à 15'463.68 :


La propriété Filtre de l'état

Faut faire gaffe !!! Il n'y a pas d'autre moyen que de créer une requête ?

Si. On peut demander un filtre directement dans l'état... Attention : Ce n'est pas en mode aperçu avant impression qu'on peut filtrer quoi que ce soit (Contrairement aux tables, requêtes et formulaires qui peuvent se filtrer dynamiquement avec le bouton droit de la souris : "Filtrer par". Vous vous souvenez ? Leçon 19). Ici, une fois que l'aperçu est lancé, on ne peut plus RIEN faire.

C'est donc en mode création que ça va se passer : Dans les propriétés de l'état, onglet données, remettez T_Celebrite dans la source à la place de R_StatSalaire, pour se retrouver comme avant.

Juste plus bas, il y a les deux propriétés qui vont nous éviter une requête : Filtre et Filtre Actif.
Dans Filtre, écrivez : SalaireMensuel>0, et dans Filtre actif, choisissez Oui :

Et voilà : Le résultat est le même.

C'est plus simple, non ?

C'est vous qui verrez... Il y a avec Access, souvent plusieurs manières d'arriver au même résultat.

ATTENTION : J'ai constaté à plusieurs reprises, que ce soit sous Access 97 ou 2000, que cette fonction était parfois instable... Il m'invente quelquefois une erreur de syntaxe comme quoi il ne reconnait pas SalaireMensuel, et, sans raison apparente, je recommence l'opération après avoir fermé et rouvert l'état, et tout à coup ça marche... Donc, votre expérience vous dictera quel comportement adopter... La requête, par contre, marche à tous les coups.


Les fonctions Min et Max

Vous avez parlé de la fonction Min et Max également ?

Min permet d'obtenir le salaire le plus bas, et Max le plus élevé, tout simplement. Vous imaginez comment les mettre en place ?

Je suppose que ce sont des champs Ab| qui contiennent =Min(SalaireMensuel) et Max(SalaireMensuel) ?

Exactement. Allez-y, mettez les en place sous la somme et la moyenne : . Notez que cette fois, le salaire le plus bas est 2284, et pas 0, puisqu'on les a exclus.


Les fonctions dans les groupes

On pourrait avoir ces sommes, moyennes, max et min au sein même des groupes j'imagine ?

Bien entendu. Créez un groupe basé sur le domaine (Leçon 50 si vous avez besoin de vous rafraîchir la mémoire), afin d'obtenir à peu près ce résultat : . Maintenant, ajoutez un pied de groupe au domaine (C'est la même chose que l'en tête de groupe, mais il se trouvera en dessous du groupe Domaine, pas au dessus, pour pouvoir mettre les sommes, moyennes, max et min en dessous, c'est plus lisible). Comme ceci : . Dans le pied de groupe qui vient d'apparaître , copiez tous les champs et étiquettes du pied d'état : (La leçon 33, vers le milieu vous rappellera comment on fait pour sélectionner plusieurs champs à la fois) : . Vous avez maintenant les statistiques pour chaque domaine :


Gestion de la confusion possible entre totaux et sous-totaux

C'est bien, mais le petit problème, c'est qu'à la fin de la dernière page, on confond les totaux du dernier groupe (Télévision), et les totaux généraux :

Oui. Donnez une apparence plus "Flashy" aux totaux de fin d'état :

C'est très joli, comment avez-vous fait une telle présentation ?

J'ai rajouté une étiquette "Totaux Finaux", j'ai rajouté un cadre, j'ai tout peint en... Mais... Qu'est ce qui me prend de répondre à une question pareille !!! Vous devriez avoir honte, toutes ces considérations esthétiques ont été vues et revues dans les leçons sur les formulaires 31, 32 et 33 !

Oui, mais je... je...

Y'a pas de mais ! Allez hop ! On révise !


Rappel de l'utilisation du Saut de page

Autre chose par contre, j'ai constaté que la dernière page ressemble à ceci : . Et ce n'est vraiment pas joli en haut, j'ai Miguel Indurain et Marc Rosset qui sont les deux dernières personnes du domaine "Sport". Et à la fin de la page d'avant, évidemment, il y a tous les premiers "Sport"...

Ce qui serait bien, ce serait de commencer chaque groupe sur une nouvelle page, comme ça, ça commence tout de suite par le titre, plus de problème... Ca ne vous rappelle rien ?

Hmmmm... Le saut de page ?

Oui, exactement, on va demander à ce qu'il change automatiquement de page dès qu'il a écrit les totaux d'un groupe, à savoir exactement ici : , ce qui donne ceci :

Mais maintenant on a les totaux tous seuls sur la dernière page... pas terrible...

C'est normal, on a demandé un saut de page en bas de chaque groupe

On peut lui dire de ne pas mettre un saut de page avant les totaux finaux ?

Non, pas du tout facilement.

On pourra par la suite faire ce genre d'acrobaties, mais il faudra plonger les mains dans Visual Basic.


Section insécable des groupes : Particularités et limites

Et puis autre chose, je suis peut-être exigeant, mais par exemple, le premier et le 2ème groupe tiendraient facilement sur une seule page...
Est-ce que à tout hasard on ne pourrait pas lui dire un truc du style "Si tu arrives à mettre plusieurs groupes sur une page sans les couper sur la page suivante, fais-le"

Oui, par contre, ça c'est possible, et c'est même très facile. Commencez par effacer le saut de page que vous avez installé. Ensuite, allez dans Affichage/Trier et grouper, damandez Section Insécable : Groupe Entier : . C'est exactement ce que vous demandiez : . Par exemple, sur la première page, il y a assez de place pour caser les Affaire ET la Chanson, mais ensuite, en dessous, il y a un grand espace vide. Grand, mais pas suffisamment pour accueillir Cinéma, qui passe donc à la ligne suivante. Et ainsi de suite.

Et admettons que nous ayons un groupe qui prend de toute façon plus d'une page, même si ça commence tout en haut ?

Dans ce cas, effectivement, il n'y a pas le titre sur la 2ème page. Nous pouvons nous en rendre compte simplement en élargissant un peu en hauteur la section détail, comme ceci : . Ce qui donne ceci : : Cinéma commence sur une page, et se termine sur l'autre, mais sans le rappel "Cinéma" au dessus de la 2ème page. Heureuzsement qu'il y a une astuce. Demandez les propriétés de la section "En-tête de groupe Domaine" : . Dans l'onglet Format, mettez Oui dans Répéter Section : . Et voilà :


Groupes, sous-groupes, sous-sous-groupes, etc.

Est-il possible de créer des sous groupes ?
Avoir tous les domaines groupés, mais, pour chaque domaine, avoir un groupe par pays d'origine par exemple?

Mais oui, chef ! En mode création, demandez simplement à grouper par pays en dessous des domaines, avec un en-tête de groupe : , ce qui va insérer une nouvelle section, juste ici : . Comme d'habitude, vous placez le pays dans cette section, et vous supprimez l'étiquette.


Bonne habitude esthétique de mise en place des groupes et des sous-groupes

Constatez ce que je fais, je met en forme de manière à ce qu'il y ait une sorte de hiérarchie dans les groupes : : , ce qui donne ceci : . Tiens, ben juste pour rigoler, regardez ce que donne le MEME état, mais sans mise en exergue des titres : :


Méfiez-vous de la surabondance de groupes et de sous-groupes

Ca fait peur, on ne comprend plus rien !
Et pour en revenir aux sous groupes, on pourrait bien entendu rajouter un pied de groupe Pays, pour mettre la somme la moyenne, etc... Mais on est pas obligé...

C'est ça. Si vous alourdissez trop votre état avec trop de sous-totaux, finalement, il ne servira plus à grand chose, mais c'est exactement ça : cet état est la version finale : Des groupes Domaine, avec un sous groupe Pays, mais pas de sommations pour les pays.

Fermez cet état, sans oublier de l'enregistrer. Je vous rappelle que nous l'avions baptisé E_StatSalaire.

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

Nous avons cette fois plongé les mains profondément dans la structure des états.

Nous avons vu comment créer une somme, une moyenne, calculer la plus grande et la plus petite valeur d'une série, dans un pied de groupe, ou dans le pied d'état.

Nous pouvons dynamiquement changer l'origine de l'état, en précisant que ce n'est plus une table, mais une requêtes (Pour exclure les gens dont le salaire est inconnu par exemple),

Nous avons vu la propriété "Filtre de l'état" (Mais qui ne marche pas à tous les coups d'après mes expériences)

Nous avons ensuite vu comment faire pour éviter que des fins de groupe ne se situent sur la page suivante, avec Section Insécable, et Répéter section. Nous avons revus dans ce contexte le saut de page manuel.

Et enfin, nous avons étudié la notion de sous groupes en prenant l'exemple de l'état qui est d'abord groupé par domaine, et ensuite par pays.

La limite des sous groupe est de 10 niveaux. On peut donc avoir un groupe Pays, sous groupé par domaine, sous groiupé par Titre, sous groupé par EtatCivil, etc. jusqu'à 10. Plus qu'il n'en faut !

Les sommes et moyennes ne sont pas obligatoirement présentes dans chaque sous-groupe.

Et enfin, nous avons encore revu que l'aspect esthétique était absolument primordial, faute de quoi, les états peuvent devenir littéralement illisibles.

Avez-vous bien compris ?

  1. La propriété "Section Insécable" s'applique à :
    a. Un groupe ***
    b. Un champ
    c. Une étiquette
    d. L'état lui même

  2. L'une de ces formules est correctement écrite. Laquelle ?
    a. =Min(SalaireMensuel) ***
    b. =Minimum(SalaireMensuel)
    c. =<Min>([SalaireMensuel])
    d. Min([SalaireMensuel])

  3. La propriété "Répéter section"
    a. S'applique seulement aux états qui ne contiennent pas de groupe, pour répéter correctement les données du détail
    b. Permet de répéter le groupe entier plusieurs fois dans le même état dans le but d'éviter par la suite de faire de photocopies
    c. Permet d'afficher systématiquement en haut de la page le nom du groupe, particulièrement si un seul groupe est trop important pour tenir sur une seule page ***
    d. N'existe pas

  4. Une fois qu'un état est créé, j'ai la possibilité de changer la source de cet état avec la propriété :
    a. Source, de l'onglet données de l'état lui-même, mais SEULEMENT si à l'origine, l'état était basé sur une requête, et pas sur une table
    b. Sources, de l'onglet données du premier groupe rencontré
    c. Source, de l'onglet données de l'état lui-même ***
    d. On ne peut pas changer la source de l'état après coup. On peut seulement faire cette opération avec les formulaires

  5. Je peux très bien avoir un état groupé d'abord par nom, puis par prénom, puis par salaire mensuel
    a. Oui, c'est même très utile dans notre cas
    b. Oui, mais dans notre cas, ça ne sert vraiment à rien ***
    c. Non, car la limite des sous-groupes est de 2 niveaux
    d. Non, car comme les données sont vraiment trop diverses, un message d'erreur apparaîtra

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 exactement cet état dans votre base de données ProFormation, que vous appellerez E_StatTitreEtatCivil:

Vous constatez qu'il est particulièrement court, puisque sur une seule page, nous avons l'en-tête (SOMME MOYENNE) et le pied (Totaux Généraux) d'état. Il n'y a pas de noms ni de prénoms. Cette astuce, si je puis dire est simplement obtenue en écrasant complètement la section détail, et donc en ne mettant rien du tout dedans... Eh oui, on n'est pas obligé...

Vous constatez donc qu'il s'agit d'un état qui groupe d'abord par EtatCivil, et qui ensuite sous groupe par Titre (Les 9 premières personnes ont un groupe EtatCivil vide simplement parce qu'il n'est pas renseigné dans la table, c'est pour ça... Ca fait un peu bizarre). Il y a donc en en-tête de groupe des EtatCivil le nombre de personnes correspondant à cet EtatCivil, suiv du mot "Personne(s)".

Ensuite, pour chaque sous groupe Titre, il n'y a non plus le nombre de personnes, mais, côte à côte, la somme et la moyenne des salaires (Moyenne un peu faussée, car nous n'avons pas exclu les gens dont le salaire est inconnu). Donc par exemple, si vous prenez l'ensemble des salaires de toutes les personnes "Célibataire", "Mademoiselle", on trouvera effectivement un total de 76581.76 francs. Je n'ai pas vérifié... Vous pouvez le faire, c'est toujours plus prudent. Leur moyenne est de 10940.25... Mais ça ne nous dit pas combien de "Célibataire" "Mademoiselle" il y a. Ce n'est pas renseigné.

Et tout en dessous, en pied d'état, les totaux et moyennes générales. En pied d'état, donc, pas en pied de page, sinon, comme on a vu, ça fera une erreur. Bon, la mise en page, les cadres, les traits, tout ça, vous vous débrouillez.

Appréciez le fait que je me sois donné bien de la peine pour vous fournir un exercice clair à visualiser !

PS : Oui, oui, il y a des "Madame" "Célibataire". Mais encore une fois, ces données sont fictives...

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