Résultat de calcul érroné!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
24 août 2007
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
S'il vous plait aidez moi, j'ai un gros pb!!!!!! J'ai fait un logiciel de gestion du stock mais le hic c que le VB me joue des tours!!!!!!!!!!!!
Il y a une formule pour le prix pondéré et le VB me fait des résultats de calcul totallement fausse.
En plus lorsque je fais entrer un article dont la quantité est par exemple 1.333 eh ben il neglige tout ce qui est aprés la virgule.
En sachant que je travaille sur Access et que la quantité et le prix sont déclaré des réels double!!!!!!!
Bizar non?

15 réponses

Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Il néglige ce qui est après la virgule.... moi ca me fait penser à une erreur de gestion de symbole de décimale.
Une piste : Lorsque tu convertis des string en nombre, vérifie bien que tu changes les virgules en point :
Dim d as double = Val(Replace(nombre, ",", "."))
Où nombre est un string à interpréter

Julien.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
T'as pas l'impression qu'il manque quelques chose pour qu'on puisse t'aider ???????

Avec le bout de code qui pose problème, tu aurais peut-etre une chance que quelqu'un parmis nous mette le doigt sur le problème.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
251
Date d'inscription
lundi 29 mars 2004
Statut
Membre
Dernière intervention
4 mars 2008
1
Etant donné que je n'ai pas de code sous les yeux, je vais essayez de te guider en aveugle, mais je ne te garantis rien...

1. Il est improbable qu'il existe une erreur de calcul jamais vue auparavant, et qui conduise à des résultats aberrants. La seule erreur probable, c'est : un programme qui ne tourne pas rond.

Donc :

Si tu utilises des variables, vérifie qu'elles sont bien typées. Par exemple, pour les Double :
Dim Variable As Double

Où stockes-tu le résultat du calcul ? Si c'est dans une variable, vérifie qu'elle ait aussi un bon type.

Je voudrais t'aider davantage mais je manque de précisions... Si tu pouvais développer un peu, ce serait plus pratique.





Cacophrène
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
Bah ouais, je trouve cà bizarre moi aussi !

Mais sinon, que veux tu qu'on fasse pour toi ? Non parce que sans le moindre bout de code, on va pas pouvoir t'aider... VB fait des calculs exacts normalement, donc y'a forcément un truc qui cloche dans ton code.
Messages postés
13
Date d'inscription
mardi 20 décembre 2005
Statut
Membre
Dernière intervention
24 août 2007

