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 :

Problème de calcul sur champs : types incompatibles


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut Problème de calcul sur champs : types incompatibles
    BONJOUR !! J ' AI UN PROBLÈME SUR UNE OPÉRATION DE CONVERTION
    J 'AI UNE ERREUR D’INCOMPATIBILITÉ DE TYPE ENTRE INTEGER ET REEL

    OPERATION =QTE*PB*DB/100+QTE*PP*DP/100

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    VAR QTEL:INTEGER; // ON SAISIE  LE CHAMP QUANTITÉ   
         QTEK, PB,PP, DB,DP:REAL;
     
    begin
    if key = #13 then begin
    QTEL:=DATA.SDETAILGPLQTELIVL.VALUE; // saisir une valeur interger à QTEL
    PB:=DATA.SITUATIONGPLPB.VALUE; //saisir une valeur en pourcentage à PB ex 40%
    PP:=DATA.SITUATIONGPLPP.VALUE; //saisir une valeur en pourcentage à PB ex 60%
    DB:=DATA.SITUATIONGPLDENSITEB.VALUE; // affecter une valeur fixe à DB  =0.510  
    DP:=DATA.SITUATIONGPLDENSITEP.VALUE; // affecter une valeur fixe à DB  =0.573 
    QTEK:=((QTEL*PB)*DB)/100+(((QTEL*PP)*DP)/100); // opération de calcule
    ShowMessage(FloatToStr(QTEK)); // pour teste que ça marche
    quand j'essaie d'affecter le resultat à un champs j'ai des erreurs type incompatible integer et extend ou integer et Real ......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATA.SDETAILGPLQTELIVK.Value:=QTEK;
    pouvez vous m'aider a affecter le résultat de l'opération à un champ et le résultat et un nombre sans la virgule
    merci !!!!

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pas la peine de "hurler" en majuscule et gras ça agresse les yeux de bon matin !
    Trop de Majuscules tue la majuscule

    j'ai pris pour habitude de toujours forcer le type plutôt qu'utiliser value

    votre code deviendrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var QteL : integer;    
         QteK, PB,PP, DB,DP: Double;   // pourquoi Real ?
     
    begin
    if key = #13 then begin
    QteL:=DATA.SDETAILGPLQTELIVL.asInteger; // saisir une valeur interger à QTEL
    PB:=DATA.SITUATIONGPLPB.asFloat; //saisir une valeur en pourcentage à PB ex 40%
    PP:=DATA.SITUATIONGPLPP.asFloat; //saisir une valeur en pourcentage à PB ex 60%
    DB:=DATA.SITUATIONGPLDENSITEB.asFloat; // affecter une valeur fixe à DB  =0.510  
    DP:=DATA.SITUATIONGPLDENSITEP.asFloat; // affecter une valeur fixe à DB  =0.573 
    QTEK:=((QTEL*PB)*DB)/100+(((QTEL*PP)*DP)/100); // opération de calcule
    ShowMessage(FloatToStr(QTEK)); // pour teste que ça marche
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    merci !!!
    mais j'ai toujours le problème comment affecter le résultat à un champs de table ?
    aussi le résultat de l'opération affiche 0 ???

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par netsoft Voir le message
    comment affecter le résultat à un champs de table ?
    Il faut passer par une requête SQL UPDATE dans laquelle tu affectes le résultat calculé à la donnée censée recevoir la valeur.

    Citation Envoyé par netsoft Voir le message
    le résultat de l'opération affiche 0 ?
    As tu vérifié en debug les données que tu récupères et qui font partie du calcul ? Quelles valeurs ont elles ?
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 275
    Points
    11 275
    Billets dans le blog
    6
    Par défaut
    quand j'essaie d'affecter le resultat à un champs j'ai des erreurs type incompatible integer et extend ou integer et Real... DATA.SDETAILGPLQTELIVK.Value:=QTEK;
    C'est donc clair, QTEK est réel, et l'essai d'affectation vise un champ entier, non ?
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    C'est donc clair, QTEK est réel, et l'essai d'affectation vise un champ entier, non ?
    oui QTEK est réel
    en résumé je veut faire une opération de calcule de volume d'une citerne de gaz butane et propane mélangé à un % donné
    EX:
    QUANTITE CHARGER = 5000 Tonne
    mélange butane = 40%
    propane =60%
    on sait que la densité du gaz butane et propane sont :
    densité butane = 0.510
    densité propane = 0.573

    donc la formule que j'ai testé en excel est :
    QTEK = QUANTITE CHARGER * 40% /100 *0.510 + QUANTITE CHARGER *60% -0.573/100


    DANS DELPHIE RESULTAT EST 0 ??????
    EST CE QUE VOUS POUVEZ M'AIDER

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Re,
    Citation Envoyé par netsoft Voir le message
    DANS DELPHIE RESULTAT EST 0 ??????
    EST CE QUE VOUS POUVEZ M'AIDER
    ce n'est certes pas Delphi le coupable mais votre programme
    reprenons la ligne 7 de l'extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTEL:=DATA.SDETAILGPLQTELIVL.VALUE; // saisir une valeur interger à QTEL
    déjà le commentaire ? saisir alors que si j'essaye de décoder vous avez deux tables SDETAIL,SITUATION déclarées dans un DataModule (Data)
    Donc première chose facilement vérifiable : les tables sont-elles ouvertes et positionnées sur le bon enregistrement ? Bien sur si les tables sont vides .....
    l'enregistrement est-il posté ?

    Avec l'IDE il est très facile aussi de mettre un point d'arrêt à cette même ligne pour ensuite vérifier les valeurs en pas à pas

    mais j'ai toujours le problème comment affecter le résultat à un champs de table ?
    déjà il serait incongru puisqu'il s'agit d'un champ calculé de stocker cette valeur alors qu'un SQL (et donc le SGBD) peut faire ce calcul

    détailler les différentes valeurs, comme dans le code donné c'est bien mais inutile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with Data do
     begin
       QTEK:=(SDetail.FieldByName('GPLQTELIVL').asInteger*Situation.FieldByName('GPLPB').asFloat*Situation.FieldByName('GPLDENSITEB').asFloat/100)+
                 (SDetail.FieldByName('GPLQTELIVL').asInteger*Situation.FieldByName('GPLPP').asFloat*Situation.FieldByName('GPLDENSITEP').asFloat)/100);
      .....
     end;
    En SQL cela donnerai (j'extrapole la jointure en estimant que la table SITUATION ne contient qu'une seule ligne)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT (D.GPLQTELIVL*S.GPLPB*S.GPLDENSITEB/100)+ (D.GPLQTELIVL*S.GPLPP*S.GPLDENSITEP/100)  AS QTEK FROM SDETAIL S JOIN SITUATION ON 1=1
    N.B. S'il faut la partie entiere ou arrondir le SGBD à certainement une fonction adéquate



    donc la formule que j'ai testé en excel est :
    QTEK = QUANTITE CHARGER * 40% /100 *0.510 + QUANTITE CHARGER *60% -0.573/100
    pardon mais ce n'est pas la même formule , j'y vois un "-" qui n'y est pas dans le programme

    en résumé je veut faire une opération de calcul
    c'est ce qui est fait
    quand j'essaie d'affecter le resultat à un champs j'ai des erreurs type incompatible integer et extend ou integer et Real ......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATA.SDETAILGPLQTELIVK.Value:=QTEK;
    Il s'agit ici, d'autre chose que ke calcul : stocker* une valeur réelle dans une colonne de la table SDETAIL, reste encore à savoir quelle est le format de cette colonne (integer ou numeric) si une erreur est levée c'est très certainement que la colonne est un entier. La question ici est donc comment aller vous arrondir : Entier le plus proche (ROUND) ou simplement partie entière de la valeur calculée (TRUNC ou INT)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    merci SergioMaster de t'a réponse claire et détaillé
    pour le"-" faute de frappe
    merci beaucoup
    une dernière question d'un débutant qu'est ce que tu me conseil pour arrondir le chiffre
    EX : dans le résultat de l’opération = 2739,54782241583 pour arrivé à 2740

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    il s'agit d'un arrondi (round)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 275
    Points
    11 275
    Billets dans le blog
    6
    Par défaut
    Dans Delphi, on peut aussi utiliser Ceil() pour arrondir à l'entier supérieur.

    Concernant la partie mathématique (physique), je suis surpris qu'en multipliant une masse par une densité (en fait, une masse volumique), on obtienne un volume. J'aurais plus volontiers utilisé une division.
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut
    Bonjour,

    je vous signale que du point de vue mathématique votre formule est erronée, il manque des parenthèses.
    Et dans votre code elles doivent englober les diviseurs 100.
    Du point de vue physique votre calcul est bizarre comme le souligne "tourlourou".

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Concernant la partie mathématique (physique), je suis surpris qu'en multipliant une masse par une densité (en fait, une masse volumique), on obtienne un volume. J'aurais plus volontiers utilisé une division.
    Personnellement, je ne me suis pas attaché à la formule, juste au code , à mon avis, il y a un choix de nom de colonnes qui peut prêter à confusion et c'est peut être ce qui rend la formule "bizarre"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 275
    Points
    11 275
    Billets dans le blog
    6
    Par défaut
    C'est plutôt dans la partie explications que le manque de rigueur physique est patent. L'essentiel est que la formule de netsoft lui fournisse le résultat attendu. Reste que pour communiquer, utiliser des mots dans un autre sens que le leur prête à ne pas bien se comprendre...
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    merci pour les réponse et vos participation , j'ai trouvé la solution grâce a vous

    Citation Envoyé par tourlourou Voir le message
    C'est plutôt dans la partie explications que le manque de rigueur physique est patent. L'essentiel est que la formule de netsoft lui fournisse le résultat attendu. Reste que pour communiquer, utiliser des mots dans un autre sens que le leur prête à ne pas bien se comprendre...

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

Discussions similaires

  1. Problème de résultat d'une opération mathématique
    Par Porkipic dans le forum Débuter
    Réponses: 12
    Dernier message: 03/03/2014, 16h37
  2. Problème d'exposant sur une méthode mathématique.
    Par ecobarito dans le forum Débuter
    Réponses: 14
    Dernier message: 29/08/2007, 21h16
  3. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 11h54
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 09h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 02h17

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