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

VB.NET Discussion :

VB + MYSQL + Inserer corectement Decimal [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut VB + MYSQL + Inserer corectement Decimal
    Bonjour,
    Je n’arrive pas à insérer correctement une valeur décimal dans mysql.

    J'ai une db sous MYSQL, la colonne est décimal (10,2).
    Pour faire simple j'ai qu'une valeur.
    Dans TextBox8.Text = 18,55 (pour l'exemple).

    Une partie de mon code boutton est le suivant :

    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
            Dim Sin_IVA, Con_IVA, Diff_IVA As Decimal
            Sin_IVA = Val(TextBox8.Text)
            Dim COMMAND As New MySqlCommand
            Dim READER As MySqlDataReader
            Dim a As New OpenFileDialog
            Try
                MysqlConn.Open()
                COMMAND.Connection = MysqlConn
                COMMAND.CommandText = "INSERT INTO  CostesMaquinaria (Precio_Sin_Iva) 
                Values (@Value1)"
                'COMMAND.Parameters.AddWithValue("@Value1", Sin_IVA)
                COMMAND.Parameters.AddWithValue("@Value1", MySqlDbType.Decimal).Value = Sin_IVA
                READER = COMMAND.ExecuteReader
                MsgBox("Data Save !", MsgBoxStyle.Information)
                MysqlConn.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                MysqlConn.Dispose()
            End Try
    Malheureusement le résultat dans mysql est 18,00

    Que dois-je faire pour avoir le bon résultat.
    Merci

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Hola

    Tu as certainement un problème séparateur décimal.

    Pour toutes les zones de texte à l'écran, le séparateur est celui défini dans les paramètres régionaux de Windows. L'insertion d'un séparateur de millier (ex. US 10 000.00$) pose aussi des problèmes.
    Dans le code, les calcul ne peuvent se faire qu'avec le POINT comme séparateur décimal : 10000.00$.

    Pour vérifier que ton problème est bien celui-là, remplace la virgule par un point dans la TextBox : TextBox8.Text = 18.55

    Quand cela se vérifie, je te proposerai une petite fonction qui remplace "automatiquement" la virgule par un point quand c'est nécessaire.


  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    Merci d'avoir répondu.
    Le problème est le suivant.
    Si je mets un point. Bam, fermeture direct du debug.

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Là, rien à voir, il n'y a aucun rapport entre le fait de mettre un point quelque part dans le code et le fonctionnement du debogueur (sauf erreur de ma part ).

    Ne peux-tu envoyer ton code et le schéma de la DB, que je puisse tester sur mon PC ?

    Mais avant cela, vérifie encore (s'il tu veux bien ...) le détail suivant :
    Je vois dans ton code READER = COMMAND.ExecuteReader.
    Vu que l'opération demandée ,n'est pas un SELECT, ne devrais-tu pas écrire READER = COMMAND.ExecuteNonQuery.


  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    J'envoi cela demain.
    Car cela commence à être un peu compliquer.
    Je vérifie demain.
    Merci.

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Pas de problème, j'arrête pour ce soir.
    Bonne nuit.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    Bonjour !
    J'ai mis les liens ici :

    https://framadrop.org/r/OxzE8iOdz6#2...dXuIf+a0mPH4M=
    https://framadrop.org/r/7bXbCApPlm#c...6TbFfsiJ7iwsQ=

    Voir si on peux m'eclairer un peux plus.

    Je me pose la entre double et decimal et les claviers.

    Sur ce code j'ai mis Decimal. Mais sur les textbox je met une virgule et le code passe pas. Par contre avec un point cela passe.
    Aussi apres qu'en je clique sur enregistrer. Les colonnes sont decimal mais cela marche pas pour Precio_Con_Iva et Diff_IVA.

    Edit:
    Je pense que pour Precio_Con_Iva et Diff_IVA le resultat apparait avec des virgules au lieu de point. Je vais voi ce qui cloche en attendant une reponse.

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Tu utilises le type DECIMAL. Il est différent du type SINGLE ou DOUBLE.
    Le type DECIMAL en VB sert à présenter de grands nombres. (ci-joint LesTypes.pdf, un tableau des types en VB).+
    Pour représenter des nombres réels (des Floats), il faut utiliser Single ou Double.
    Je ne sais pas quel est l'usage de Decimal en MySql, mais je te suggère d'utiliser Single ou Double en VB et en MySql.

    Par ailleurs, je te signalais hier qu'il ne convient pas d'ultiliser EXECUTEREADER pour un INSERT. Il faut (je crois) utiliser EXECUTENONQUERY.

    Pour ce qui est de la virgule et du point, peu importe ce qui se voit dans le TextBox. Mais pour ce qui entre dans un calcul ou dans un champs de DB, ça doit être un point.

    Puisqu'il n'y a pas de séparateur de milliers (si je comprends bien), je te propose de traiter toujours le texte numérique d'un TextBox comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ' ... ...
            Dim Sin_IVA, Con_IVA, Diff_IVA As DOUBLE
            Sin_IVA = CTYPE(TextBox8.Text.Replace(",", "."), Double)
            Con_IVA = CTYPE(TextBox10.Text.Replace(",", "."), Double))
            Diff_IVA = CTYPE(TextBox11.Text.Replace(",", "."), Double))
    ' ... ...
                COMMAND.Parameters.AddWithValue("@Value4", Sin_IVA)
     
                COMMAND.Parameters.AddWithValue("@Value6", Con_IVA)
                COMMAND.Parameters.AddWithValue("@Value7", Diff_IVA)
    ' ... ...
    Je te propose de réviser ces quelques détails.Tiens moi informé.

    Questions indiscrètes : tu es hispanophone ? Pourquoi questionnes-tu un forum francophone ? (pas obliger de répondre ...).


  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    OK. Je vais revérifier mon code je reviens vers toi demain. Je vis en Espagne pour le boulot. C'est plus facile de se comprendre en français.

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Merci pour la réponse ...
    L'adresse d'un forum en langue espagnole ne t'intéresse donc pas.

    Bonne soirée,


  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Ne pas utiliser val mais decimal.tryparse
    Ça utilise le séparateur de décimal paramétré dans Windows, on peut jouer sur la culture pour forcer un séparateur.

    Décimal est un nombre fixe, single et double peuvent être des approximations et donc ne sont pas pratique pour des mesures ou des valeurs monétaires.
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    Bonjour !

    Merci pour le code

    Mais j'ai d'autres question avec DOUBLE.

    J'ai tester le code. Pas de problème à ce niveau.
    J'avais 3 valeurs pour tester, "111,23","111,2325" et "111,555". Pas de problème à l'insert dans la db MYSQL.
    J'ai voulu vérifier le résultat qui devrait être "334,0175" mais j'ai "334,01750000000004". Pourquoi ?
    C'est surement pour cela que Pol63 dis que c'est pas bon.
    Aussi comme j'utilise CrystalReport pour générer mes résultats.
    Je ne peux pas faire un sum de détail. A moins de créer une formule avec ToNumber({CostesMaquinaria.PrecioCoste})
    Oui j'ai modifier un peu le code avec un truc simple pour tester au lieu de SIN_IVA
    Merci pour vos réponses.

  13. #13
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    C'est vrai qu'un réel est rarement "juste" dans sa représentation en machine (sur 8 octets, par exemple, il y a toujours un ou deux bits à l'extrême droite du jeu d'octets qui n'ont pas la valeur qui faudrait) et cela laisse "trainer" une lointaine décimale résiduelle.
    Cependant, cela n'affecte pas les calculs considérés avec une précision raisonnable, qui serait au maximum de 4 décimales dans ton cas (pour le calcul de TVA, 4 décimales pour les calculs et 2 à l'affichage).

    Je suppose que tu as bien choisi le même type "Double" dans VB et dans MySQL (j'insiste sur ce détail parce que généralement, en Double l'imprécision des réels ne se perçoit plus, me semble-t-il).
    Je te propose donc de formater les valeurs à l'affichage, ou même juste avant la sommation, avant leur mise à disposition de CrystalReport. Une fonction ToNumber par exemple, peut être très utile.

    Ton problème serait-il donc résolu ?

    Excellente journée,


  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : Espagne

    Informations forums :
    Inscription : Juillet 2003
    Messages : 323
    Par défaut
    Oui en effet. J'avais mis bien DOUBLE dans MYSQL, etc....
    Mon Problème est bien résolu.
    Merci à vous et a très bientôt.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/05/2006, 11h41
  2. Problèmede insert MySQL avec les DECIMAL
    Par SuperCed dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/04/2006, 17h04
  3. comment inserer les entrée d'une formulaire dans MySQL
    Par horri dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 28/02/2006, 19h16
  4. inserer des donnees issues d'un formulaire dans mysql
    Par sousou207 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/12/2005, 23h50
  5. [MySQL]Inserer fichier pdf dans une table
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/11/2005, 16h08

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