Private Sub Label1_Click()
Dim rs As Recordset
Dim sql As String
Dim test As Integer
Dim qteae As String
Dim priae As String
Dim repre As Integer
Select Case Txtmode
   
    Case "Mode Ajout"
   
        If Not (valfour) And valent Then
            MsgBox "validez le fournisseur"
            four = ""
            Exit Sub
        End If
       
        If four = "" Then
            MsgBox "valeur fournisseur invalide"
            four.SetFocus
            Exit Sub
        End If
       
        If bl = "" Then
            If valent Then
                MsgBox "valeur B.L invalide"
                Exit Sub
            Else
                MsgBox "valeur B.S invalide"
                Exit Sub
            End If
            bl.SetFocus
        End If
       
        If Not (VALFAM) Then
            MsgBox "validez la famille"
            famille.SetFocus
            Exit Sub
        End If
           
        If Not (VALCLA) Then
            MsgBox "validez la famille"
            classe.SetFocus
            Exit Sub
        End If
   
        If Not (VALFAM) Then
            MsgBox "validez la famille"
            famille.SetFocus
            Exit Sub
        End If
       
        If QTE = "" Then
            MsgBox "valeur QTE invalide"
            QTE.SetFocus
            Exit Sub
        End If
       
        If pu = "" Then
            MsgBox "valeur pu invalide"
            pu.SetFocus
            Exit Sub
        End If
       
        Data.rsmajstock.AddNew
       
        Data.rsmajstock.Fields(1) = four
        Data.rsmajstock.Fields(2) = bl
        Data.rsmajstock.Fields(3) = fam
        Data.rsmajstock.Fields(4) = classe
        Data.rsmajstock.Fields(5) = Code
        Data.rsmajstock.Fields(6) = CDbl(Val(QTE))
        Data.rsmajstock.Fields(7) = CDbl(Val(pu))
        Data.rsmajstock.Fields(8) = dte
        Data.rsmajstock.Fields(9) = DateTime.Date
        test = 0
        If valent Then
            Data.rsarticle.MoveFirst
            Do Until Data.rsarticle.EOF Or test = 1
                If Data.rsarticle.Fields(2) <> Code Or Data.rsarticle.Fields(0) <> fam.Text Or Data.rsarticle.Fields(1) <> classe.Text Then
                    Data.rsarticle.MoveNext
                Else
                    test = 1
                End If
            Loop
            If CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val(QTE)) <> 0 Then
                Data.rsmajstock.Fields(10) = (CDbl(Val(Data.rsarticle.Fields(5))) + (CDbl(Val(pu)))) / 2
            Else
                Data.rsmajstock.Fields(10) = 0
            End If
            If CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val(QTE)) <> 0 Then
                Data.rsarticle.Fields(5) = CDbl((CDbl(Val(Data.rsarticle.Fields(5))) * (CDbl(Val(Data.rsarticle.Fields(6))))) + (CDbl(Val(QTE)) * CDbl(Val((pu)))) / (CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val((QTE)))))
            End If
            Data.rsmajstock.Fields(11) = CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val(QTE))
            Data.rsarticle.Fields(6) = CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val(QTE))
           
            Data.rsmajstock.Fields(12) = "ent"
           
        Else
            Data.rsarticle.MoveFirst
            Do Until Data.rsarticle.EOF Or test = 1
                If Data.rsarticle.Fields(2) <> Code Or Data.rsarticle.Fields(0) <> fam.Text Or Data.rsarticle.Fields(1) <> classe.Text Then
                    Data.rsarticle.MoveNext
                Else
                    test = 1
                End If
            Loop
           
            Data.rsmajstock.Fields(10) = CDbl(Val(pu))
           
            Data.rsmajstock.Fields(11) = CDbl(Val(Data.rsarticle.Fields(6))) - CDbl(Val(QTE))
            Data.rsarticle.Fields(6) = CDbl(Val(Data.rsarticle.Fields(6))) - CDbl(Val(QTE))
           
            Data.rsmajstock.Fields(12) = "so"
        End If
            Data.rsmajstock.Fields(13) = "V"
            Data.rsmajstock.Fields(14) = DateTime.Date
            Data.rsmajstock.Update
            Data.rsarticle.Update
            repre = MsgBox("Avez vous d'autre ajout à faire", vbYesNo)
            If repre <> 7 Then
                Data.rsmajstock.Update
               Data.rsarticle.Update
                LISTFOUR.Visible = False
                LISTFAM.Visible = False
                listcla.Visible = False
               listart.Visible = False
                bolrechfam = False
                VALFAM = False
                bolrechcla = False
                VALCLA = False
                bolrechart = False
                VALART = False
                fam = ""
                classe = ""
                Code = ""
                QTE = ""
                pu = ""
                uni = ""
                fam.SetFocus
                Exit Sub
            End If
