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

SQL Firebird Discussion :

Integer overflow avec un champs calculé


Sujet :

SQL Firebird

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut Integer overflow avec un champs calculé
    Bonjour,

    J'utilise la version 2.1 de Firebird (WI-V2.1.2.18118).J'en suis au développement, il n'y a aucune production. Donc pas de problème pour trafiquer la base.

    J'essaie de faire quelques calculs sur la TVA.
    Seulement, il me met l'erreur ci-dessous. J'ai donc essayé de découper la requête pour tester la partie qui pose problème (normalement, il n'y a pas d'union).

    Si j'enlève " * (1 - (REMISE_EN_POURCENT_TOTALE / 100))", la requête fonctionne :


    Et si je le remplace par " * 0.99"


    ISC ERROR CODE:335544779

    ISC ERROR MESSAGE:
    Integer overflow. The result of an integer operation caused the most significant bit of the result to carry.

    STATEMENT:
    TIBOInternalDataset: "<TApplication>.frmMain.dlgWisql.<TIBOQuery>.<TIBOInternalDat
    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
     SELECT (SUM(TVA1) * (1 - (REMISE_EN_POURCENT_TOTALE / 100))) as TVA1, TAUX, DESCRIPTION
     FROM (
     SELECT SUM((LIGNE_COMMANDE.PU_HT * LIGNE_COMMANDE.QUANTITE - Ligne_Commande.Remise  - (Ligne_Commande.PU_HT / 100 * Ligne_Commande.Quantite * Ligne_Commande.Remise_en_pourcent)) * (TVA.TAUX / 100)) as TVA1, TVA.DESCRIPTION, TVA.TAUX, COMMANDE.REMISE_EN_POURCENT_TOTALE
     FROM LIGNE_COMMANDE
     JOIN TVA on TVA.NUMERO_TVA=LIGNE_COMMANDE.NUMERO_TVA
     JOIN Commande ON Commande.NUMERO_DE_COMMANDE=Ligne_Commande.NUMERO_DE_COMMANDE
     WHERE LIGNE_COMMANDE.NUMERO_DE_COMMANDE='1'
     GROUP BY TAUX, DESCRIPTION, COMMANDE.REMISE_EN_POURCENT_TOTALE
     UNION
     SELECT 0 as TVA1, TVA.DESCRIPTION, TVA.TAUX, COMMANDE.REMISE_EN_POURCENT_TOTALE
     FROM LIGNE_COMMANDE
     JOIN TVA on TVA.NUMERO_TVA=LIGNE_COMMANDE.NUMERO_TVA
     JOIN Commande ON Commande.NUMERO_DE_COMMANDE=Ligne_Commande.NUMERO_DE_COMMANDE
     WHERE LIGNE_COMMANDE.NUMERO_DE_COMMANDE='1')
     GROUP BY TAUX, DESCRIPTION, REMISE_EN_POURCENT_TOTALE
    Les chiffres ne sont pas gros. Voyez-vous de quel problème il s'agit ?

    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Quels sont les types de champs utilisés ?
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci de vous pencher sur mon problème.

    Voici les type des champs calculés :

    "REMISE_EN_POURCENT_TOTALE" NUMERIC(18,4),
    "QUANTITE" NUMERIC(18,4),
    "PU_HT" NUMERIC(18,4),
    "REMISE" NUMERIC(18,4),
    "REMISE_EN_POURCENT" NUMERIC(18,4),
    "TAUX" NUMERIC(18,4),

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Aucune idée ?
    Vous avez besoin de plus d'informations ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Par hasard, tu n'aurais pas un problème avec le point décimal et la virgule décimale.

    En effet, tes nombres sont affichés avec la virgule décimale et dans 0.99 tu retiens le point décimal.

    Il s'agit juste d'une réflexion.

    Bon courage

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Je ne pense pas que ce soit ça. J'ai une erreur si je met une virgule.

    En effet, c'est juste IBOConsole qui 'affiche comme ça. C'est bien des float qui sont utilisés.

    J'ai toujours le problème avec un code beaucoup plus court.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUM((LIGNE_COMMANDE.PU_HT * LIGNE_COMMANDE.QUANTITE - Ligne_Commande.Remise  - (Ligne_Commande.PU_HT / 100 * Ligne_Commande.Quantite * Ligne_Commande.Remise_en_pourcent)) * (TVA.TAUX / 100)) * (1 - (REMISE_EN_POURCENT_TOTALE / 100)) as TVA1, TVA.DESCRIPTION, TVA.TAUX, COMMANDE.REMISE_EN_POURCENT_TOTALE
     FROM LIGNE_COMMANDE
     JOIN TVA on TVA.NUMERO_TVA=LIGNE_COMMANDE.NUMERO_TVA
     JOIN Commande ON Commande.NUMERO_DE_COMMANDE=Ligne_Commande.NUMERO_DE_COMMANDE
     WHERE LIGNE_COMMANDE.NUMERO_DE_COMMANDE='1'
     GROUP BY TAUX, DESCRIPTION, COMMANDE.REMISE_EN_POURCENT_TOTALE

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 739
    Points : 52 451
    Points
    52 451
    Billets dans le blog
    5
    Par défaut
    Si j'enlève " * (1 - (REMISE_EN_POURCENT_TOTALE / 100))", la requête fonctionne :
    Essayez avec :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     * (1.0 - (REMISE_EN_POURCENT_TOTALE / 100.0))
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     * (1.0 - (CAST(REMISE_EN_POURCENT_TOTALE AS DECIMAL(24,4) / 100.0))
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par gandf Voir le message
    Voici les type des champs calculés :

    "REMISE_EN_POURCENT_TOTALE" NUMERIC(18,4),
    "QUANTITE" NUMERIC(18,4),
    "PU_HT" NUMERIC(18,4),
    "REMISE" NUMERIC(18,4),
    "REMISE_EN_POURCENT" NUMERIC(18,4),
    "TAUX" NUMERIC(18,4),
    18,4 ? pour un taux de TVA ?
    18,4 ? pour une remise en % ?
    18,4 ? pour un taux ?
    quelle idée ?
    Il faut changer ça, et caster les éléments dans vos expressions
    et ne pas oublier que:
    Numeric(p1,s1)/Numeric(p2,s2) donne un Numeric(18,s1+s2)
    idem pour la multiplication

    j'ajoute que la règle générale veut que l'on utilise des valeurs à décimales fixes pour ce que l'on compte et des valeurs flottantes pour ce que l'on mesure. Il est tout à fait cohérent de définir une table qui va utiliser par exemple : un INTEGER pour le nombre commandé, un DECIMAL pour la valeur totale de la vente et un FLOAT pour le pourcentage de rabais.
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci, c'était bien ça le problème. J'ai pas fait attention aux types des données numériques.
    Je ne savais pas qu'il fallait caster quand l'on fait des calculs en SQL parce que d'habitude, je n'ai pas besoin de faire de calcul dans mes requêtes.

    MERCI

  10. #10
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 897
    Points : 6 024
    Points
    6 024
    Par défaut
    J'ajoute que la référence ce problème : http://firebird.developpez.com/faq/?...rreur#TRA00207
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  11. #11
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Encore faut-il identifier correctement le problème pour trouver la réponse.

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

Discussions similaires

  1. Critères avec opérateurs dans une requête avec des champs calculés
    Par lmollard dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/05/2008, 19h53
  2. Réponses: 4
    Dernier message: 05/05/2008, 19h51
  3. Requete mise à jour avec un champ calculé
    Par gberthier dans le forum Requêtes et SQL.
    Réponses: 35
    Dernier message: 24/04/2008, 15h25
  4. Probleme avec les champs calculé
    Par Malou3216 dans le forum Modélisation
    Réponses: 6
    Dernier message: 23/05/2007, 15h31
  5. additionner un aggregat avec un champ calculé
    Par pierrot67 dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2006, 14h08

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