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

  1. 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 champ Classe, de type Texte, de taille 10. Dans un scénario réel, on aurait sans doute une table spécifique pour les classes, mais ce n’est pas le sujet… 🙂
  2. Passez en mode de saisie, et renseignez la classe de chaque élève.
  3. Ouvrez ensuite les requêtes construites dans l’article précédent, et ajoutez le champ Classe sur la grille de ces requêtes.
  4. Comme on veut pouvoir filtrer par classe, ajoutez le critère [Entrer la classe] sous ce champ, de façon à obtenir :
  5. 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.

Conseil
Pour plus d’informations sur les concaténations, consultez le site www.self-access.com.

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 :

Transformez ce calcul en :

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 :

Aménagez ce champ calculé pour obtenir :

A vous de jouer !

Vous aimerez aussi...

25 réponses

  1. Rulo dit :

    Salut tout le monde comment utilisé la fonction cptedom avec des 3 tables

  2. Jacques Gronier dit :

    Merci d’avance
    Bonne soirée
    Jacques

  3. Hervé Inisan dit :

    Jacques Gronier > Effectivement, ça peut être une piste. L’article pour Access devrait être en ligne demain.

  4. Jacques Gronier dit :

    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

  5. Hervé Inisan dit :

    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…

  6. Jacques Gronier dit :

    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

  7. Hervé Inisan dit :

    Altech > Peux-tu préciser ? (un exemple de données et de traitement, peut-être ?)

  8. ALTECH dit :

    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

  9. Hervé Inisan dit :

    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.

  10. FIFOU dit :

    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…

  11. Hervé Inisan dit :

    FIFOU > Cet article devrait aider.

  12. FIFOU dit :

    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.

  13. Hervé Inisan dit :

    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 :

    • Est-ce qu’une table (ou une requête) existe bien dans la base avec ce nom : tbl Notes 1er Sem ?
    • MG est un champ de quel type (ta syntaxe suppose que c’est un numérique) ?
  14. paptagne dit :

    Bonjour, la formule qui ne marche pas est la suivante:
    CpteDom("*";"[tblNotes 1er Sem]";" [MG] >" & [MG] & "AND[Classe] = '" & [Entrer la classe] & "'")+1
    Merci.

  15. Hervé Inisan dit :

    paptagne > Quelle est la formule qui ne fonctionne pas ?

  16. Hervé Inisan dit :

    Operateur > Pour le calcul des ex-æquo, cet autre article du Grenier devrait aider.

  17. Hervé Inisan dit :

    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 de CpteDom) n’existe pas dans la base de données.

    Quelle est la formule exacte que tu as tapée ?

  18. paptagne dit :

    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.

  19. paptagne dit :

    Bonjour,j’ai le même probleme que Mr j’aimerai savoir la suite des articles .Merci de votre aide précieuse.

  20. Yeo dit :

    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

  21. Operateur dit :

    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.

  22. Hervé Inisan dit :

    Badji > Quelle est la formule qui pose problème ?

  23. Badji dit :

    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

  24. Badji Demba dit :

    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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *