Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut ajout champ en décimal dans table ACCESS

    Bonjour,

    je cherche désespérément à insérer un champs en décimal dans une table ACCESS, mais la valeur est formatée à l'insertion.

    Code et Exemple:

    Code :
    commande.Parameters.Add(new OleDbParameter("@prix", Convert.ToDecimal(mtbPrix.Text)));
    ma MaskedTextBox mtbPrix a un masque 9,99 ( j'ai essayé avec 9.99 ).

    mon champ prix dans la table est défini comme ceci dans la table.

    Taille du champ : Décimal
    Précision : 18
    échelle : 2
    Décimales : 2

    si j’essaie d'insérer 1,12 la valeur 112 est introduite dans la table.

    Est-ce que c'est ACCESS qui formate la valeur? comment éviter cela?


    Merci ( en espérant ne pas m'être trompé de forum )

  2. #2
    Expert Confirmé

    Homme Profil pro Eric Metz
    Développeur informatique
    Inscrit en
    avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Metz
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : avril 2006
    Messages : 920
    Points : 3 246
    Points
    3 246

    Par défaut

    Bonjour,

    J'ai recréer une DB avec une table reprenant un champ du même type que le votre. Effectivement j'ai reproduis l'erreur.

    Le code suivant fonctionne :

    Code :
    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
     
    _dbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb");
     
    try
    {
       _dbConnection.Open();
     
       double dec = 9.99;
       OleDbCommand cmd = new OleDbCommand( "INSERT INTO TABLE1 (DECI) VALUES(@Val1)");
       cmd.Connection = _dbConnection;
       cmd.Parameters.Add("@Val1", OleDbType.Double).Value = dec;
     
       cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
       MessageBox.Show(ex.Message, "Erreur");
    }
    finally
    {
       if (_dbConnection != null && _dbConnection.State == ConnectionState.Open)
       {
           _dbConnection.Close();
           _dbConnection.Dispose();
       }
    }
    Il semblerait qu'utiliser le type décimal en C# provoque le problème contrairement au typedouble.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Bonjour,

    tout en laissant le type decimal dans la table?

  4. #4
    Expert Confirmé

    Homme Profil pro Eric Metz
    Développeur informatique
    Inscrit en
    avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Metz
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : avril 2006
    Messages : 920
    Points : 3 246
    Points
    3 246

    Par défaut

    Bonsoir,

    Je n'ai pas touché au schéma de la table, j'ai bien repris celui que vous avez spécifié dans votre post

  5. #5
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Bonjour binou76,

    Effectivement cela fonctionne.

    J'avais antérieurement essayer de travailler avec des double, mais là c'est C# qui provoquait des problèmes de précisions au niveau de calculs.

    Il faudrait donc que je trouve plutôt une solution pour travailler de nouveau avec des double alors

  6. #6
    Expert Confirmé

    Homme Profil pro Eric Metz
    Développeur informatique
    Inscrit en
    avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Metz
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : avril 2006
    Messages : 920
    Points : 3 246
    Points
    3 246

    Par défaut

    Personnellement quand je travaille avec des nombres avec décimal j'utilise soit les float soit les doubles. Je n'ai jamais utilisé le type décimal.

    Erreur ou non, je n'ai jamais eu de problème pour autant que les types utilisés soit les mêmes.

    Maintenant d'autres membres du forum auront peut-être des explications plus concrètes sur d'éventuels avantages à utiliser le type décimal.

  7. #7
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    Bonjour,

    Quant au choix decimal ou double, on ne peut pas te donner une réponse, il faut que tu choisisses le type qui correspond le plus à tes besoins. Deux liens intéressants Lien1 et Lien2.

    A toi de voir
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  8. #8
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Bonjour,

    J'ai toujours travaillé avec des double aussi, mais cette fois-ci j'ai des soucis.

    par cet exemple de code :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    double montTotal = 0;
     
    for (int i = 0; i < 6; i++) 
    {
         if (!labelMontant[i].Text.Equals(""))
        {
            montTotal = montTotal + 
                             Convert.ToDouble(labelMontant[i].Text.Substring(0, 
                             labelMontant[i].Text.Length - 2));
        }
    }
     
     
    double reste = Convert.ToDouble(lbMontant.Text.Substring(0, 
                        lbMontant.Text.Length - 2));
     
    label4.Text = Convert.ToString(reste - montTotal);
    Seulement les trois premiers éléments sont considérés par la condition suivante:
    Code :
    (!labelMontant[i].Text.Equals(""))
    ce que j'obtiens après la boucle :
    montTotal = 579.99 // ce qui est normal
    reste = 580.00

    mais à l'opération reste - montTotal, je n'obtiens pas 0, 01 mais 0,00999999999999091.

    Une idée de ce que ça peut être?

    Merci

  9. #9
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    avec des decimal tu aurais une meilleure précision

    Reprend tes cours sur la représentation binaire des nombres et fais le calul, tu verras que ça peut être normal
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  10. #10
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Bonjour sisqo60,

    Oui, c'est ce qui me pose problème ( le problème initial du post )

    le décimal est plus précis, mais il me pose problème quand je dois le stocker dans la base de données

  11. #11
    Expert Confirmé

    Homme Profil pro Eric Metz
    Développeur informatique
    Inscrit en
    avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Metz
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : avril 2006
    Messages : 920
    Points : 3 246
    Points
    3 246

    Par défaut

    Bonjour je pense que j'ai la solution à votre problème.

    J'ai gardé le même schéma pour votre table.

    J'utilise le Type "Décimal" pour les différents calculs pour corriger votre problème causé par manque de précision du Type Double. je spécifie juste "OleDbType.Double" comme type lors de la création du paramètre pour la sauvegarde et la valeur est sauvée correctement dans la table. Et lors de la récupération je récupère bien la bonne valeur dans une variable de type "Decimal". Voici le code que j'ai écris comme test (ne faite pas attention à l'Id qui est harcodé c'est pas propre mais c’était pour gagner un peu de temps).

    Code :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    _dbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database1.mdb");
     
    try
    {
       _dbConnection.Open();
     
       decimal montTotal = (decimal)578.98; 
       decimal reste =  (decimal)580.00 ;
     
       decimal result = reste - montTotal;
     
       // Sauvegarde dans la db
       OleDbCommand cmd = new OleDbCommand("INSERT INTO TABLE1 (ID,DECI) VALUES(2,@Val1)");
       cmd.Connection = _dbConnection;
       cmd.Parameters.Add("@Val1", OleDbType.Double).Value = result;
     
       cmd.ExecuteNonQuery();
     
       // Récupération dans la db 
       cmd.CommandText = "SELECT * FROM TABLE1 WHERE ID = 2";
     
       OleDbDataReader dr = cmd.ExecuteReader();
     
       if (dr.Read())
       {
          result = dr.GetDecimal(1);
       }
     
       dr.Close();                 
    }
    catch (Exception ex)
    {
       MessageBox.Show(ex.Message, "Erreur");
    }
    finally
    {
       if (_dbConnection != null && _dbConnection.State == ConnectionState.Open)
       {
          _dbConnection.Close();
          _dbConnection.Dispose();
       }
    }

  12. #12
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Merci,

    Je teste cela en rentrant du boulot demain et je vous tiens au courant.

  13. #13
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : février 2006
    Messages : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    Bonjour,

    Il y a OleDbType.Decimal et OleDbType.Numeric qui te permettrons de mieux stocker tes données en base. J'ai bien peur qu'enregistrer un decimal en type double te donnes (pas toujours, ça dépend de la précision) des valeurs différentes base.

    Si ton champ en base de données est un Numeric (18, 2), utilises numeric
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  14. #14
    Expert Confirmé

    Homme Profil pro Eric Metz
    Développeur informatique
    Inscrit en
    avril 2006
    Messages
    920
    Détails du profil
    Informations personnelles :
    Nom : Homme Eric Metz
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : avril 2006
    Messages : 920
    Points : 3 246
    Points
    3 246

    Par défaut

    OleDbType.Decimal supprime bien la décimale comme il a expliqué plus haut. Phénomène bizarre que je n'ai pas encore compris...

  15. #15
    Nouveau Membre du Club
    Inscrit en
    février 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 109
    Points : 30
    Points
    30

    Par défaut

    Salut,

    Merci binou76, ca fonctionne très bien et je suis enfin sorti de ce cercle vicieux.

    Effectivement sisqo60, OleDbType.Decimal me supprime la virgule ( ou point ) lors de l'insertion.
    J'ai donc essayé de travailler avec des double, où là j'avais des problèmes de précisions.

    Donc la solution de binou76 fonctionne à merveille et me permet de travailler avec des Decimal et de pouvoir les introduire en DB.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •