formateur informatique

Classer les résultats numériques par requêtes Access

Accueil  >  Bureautique  >  Access  >  Access Avancé  >  Classer les résultats numériques par requêtes Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux, voici son url absolue :

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Classement des résultats avec Access

Dans cette formation Access, nous abordons les techniques permettant de classer les valeurs numériques. Il peut s'agir de chiffres d'affaires, de montants de commandes ou encore de moyennes générales par exemple. L'objectif consiste à attribuer des rangs aux valeurs comparées les unes avec les autres.

Classer les valeurs numériques par champ calculé de requête Access



L'exemple de la capture ci-dessus illustre le résultat fourni par une requête. Cette dernière est munie d'un champ calculé mettant en oeuvre des fonctions permettant de classer les élèves, selon les moyennes obtenues.

Sources et présentation de la problématique
Nous proposons de récupérer une base de données composée d'une petite table. Il s'agit d'une toute petite base de données destinée à tester les fonctionnalités Access permettant de réaliser des classements sur les valeurs numériques. C'est pourquoi seul un élément est proposé dans le volet des objets Access sur la gauche de la fenêtre. Il s'agit de la table moyennes.
  • Double cliquer sur cette table pour accéder à son contenu en mode Feuille de données,
L'organisation est très simple. Les notes obtenues par des élèves dans différentes matières, désignées par des champs spécifiques, sont énumérées. Les deux derniers champs : MoyenneE et MoyenneD sont ceux qui retiennent notre attention. Le premier retranscrit les moyennes générales de chacun, converties en nombres entiers. Le second propose les moyennes originelles, en nombres décimaux. Ces résultats sont listés sous deux formes différentes, car le calcul du rang diffère selon la nature du nombre.

Classements sur des nombres entiers
Nous proposons de débuter par le cas le plus simple. Il s'agit de définir le classement de chaque élève par rapport à l'ensemble de la classe. L'élève ayant obtenu la meilleure moyenne générale sera classé premier. L'élève ayant obtenu la plus mauvaise moyenne sera classé dernier, soit huitième dans notre cas. Les tables sont les outils de construction de la base de données. Elles ne sont pas prévues pour accueillir des calculs. Les requêtes en revanche permettent de manipuler leurs informations pour préparer les données, en vue de la construction d'un formulaire par exemple. Et les requêtes peuvent accueillir des champs calculés. Ces derniers, comme leur nom l'indique, autorisent les formules dynamiques.
  • Fermer la table moyennes en cliquant sur la croix de son onglet,
  • Cliquer sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
  • Dans la section Requêtes, cliquer sur le bouton Création de requête,
  • Dans la boîte de dialogue qui suit, sélectionner la table moyennes,
  • Puis, cliquer sur le bouton Ajouter et sur le bouton Fermer,
Nous accédons ainsi à l'éditeur de requêtes Access. La table moyennes est représentée dans sa version schématisée avec la liste de ses champs.
  • Dans cette représentation schématique, cliquer sur le premier champ nommé ID,
  • Tout en maintenant la touche MAJ (Shift) enfoncée, cliquer sur le dernier, nommé MoyenneD,
Nous englobons ainsi tous les champs dans la sélection.
  • Glisser la sélection vers le bas sur la grille de requête de manière à les déposer,
Construire requête Access pour classer les résultats en spécifiant les champs de table

Si nous exécutons la requête à ce stade, elle fournit exactement les mêmes résultats que la table moyennes. Elle consiste pour l'instant à sélectionner tous les champs et à restituer les informations pour chaque enregistrement. C'est ici que nous devons créer le champ calculé permettant de réaliser la moyenne de chaque élève, en fonction des notes du champ MoyenneE.

Un champ calculé se crée dans l'une des colonnes vides de la grille de requête. Il doit être nommé et son nom doit être suivi du symbole deux-points, pour annoncer la formule à suivre.
  • Cliquer avec le bouton droit de la souris dans la zone Champ de la colonne vide située juste à droite du champ MoyenneD,
  • Dans le menu contextuel, choisir Zoom,
Pour plus de confort, nous choisissons d'écrire la syntaxe de la formule dans le petit éditeur qui apparaît. La fonction Access qui permet de dénombrer tous les éléments d'un groupe (Champ de tous les enregistrements), est la fonction CpteDom. Si nous lui passons le critère qui consiste à compter, pour l'enregistrement en cours, tous ceux qui lui sont supérieurs, nous obtenons le rang. Pour la plus mauvaise moyenne par exemple, nous obtiendrons le résultat de 7, puisque 7 élèves sur les 8 ont une meilleure note. Si à ce résultat nous ajoutons une unité (+1), nous obtenons son classement soit huitième. La syntaxe de la fonction CpteDom est la suivante :

=CpteDom('[Champ_du_calcul]'; '[table]'; 'Critère_de_dénombrement)
  • Dans l'éditeur zoomé, saisir l'expression suivante :
Rang:CpteDom('[MoyenneE]'; '[moyennes]'; '[MoyenneE]> ' & [MoyenneE])+1

Champ calculé pour requête access pour classements avec fonction CpteDom



Nous nommons ce nouveau champ Rang. Son calcul, après les deux points, exploite bien la fonction Access CpteDom. A cette dernière, nous passons le nom du champ pour le calcul en premier paramètre, soit MoyenneE. Comme vous le savez, dans une expression Access, un champ s'exprime entre crochets. En deuxième paramètre, nous lui passons le nom de la table (moyennes), également entre crochets. En troisième paramètre enfin, nous lui passons l'expression du critère à dénombrer sur l'ensemble des enregistrements. Il s'agit d'une partie fixe concaténée (&) à une partie variable. La partie fixe désigne le champ MoyenneE pour l'enregistrement en cours. Tous seront passés en revue par cette fonction, à l'instar de la fonction Nb.Si d'Excel par exemple, qui permet de dénombrer toutes les cellules répondant à un critère. Nous vérifions si sa valeur est supérieure (>) à l'ensemble des autres valeurs pour ce même champ, fourni en partie variable donc (& [MoyenneE]). Nous incrémentons ce résultat d'une unité pour obtenir le classement, comme nous l'avons expliqué plus haut.
  • Valider l'expression en cliquant sur le bouton Ok de l'éditeur zoomé,
De retour sur la grille de requête, vous constatez la présence du champ calculé à l'emplacement que nous avons choisi.
  • Enregistrer la requête (CTRL + S) sous le nom : ClassementE,
  • Puis, valider par Ok,
  • Cliquer ensuite sur le bouton Exécuter du ruban Créer par exemple,
Nous obtenons une vue semblable à celle de la table. Mais à l'extrémité droite, vous notez la présence du champ Rang, tel que nous l'avons nommé. Et notre calcul a parfaitement fonctionné puisqu'un classement cohérent est attribué à chaque élève, en fonction de sa moyenne générale convertie en nombre entier.

Classer les résultats grâce à un champ calculé dans une requête Access

Pour y voir plus clair, il aurait été pertinent de réaliser un tri décroissant sur le champ MoyenneE. Les requêtes permettent de manipuler les données avec beaucoup de puissance. Nous proposons donc de réaliser ce petit réglage.
  • Cliquer sur la flèche du bouton Affichage dans le ruban Accueil,
  • Dans la liste, choisir Mode création,
  • Dans la zone Tri du champ calculé Rang, dérouler la liste déroulante,
  • Choisir Croissant et enregistrer la requête,
Tri dans requête Access pour classer les résultats dans un ordre croissant

Si vous exécutez de nouveau la requête, vous obtenez des données triées du meilleur au plus mauvais élève. Nous aurions aussi pu engager un tri décroissant sur le champ de la moyenne. L'important est de pouvoir réaliser un tri consistant à restituer les classements dans l'ordre.

Classer les nombres décimaux
Nous proposons de créer une deuxième requête sur le modèle de la première. A priori, le calcul est identique mais doit désormais porter sur le champ MoyenneD.
  • Fermer la requête ClassementE,
  • Dans le volet des objets Access sur la gauche, cliquer avec le bouton droit sur la requête,
  • Dans le menu contextuel, choisir Copier,
  • Puis, cliquer sur un emplacement vide du volet, toujours avec le bouton droit,
  • Dans le menu contextuel, choisir Coller,
  • Dans la petite fenêtre qui suit, la renommer ClassementD et valider par Ok,
La nouvelle requête, identique à la première, apparaît dès lors listée dans le volet des objets Access. Nous n'avons plus qu'à adapter l'expression de son champ calculé.
  • Cliquer avec le bouton droit de la souris sur la requête ClassementD,
  • Dans le menu contextuel, choisir Mode création,
  • Dans la grille de requête, cliquer avec le bouton droit sur le champ calculé Rang,
  • Dans le menu contextuel, choisir Zoom,
  • Dans l'expression, remplacer le champ MoyenneE par le champ MoyenneD,
Trois modifications sont à entreprendre.
  • Valider par Ok et enregistrer la requête,
  • Puis, l'exécuter,
Erreur requête Access pour classer les résultats sur des nombres décimaux

Deux cas de figure peuvent se présenter selon la version d'Access. Soit la requête s'affiche et des erreurs apparaissent dans le champ calculé, en regard des moyennes décimales. Soit comme ici, le message d'erreur intervient en amont et n'autorise pas l'affichage de la requête. Le message est explicite. La virgule est en cause. En effet, Access est un logiciel américain pour qui la décimale est matérialisée par le symbole du point (.) et non de la virgule (,). En conséquence, dans notre expression de calcul, les nombres sont considérés comme du texte. Et il n'est pas possible de réaliser des opérations arithmétiques sur des chaînes de caractères.

Nous proposons deux solutions pour palier le problème. La première consiste à exploiter les fonctions offertes par le générateur d'expression. L'une d'entre elles se nomme Remplacer. Comme son nom l'indique, elle permet de remplacer une occurrence (La virgule) par une autre (Le point), dans une chaîne de caractères (La moyenne décimale). Sa syntaxe est la suivante :

Remplacer(Chaine_de_texte ; Caracatère_à_remplacer ; Caractère_de_remplacement)

Comme il s'agit d'une fonction manipulant des chaînes de caractères, elle est susceptible de générer une erreur, selon la version d'Access. Auquel cas, nous pourrions l'encadrer dans une fonction de conversion telle que CDbl. Cette dernière convertit l'expression qui lui est passée en nombre réel. Mais nous proposons une méthode universelle en seconde solution, grâce à un tout petit bout de code VBA Access.
  • Dans la grille de requête, cliquer avec le bouton droit sur le champ calculé Rang,
  • Dans le menu contextuel, choisir Créer,
  • Dans le générateur d'expression qui suit, cliquer juste devant le dernier champ [MoyenneD], situé après le caractère de concaténation (&),
Nous définissons ainsi l'emplacement à partir duquel doit être insérée la fonction de traitement.
  • Dans la liste des éléments d'expression, déployer l'affichage de la rubrique Fonctions,
  • Puis, sélectionner l'élément Fonctions intégrées,
  • Dans les catégories d'expressions au centre, sélectionner la catégorie Texte,
  • Dans les valeurs d'expression sur la droite, double cliquer sur la fonction Remplacer,
Celle-ci s'insère en effet devant le champ MoyenneD mais ne l'encadre pas. L'expression à ce stade est la suivante :

Rang:CpteDom('[MoyenneD]'; '[moyennes]';'[MoyenneD] >' & Remplacer(«string»; «find»; «replace»; «start»; «count»; «compare») «Expr» [MoyenneD])+1
  • Modifier l'expression comme suit :
Rang:CpteDom('[MoyenneD]'; '[moyennes]'; '[MoyenneD] >' & Remplacer( [MoyenneD]; ','; '.'))+1

Le champ MoyenneD doit être passé en premier argument de la fonction Remplacer. La virgule à remplacer doit être exprimée en deuxième argument, entre guillemets car il s'agit d'un texte. Le point doit être exprimé en troisième argument, lui aussi entre guillemets. Il ne faut pas oublier de fermer la parenthèse de la fonction Remplacer. Nous obtenons donc deux parenthèses fermantes juste avant l'incrémentation d'une unité (+1).

Fonction Access pour remplacer virgule par point afin de réaliser des calculs sur des valeurs décimales

La capture ci-dessus illustre le résultat final, avec toutes les étapes intermédiaires réalisées dans le générateur d'expression Access.
  • Valider la modification de la formule en cliquant sur le bouton Ok,
  • Enregistrer la requête (CTRL + S),
  • Puis, cliquer sur le bouton Exécuter du ruban Créer pour visualiser son résultat,
Cette fois, nous obtenons les classements tels qu'ils avaient été obtenus par la première requête sur les nombres entiers. Mais vous en conviendrez, réaliser des classements sur des nombres décimaux s'est avéré plus périlleux. Il est intéressant d'avoir rencontré ce cas particulier. Nous saurons désormais que pour traiter des nombres réels par les fonctions Access, il convient dans un premier temps, de remplacer la virgule par le point.



Exécuter une fonction VBA dans une requête Access
Nous allons découvrir une méthode permettant d'actionner de nouveaux leviers et d'offrir de nouvelles perspectives dans l'exploitation d'Access. Il s'agit de concevoir une requête classiquement, comme nous l'avons entrepris jusqu'alors. Mais pour des traitements spécifiques, nous pouvons passer la main à un code Visual Basic Access. Le principe est de créer une nouvelle fonction VBA pour remplacer la virgule par le point. Dans l'expression du champ calculé, il suffira d'appeler cette fonction par son nom, afin de traiter les nombres décimaux du champ MoyenneD.

Tout d'abord, nous proposons de dupliquer la dernière requête. Nous conserverons ainsi l'historique des fonctionnalités ayant permis de calculer les classements avec succès.
  • Fermer la requête ClassementD en cliquant sur la croix de son onglet,
  • Dans le volet des objets Access, cliquer avec le bouton droit de la souris sur cette dernière,
  • Dans le menu contextuel, choisir Copier,
  • Puis, cliquer avec le bouton droit sur un emplacement vide du volet,
  • Dans le menu contextuel, choisir Coller,
  • Dans la fenêtre qui suit, la renommer ClassementDF et valider par Ok,
  • Cliquer ensuite sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
  • A droite du ruban, dans la section Macros et code, cliquer sur le bouton Module,
Nous basculons ainsi dans l'éditeur de code Visual Basic. Comme nous l'ont appris les différentes formations VBA Access, une fonction permet de réaliser un traitement et de retourner le résultat à l'appelant. C'est le mot clé Function qui permet de la déclarer.
  • Dans la feuille de code au centre de l'écran, créer la fonction nb_fr comme suit :
Function nb_fr(chaine As Variant)

nb_fr = Replace(chaine, ',', '.')

End Function


Cette fonction est triviale. Elle ne requiert pas de compétence en développement. Nous la nommons nb_fr. Nous la déclarons avec un paramètre en attente (chaine). Nous le déclarons comme un Variant pour autoriser le traitement sur le plus grand nombre. Il s'agit du nombre décimal à traiter. Nous exploitons la fonction VBA Replace qui, comme son homologue Remplacer du générateur, permet de substituer une occurrence par une autre, dans un texte. Nous affectons son résultat à la fonction elle-même, par son nom (nb_fr). C'est ainsi en VBA qu'une fonction retourne son traitement.
  • Enregistrer les modifications en conservant le nom Module1 attribué par défaut,
  • Basculer sur l'application Access avec le raccourci clavier ALT + F11 par exemple,
  • Cliquer avec le bouton droit de la souris sur la requête ClassementDF,
  • Dans le menu contextuel, choisir Création,
  • Dans l'éditeur de requête, cliquer avec le bouton droit sur le champ calculé Rang,
  • Dans le menu contextuel, choisir Zoom,
  • Dans la fenêtre qui suit, adapter l'expression avec la fonction VBA comme suit :
Rang:CpteDom('[MoyenneD]'; '[moyennes]';'[MoyenneD] >' & nb_fr([MoyenneD]))+1

Notre fonction VBA nb_fr ne requiert qu'un seul paramètre. Les arguments de la fonction Remplacer doivent donc être supprimés.
  • Valider l'expression en cliquant sur le bouton Ok,
  • Enregistrer la requête (CTRL + S),
  • Puis, cliquer sur le bouton Exécuter du ruban Créer,
Classement des nombres décimaux par appel fonction VBA Access depuis champ calculé de requête

Comme vous le remarquez, nous obtenons exactement le même résultat qu'avec la requête ClassementD. Nous sommes parvenus à organiser les nombres avec décimales, grâce à l'appel d'une petite fonction VBA Access depuis une requête. Ces imbrications peuvent apporter beaucoup de puissance à l'avenir, pour le développement d'applications professionnelles avec Access.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales



Partager la formation
Partager sur Facebook
Partager sur Google+
Partager sur Twitter
Partager sur LinkedIn