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

Bases de données Delphi Discussion :

Paramètre numériques mal reconnus avec DBExpress et Oracle


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut Paramètre numériques mal reconnus avec DBExpress et Oracle
    Bonjour,

    Nous avons des soucis avec les paramètres de requète de valeur flotante.

    Le contexte :
    Oracle 9i, client 9i, Appli sous delphi 2010 (edit : même problème avec XE2) avec DBExpress

    La table est simplement :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE ESSAISAND
    (
      CHAMP1  VARCHAR2(5 BYTE),
      CHAMP2  FLOAT(126),
      CHAMP3  NUMBER(19,10),
      CHAMP4  NUMBER
    )

    La requète :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into ESSAISAND
     (CHAMP1,CHAMP2,CHAMP3,CHAMP4) 
    VALUES 
    (:CHAMP1,:CHAMP2,:CHAMP3,:CHAMP4)

    A l'exécution, en utilisant ParamByName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sqlqUERY1.ParamByName('CHAMP4'   ).AsFloat := 3.33;
    On obtient l'erreur :
    ---------------------------
    Testconnexiondbexpress
    ---------------------------
    ORA-00932: types de données incohérents : %s attendu ; %s obtenu.
    ---------------------------
    OK
    ---------------------------
    L'erreur est la même avec CHAMP2 et CHAMP3.

    En fouillant sur le net on trouve des solutions qui fonctionent partiellement :
    AsBCD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sqlqUERY1.ParamByName('CHAMP3'   ).AsBcd := 2.22;
    Fonctionne si la valeur est faible.
    Ceci ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      D :=  1230000000000000000000000000.456;
      sqlqUERY1.ParamByName('CHAMP3'   ).AsBcd := d;
    retourne :
    ---------------------------
    Testconnexiondbexpress
    ---------------------------
    Opération en virgule flottante incorrecte.
    ---------------------------
    OK
    ---------------------------
    AsFmtBCD
    Fonction sur les petits nombre mais toujours pas sur les grands :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      D :=  1230000000000000000000000000.456;
      sqlqUERY1.ParamByName('CHAMP3'   ).AsFMTBCD := Doubletobcd(d);
    ---------------------------
    Testconnexiondbexpress
    ---------------------------
    1,23E27 n'est pas une valeur BCD correcte.
    ---------------------------
    OK
    ---------------------------

    AsFloat fonctione nickel avec FireBird/DBExpress mais aussi avec Oracle/BDE !

    Une solution est de se passer des paramètres :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into ESSAISAND
     (CHAMP1,CHAMP2,CHAMP3,CHAMP4) 
    VALUES 
    (:CHAMP1,:CHAMP2,:CHAMP3,'1.23E27')
    Là, la valeur est stockée correctement (Vérifié dans Toad)... Mais ensuite elle ne s'affiche plus si on affiche la table dans un DbGrid via un ClientDataset.

    Quelqu'un a eut une solution ?
    Je ne peux pas utiliser de composants spécifiques à Oracle car nos applis sont multibases (suivant les clients) FireBird/Oracle/SQLServer.

    On vient de se passer du BDE et suivi la recommandation de passer à DBexpress... Tout est basé sur DbExpress maintenant. Et nos tests ont été fait avec FireBird où il n'y a aucun souci.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    TParam.AsBCD c'est 20 chiffres significatifs, tu en mets 32 (en fait c'est un Currency, un entier géré avec une virgule fixe à 4)

    TParam.AsFloat, ça tourne autour de 15-16

    TParam.AsFMTBCD couple le avec DoubleToBCD n'aura pas plus d'intéret que AsFloat car tu reste limité à 15-16 chiffres significatifs

    Essaye un TBcd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sqlqUERY1.ParamByName('CHAMP3'   ).AsFMTBCD := StrToBcd('1230000000000000000000000000.456');
    Il est rare de travail avec de tel nombre !
    Avec '1.23E27' tu perds dont la précision et 456 !
    Tu évoques FireBird, BDE, ... cela fonctionne avec une précision de 32 chiffres significatifs ou seulement 15 à 20 ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Bonjour,

    Même erreur.

    J'ai aussi la même erreur avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlqUERY1.ParamByName('CHAMP3'   ).AsFMTBCD := StrToBcd('1.23E27');
    Alors que 1.23E27 n'a que peu de chiffres significatifs

    1.23E27 tient très bien dans un Single (Float sous FireBird)

    En passant sans paramètre, 1.23E27 est bien stocké dans la base. Mais ça oblige à tranformer en chaine les paramètre directement dans la requète.

    Edit : j'avais laissé le .456 par erreur, 123000000000000000000000000.0 ne fonctionne pas non plus. Single va de 1.0E-38 à 100E38 environ.
    Le pb est justement de passer par des paramètres BCD qui eux limites les valeur.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    As-tu besoin d'une grand précision, les 456 ?

    Car dans ce cas, utilise que le FLOAT ou NUMBER(19,10) dans Oracle, semble que ce soit le NUMBER implicite, quelles sont ces limites dans ce cas ?

    Je travail assez peu sur de grand chiffre, en compta, le Currency suffit, au pire, il y a un compte dédié aux erreurs d'arrondis.
    En finance, c'est là qu'il faut pousser, surtout pour les taux de change, qu'il faut calculer sur 6 digits et non 4 comme le Currency, pour le moment, j'ai jamais dépassé NUMBER(7,6) ce qui tient correctement dans unDouble, c'était sur Oracle, je t'avoue que je n'ai jamais vérifié si la conversion Euro-FrancBelge était bonne, j'avais juste finalisé l'outil, procédure et déploiement pour la migration Paradox/BDE -> Oracle/ADO fait par un collègue démissionnaire d'une application de gestion financière d'une ONG.
    C'était les plus gros chiffres que j'ai vu !

    Moi, je travail plus avec les bits et des entiers qu'avec du flottant !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Les 456 non.
    La précision d'un Single me suffit dans la plupart des cas.
    Dans certains cas je passe en Double (DOUBLE PRECISION sous firebird) car les 8/9 chiffres ne sont pas suffisant.

    Mais dans tous les cas AsFloat devrait fonctionner.

    J'ai tellement eut de doute que je viens même de refaire un essai sous FireBird
    Sous FB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ParamByName('TRUC').AsFloat := 1.23E27;
    Fonctionne sans problème.
    1229999970340245300000000000.000000 en float
    1230000000000000000000000000.000000 en double précision.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Ce qui pose problème, c'est le type Oracle, CHAMP1 2 et 3 fonctionne ?
    Modifie CHAMP4 pour qu'il ressemble à un de ces trois champs !
    Je ne vois que cela !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/05/2010, 16h54
  2. [D2010][Oracle 10g] Paramètre de requête avec DBExpress
    Par Lung dans le forum Bases de données
    Réponses: 8
    Dernier message: 26/02/2010, 13h37
  3. Réponses: 3
    Dernier message: 12/12/2008, 08h05
  4. Réponses: 15
    Dernier message: 18/11/2008, 17h41
  5. Pb de recordcount avec dbexpress et Oracle
    Par jullegeay dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/07/2006, 14h29

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