Calcul de rang avec critère
Dans l’article Calcul de rang, il a été question de numéroter des élèves en fonction de leurs notes, ou des sportifs en fonction de leur temps. La numérotation se faisait sur la liste entière des élèves ; voici une variante qui va permettre de filtrer cette liste par classe.
Le principe
Si vous ne l’avez pas déjà lu, allez faire un tour sur l’article Calcul de rang, vous comprendrez mieux les aménagements qu’on va faire dans la suite ! Notre objectif est de classer les élèves par rang, comme dans l’article cité, mais cette fois en filtrant sur une classe donnée. On souhaite obtenir quelque chose comme ceci :
Quelques aménagements
- Tout d’abord, il faut ajouter la notion de classe à votre table. Vous ouvrez donc la table
tblElèves
en mode Création, et ajoutez par exemple un champClasse
, de type Texte, de taille10
. Dans un scénario réel, on aurait sans doute une table spécifique pour les classes, mais ce n’est pas le sujet… 🙂 - Passez en mode de saisie, et renseignez la classe de chaque élève.
- Ouvrez ensuite les requêtes construites dans l’article précédent, et ajoutez le champ
Classe
sur la grille de ces requêtes. - Comme on veut pouvoir filtrer par classe, ajoutez le critère
[Entrer la classe]
sous ce champ, de façon à obtenir :
- Dans l’idéal, ce serait pas mal de définir le type de données de ce paramètres (type Texte).
Dans Access 2003 et moins : Requête / Paramètres.
Dans Access 2007 et plus : onglet Outils de requête / Créer, puis bouton Paramètres.
Pour l’instant, si vous exécutez la requête, il y a bien demande de la classe, mais le calcul du rang n’en tient pas compte.
On va améliorer ça ! Dans l’article précédent, je vous avais donné 3 méthodes pour calculer le rang, je garde le même principe en adaptant chacune des 3 méthodes pour tenir compte de la classe.
Méthode 1 : calcul de rang par DCount
C’est sans doute la méthode la plus lourde à aménager (je rappelle que c’est aussi la moins performante).
Modifiez la première requête de l’article précédent, de façon à transformer le champ calculé Rang
qui valait ceci :
Rang: CpteDom("*";"[tblElèves]";"[Moyenne] > " & [Moyenne]) + 1
en ceci :
Rang: CpteDom("*";"[tblElèves]";"[Moyenne] > " & [Moyenne] & " AND [Classe] = '" & [Entrer la classe] & "'") + 1
Vous remarquerez qu’on transforme le critère pour ajouter un filtre sur la classe. Celle-ci étant de type Texte, il faut tenir compte des apostrophes pour délimiter la valeur saisie. L’idée étant d’obtenir : [Classe] = '6A'
par exemple.
Méthode 2 : calcul de rang par sous-requête
Dans la méthode par sous-requête, nous avions utilisé ce calcul de rang :
1 2 3 |
Rang: (SELECT Count(*) FROM [tblElèves] AS T2 WHERE T2.[Moyenne] > T1.[Moyenne]) + 1 |
Transformez ce calcul en :
1 2 3 4 |
Rang: (SELECT Count(*) FROM [tblElèves] AS T2 WHERE T2.[Moyenne] > T1.[Moyenne] AND [Classe] = [Entrer la classe]) + 1 |
C’est encore dans le filtre WHERE
qu’on intègre la classe, mais c’est un peu plus simple à lire que dans l’exemple plus haut… à mon avis ! 😉
Méthode 3 : variante sur la numérotation
Dans le 3ème exemple donné, il s’agissait de numéroter les élèves en continu, même en cas d’ex-æquo (du genre : 1, 1, 2, 3, 4…), alors que pour l’instant on obtient 1, 1, 3, 4, 5… Ce qui donnait :
1 2 3 4 |
Rang: (SELECT COUNT(*) + 1 FROM (SELECT DISTINCT [Moyenne] FROM [tblElèves] AS T2) WHERE T2.[Moyenne] > [tblElèves].[Moyenne] ) |
Aménagez ce champ calculé pour obtenir :
1 2 3 4 |
Rang: (SELECT COUNT(*) + 1 FROM (SELECT DISTINCT [Moyenne] FROM [tblElèves] AS T2 WHERE [Classe] = [Entrer la classe]) WHERE T2.[Moyenne] > [tblElèves].[Moyenne] ) |
A vous de jouer !
Salut tout le monde comment utilisé la fonction cptedom avec des 3 tables
L’article donne des exemples basés sur des des tables (voir « tblElèves »).
Mais je n’ai peut-être pas compris la question ?
Merci d’avance
Bonne soirée
Jacques
Jacques Gronier > Effectivement, ça peut être une piste. L’article pour Access devrait être en ligne demain.
Merci D’avance
J’ai réussi sous Excel, »nb.si.ens »,avec la fonction mais c’est quand même beaucoup moins élégant.
@ Bientôt
Jacques Gronier > En aménageant un peu le principe de cet article, on devrait arriver au résultat souhaité. Le temps de préparer un petit article là-dessus, ce sera en ligne bientôt…
Bonjour, et merci pour ces mines de renseignements.
Tout d’abord, je précise que j’ai un niveau de compétence « débutant + » sur Access (2010)
Bénévole à la Fédération Française de Bowling, je cherche à calculer le rang de la moyenne réalisée par des joueurs au cours d’une compétition, afin de pouvoir établir un classement par points transversal.
Exemple pour une journée de Championnats, j’ai 4600 participants dans plus de 100 divisions.
Les exemples décrits pour les moyennes des élèves par classe seraient parfaits, si le calcul pouvait se faire sans passer par le filtre et donc l’entrée « manuelle » de la division….
Merci d’avance
Jacques
Altech > Peux-tu préciser ? (un exemple de données et de traitement, peut-être ?)
Merci a tous pour les commentaires que je trouve impecable,
cependant mon souci est le suivant:
JE SOUHAITE CALCULER LES MOYENNES, ENSUITE FAIRE LES RANGS EN VB. ou simplement des requêtes en VB POUR EFFECTUER LE CALCUL.
MERCI A TOUS
FIFOU > D’après ce que je comprends (mais je n’ai pas la structure exacte des données), une requête « Analyse croisée » pourrait répondre à ta demande.
Bonsoir,
Merci Ms Hervé, j’ai une autre question 😉 c’est:
Tout d’abord j’ai crée un tableau supplémentaire qui affiche la somme des champs d’un autre tableau mais mon soucis c’est comment réaliser ce tableau ‘Supplémentaire’ dynamiquement qui affiche la somme par année.
C’est-à-dire, il y aura une ligne ou une colonne qui correspondra à l’année et regroupera la somme des arrêts de la machine par exemple. Exemple: Les arrêts de l’année 2012 seront affichées dans une seule colonne et celles de l’année 2013 dans
une autre colonne…
FIFOU > Cet article devrait aider.
Bonjour,
Je voudrais savoir comment faire des équation de calcul avec le lanquage SQL par exemple (Taux de disponibilité = taux des jours de travail – taux d’arrêts).
Et merci beaucoup.
paptagne > Je rajouterais quelques espaces au niveau des concaténations :
CpteDom("*"; "[tblNotes 1er Sem]"; "[MG] > " & [MG] & " AND [Classe] = '" & [Entrer la classe] & "'") + 1
D’autres choses à vérifier :
tbl Notes 1er Sem
?MG
est un champ de quel type (ta syntaxe suppose que c’est un numérique) ?Bonjour, la formule qui ne marche pas est la suivante:
CpteDom("*";"[tblNotes 1er Sem]";" [MG] >" & [MG] & "AND[Classe] = '" & [Entrer la classe] & "'")+1
Merci.
paptagne > Quelle est la formule qui ne fonctionne pas ?
Operateur > Pour le calcul des ex-æquo, cet autre article du Grenier devrait aider.
Yeo > Vu le type d’erreur, la fonction
CpteDom()
doit être mal écrite. Ou la table/requête dans laquelle elle fait référence (le 2ème paramètre deCpteDom
) n’existe pas dans la base de données.Quelle est la formule exacte que tu as tapée ?
Bonjour, je constate que tous les enregistrements ont le même rang 1 avec des valeurs décimales dans la requête paramétrée.Que faire dans ce cas?Merci.
Bonjour,j’ai le même probleme que Mr j’aimerai savoir la suite des articles .Merci de votre aide précieuse.
Salut Hervé, en utilisant la fonction suivant pour calculer les RANG des élèves « Rang: CpteDom(« * »; »[moyenne général] »; »[Mg] > » & [Mg] & » AND [Classe] = ‘ » & [Entrer la classe] & « ‘ ») + 1 »
Moyennes Général= Requête Sources
MG: la Moyenne générale
J’obtient le message d’erreur suivant
le moteur de BD Ms Access ne peut pas trouver la tbl ou la req source « [moyenne général] »[mg]>14,91666666666 and[classe]= » ». Assurez-vous qu’elle existe et qu’elle est correctement orthographiée
C’est la 2ème formule qui me pose problème.
le 2ème souci,
C’est comment faire pour que Access puisse me faire les 3 Bulletins de l’année Scolaire sans Confusion. en Utilisat la fonction « Trim » & PartDate(« q »;[Date note];1) J’ai le resultat sur 4 Trimestres ce qui n’est Juste puisque l’année scolaire compte 3 trimestres.
Merci
Bonjour Mr Hervé Inisan
Tout d’abord je vous remercie pour tout ce que vous faite pour nous.
Mon problème est le suivant.
COMMENT PRENDRE EN COMPTE LES EXEQUO LORS DU CLASSEMENT?
je vous remercie.
Badji > Quelle est la formule qui pose problème ?
Rebonjour Mr Hervé
Je vous ai envoyé un message concernant mon probléme sur le rang mais j’ai pas encore eu de réponse. En je veux faire le rang des éléves d’un établissement scolaire mais je n’arrive pas à utiliser votre méthode; Quand j’utilise la 3me méthode le systéme me dit que j’ai omis d’utiliser l’exp1000 comme fonction d’agrégat dans la formule.
Merci de M’aider
Bonjour Mr Inisan
Tout d’abord je vous remercie pour la derniére fois, en effet vous m’avez aidé il y a quelques mois à transformer des nombres en lettres.
Cette fois je reviens pour vous demander de m’aider à calculer le rang des éléves d’un établissement scolaire.
J’ai essayé votre premier méthode mais le systéme m’envoie un message me disant que j’ai introduit une virgule dans l’Expression alors que c’est la moyenne qui est un chiffre décimal de 2 chiffres aprés la virgule ».
J’ai essayé la troisiéme méthode comme la 2me ne donne rien et la encore le systéme m’envoie le message suivant « Vous avez essayé d’exécuter une requête ne comprenant pas l’expression spécifiée <<Expr1000>> comme une partie de la fonction d’agrégat ».
J’attends votre réponse avec impatience. Merci d’Avance