Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access
Access Forum d'entraide sur Microsoft Access. Avant de poster -> La F.A.Q Access
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 13h27   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 39
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 39
Points : 2
Points : 2
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
sophie) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h53   #2
Invité de passage
 
Inscription : décembre 2011
Messages : 39
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 39
Points : 2
Points : 2
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
sophie) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 18h59   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonjour,

J'essaierai avec Round.
Exemple pour arrondir à une décimale :
Code :
Round([MoyenneDesMatières]; 1)
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2012, 20h33   #4
Invité de passage
 
Inscription : décembre 2011
Messages : 39
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 39
Points : 2
Points : 2
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 :
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
sophie) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 08h23   #5
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonjour,

Citation:
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 :
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#

Citation:
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2012, 16h11   #6
Invité de passage
 
Inscription : décembre 2011
Messages : 39
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 39
Points : 2
Points : 2
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
sophie) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 19h03   #7
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

C'est pas franchement évident.

Exemple avec une table tblNote(Identifiant, Note).
Avec une seule requête :
Code sql :
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 :
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 :
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+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 21h44   #8
Invité de passage
 
Inscription : décembre 2011
Messages : 39
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 39
Points : 2
Points : 2
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
sophie) est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h37.


 
 
 
 
Partenaires

Hébergement Web