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 :

Montant avec decimales VBNet 2017 et Databases DB2 ORACLE MYSQL MSSQL


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut Montant avec decimales VBNet 2017 et Databases DB2 ORACLE MYSQL MSSQL
    Bonjour,

    Ma question est partagée entre VBnet et Databases ( MSSQL, MYSQL, ORACLE, DB2 ).

    J'ai créé dans les quatre SGDB une table COMPDBA avec les mêmes caractéristiques.
    Notamment une colonne MONTANT définie come DECIMAL(18,2)

    Dans mon programme VBNET ( Studio 2017 ) j'accède la table par une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBSQLA = "SELECT REFER,NOM,MATRI,MONTANT,FLAGN,FLAGA,USERID FROM  COMPDBA;"
    Plus précisément avec ce code ( suivant le SGDB)
    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
    If OAlphaT = "MSSQL" Then
                DBConnectionStringSQLA = "Data Source=" & Trim(OAlphaS) & ";Database=" & OAlphaB & ";Trusted_Connection=True;"
                DBConnSQLA = New SqlClient.SqlConnection(DBConnectionStringSQLA)
                DBConnSQLA.Open()
                DBCommandSQLA = New SqlCommand(DBSQLA, DBConnSQLA)
                DBDataReaderSQLA = DBCommandSQLA.ExecuteReader()
            Else
                If OAlphaT = "MYSQL" Then
                    Dim DBConnMySQLA = New MySqlConnection("server=" & Trim(OAlphaS) & ";uid=" & Trim(AuthUserA) & ";pwd=" & Trim(AuthPwdA) & ";database=" & OAlphaB & ";")
                    DBConnMySQLA.Open()
                    DBCommandMySQLA = New MySqlCommand(DBMySQLA, DBConnMySQLA)
                    DBDataReaderMySQLA = DBCommandMySQLA.ExecuteReader()
                Else
                    DBConnA = New Odbc.OdbcConnection(DBConnectionStringA)
                    DBConnA.Open()
                    DBCommandA.CommandTimeout = 3600
                    DBCommandA = New OdbcCommand(DBSQLA, DBConnA)
                    DBDataReaderA = DBCommandA.ExecuteReader()
                End If
            End If
    Connections spécialisées pour MSSQL et MYSQL, commandes ODBC pour DB2 et ORACLE.

    Pour MSSQL et MYSQL, le retour de la commande me donne bien les décimales pour le champ MONTANT
    Par exemple : pour MSSQL : 000000000015874.00 et pour MYSQL : 15874,00 ( je sais gérer les zéros non significatifs avant la virgule )
    Mais pour DB2 et ORACLE, je reçois
    pour DB2 : 1587400 et pour ORACLE : 15874 ( même pas 1587400 !!! )

    Tout cela est à la fois disparate, mais également inexact.

    Quelqu'un a une idée pour écrire un SELECT qui convienne et me renvoie bien les décimales séparées du montant avec un point ou une virgule?

    Merci

    Pierre


    Note : quand je passe la commande SELECT dans l'éditeur studio des SGDB je reçois toujours bien les montants marqués avec les décimales.

  2. #2
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Je suppose qu'en VB, après exécution de la requête, tu examines les valeurs dans des variables de type Double. Tu peux les visualiser en cours d'exécution en plaçant des points d'arrêts et en activant les espions.
    Lorsque tu vois alors ces valeurs selon leur réelles valeurs Double, tu peux les convertir en chaines pour l'affichage avec 2 décimales et sans zéro non significatif par
    String.Format("{0:####0.00}", LaValeurDeTypeDouble).

    Par exemple : TextBox1.Text = String.Format("{0:####0.00}", LaValeurDeTypeDouble).

    Pour le système DB2, s'il ne voit pas le séparateur décimale, il faudrait sans doute diviser sa valeur par 100 ... mais là, ça devient du bricolage hasardeux.

    J'espère que cette approche t'aidera ...

  3. #3
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Merci Phil pour la suggestion, mais elle rend la programmation pas trop belle et pas trop efficace, sachant qu'il peut s'agir de n'importe quelle table...

    Finalement, j'ai pris les connections natives ?? ( est ce le bon mot ) de DB2 et ORACLE en faisant les include's nécessaires.

    Donc passer par ceci ( extrait ORACLE pour exemple )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Imports Oracle.ManagedDataAccess.Client
     
    DBConnectionStringOraA =  "data source=" & Trim(OAlphaS) & ":1521/" & Trim(OAlphaD) & ";user id=" & Trim(AuthUserA) & ";password=" & Trim(AuthPwdA) & ";"
    DBConnOraA = New OracleConnection(DBConnectionStringOraA)
    DBConnOraA.Open()
    DBOraO = "SELECT MONTANT FROM COMPDBA"
    DBCommandOraA = New OracleCommand(DBOraA, DBConnOraA)
    DBDataReaderOraA = DBCommandOraA.ExecuteReader()
    ZLZAlpha = Trim(DBDataReaderOraA.GetValue(0).ToString())
    et là je peux trouver dans ZLZAlpha le montant avec décimales.


    J'ai envie de tirer une conclusion : il y a un bug, ou à tout le moins une grosse et belle insuffisance dans la gestion de la connexion ODBC...
    J'accuse .....
    Et si cette lacune dans ODBC est avérée, je mets le post en "résolu"...

    Bonne journée

    Pierre

  4. #4
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Voilà une pièce du problème : ZLZAlpha = Trim(DBDataReaderOraA.GetValue(0).ToString()).

    Il faut traiter les réels en Double (ou Single), pas en String.

    Je te propose d'essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim ZDouble As Double = CType(DBDataReaderOraA.GetValue(0), Double)
    ZLZAlpha = String.Format("{0:####0.00}", ZDouble)
    ...

  5. #5
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Phil,

    je suis certain que ta solution fonctionne, mais comme dans mon application, on peut faire un select sur n'importe quelle table ( au choix de l'utilisateur ) et donc la gestion des attributs des champs devient quasi impossible. Suivant la requête, chaque champ peut contenir du caractère, du numérique, une date, un timestamp, un varchar, un bin, etc.

    Je reviens sur le fait que seule la connection Odbc ne fonctionne pas, tandis que SqlConnection, MySqlConnection, OracleConnection, DB2Connection fonctionnent sur leurs propres systèmes de databases.

    Je vais donc continuer à exploiter par les connections natives.... et considérer que Odbc a une faiblesse !! ( ou que ce soit moi qui ai une faiblesse dans la connaissance de Odbc )

    Merci

    Bonne journée ( mais où est le soleil ? que l'on puisse quitter son bureau et sa programmation )

    Pierre

  6. #6
    Membre émérite 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
    Points : 2 865
    Points
    2 865
    Par défaut
    Ah oui ... le temps ...
    Il paraît que ça va s'améliorer

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

Discussions similaires

  1. substring DB2 ORACLE MYSQL
    Par MaitrePylos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/12/2007, 13h36
  2. Problème avec le mot clé ESCAPE de DB2
    Par eros dans le forum DB2
    Réponses: 1
    Dernier message: 22/11/2007, 17h10
  3. Réponses: 5
    Dernier message: 19/04/2007, 12h45
  4. Capture de fronts montants avec un PIC16F876
    Par sylvain42 dans le forum C
    Réponses: 3
    Dernier message: 12/06/2006, 14h48
  5. rand avec decimale
    Par apprenti-fab dans le forum Langage
    Réponses: 8
    Dernier message: 16/03/2006, 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