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 :

Probleme de Calcul 0 + 1000 = 0


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut Probleme de Calcul 0 + 1000 = 0
    Bonjour,

    Voilà mon problème,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Var Blres : real;
         Delta : real;
    QtiteDepart : real;
    NewQtite : real;
    begin
    ...              
         QtiteDepart := StrToFloat(StringGrid_Lil.Cells[33,ligne]);
         NewQtite :=  StrToFloat(StringGrid_Lil.Cells[7,ligne]);
         Delta := QtiteDepart - NewQtite;
         Brlres := ClientDataSet_commun.fieldbyname('brlrel').AsFloat + Delta;
    ...
    end
    mon cliendataset a comme valeur : 0 et mon delta: 1000.
    Le problème est que brlres me renvoi 0 et non 1000.

    Je ne comprends pas car en mode debogage, Evaluer/Modifier :
    Je fais : ClientDataSet_commun.fieldbyname('brlrel').AsFloat + Delta, et il me renvoi bien 1000.

    Merci de votre aide.
    Valoji

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    juste une indication

    souvent les formats real,double,single de delphi
    et les format double,float,singlet des bases de données sont différents au niveau representation memoire

    si tu utilise blres dans la suite pour faire des comparaison il faut faire attention aux arrondis

    genre pas 1000 mais plutot 9999.9999999757683478942
    @+

  3. #3
    Membre actif
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Juin 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte de système d’information
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 177
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    n'aurais-tu pas une valeur Nulle dans ton champ issu de ton clientdataset,

    ça expliquerait le pourquoi du comment

    A+

  4. #4
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    J'ai essayer cela sans avoir passer par ma query :

    brlres := 0 + delta (Sachant que delta = 1000);

    Brlres me renvoi comme même 0.

    Valoji

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Cela marche :
    brlres := 0 + delta;

    on a bien brlres = 1000 quand delta vaut 1000

    Es-tu sûr que delta vaut 1000?

    A+

  6. #6
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Voila mon code,

    J'ai essayer sur un projet vierge il me renvoie bien 1000, et oui je suis sur que delta = 1000

    voici mon code complet
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    var
      Brlres : Real;
      QtiteDepart : Real;
      NewQtite : Real;
      Brleta : String;
      Reliqua : Boolean; // Si la quantité est supérieure au restant à liquider de la reception, on ajoute le delta dans fcprd
      Delta  : Real;
    begin
        If (FlagEtatFonc = Modification) then
        begin
          With query_commun do
          begin
              Try
                if (brlnumser <> '') then
                begin
                  close;
                  ClientDataSet_commun.Close;
                  SQL.Clear;
                  SQL.Add('SELECT brlrel, brlliv');
                  SQL.Add('FROM dpbrl');
                  SQL.Add('WHERE brlnumser = '+ Brlnumser );
                  open;
                  ClientDataSet_commun.Open;
                  {On recupere la quantité initiale qui a été saisi}
                  QtiteDepart := StrToFloat(StringGrid_Lil.Cells[33,ligne]);
                  NewQtite :=  StrToFloat(StringGrid_Lil.Cells[7,ligne]);
                  Delta := QtiteDepart - NewQtite;
                  Brlres := FieldByName('brlrel').AsFloat + Delta;
                  if (fieldbyname('brlrel').AsInteger <= 0) or (fieldbyname('brlrel').AsFloat < StrToFloat(StringGrid_Lil.Cells[7,ligne]))  then
                  begin
                    Reliqua := True;
                    Brlres := 0;
                    Brleta := 'L';
                  end
                  else
                  begin
                    BrlRes := fieldbyname('brlrel').AsFloat - StrToFloat(StringGrid_Lil.Cells[7,ligne]);
                    Brleta := 'P';
                  end;
                  if fieldbyname('brlliv').AsFloat < BrlRes then
                  begin
                    Brleta := 'U';
                    Brlres := fieldbyname('brlliv').AsFloat;
                  end;
                  SQL.Clear;
                  SQL.Add('UPDATE dpbrl');
                  SQL.Add('SET Brleta = "' + BrlEta +'", ');
                  SQL.Add('    BrlRel = "'+ FloatToStr(Brlres) + '"');
                  SQL.Add('WHERE brlnumser = '+ Brlnumser );
                  ExecSQL;
                end;
    Merci pour votre aide
    Valoji

  7. #7
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Au niveau de mon debogage lorsque je fais teste la valeur de cette somme :

    FieldByName('brlrel').AsFloat + Delta; il me renvoi bien 1000.

    Mais il ne veut pas me l'affecter à mon brlres

    Valoji

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    En débgage, il faut que le curseur soit un cran en dessous si tu veux voir la valeur de Brlres.

    Sinon après ton code passe où dans le if ?
    Dans la première partie ou dans le else ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     if (fieldbyname('brlrel').AsInteger <= 0) or (fieldbyname('brlrel').AsFloat < StrToFloat(StringGrid_Lil.Cells[7,ligne]))  then
                  begin
                    Reliqua := True;
                    Brlres := 0;
                    Brleta := 'L';
                  end
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Mon curseur est bien un cran en dessous,

    je vous remet mon code sans le reste :
    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
    21
    22
        If (FlagEtatFonc = Modification) then
        begin
          With query_commun do
          begin
              Try
                if (brlnumser <> '') then
                begin
                  ClientDataSet_commun.Close;
                  close;
    
                  SQL.Clear;
                  SQL.Add('SELECT brlrel, brlliv');
                  SQL.Add('FROM dpbrl');
                  SQL.Add('WHERE brlnumser = '+ Brlnumser );
                  ClientDataSet_commun.Open;
                  open;
    
                  {On recupere la quantité initiale qui a été saisi}
                  QtiteDepart := StrToFloat(StringGrid_Lil.Cells[33,ligne]);
                  NewQtite :=  StrToFloat(StringGrid_Lil.Cells[7,ligne]);
                  Delta := QtiteDepart - NewQtite;
                  Brlres := ClientDataSet_commun.FieldByName('brlrel').AsFloat + Delta);
    ;

    Mon clientdataset est bien égal à 0, mon delta est bien egal à 1000.

    En mode débogage (un cran en dessous), quand je teste ClientDataSet_commun.FieldByName('brlrel').AsFloat + Delta, il me renvoi bien 1000, le problème c'est qui veut pas me l'affecter à mon brlres.

    Au debut je pensais que ca venait de mon clientdataset que j'ai remplacer par 0 + delta, meme probleme.

    Par contre si, avec le module Evaluer / Modifier, je lui repasse
    Brlres := (ClientDataSet_commun.FieldByName('brlrel').AsFloat + Delta
    , brlres prend bien la valeur 1000.

    Pour mon problème je pense plutôt à un problème de déclaration de variable (Real), mais je pense que tout est declarer correctement.

    J'ai tester sur un projet propre, cela fonctionne à merveille avec une valeur à 0 et une 1000 ma variable recupere bien 1000, donc là je suis vraiment en panne séche.

    Valoji,

  10. #10
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    Petite info dans mes tests :

    voilà ce que j'ai essayer ce matin :
    MessageDlg(FloatToStr(ClientDataSet_commun.FieldByName('brlrel').AsFloat + Delta), mtWarning, [mbOK], 0);
    Brlres := 1000;
    Resultat :
    mon message dialogue me renvoi bien 1000;
    Brlres me renvoi toujours 0, meme si je lui affecte 1000 directement, bon courage pour ce qui aime bien ce prendre la tête

    Pour rappel voilà comment j'ai declarere mon brlres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Procedure Tform_gesliq.MajStock(Ligne : Integer; prdnumser, brlnumser : String);
    var
      Brlres : Real;
      ....
    begin
    ...
    Valoji

  11. #11
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je me trompe peut-être, mais...
    Juste après avoir affecté la valeur à ton Brles, tu as une If.. Then.. Else.., ou, dans les deux cas, tu lui affectes une nouvelle valeur.
    Résultat des courses, la première affectation ne sert à rien, et le compilateur la squeeze.
    Roland

  12. #12
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut
    C bon c resolu merci à vous tous est particulierement RSC :
    Je me trompe peut-être, mais...
    Juste après avoir affecté la valeur à ton Brles, tu as une If.. Then.. Else.., ou, dans les deux cas, tu lui affectes une nouvelle valeur.
    Résultat des courses, la première affectation ne sert à rien, et le compilateur la squeeze.
    __________________
    Roland
    J'ai donc eclate cette procedure en trois procedure (Creation, modification, suppression).

    Donc j'avais tellement de If que mon compilateur squeezer ma variable, et donc pour lui, elle ne servait donc à rien car il considérait que l'on ne pouvait pas rentrer dans les if

    Donc en eclatant ma procedure en 3, (Ce qui est plus lisible) ce la fonctione car moins de If,

    Donc encore merci à tous pour votre aide.

    Valoji,

    PS : Bonne prog

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

Discussions similaires

  1. [FLASH 8] Problemes de calcul précis avec FLASH
    Par ZecMan dans le forum Flash
    Réponses: 1
    Dernier message: 20/02/2006, 14h03
  2. Probleme de calcul :S
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 20h06
  3. probleme de calculs : 1-0.9 = 0.099999999999998
    Par francon81 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/06/2005, 14h17
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 16h52
  5. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 17h46

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