Case "Mode Suppression"
        If Data.rsmajstock.Fields(12) = "ent" Then
       
            Data.rsarticle.MoveFirst
            Do Until Data.rsarticle.EOF Or test = 1
                If Data.rsarticle.Fields(2) <> Code Or Data.rsarticle.Fields(0) <> fam.Text Or Data.rsarticle.Fields(1) <> classe.Text Then
                    Data.rsarticle.MoveNext
                Else
                    test = 1
                End If
            Loop
           
            If CDbl(Val(Data.rsarticle.Fields(6))) >= CDbl(Val(Data.rsmajstock.Fields(6))) Then
                If CDbl(Val(Data.rsarticle.Fields(6))) - CDbl(Val(Data.rsmajstock.Fields(6))) <> 0 Then
                    Data.rsarticle.Fields(5) = CDbl(((Val(Data.rsarticle.Fields(5))) * CDbl(Val(Data.rsarticle.Fields(6)))) - CDbl((Val(Data.rsmajstock.Fields(7))) * CDbl(Val(Data.rsmajstock.Fields(6))))) / CDbl((Val(Data.rsarticle.Fields(6))) - CDbl(Val(Data.rsmajstock.Fields(6))))
                Else
                    Data.rsarticle.Fields(5) = 0
                End If
                Data.rsarticle.Fields(6) = CDbl(Val(Data.rsarticle.Fields(6))) - CDbl(Data.rsmajstock.Fields(6))
                Data.rsmajstock.Fields(13) = "S"
                Data.rsmajstock.Fields(14) = DateTime.Date
            Else
                MsgBox "Impossible de supprimer cet enregistrement ce là rendrait le stock négatif"
            End If
        Else
            Data.rsarticle.MoveFirst
            Do Until Data.rsarticle.EOF Or test = 1
                If Data.rsarticle.Fields(2) <> Code Or Data.rsarticle.Fields(0) <> fam.Text Or Data.rsarticle.Fields(1) <> classe.Text Then
                    Data.rsarticle.MoveNext
                Else
                    test = 1
                End If
            Loop
              "calcul du prix pondéré"  Data.rsarticle.Fields(5) = CDbl(((Val(Data.rsarticle.Fields(5))) * CDbl(Val(Data.rsarticle.Fields(6)))) + (CDbl(Val(Data.rsmajstock.Fields(7))) * CDbl(Val(Data.rsmajstock.Fields(6))))) / (CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Val(Data.rsmajstock.Fields(6))))
                Data.rsarticle.Fields(6) = CDbl(Val(Data.rsarticle.Fields(6))) + CDbl(Data.rsmajstock.Fields(6))
                Data.rsmajstock.Fields(13) = "S"
                Data.rsmajstock.Fields(14) = DateTime.Date
               
        End If
            Data.rsmajstock.Update
            Data.rsarticle.Update


End Select
Label20_Click
End Sub

Le résultat est stocké dans la base de donnée.
Merci d'avance
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Essaye ce que je t'ai dis, remplace tout tes Val(Data....) par Val(Replace(Data..., ",", "."))

Julien.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ou au contraire supprime tes Val

Lorsque tu as CDbl(Val(---)), noramelement CDbl(---) devrait suffire.

A savoir que Val n'accepte que le Point (".") comme séparateur décimal, tandis que CDbl accepte ce qui est configuré dans les paramètres de Windows (point ou virgule).

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

salut à tous !!!

pour les pb de virgules à la place de points il y a :

Panneau de configuration .... Options régionales et linguistiques .... Personnalisé ....  Onglets  'Nombres' et 'Symbole Monétaire' , combobox 'Symbole décimal', mettre le point, à la place de la virgule.
Cela réglera tous les pb de ce genre, présents et avenir !!!!

à plus !!!!
 

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Personnellement je préfère coder de manière universelle et prévoir tout les cas (quitte à être un chouilla plus lent) que de changer les paramètres de mon pc pour tous mes programmes et de devoir le faire sur les pc auxquels je distribue mes progs...

Julien.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
erefdatacomputing, elle est bien gentille ta solution. Sur ta machine tu fait ce que tu veux, c'est pas un problème. Sur la machine du client tu ne touche surtout pas à ce qui n'est pas utile. Ca ne te regarde pas comment comment il configure sa machine tant que ça ne remet pas en cause ton programme.
Ou alors, si tu change la configuration, t'en assume toutes les conséquences (" Allo pourquoi mon tabeur Excel fait des erreurs de calculs depuis que vous avez toucher à ma machine?", etc....)

Je suis d'accord avec Julien, lorsque c'est possible il vaut mieux programmer de façon universelle, et prévoir le maximum de cas. Ca a l'avantage de te mettre à l'abris de problèmes futurs, et dans certains cas d'acquerir une certaine notoriété auprès du client, au détriment du concurent qui n'a pas été aussi malin .

Changer les paramètres régionnaux de la machine, ce n'est pas une solution, c'est juste un masque sur le problème (sauf cas vraiment très particuliers et en accord avec toutes les parties prenantes).

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

Hello Casy !!


1) rien dans ce que Tiger1982 a indiqué, ne laissait à penser qu'il parlait, d'une machine appartenant à un client !!!

2) je te signale que le symbole décimal qui se trouve sur les claviers des calculatrices, ordinateurs, et autres, c'est le 'point' !!!!!
Et c'est en fonction des paramètres de la machine, que le point ou la virgule est affichée !!
Sans parler du conflit 'latin-anglosaxon' que sème la zizanie en ce qui concerne cette 'virgule' et les 'séparateurs de milliers' !!!
(US: 1,000,000,000.00    FR: 1.000.000.000,00)

3) Bien entendu, s'il s'agit d'une machine client (ce que je ne peux pas deviner !!!), il faut éviter de toucher à ce genre de paramètres !! 
Autrement, je persiste, et signe, cela règle ce genre de Pb !!!

à bon entendeur .... salut !!  

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Non ça ne le regle pas, désolé je maintien, ça ne fait que le cacher. Crois-en l'expérience, le problème réapparaitra un jour ou l'autre. Et plus vite que tu ne le pense.

Pourquoi avoir plusieurs méthodes de codage suivant la destination du logiciel.

Autant être conciencieux et faire du code propre dès le départ et pour tout le monde. C'est une habitude à prendre et ça coute pas plus cher.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
165
Date d'inscription
mardi 7 mars 2006
Statut
Membre
Dernière intervention
24 avril 2018

Salut Casy !!


 Tu dis :   'Autant être conciencieux et faire du code propre dès le départ et pour tout le monde. C'est une habitude à prendre et ça coute pas plus cher.'

=> Entièrement d'accord avec toi !!

Tu dis  :  'Non ça ne le regle pas, désolé je maintien, ça ne fait que le cacher. Crois-en l'expérience, le problème réapparaitra un jour ou l'autre. Et plus vite que tu ne le pense.'

1) => Si c'est possible dans Windows !!! c'est que c'est prévu à cet effet !!! et ça ne cache rien du tout  !!!

2) => "Chacun vois midi à sa porte !!!"   ça fait 20 ans que je programme ... Basic, QBasic, GWBasic, VB5, VB6 (dont près de 5 ans en VB6) pour des applications du style logiciels de gestion d'entreprise, gestion de stocks, commandes clients et fournisseurs, etc..., liès pour la plupart à des Bdd ACCESS, et je n'ai JAMAIS eu les problèmes que tu penses qu'il pourrait y avoir !!
Il faut dire qu'à chaque fois, c'était pour des machines fournies et configurées par mes soins, didiées uniquement à mes applications !!!
Donc soit, "Je suis très doué "(lol ce que je doute grandement !!) ou bien 'J'ai dû avoir de la chance' !!!?? (ce qui est plus probable !!)

Les Pb que tu imagines , sont à mon avis liés à des nombres décimaux mémorisés dans d'autres logiciels (EXCEL, ACCESS, et autres) et ayant un symbole décimal qui ne serait plus reconnu en cas de changement dans les paramètres de Windows !!!
 
C'est effectivement le risque principal !!!

rappel dans mon précedent post: 

"Bien entendu, s'il s'agit d'une machine client (ce que je ne peux pas deviner !!!), il faut éviter de toucher à ce genre de paramètres !! "

Et après tout ...  je ne donnais que mon avis ... ceux qui pensent différement ... je ne les ai pas contestés ni critiqués... et je n'entend pas les convaincre à une méthode parmi d'autres, ni leur faire la leçon !!! 
Après cela .. si mon avis ne plait pas ... libre à tous de ne pas en tenir compte !!!
Merçi quand même de cette 'critique constructive' !!!

Je comprends vite mais il faut m'expliquer longtemps et tout en détails !!!
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
J'appuie la réserve de casy quant à la modification des paramtères régionaux de windows, car imagine : tu fais 2 programmes, l'un qui doit prendre le point comme séparateur décimal, et un autre la virgule... tu fais comment là ???

Ou encore plus bête : à chaque réinstallation de Windows, il faudra penser aller modifier les params pour que ton prog fonctionne... Lorsque ce n'est installé que sur une seule machine, c'est gérable, mais lorsque c'est pour un parc informatique, ou chez des clients, là par contre, c'est un véritable casse-tête !

J'appuie donc casy : il faut faire un prog capable de s'adapter aux params de windows, et non le contraire !!!
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Moi aussi ça fais pas mal d'années que je programme (divers langages Basics, Pascals, C, assembleur, ...) dont 6 années en tant que professionel.

Et je peux te dire que les problèmes, je ne les imagines pas. Ils sont bien réels et sont mon pain quotidien.

Evidemment, si les machines que tu utilise sont dédiées exclusivement à tes applications, tu peux te premettre de faire ce que tu veux et surtout n'impornawak.

Sur ce, je pense qu'un admin peut cloturer le topic, avant que ça parte vraiment en vrille.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #