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

Requêtes et SQL. Discussion :

[AC-2010] Besoin d'aide requête avec calcul de pourcentages


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut [AC-2010] Besoin d'aide requête avec calcul de pourcentages
    Bonjour à tous,

    Je viens de m'apercevoir d'un gros problème sur ma requête SQL. C'est une requête qui calcule des pourcentages à partir de données d'analyses de particules et les compare avec une banque de matériaux de composition chimique connue.
    La requête marche parfaitement quand les pourcentages sont >= à 0,10%, dans la requête cela se transforme en 0,001, jusque là c'est normal.
    Cependant, en dessous, elle devient par exemple pour 0,02% => 2.000001E-04 ! Je m'en suis rendu compte car j'ai mis en place une Mise en forme conditionnelle sur ces résultats et j'ai la case qui se colorait de la mauvaise couleur (elle était rouge pour dire qu'on est pas bon alors que la valeur était bien dans le bon critère pour que la case soit de couleur verte).

    Je vous joins la requête et une image du format des champs numériques de ma table.

    Nom : requête.jpg
Affichages : 287
Taille : 146,0 KoNom : Format numérique.jpg
Affichages : 334
Taille : 54,8 Ko

    Les résultats sont enregistrés dans une table et j'ai bien 0,02% c'est seulement quand je clique sur la valeur que ça me met 2.000001E-04.

    Il me reste une semaine avant la fin de mon stage j'espère que vous pourrez m'aider !

    En tout cas merci d'avance à ceux qui prendront la peine de me lire et s'il vous faut d'autres infos n'hésitez pas à me demander !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour

    essaye val(format([TonChamp],"0.0000")) pour eliminer les decimales en trops.

    Autre possibilite : supprimer le format % dans la table et travailler avec les nombres directement.

    Et tu te contentes d'afficher en % sur les formulaire que l'utilisateur peut voir.

    A+

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Aussi tu pourrais essayer de changer le type de Reel simple a Reel double.

    Et utilme idee : utiliser des entiers long partout et diviser seulement a l'affichage (ex si tu decide que tes nombres peuvent avoir 4 decimales, tu affiche TonNombre/10000. Mais partout ailleurs tu fais des calculs sur des entiers, comme si tous tes nombres etaient multiplies par 10000.

    C'est un probleme classique de representation des reels dans les systemes informatiques. L'espace reel est continu mais l'espace de codage dans un ordinateur est discontinu donc on tasse legerement la valeur a gauche ou a droite pour la faire entrer dans une des valeurs que l'ordi peut coder.

    A+

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    D'abord un grand merci à toi Marot pour toutes les alternatives que tu m'as proposé !

    Honte à moi j'ai oublié de parler du plus important . Mes valeurs sont stockées sur une table mais je n'ai jamais réussi à faire une mise en forme conditionnelle avec des valeurs de ma tables car je ne peux pas lui dire de comparer avec la valeur d'un champ pour un enregistrement précis (du moins je ne sais pas faire). j'ai donc utilisé à la place des variables temporaires qui marchent très bien avec la MFC.
    Le problème doit venir du fait que la valeur "2.000001E-04" apparaît dans la requête car j'utilise une variable du type string de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                Dim minSi As String
                Dim maxSi As String
     
                minSi = txtSiMass - 3 * txtSiSigma.Value
                maxSi = txtSiMass + 3 * txtSiSigma.Value
                TempVars.Add "minSi", minSi
                TempVars.Add "maxSi", maxSi
    Dans la requête que j'ai mis en pièce jointe au début le "2.000001E-04" correspond au maxSi.

    Avec ce système j'ai peur d'être dans une impasse d'autant qu'il me reste très peu de temps pour changer! A moins d'arriver à utiliser les valeurs de ma table dans la MFC, je ne vois pas. Est-ce que je peux sinon imposer un format à mes variables minSi et maxSi? La solution du val(format([TonChamp],"0.0000")) ne marche qu'avec des champs non ?

    Merci encore pour ton aide.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Format te cree une chaine donc si tu mets ton resultat dans une chaine tu peux faire simplement : format([TonChamp],"0.0000")

    Je ne saisi pas pourquoi tu utlises une chaine pour stoquer une valeur numerique.

    Pour faire une mise en forme conditionnelle un peux differente tu peux utiliser l'option expression et la tu peux mettre a peu pres n'importe quoi.

    Un tuc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DFirst("NomTonChamp", "NomTaScource", "NoTaClef=" & [NomTaClef])=[NomTonChamp])
    devrait permettre de comparer la valeur du Ton champ dans l'enr courrant avec celui dont la clef correspond dans ta source.

    Attention, cela risque de ramer pas mal.

    Un possibilite est de recuperer tes valeurs de reference dans la source de donnees avec une jointure, comme cela les valeurs sont disponibles dans le meme enregistrement. Tu obtiens un truc du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select [TaTable].[TonChamp] as [TonChamp], [TaTableRef].[TonChampRefMin] as [TonChampRefMin], [TaTableRef].[TonChampRefMax] as [TonChampRefMax] ...

    Dans ta mise en forme conditionnelle tu choisi expression et tu mets [TonChampRefMin]<=[TonChamp] and [TonChamp]<=[TonChampRefMax] comme condition. (Il faut peut-etre un = au debut, je ne me souviens jamais).

    L'avantage de cette solution c'est que tu peux facilement valider tes bornes puisqu'elles sont visibles dans la source putot que planquee dans la mise en forme.

    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai utilisé une chaine car il me semble que c'est le seul moyen pour faire mon calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    minSi = txtSiMass - 3 * txtSiSigma.Value
    Enfin j'ai essayé avec single et double et ça ne marchait plus ! Je suis d'accord que je ne trouve pas cela logique mais ce n'est pas la première fois avec ACCESS

    Faute de temps, j'ai trouvé une alternative: je déclare deux nouvelles variables au format single, je leur donne la valeur équivalent à "txtSiMass - 3 * txtSiSigma.Value" qui est stockée dans un champ d'une de mes tables. Enfin je les déclare comme variables temporaires pour la MFC de mon sous-formulaire ( ce sous-formulaire n'est pas dans le même formulaire que celui où j'entre toutes les données). Enfin le plus simple est de regarder ce topic que j'avais créé sur ce sujet (tu avais d'ailleurs été le premier à me répondre ^^) http://www.developpez.net/forums/d14...u-probabilite/

    Cela m'a permis de découvrir une autre erreur. Quand j'ai une valeur négative pour un élément de l'analyse, tous les alliages qui n'ont aucune valeur pour cet élément sont quand même considérés dans la tolérance car s'ils sont nuls ils ont la valeur par défaut 0 (voir aussi la raison dans le topic en lien).

    Du coup j'ai rajouté un bout de code qui regarde si le premier caractère est un "-" (valeur négative), si c'est le cas il lui donne la valeur "0.00001" et pas 0 afin qu'ils ne soient pas dans tolérance.

    Voilà le code pour l'élément Nickel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
            'Nickel
            'Nickel
            TempVars.Remove ("minNi")
            TempVars.Remove ("maxNi")
             If (txtNiMass <> "") And IsNull(txtNiSigma) Then
                MsgBox "Vous avez oublié de rentrer l'incertitude de l'analyse du nickel"
                Exit Sub
                ElseIf (txtNiMass <> "") And (txtNiSigma <> "") Then
                Dim minNi, maxNi As String
                Dim MFCMinNi, MFCMaxNi As Single
     
                minNi = txtNiMass - 3 * txtNiSigma.Value
                maxNi = txtNiMass + 3 * txtNiSigma.Value
                MFCMinNi = oRst("NiMin")
                MFCMaxNi = oRst("NiMax")
                TempVars.Add "minNi", MFCMinNi
                TempVars.Add "maxNi", MFCMaxNi
     
                minNi = Replace(minNi, ",", ".")
                maxNi = Replace(maxNi, ",", ".")
     
                If InStr(minNi, "-") = 1 Then
                    minNi = "0.00001"
                End If
     
                If (AppendCritNote) Then
                   sCritNote = sCritNote & " + "
                End If
                sCritNote = sCritNote & "Abs((Nz([NiMaxCompo], 0) >= " & minNi & ") And (Nz([NiMinCompo], 0) <= " & maxNi & "))"
                AppendCritNote = True
            End If
    En tout cas merci pour le temps que tu as pris pour m'aider et les idées que tu m'as donné me resserviront sûrement, ainsi qu'à d'autres je l'espère !

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

Discussions similaires

  1. Besoin d'aide --> Requête
    Par furth dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/07/2007, 14h30
  2. [OpenOffice][Tableur] Besoin d'aide Feuille de calcul
    Par shido dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 18/03/2007, 16h36
  3. Besoin d'aide pour un calcul sur un site
    Par barre dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/02/2007, 08h36
  4. Aide requète avec jointure
    Par StanmaD dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/11/2006, 23h55
  5. besoin d'aide fonction avec fichier (debutant)
    Par boby61 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/03/2005, 11h22

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