IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Requête : Imposer le format d'un champ calculé de type Numérique [AC-2007]


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut Requête : Imposer le format d'un champ calculé de type Numérique
    Bonjour à tous et bonne année !

    Je travaille avec une table comprenant les notes individuelles des élèves d'une classe dans différentes matières.
    Grâce à une requête, je calcule les moyennes de la classe par matière (ce champ calculé est appelé "MoyenneParMatière"). Obtenant des nombres comprenant jusqu'à 15 décimales, je souhaiterais stocker seulement 1 chiffre après la virgule :
    ainsi je voudrais que 12,3333 et 12,25 soient stockés comme 12,3 (arrondi supérieur).

    J'arrive seulement à modifier l'affichage en sélectionnant (en Mode Création de ma requête dans la feuille Propriétés)
    Format : Standard
    Décimales : 1
    mais le nombre stocké est toujours le même...
    Existe-t-il une fonction prédéfinie sous QBE ?

    Merci par avance pour votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Je pense avoir trouvé :

    FormatNumber([MoyenneDesMatières];1)

    La fonction retourne une chaîne de caractères, mais en faisant par la suite les calculs qui m'intéresse ça marche.
    En fait d'après la doc sur la fonction FormatNumber(), je ne l'utilise pas comme c'est indiqué, donc est-ce correct ??

    FormatNumber() : Convertit des nombres en chaînes. La conversion est le résultat de la mise en forme du nombre spécifié dans le premier argument (number) à l'aide du format spécifié dans le deuxième argument (string) et selon les règles définies dans le format décimal nommé dans le troisième argument facultatif (string). Si le troisième argument, à savoir le nom du format décimal, est omis, le format décimal par défaut est utilisé. Cette fonction et l'élément <xsl:decimal-format> sont conçus pour être utilisés conjointement.

    je n'arrivais pas à utiliser l'argument spécifiant le format, car
    FormatNumber([MoyenneDesMatières];"##.#", "european")
    ne marche pas
    l'argument european est censé indiquer que le séparateur de décimales est la virgule et non le point.

    Merci par avance pour votre aide

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    J'essaierai avec Round.
    Exemple pour arrondir à une décimale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Round([MoyenneDesMatières]; 1)
    A+

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    oui merci LedZeppII ça marche !

    ensuite je cherche à calculer le rang non-dense entre les moyennes de notes (champ Moyenne) que j'ai obtenues (par exemple s'il y a 2 ex-aequo, ils ont le même rang et on saute le numéro suivant : on obtient 1 et 1 puis 3),

    en écrivant ceci ça marche (champ calculé en mode Création de ma requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CpteDom("*";"[NomRequête]";Remplacer("[Moyenne]";",";".") & ">" & Remplacer([Moyenne];",";"."))+1
    j'utilise la fonction Remplacer() (car la fonction CpteDom() ne semble accepter que les points comme séparateurs décimaux), mais vu qu'elle renvoie une chaîne de caractère, j'ai du mal à comprendre comment l'expression de comparaison (censée être entre 2 nombres : A>B) en 3ème argument est évaluée correctement ???

    De plus, je cherche à effectuer une seule requête pour calculer le rang non dense de mes notes, mais je n'arrive pas à faire mieux que 2 requêtes distinctes à partir de ma table initiale (table 1):
    - calcul des moyennes par matières (table2)
    - calcul du rang (table 2 à laquelle on ajoute le champ calculé rang non-dense)
    est-il possible de passer par des sous-requêtes dans le cas de calculs de moyennes (vu que la table 2 possède beaucoup moins de lignes que la table 1 initiale le champ calculé rang non-dense ne s'appliquera pas sur toutes les lignes de la table 1) ???

    Merci par avance pour votre aide

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    j'utilise la fonction Remplacer() (car la fonction CpteDom() ne semble accepter que les points comme séparateurs décimaux), mais vu qu'elle renvoie une chaîne de caractère, j'ai du mal à comprendre comment l'expression de comparaison (censée être entre 2 nombres : A>B) en 3ème argument est évaluée correctement ???
    Moi j'utilise la fonction Str(nombre) pour convertir un nombre en chaîne de caractères quand je veux un point comme séparateur décimal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CpteDom("*"; "[NomRequête]"; "[Moyenne]>" & Str([Moyenne])) + 1
    Le troisième argument de Cpte(..,..,..) est une chaîne de caractères.
    Comme il s'agit d'une expression SQL ...
    - le séparateur décimal est le point
    - les dates sont au format #mm/jj/aaaa#

    De plus, je cherche à effectuer une seule requête pour calculer le rang non dense de mes notes, mais je n'arrive pas à faire mieux que 2 requêtes distinctes à partir de ma table initiale (table 1)
    Ce n'est pas forcément une mauvaise chose.
    Vouloir tout faire en une seule requête, peut conduire à une requête complexe, plus lente.

    A+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci beaucoup pour tes indications LedZeppII ! (et désolé de répondre si tardivement)

    en fait il m'est demandé d'effectuer la requête (pour calculer le rang non dense de mes moyennes de notes) en une seule fois, pourrais tu m'indiquer comment je dois m'y prendre pour faire à la fois les moyennes et le calcul du rang ?


    Merci par avance

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    C'est pas franchement évident.

    Exemple avec une table tblNote(Identifiant, Note).
    Avec une seule requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT TMOY.Identifiant, TMOY.MoyenneNotes,
           (SELECT Count(*) 
            FROM (SELECT TMPNotes2.Identifiant, Round(Avg(TMPNotes2.Note), 2) AS MoyenneNotes 
                  FROM tblNotes As TMPNotes2
                  GROUP BY TMPNotes2.Identifiant) As TMOY2
            WHERE TMOY2.MoyenneNotes >  TMOY.MoyenneNotes
           ) +1 As Rang
    FROM (SELECT tblNotes.Identifiant, Round(Avg(tblNotes.Note), 2) AS MoyenneNotes
          FROM tblNotes
          GROUP BY tblNotes.Identifiant) As TMOY
    ORDER BY TMOY.MoyenneNotes DESC, TMOY.Identifiant ASC

    Avec deux requêtes :
    Si j'enregistre la sous-requête (également sous-sous-requête) suivante ...
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tblNotes.Identifiant, Round(Avg(tblNotes.Note), 2) AS MoyenneNotes
    FROM tblNotes
    GROUP BY tblNotes.Identifiant
    ... en tant que requête Access (qryMoyNotes par exemple), je gagne en lisibilité, en faisant une requête sur une requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT qryMoyNotes.Identifiant, qryMoyNotes.MoyenneNotes, 
           1 + DCount("*","qryMoyNotes","MoyenneNotes>" & Str([MoyenneNotes])) AS Rang
    FROM qryMoyNotes
    ORDER BY qryMoyNotes.MoyenneNotes DESC , qryMoyNotes.Identifiant
    A+

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour LedZeppII,
    j'ai bien analysé le code que tu as écrit, et je l'ai adapté à ma base : tout marche parfaitement ! merci merci !
    Ton aide m'a permis de mieux comprendre comment coder des requêtes imbriquées en SQL (vu que je débute et que j'utilisais surtout QBE pour les requêtes), en espérant que cela me donne de bonnes idées pour la suite !
    Je te remercie énormément de t'être penché sur mon problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Champ calculé de type date dans TCD
    Par imadeus dans le forum Conception
    Réponses: 4
    Dernier message: 03/06/2015, 15h22
  2. Format d'un champ calculé
    Par juju05 dans le forum SQL
    Réponses: 3
    Dernier message: 13/10/2011, 13h47
  3. Champ calculé de type compteur dans un état
    Par OlivierC69 dans le forum Access
    Réponses: 5
    Dernier message: 10/08/2006, 10h04
  4. Champ calculé dans requête
    Par AlexB59 dans le forum SQL
    Réponses: 3
    Dernier message: 04/01/2006, 15h52
  5. Champ calculé dans une requête
    Par HUÏEZ Fabienne dans le forum Access
    Réponses: 3
    Dernier message: 08/12/2005, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo