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

 Delphi Discussion :

calcul avec chiffre a virgule


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut calcul avec chiffre a virgule
    salut tous j'ai un petit probleme sur un calcul avec vigule
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TAjoutPaiement.SpeedButton2Click(Sender: TObject);
    var
    som:Double; cot:Double; pai:Double;
     
    begin
    som:=StrToFloat(Sommes.Text); //Prix
    cot:=StrToFloat(cotisation.Caption); //Prix
    pai:=StrToFloat(Paiement.Caption); //Prix
    paie:=pai+som;
    paiementfini.caption:=floattostr(paie);
    PrixReste:=cot-(pai+som);
    reste.caption:=floattostr(PrixReste);
    chiffre sans virgule le code marche super mais avec virgule problème d'occurance

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par tarmo57 Voir le message
    ...mais avec virgule problème d'occurance
    C'est quoi un problème d'occurrence ?

    Mais je dirais qu'il s'agit certainement d'un problème avec le séparateur décimal: virgule ou point.
    Et puis, puisque tu manipules des valeurs monétaires, autant travailler avec des types Currency et SrtToCurr/CurrToStr.

    @+ Claudius

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut query qui donne probleme
    je viends de me rendre compte que le query pose probleme avec virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query1.SQL.Clear;
    Query1.SQL.Add('Update assos_membre.DB set Paiement = '+ QuotedStr(paiementfini.Caption)
    +',Reste = '+ QuotedStr(reste.Caption)
    +' where Idmembre ='+ QuotedStr(id.Caption)+'');
    Query1.ExecSQL;
    et sans virgule cela marche bien

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Utilises des variables et une requête paramétrée, beaucoup plus simple d'utilisation.

    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
     
    var
      PaiementFini, Reste: Currency;
      IDMembre: Integer;
    begin
      // ...
      with Query1.SQL do
      begin
        Clear;
        Add('Update assos_membre.DB');
        Add('set Paiement = :PaiementFini, Reste = :Reste');
        Add('where Idmembre = :IDMembre;');
        ParamsByName('PaiementFini').AsCurrency := PaiementFini;
        ParamsByName('Reste').AsCurrency := Reste;
        ParamsByName('IDMembre').AsInteger := Membre;
        ExecSQL;
      end;
    end;
    C'est beaucoup plus simple car tu t'affranchis du problème de formatage des valeurs transmises.

    @+ Claudius

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut j'ai des erreures
    Citation Envoyé par Cl@udius Voir le message
    Re,
    Utilises des variables et une requête paramétrée, beaucoup plus simple d'utilisation.

    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
     
    var
      PaiementFini, Reste: Currency;
      IDMembre: Integer;
    begin
      // ...
      with Query1.SQL do
      begin
        Clear;
        Add('Update assos_membre.DB');
        Add('set Paiement = :PaiementFini, Reste = :Reste');
        Add('where Idmembre = :IDMembre;');
        ParamsByName('PaiementFini').AsCurrency := PaiementFini;
        ParamsByName('Reste').AsCurrency := Reste;
        ParamsByName('IDMembre').AsInteger := Membre;
        ExecSQL;
      end;
    end;
    C'est beaucoup plus simple car tu t'affranchis du problème de formatage des valeurs transmises.

    @+ Claudius
    voici les erreures avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Construction
      [Erreur] Unit14.pas(236): Type Record, Object ou Class requis
      [Erreur] Unit14.pas(238): Type Record, Object ou Class requis
      [Erreur] Unit14.pas(246): Identificateur non déclaré : 'ParamsByName'
      [Erreur] Unit14.pas(246): Opérateur ou point-virgule manquant
      [Erreur] Unit14.pas(247): Opérateur ou point-virgule manquant
      [Erreur] Unit14.pas(248): Opérateur ou point-virgule manquant
      [Erreur] Unit14.pas(248): Identificateur non déclaré : 'Membre'
      [Erreur] Unit14.pas(249): Identificateur non déclaré : 'ExecSQL'
      [Erreur] Unit14.pas(291): Types incompatibles : 'String' et 'Text'

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Ouais, en tapant à la volée j'ai commis quelques petites erreurs.
    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
    var
      PaiementFini, Reste: Currency;
      IDMembre: Integer;
    begin
      // ... N'oublies pas d'alimenter les variables
      with Query1 do
      begin
        SQL.Clear;
        SQL.Add('Update assos_membre.DB');
        SQL.Add('set Paiement = :PaiementFini, Reste = :Reste');
        SQL.Add('where Idmembre = :IDMembre;');
        ParamByName('PaiementFini').AsCurrency := PaiementFini;
        ParamByName('Reste').AsCurrency := Reste;
        ParamByName('IDMembre').AsInteger := Membre;
        ExecSQL;
      end;
    end;
    Ca devrait aller mieux.

    @+

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 733
    Points : 25 641
    Points
    25 641
    Par défaut
    Tarmo, tu pourrais faire un minimum d'effort, tu copies colles du code sans chercher à la comprendre, à regarde 30s l'aide pour voir sur quel objet appliqué ParamsByName (sans le s) !
    C'est un peu trop facile

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut oui
    Citation Envoyé par ShaiLeTroll Voir le message
    Tarmo, tu pourrais faire un minimum d'effort, tu copies colles du code sans chercher à la comprendre, à regarde 30s l'aide pour voir sur quel objet appliqué ParamsByName (sans le s) !
    C'est un peu trop facile
    c'est vrai tu as raison mea coulpa

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut toujour sur mon probleme
    désolé mais toujours pleins d'erreurs .Je repar sur ma base de départ qui fonctionne bien sans virgule
    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
    procedure TAjoutPaiement.SpeedButton2Click(Sender: TObject);
    var
    som:Double; cot:Double; pai:Double;
    Stg:string;
    F: TextFile;
    begin
     if Sommes.text='' then
    Showmessage ('Vous avez oublier la somme du paiement')
    else
     if Type1.text='' then
    Showmessage ('Vous avez oublier le mode de paiement')
    else
     begin
    som:=StrToFloat(Sommes.Text); //Prix
    cot:=StrToFloat(cotisation.Caption); //Prix
    pai:=StrToFloat(Paiement.Caption); //Prix
    paie:=pai+som;
    paiementfini.caption:=floattostr(paie);
    PrixReste:=cot-(pai+som);
    reste.caption:=floattostr(PrixReste);
     
    begin
    Query1.SQL.Clear;
    Query1.SQL.Add('Update assos_membre.DB set Paiement = '+ QuotedStr(paiementfini.Caption)
    +',Reste = '+ QuotedStr(reste.Caption)
    +' where Idmembre ='+ QuotedStr(id.Caption)+'');
    Query1.ExecSQL;
    et plante avec virgule ??
    une chose est sur c le query qui merde
    je ne comprend plus help my svp

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Points : 1 935
    Points
    1 935
    Par défaut
    salut,

    J'ai indenté à peu près correctement le début de ton code, mais de petits conseils en passant :
    1. Le détail qui tue sur des appli pro : attention à l'ortho...
    2. Code non indenté = cela indique un programmeur non soucieux du résultat de la compil...
    3. Pourquoi ne jamais se relire ?


    Franchement, quelle présentation à en repousser plus d'un

    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
    procedure TAjoutPaiement.SpeedButton2Click(Sender: TObject);
    var
      som, cot, pai: Double;
      Stg: String;
      F: TextFile;
    begin
      if Sommes.text = '' then
        ShowMessage('Vous avez oublié la somme du paiement')
      else
       if Type1.text = '' then
         ShowMessage('Vous avez oublié le mode de paiement')
       else
       begin
         som  := StrToFloat(Sommes.Text);        //Prix
         cot  := StrToFloat(Cotisation.Caption); //Prix
         pai  := StrToFloat(Paiement.Caption);   //Prix
         paie := pai + som;
         paiementfini.caption := FloatToStr(paie);
         PrixReste := cot - (pai + som);
         reste.caption := FloatToStr(PrixReste);
     
    Le begin direct du dessous vient faire quoi ?
    Mais bon, n'ayant pas de compo BDD sur mon D7, je ne sais pas...
    
    begin
    Query1.SQL.Clear;
    Query1.SQL.Add('Update assos_membre.DB set Paiement = '+ QuotedStr(paiementfini.Caption)
    +',Reste = '+ QuotedStr(reste.Caption)
    +' where Idmembre ='+ QuotedStr(id.Caption)+'');
    Query1.ExecSQL;
    N'oublie pas l'indentation !!!

    Toujours sur base de deux spaces

    J'espère t'avoir un peu aidé.

  11. #11
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 986
    Points : 1 419
    Points
    1 419
    Par défaut
    le code à Cl@udius c'est la meilleur solution selon moi
    moi je fait comme sa:
    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
    var
      PaiementFini, Reste: Currency;
      IDMembre: Integer;
    begin
      // ... N'oublies pas d'alimenter les variables
      with Query1 do
      begin
        ParamCheck := False;
        Close;
        SQL.Clear;
        SQL.Add('Update assos_membre.DB');
        SQL.Add('set Paiement = :PaiementFini, Reste = :Reste');
        SQL.Add('where Idmembre = :IDMembre;');
        ParamCheck := True;
        Parameters.Refresh;
        ParamByName('PaiementFini').AsCurrency := PaiementFini;
        ParamByName('Reste').AsCurrency := Reste;
        ParamByName('IDMembre').AsInteger := Membre;
        Prepared := True;
        ExecSQL;
      end;
    end;

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut désolé mais j'ai toujour une erreur
    je suis désolé tous mais j'ai toujours une erreur
    je pose le problème autrement car je crois que je ne comprends vraiment


    mon champs de ma base de donnée est somme de 20
    j'ai un édit.text lui de 50,50

    je voudrais faire un update

    merci encore et désolé de ne pas piger le truc

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 798
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 798
    Points : 5 591
    Points
    5 591
    Par défaut
    Mais je dirais qu'il s'agit certainement d'un problème avec le séparateur décimal: virgule ou point.
    Est-ce que au moins, tu a vérifié ça ? J'ai fait le test chez moi et ça fonctionne nickel.

    Il suffit de remplacer la virgule par un point pour que ça fonctionne.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 733
    Points : 25 641
    Points
    25 641
    Par défaut
    Tient, je savais bien que j'avais vu son sujet sur Phidels, mais il n'arrive pas à comprendre la notion de séparateur décimal ...

    Tarmo, peux-tu dans 1er temps de faire la requête à la main dans le Module de Bases de Données fourni avec Delphi, tu comprendras mieux le remplacement de la virgule par le point dans le SQL

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 483
    Points : 128
    Points
    128
    Par défaut ok probleme résolu
    Citation Envoyé par ShaiLeTroll Voir le message
    Tient, je savais bien que j'avais vu son sujet sur Phidels, mais il n'arrive pas à comprendre la notion de séparateur décimal ...

    Tarmo, peux-tu dans 1er temps de faire la requête à la main dans le Module de Bases de Données fourni avec Delphi, tu comprendras mieux le remplacement de la virgule par le point dans le SQL
    salut tous mes excuses de venir un peu tard mais vous l'aurez compris gros problème de pc .j'ai donc changé mon DD et après un bon formatage le code de Cl@udius marche super désolé de tous ces soucis pour rien fin de compte .Encore merci a tous

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/12/2008, 12h17
  2. limitation calcul à 2 chiffres après virgule
    Par jgrazzi dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/09/2008, 10h01
  3. Calcule avec des virgules
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 27/07/2007, 10h43
  4. Calcul avec nombre à virgule
    Par stefano dans le forum Delphi
    Réponses: 3
    Dernier message: 28/01/2007, 20h59
  5. Rand avec chiffre à virgule
    Par Mikiman dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2006, 15h56

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