Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Profil pro Vincent NOURRY
    ARTISAN
    Inscrit en
    février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Vincent NOURRY
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ARTISAN
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2012
    Messages : 17
    Points : 4
    Points
    4

    Par défaut Gerer le format décimal

    bonjour,


    J'ai un petit problème avec des données

    quant j'envois des donnée sur mon serveur il me les stock pas au bon format:

    voici ma base
    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
     
    --Table: MATERIAU
     
    --DROP TABLE MATERIAU;
     
    CREATE TABLE MATERIAU (
      ID               INTEGER NOT NULL,
      DESIGNATION      VARCHAR(70),
      UNITE            VARCHAR(3),
      PRIX             DECIMAL(9,3),
      COND             DECIMAL(6,3),
      MARGE            DECIMAL(3,3),
      STOCK_MINI       DECIMAL(9,3),
      FAMILLE          VARCHAR(20),
      PRIX_DE_VENTE    DECIMAL(6,2),
      EMPLACEMENT      VARCHAR(20),
      PRIX_VENTE_FIXE  INTEGER,
      Q_STOCK          DECIMAL(9,3),
      COMMENTAIRE      VARCHAR(200),
      STOCK_MAXI       DECIMAL(9,3),
      GERER_EN_STOCK   INTEGER,
      TEST             NUMERIC(5,1) DEFAULT NULL,
      /* Clés */
      PRIMARY KEY (ID)
    );
     
     
    SET TERM ^ ;
     
    CREATE TRIGGER MATERIAU_BI FOR MATERIAU
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(GEN_MATERIAU_ID,1);
    END^
     
    SET TERM ; ^
    quant j'envoie "PRIX_DE_VENTE = '1.01'"sur mon serveur il enregistre '1,00999999046326' dans ma base comment puis-je régler le problème?

    d'avance merci!!!

  2. #2
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 329
    Points : 3 994
    Points
    3 994

    Par défaut

    Bonjour,
    Citation Envoyé par vience Voir le message
    ...quant j'envoie "PRIX_DE_VENTE = '1.01'"sur mon serveur il enregistre '1,00999999046326' dans ma base comment puis-je régler le problème?
    Avec quel outil (=programme) insérez vous cette valeur dans la table ?
    C'est là que le problème d'arrondi se trouve, il faudrait utiliser un type de variable dont le type de codage permet d'éviter ce phénomène d'approximation...
    Philippe.

  3. #3
    Invité de passage
    Profil pro Vincent NOURRY
    ARTISAN
    Inscrit en
    février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Vincent NOURRY
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ARTISAN
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2012
    Messages : 17
    Points : 4
    Points
    4

    Par défaut

    bonjour,

    merci pour votre reponse

    en effais question idiote répose idiote...

    je travail sur un userfrom sous VBA et en fait j'envois une variable sous ce format : "Replace(CDbl(Box5), ",", ".")" et çà me donne ce résultat citer plus haut...
    en fait j'ai essayer aussi : "Str(Box5)" et j'ai pas prêter attention au résultat qui est bon dans la base de donnée

    je me pose ces questions:

    1)° j'ai dans tout les cas visualiser la requête avant de la valider et il ce trouve qu'elle était bonne => bon les mystères de l'informatique on va dire

    2)° pourquoi firebird ne renvoie pas une erreur ou arrondi la donnée si elle n'est pas conforme au format => DDD.AAA?

  4. #4
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 329
    Points : 3 994
    Points
    3 994

    Par défaut

    Citation Envoyé par vience Voir le message
    en effais question idiote répose idiote...
    Oh, l'autre !
    Citation Envoyé par vience Voir le message
    j'envois une variable sous ce format : "Replace(CDbl(Box5), ",", ".")"
    Donc, vous transformez la valeur d'une zone de saisie en Double et après vous appliquez un remplacement du signe de séparation décimale ?
    Citation Envoyé par vience Voir le message
    1)° j'ai dans tout les cas visualiser la requête avant de la valider et il ce trouve qu'elle était bonne => bon les mystères de l'informatique on va dire
    Quelle est cette requête ?
    Citation Envoyé par vience Voir le message
    2)° pourquoi firebird ne renvoie pas une erreur ou arrondi la donnée si elle n'est pas conforme au format => DDD.AAA?
    Quelle est la version de Firebird d'ailleurs ?
    Quel SQL Dialect est utilisé ? (1, 3 ?)
    Philippe.

  5. #5
    Invité de passage
    Profil pro Vincent NOURRY
    ARTISAN
    Inscrit en
    février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Vincent NOURRY
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ARTISAN
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2012
    Messages : 17
    Points : 4
    Points
    4

    Par défaut

    bonsoir,

    voici ma requete:
    Code :
    1
    2
     
    UPDATE MATERIAU SET PRIX = '1', MARGE = '1', PRIX_DE_VENTE = ' 1.01' WHERE ID = 1
    et mon ancien code vba :
    Code :
    1
    2
    3
    4
     
    SQL = "UPDATE MATERIAU "
    SQL = SQL & "SET PRIX = '" & Replace(CDbl(Box5), ",", ".") & "', MARGE = '" & Replace(CDbl(Box6), ",", ".") & "', PRIX_DE_VENTE = '" & Str(Box7) & "' "
    SQL = SQL & "WHERE ID = " & ID_Materiau

  6. #6
    Invité de passage
    Profil pro Vincent NOURRY
    ARTISAN
    Inscrit en
    février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Vincent NOURRY
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ARTISAN
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2012
    Messages : 17
    Points : 4
    Points
    4

    Par défaut

    bonsoir,

    voici ma requete:
    Code :
    1
    2
     
    UPDATE MATERIAU SET PRIX = '1', MARGE = '1', PRIX_DE_VENTE = ' 1.01' WHERE ID = 1
    et mon ancien code vba :
    Code :
    1
    2
    3
    4
     
    SQL = "UPDATE MATERIAU "
    SQL = SQL & "SET PRIX = '" & Replace(CDbl(Box5), ",", ".") & "', MARGE = '" & Replace(CDbl(Box6), ",", ".") & "', PRIX_DE_VENTE = '" & Str(Box7) & "' "
    SQL = SQL & "WHERE ID = " & ID_Materiau

    ma version fb est 2.5 et
    je sais pas ou trouvez le dialect
    1)° j'ai dans tout les cas visualiser la requête avant de la valider et il ce trouve qu'elle était bonne => bon les mystères de l'informatique on va dire
    j'ai mis çà par ce que j'ai lu quelle que par sur un forum que les programme informatique avais du mal à stocké des nombres à virgule sous un format binaire et je peu comprendre...

    ce que je comprend pas c'est que quand on demande à firebird de stocker
    Code :
    PRIX_DE_VENTE    DECIMAL(6,2)
    qu'il puisse stocker '1,00999999046326'

  7. #7
    Rédacteur/Modérateur
    Avatar de SergioMaster
    Homme Profil pro Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 58
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 431
    Points : 10 648
    Points
    10 648
    Billets dans le blog
    1

    Par défaut

    Bonjour
    la requête devrait être
    Code :
    1
    2
     
    UPDATE MATERIAU SET PRIX = 1.00, MARGE = 1.00, PRIX_DE_VENTE = 1.01 WHERE ID = 1
    et non des valeurs entre Quotes
    le mieux serait d'utiliser une requête paramétrée (quoique en VBA je ne sache pas comment faire je suis DELPHI(ste))

    mais je pense que le problème essentiel vient des Quotes ,même dans l'ancien code VBA , j'aurais mis ceci :
    Code :
    1
    2
    3
    SQL = "UPDATE MATERIAU "
    SQL = SQL & "SET PRIX = " & REPLACE(CDbl(Box5), ",", ".") & ", MARGE =" & REPLACE(CDbl(Box6), ",", ".") & ", PRIX_DE_VENTE = " & Str(Box7) & " "
    SQL = SQL & "WHERE ID = " & ID_Materiau
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  8. #8
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 329
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 329
    Points : 3 994
    Points
    3 994

    Par défaut

    Bonjour,
    Citation Envoyé par vience Voir le message
    voici ma requete:
    Code :
    UPDATE MATERIAU SET PRIX = '1', MARGE = '1', PRIX_DE_VENTE = ' 1.01' WHERE ID = 1
    Evitez d'écrire des nombres sous forme de chaines de caractères, cela évitera des conversions de type inutiles...
    Code :
    UPDATE MATERIAU SET PRIX = 1, MARGE = 1, PRIX_DE_VENTE = 1.01 WHERE ID = 1
    en vba, cela devrait s'écrire (je virerais les fonctions CDBL et STR qui sont AMHA inutiles):
    Code :
    1
    2
    3
    SQL = "UPDATE MATERIAU "
    SQL = SQL & "SET PRIX = " & Replace(Box5, ",", ".") & ", MARGE = " & Replace(Box6, ",", ".") & ", PRIX_DE_VENTE = " & Replace(Box7, ",", ".") & " "
    SQL = SQL & "WHERE ID = " & ID_Materiau
    Citation Envoyé par vience Voir le message
    ma version fb est 2.5 et
    je sais pas ou trouvez le dialect
    Donc à priori SQL Dialect 3 (cf. FAQ) sauf conversion d'une ancienne base de données.
    Pour en être sur, se connecter à la base de données sous ISQL, puis tapez SHOW SQL DIALECT;
    Citation Envoyé par vience Voir le message
    ce que je comprend pas c'est que quand on demande à firebird de stocker
    Code :
    PRIX_DE_VENTE    DECIMAL(6,2)
    qu'il puisse stocker '1,00999999046326'
    J'ai effectué différents tests avec FB 2.5.1 et votre table sous Delphi et depuis IbExpert. Je ne reproduis pas ce dysfonctionnement. Je reste sur ma première idée que le problème d'arrondi se situe côté VBA.
    Philippe.

  9. #9
    Invité de passage
    Profil pro Vincent NOURRY
    ARTISAN
    Inscrit en
    février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Vincent NOURRY
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : ARTISAN
    Secteur : Bâtiment

    Informations forums :
    Inscription : février 2012
    Messages : 17
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    désoler d'avoir délaisser le forum mais je pense avoir trouvé le disfonctionement

    en faite le résultat qui me posait probleme je le lisais dans ma base avec firebird maestro et je pense que c'est lui qui "lisais" mal le résultat

    du reste je pense que est d'une bonne utilité puise qui change 2,00 en 2.00
    VBA 2.00 c'est du string et en SQL 2.00 c'est du décimal

    dans tout les cas merci pour votre intéret

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
  •