Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema ao mostrar valores monetários em edits...


robinhocne

Pergunta

Bom vamos para mais um probleminha.

No meu formulário do caixa onde faço os lancamentos de entradas e saidas de valores teria que ajustar umas coisas que não estou conseguindo!

1º>Primeiramente, nesse Tópico que foi resolvido eu fiz uma lançamento de por exemplo: 250,50 e na hora que eu abro o formulário do caixa como eu assim que abro ele me mostra os lancamento do dia e somando os valores nos edits abaixo, mas ele dá esse erro:

'250,50' is not a valid integer value

Esse é um procedimento que eu fiz o AtualizaCaixa para me atualizar e mostrar no DbGrid (DbgCaixa)

Ligado em um DataSource (DtsCaixa) e IbQuery (QryCaixa):

procedure Tfrmcai.AtualizaCaixa;
begin
   With QryCaixa do
      Begin
         QryCaixa.Close;
         QryCaixa.Sql.Text := 'Select * from lancamento  where Pagamento = Current_date';
         QryCaixa.Open;
      end;
      
   //Soma o saldo do Dia
 With QryTotais do
      Begin
         QryTotais.Close;
         QryTotais.Sql.Text := 'Select sum(Valor)as "+" From Lancamento where tipo =  1 and pagamento = Current_date';
         QryTotais.Open;
      end;
 With QryTotais2 do
      Begin
         QryTotais2.Close;
         QryTotais2.Sql.Text := 'Select sum(valor) as "-" From Lancamento where tipo = 0 and pagamento = Current_date';
         QryTotais2.Open;
      End;
     TxtTlDia.text := ((FloatToStr((QryTotais.FieldByName('+').AsFloat) - (QryTotais2.FieldByName('-').AsFloat)) ));

     // Saldo Total
 With QrySaldo do
      Begin
         QrySaldo.Close;
         QrySaldo.Sql.Text := 'Select sum(Valor)as "+" From Lancamento where tipo = 1 and pagamento is not null';
         QrySaldo.Open;
      end;
 With QrySaldo2 do
      Begin
         QrySaldo2.Close;
         QrySaldo2.Sql.Text := 'Select sum(Valor)as "-" From Lancamento where tipo = 0 and pagamento is not null';
         QrySaldo2.Open;
      End;
     TxtSoma.text := ( (FloatToStr((QrySaldo.FieldByName('+').AsFloat) - (QrySaldo2.FieldByName('-').AsFloat)) ));

     // Saldo Anterior
 With QryAnterior do
      Begin
         QryAnterior.Close;
         QryAnterior.Sql.Text := 'select sum(valor) from lancamento where Tipo = 1' +
         ' and extract(year from pagamento) = extract(year from current_date)' +
         ' and extract(month from pagamento) = extract(month from current_date) -1';
         QryAnterior.Open;
      end;
 With QryAnterior2 do
      Begin
         QryAnterior2.Close;
         QryAnterior2.Sql.Text := 'select sum(valor) from lancamento where Tipo = 0 and ' +
         'extract(year from pagamento) = extract(year from current_date)' +
         'and extract(month from pagamento) = extract(month from current_date) -1';
         QryAnterior2.Open;
      End;
     TxtAnterior.text := ( (FloatToStr((QryAnterior.FieldByName('sum').AsFloat) - (QryAnterior2.FieldByName('sum').AsFloat)) ));


    // Saldo Total do Mês
 With QryMes do
      Begin
         QryMes.Close;
         QryMes.Sql.Text := 'select sum(valor) from lancamento where Tipo = 1' +
         ' and extract(year from pagamento) = extract(year from current_date)' +
         ' and extract(month from pagamento) = extract(month from current_date)';
         QryMes.Open;
      end;
 With QryMes2 do
      Begin
         QryMes2.Close;
         QryMes2.Sql.Text := 'select sum(valor) from lancamento where Tipo = 0 and ' +
         'extract(year from pagamento) = extract(year from current_date)' +
         'and extract(month from pagamento) = extract(month from current_date)';
         QryMes2.Open;
      End;
     TxtMes.text := ( (FloatToStr((QryMes.FieldByName('sum').AsFloat) - (QryMes2.FieldByName('sum').AsFloat)) ));


     // Para quando for negativo mostrar em vermelho o saldo do dia
     If StrToInt(TxtTlDia.text) < 0 Then
        TxtTlDia.font.color := ClRed
     Else
        TxtTlDia.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total
     If StrToInt(TxtSoma.text) < 0 Then
        TxtSoma.font.color := ClRed
     Else
        TxtSoma.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo Anterior
          If StrToInt(TxtAnterior.text) < 0 Then
        TxtAnterior.font.color := ClRed
     Else
        TxtAnterior.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total do mes
     If StrToInt(TxtMes.text) < 0 Then
        TxtMes.font.color := ClRed
     Else
        TxtMes.font.color := clBlack;  

    //TxtTlCaixa.text := (TxtTlDia.text + TxtSaldo.text);   mostrar os resultados de dois em um

end;

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Robinhocne, alterei o título para que mostrasse adequadamente sua dúvida. Do jeito que estava, achei que você queria formatar os edits para mostrar no formato monetário (tipo, "R$ 250,00")

Bom o erro é bem óbvio: '250,50' is not a valid integer value

que sugere que em algum momento você está querendo converter para inteiro algo que não o é.

A pista fica por conta da mensagem, então em algum ponto você tinha uma chamada a função que converte para integer. Localizamos elas em seguimentos como este do seu código:

...
     If StrToInt(TxtTlDia.text) < 0 Then    < ========== AQUI
        TxtTlDia.font.color := ClRed
     Else
        TxtTlDia.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total
     If StrToInt(TxtSoma.text) < 0 Then    < ========== AQUI
...
Primeiro, o número formatado como está, já não corresponde a um float - lembra a história do "." e da ","? Então, para converter um texto numerico, a casa decimal deverá ser o "."!!! Para a aplicação que você pretende, acho que seria mais produtivo você simplesmente verificar a existência do sinal "-" no texto do número, como segue:
...
     If Pos('-', TxtTlDia.text) > 0 Then
        TxtTlDia.font.color := ClRed
     Else
        TxtTlDia.font.color := clBlack;

em caso que fosse necessário algum tipo de operação, seria mais interessante, então, que você utilizasse variáveis para armazenar os valores e quando necessário, os convertesse para string e mostrasse nos edits.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

É Micheus realmente é também para formatar os Edits são duas coisas que eu não consiguo fazer.

1º Queria ver como eu faço para formatar no Edit e salvar, utilizei daquele jeito que foi feito no Tópico, mas não deu certo ele está dando esse erro.

Foi dessa maneira que eu fiz:

Add (AnsiReplaceStr(Format('%.2f',[TxtVal.Text]), ',', '.'));
Erro
Format '%.2f' invalid or incompatible with argument
Ai... 2º Quando eu abro ele me dá esse erro,'250,50' is not a valid integer value mas pelo que eu vi o erro é onde eu faço as instruções para mostrar nos Edits, mas esse procedimento não estou entendendo mudei algumas coisas do "+" e "-", mas nada como eu prosiguo, dá uma pista para eu tentar desvendar! Então o Problema seria aqui:
TxtTlDia.text := ((FloatToStr((QryTotais.FieldByName('+').AsFloat) - (QryTotais2.FieldByName('-').AsFloat)) ));

Editado por robinhocne
Link para o comentário
Compartilhar em outros sites

  • 0

robinhocne, neste caso, talvez a solução de quase todos os seus problemas seja pelo uso do componente TCurrencyEdit do pacote RxLib (paleta RX Controls).

- Veja que com ele, você poderá obter a formatação monetária: DisplayFormat por padrão é definida como "R$ ,0.00;-R$ ,0.00";

- Voce atribui um valor numérico (extended) diretamente a ele e automaticamente ele irá formatar o texto a ser mostrado;

- A edição fica fácil, porque ele aceita a vírgula numa boa;

Quando você precisar trabalhar com o valor numérico, utiliza a propriedade Value: CurrencyEdit1.Value := 250.5;

Quando precisar do texto formatado, utiliza a propriedade DisplayText: Label1.Caption := CurrencyEdit1.DisplayText;

Por acaso você o tem instalado? Se não veja este post

Link para o comentário
Compartilhar em outros sites

  • 0

Mas complementando...

sobre o erro: Format '%.2f' invalid or incompatible with argument

robinhocne, se você der uma olhada no help sobre format, vai saber que quando você utilizar o %f, significa que no array de valores que você passa a função, o valor correspondente a este "parâmetro" tem que ser um número!

E você está passando o quê....? Um string. :blink:

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, Resolvido este erro

is not a valid integer value
Este erro estava dando por eu estar tentado converter um texto numerico (String) para um Float (numero real) nesses códigos:
// Para quando for negativo mostrar em vermelho o saldo do dia
     If StrToInt(TxtTlDia.text) < 0 Then
        TxtTlDia.font.color := ClRed
     Else
        TxtTlDia.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total
     If StrToInt(TxtSoma.text) < 0 Then
        TxtSoma.font.color := ClRed
     Else
        TxtSoma.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo Anterior
          If StrToInt(TxtAnterior.text) < 0 Then
        TxtAnterior.font.color := ClRed
     Else
        TxtAnterior.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total do mes
     If StrToInt(TxtMes.text) < 0 Then
        TxtMes.font.color := ClRed
     Else
        TxtMes.font.color := clBlack;  

end;
Eu Estava usando edits para retornar os dados que queria que mostrasse neles, ai foi mudado para o TCurrencyEdit um componente do pacote do RxLib, onde ele tem uma propriedade chamada Value que já me retorna os dados em real!, pois então não precisaria fazer uma conversão FloatToStr (no caso um ponto flutuante para String), pois sendo que não precisaria checar nada, então os dados ficaria assim:
// Para quando for negativo mostrar em vermelho o saldo do dia
     If TxtTlDia.Value < 0 Then
        TxtTlDia.font.color := ClRed
     Else
        TxtTlDia.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total
     If TxtSoma.Value < 0 Then
        TxtSoma.font.color := ClRed
     Else
        TxtSoma.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo Anterior
     If TxtAnterior.Value < 0 Then
        TxtAnterior.font.color := ClRed
     Else
        TxtAnterior.font.color := clBlack;

     // Para quando for negativo mostrar em vermelho o saldo do Total do mes
     If TxtMes.Value < 0 Then
        TxtMes.font.color := ClRed
     Else
        TxtMes.font.color := clBlack;
E os codigos que eram para fazer as buscas dos dados e mostrar nos edits:
With QryCaixa do
      Begin
         QryCaixa.Close;
         QryCaixa.Sql.Text := 'Select * from lancamento  where Pagamento = Current_date';
         QryCaixa.Open;
      end;
      
   //Soma o saldo do Dia
 With QryTotais do
      Begin
         QryTotais.Close;
         QryTotais.Sql.Text := 'Select sum(Valor)as "+" From Lancamento where tipo =  1 and pagamento = Current_date';
         QryTotais.Open;
      end;
 With QryTotais2 do
      Begin
         QryTotais2.Close;
         QryTotais2.Sql.Text := 'Select sum(valor) as "-" From Lancamento where tipo = 0 and pagamento = Current_date';
         QryTotais2.Open;
      End;
     //TxtTlDia.text := ((FloatToStr((QryTotais.FieldByName('+').AsFloat) - (QryTotais2.FieldByName('-').AsFloat)) ));
         TxtTlDia.Value := QryTotais.FieldByName('+').AsFloat - QryTotais2.FieldByName('-').AsFloat;
     // Saldo Total
 With QrySaldo do
      Begin
         QrySaldo.Close;
         QrySaldo.Sql.Text := 'Select sum(Valor)as "+" From Lancamento where tipo = 1 and pagamento is not null';
         QrySaldo.Open;
      end;
 With QrySaldo2 do
      Begin
         QrySaldo2.Close;
         QrySaldo2.Sql.Text := 'Select sum(Valor)as "-" From Lancamento where tipo = 0 and pagamento is not null';
         QrySaldo2.Open;
      End;
   //  TxtSoma.text := ( (FloatToStr((QrySaldo.FieldByName('+').AsFloat) - (QrySaldo2.FieldByName('-').AsFloat)) ));
     TxtSoma.Value := QrySaldo.FieldByName('+').AsFloat - QrySaldo2.FieldByName('-').AsFloat;

     // Saldo Anterior
 With QryAnterior do
      Begin
         QryAnterior.Close;
         QryAnterior.Sql.Text := 'select sum(valor)as "+" from lancamento where Tipo = 1' +
         ' and extract(year from pagamento) = extract(year from current_date)' +
         ' and extract(month from pagamento) = extract(month from current_date) -1';
         QryAnterior.Open;
      end;
 With QryAnterior2 do
      Begin
         QryAnterior2.Close;
         QryAnterior2.Sql.Text := 'select sum(valor)as "-" from lancamento where Tipo = 0 and ' +
         'extract(year from pagamento) = extract(year from current_date)' +
         'and extract(month from pagamento) = extract(month from current_date) -1';
         QryAnterior2.Open;
      End;
     //TxtAnterior.text := ( (FloatToStr((QryAnterior.FieldByName('sum').AsFloat) - (QryAnterior2.FieldByName('sum').AsFloat)) ));
        TxtAnterior.Value := QryAnterior.FieldByName('+').AsFloat - QryAnterior2.FieldByName('-').AsFloat;

    // Saldo Total do Mês
 With QryMes do
      Begin
         QryMes.Close;
         QryMes.Sql.Text := 'select sum(valor)as "+" from lancamento where Tipo = 1' +
         ' and extract(year from pagamento) = extract(year from current_date)' +
         ' and extract(month from pagamento) = extract(month from current_date)';
         QryMes.Open;
      end;
 With QryMes2 do
      Begin
         QryMes2.Close;
         QryMes2.Sql.Text := 'select sum(valor)as "-" from lancamento where Tipo = 0 and ' +
         'extract(year from pagamento) = extract(year from current_date)' +
         'and extract(month from pagamento) = extract(month from current_date)';
         QryMes2.Open;
      End;
     //TxtMes.text := ( (FloatToStr((QryMes.FieldByName('sum').AsFloat) - (QryMes2.FieldByName('sum').AsFloat)) ));
     TxtMes.Value := QryMes.FieldByName('+').AsFloat - QryMes2.FieldByName('-').AsFloat;
Bom a segunda parte esta resolvida mas falta a primeira parte desse Post Pois aqui eu queria salvar e já convertendo para float, mas fazendo o programa ler em vez de "," eu lê ".", fiz dessa maneira:
Add (AnsiReplaceStr(Format('%.2f',[TxtVal.Text]), ',', '.'));

Mas ai dá esse erro:

Format '%.2f' invalid or incompatible with argument

E agora?

Link para o comentário
Compartilhar em outros sites

  • 0
Bom a segunda parte esta resolvida mas falta a primeira parte desse Post

Pois aqui eu queria salvar e já convertendo para float, mas fazendo o programa ler em vez de "," eu lê ".", fiz dessa maneira:

Add (AnsiReplaceStr(Format('%.2f',[TxtVal.Text]), ',', '.'));

Mas ai dá esse erro:

Format '%.2f' invalid or incompatible with argument

E agora?

robinhocne, você leu o que eu postei no post#5 ?

Bom, eu vou colocar aqui denovo:

Mas complementando...

sobre o erro: Format '%.2f' invalid or incompatible with argument

robinhocne, se você der uma olhada no help sobre format, vai saber que quando você utilizar o %f, significa que no array de valores que você passa a função, o valor correspondente a este "parâmetro" tem que ser um número!

E você está passando o quê....? Um string. :blink:

Sendo mais claro: Você está passando um texto como parâmetro (TxtVal.Text), sendo que a função Format, utilizando o formato "%.2f" (onde f refere-se a float) requer que o parâmetro seja um número!

Assim sendo, se este seu TxtVal é um componente TCurrencyEdit também (e eu acho que sim), então você deveria utilizar a propriedade Value.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Bom a segunda parte esta resolvida mas falta a primeira parte desse Post

Pois aqui eu queria salvar e já convertendo para float, mas fazendo o programa ler em vez de "," eu lê ".", fiz dessa maneira:

Add (AnsiReplaceStr(Format('%.2f',[TxtVal.Text]), ',', '.'));
Mas ai dá esse erro:
Format '%.2f' invalid or incompatible with argument
E agora?
robinhocne, você leu o que eu postei no post#5 ? Bom, eu vou colocar aqui denovo:
Mas complementando... sobre o erro: Format '%.2f' invalid or incompatible with argument robinhocne, se você der uma olhada no help sobre format, vai saber que quando você utilizar o %f, significa que no array de valores que você passa a função, o valor correspondente a este "parâmetro" tem que ser um número! E você está passando o quê....? Um string. :blink:
Sendo mais claro: Você está passando um texto como parâmetro (TxtVal.Text), sendo que a função Format, utilizando o formato "%.2f" (onde f refere-se a float) requer que o parâmetro seja um número! Assim sendo, se este seu TxtVal é um componente TCurrencyEdit também (e eu acho que sim), então você deveria utilizar a propriedade Value. Abraços
Ok, eu não estava usando o TCurrencyEdit, mas ai mudei para eles, e então no Vvlr mudei de Text para Value, então ficou dessa maneira:
add (Txtval.Value);

Mas ai dá esse erro:

Imcopatible types: 'String' and 'Extended'

Link para o comentário
Compartilhar em outros sites

  • 0
Ok, eu não estava usando o TCurrencyEdit, mas ai mudei para eles, e então no Vvlr mudei de Text para Value, então ficou dessa maneira:

add (Txtval.Value);

Mas ai dá esse erro:

Imcopatible types: 'String' and 'Extended'
Oh my god! :o

Vou ter que parodiar o nosso colega Jhonas...

Traduzindo a mensagem de erro: Tipos incompatíveis: string e extended (texto e número, para simplificar mais ainda)

você não tem que adicionar um string no seu TStringList Vvlr? Para quê que você vai mudar justo esta linha?

Esta você não tinha que mexer nada nela!!! <_<

Deveria continuar exatamente como estava: um texto numérico, com a vírgula que você substituia por um ponto utilizando a função StrReplace! Era o que já tínhamos corrigido nos outros post's.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Ok, eu não estava usando o TCurrencyEdit, mas ai mudei para eles, e então no Vvlr mudei de Text para Value, então ficou dessa maneira:

add (Txtval.Value);
Mas ai dá esse erro:
Imcopatible types: 'String' and 'Extended'
Oh my god! :o Vou ter que parodiar o nosso colega Jhonas... Traduzindo a mensagem de erro: Tipos incompatíveis: string e extended (texto e número, para simplificar mais ainda) você não tem que adicionar um string no seu TStringList Vvlr? Para quê que você vai mudar justo esta linha? Esta você não tinha que mexer nada nela!!! <_< Deveria continuar exatamente como estava: um texto numérico, com a vírgula que você substituia por um ponto utilizando a função StrReplace! Era o que já tínhamos corrigido nos outros post's. Abraços
Ops, foi a resaca de ontem, mas desculpas, fiz errado mesmo, para salvar no vvlr ficou dessa maneira:
Add (AnsiReplaceStr(Format('%.2f',[TxtVal.Value]), ',', '.'));

Ok, Resolvido mais uma duvida!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...