Problema com calculos. ClientDataSet...
Estou querendo fazer esse calculo:
Ta dando esse erro:
Como resolvo?
saldo_real.Text:=(dm.cdsChequesVALOR.AsString)-(dm.cdsPagamentoPAGAMENTO.AsString)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsString)+(dm.cdsPagamentoJUROS.AsString);
Ta dando esse erro:
[Error] UnPagamento.pas(113): Operator not applicable to this operand type
Como resolvo?
Jpauloss
Curtidas 0
Respostas
Jpauloss
25/09/2007
Da esse erro no primeiro e no segundo ´-´ (menos)
GOSTEI 0
Paulo Samurai
25/09/2007
Não dá pra fazer conta com o AsString, então use o seguinte código:
Dependendo do tipo de campo voce pode usar Currency no lugar de float. Se o tipo de dado do campo também for string, talvez seja interessante converter através da função StrToFloatDef(dm.cdsChequesVALOR.AsString, 0) ou StrToCurrDef(dm.cdsChequesVALOR.AsString, 0);
[]´s
var saldoReal: Double; begin saldoReal := (dm.cdsChequesVALOR.AsFloat)-(dm.cdsPagamentoPAGAMENTO.AsFloat)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat)+(dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:= FloatToStr(saldoReal);
Dependendo do tipo de campo voce pode usar Currency no lugar de float. Se o tipo de dado do campo também for string, talvez seja interessante converter através da função StrToFloatDef(dm.cdsChequesVALOR.AsString, 0) ou StrToCurrDef(dm.cdsChequesVALOR.AsString, 0);
[]´s
GOSTEI 0
Jpauloss
25/09/2007
[quote:6639437f89=´Paulo Samurai´]Não dá pra fazer conta com o AsString, então use o seguinte código:
Dependendo do tipo de campo voce pode usar Currency no lugar de float. Se o tipo de dado do campo também for string, talvez seja interessante converter através da função StrToFloatDef(dm.cdsChequesVALOR.AsString, 0) ou StrToCurrDef(dm.cdsChequesVALOR.AsString, 0);
[]´s[/quote:6639437f89]
Valeu! Funcionou!
var saldoReal: Double; begin saldoReal := (dm.cdsChequesVALOR.AsFloat)-(dm.cdsPagamentoPAGAMENTO.AsFloat)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat)+(dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:= FloatToStr(saldoReal);
Dependendo do tipo de campo voce pode usar Currency no lugar de float. Se o tipo de dado do campo também for string, talvez seja interessante converter através da função StrToFloatDef(dm.cdsChequesVALOR.AsString, 0) ou StrToCurrDef(dm.cdsChequesVALOR.AsString, 0);
[]´s[/quote:6639437f89]
Valeu! Funcionou!
GOSTEI 0
Jpauloss
25/09/2007
[quote:27c78ab415=´Paulo Samurai´]Não dá pra fazer conta com o AsString, então use o seguinte código:
Dependendo do tipo de campo voce pode usar Currency no lugar de float. Se o tipo de dado do campo também for string, talvez seja interessante converter através da função StrToFloatDef(dm.cdsChequesVALOR.AsString, 0) ou StrToCurrDef(dm.cdsChequesVALOR.AsString, 0);
[]´s
var saldoReal: Double; begin saldoReal := (dm.cdsChequesVALOR.AsFloat)-(dm.cdsPagamentoPAGAMENTO.AsFloat)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat)+(dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:= FloatToStr(saldoReal);
Valeu! Funcionou![/quote:27c78ab415]
Como faz para atualizar esse cáculo?
Quando faço uma inserção ele fica o mesmo valor do primeiro resultado.
Tem que dar um refresh?
Meu código ta ssim:
procedure TFrmPagamento.nome_clienteChange(Sender: TObject); Var vSaldoReal: Double; begin if (debito.Text=´´) or (pagamento.Text=´´) or(pag_juros.Text=´´) or (saldo.Text=´´) or (juros.Text=´´) or (saldo_liquido.Text=´´) then begin debito.Text:=´0´; pagamento.Text:=´0´; pag_juros.Text:=´0´; saldo.Text:=´0´; saldo_liquido.Text:=´0´; end; dm.sdsPagamento.Close; dm.sdsPagamento.CommandText:=´select * from pagamento where id_cliente= :id_cliente´; dm.sdsPagamento.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsPagamento.Open; dm.cdsPagamento.Refresh; dm.sdsCheques.Close; dm.sdsCheques.CommandText:=´select * from cheques where id_cliente= :id_cliente´; dm.sdsCheques.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsCheques.Open; dm.cdsCheques.Refresh; vSaldoReal:=(dm.cdsChequesVALOR.AsFloat)- (dm.cdsPagamentoPAGAMENTO.AsFloat)- (dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:=FloatToStr(vSaldoReal); end;
Algum segredo?
GOSTEI 0
Adriano Santos
25/09/2007
Fecha o ClientDataSet e reabre depois do cálculo.
GOSTEI 0
Jpauloss
25/09/2007
[quote:dd94c7f91f=´Adriano Santos´]Fecha o ClientDataSet e reabre depois do cálculo.[/quote:dd94c7f91f]
Num ta atualizando não. Da uma olhadinha aí
Parece que só faz a primeira vez.
Num ta atualizando não. Da uma olhadinha aí
procedure TFrmPagamento.nome_clienteChange(Sender: TObject); Var vSaldoReal: Double; begin if (saldo_real.Text=´´) or (pagamento.Text=´´) or (pag_juros.Text=´´) or (saldo.Text=´´) or (juros.Text=´´) or (saldo_liquido.Text=´´) then begin saldo_real.Text:=´0´; pagamento.Text:=´0´; pag_juros.Text:=´0´; saldo.Text:=´0´; saldo_liquido.Text:=´0´; end; dm.sdsPagamento.Close; dm.sdsPagamento.CommandText:=´select * from pagamento where id_cliente= :id_cliente´; dm.sdsPagamento.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsPagamento.Open; dm.cdsPagamento.Refresh; dm.sdsCheques.Close; dm.sdsCheques.CommandText:=´select * from cheques where id_cliente= :id_cliente´; dm.sdsCheques.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsCheques.Open; dm.cdsCheques.Refresh; vSaldoReal:=(dm.cdsChequesVALOR.AsFloat)- (dm.cdsPagamentoPAGAMENTO.AsFloat)- (dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:=FloatToStr(vSaldoReal); dm.cdsCheques.Close; dm.cdsCheques.Open; dm.cdsCheques.Refresh; end;
Parece que só faz a primeira vez.
GOSTEI 0
Jpauloss
25/09/2007
Tem como dar um Refresh só em um campo da tabela?
GOSTEI 0
Paulo Samurai
25/09/2007
Este edit ´saldo real´ é um dbEdit? Se for seria melhor que voce utiliza-se o campo ´saldo_real´ como receptor e não o edit ;)
De qualquer forma, é necessário depurar e verificar se os campos que compõe o saldo estão vindo com os valores corretos, senão há algum problema na consulta / atualização deles.
[]´s
De qualquer forma, é necessário depurar e verificar se os campos que compõe o saldo estão vindo com os valores corretos, senão há algum problema na consulta / atualização deles.
[]´s
GOSTEI 0
Jpauloss
25/09/2007
Descobri em parte.
O calculo esta sendo feito corretamente. Quero uma soma do campo VALOR da tabela CHEQUES, então fiz um campo aggregate fazendo a soma do campo VALOR. E o calculo ficou assim:
Onde cdsChequesSoma é o campo agregado.
Só que da um erro:
O calculo esta sendo feito corretamente. Quero uma soma do campo VALOR da tabela CHEQUES, então fiz um campo aggregate fazendo a soma do campo VALOR. E o calculo ficou assim:
vSaldoReal:=(dm.cdsChequesSoma.AsFloat)- (dm.cdsPagamentoPAGAMENTO.AsFloat)- (dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat); saldo_real.Text:=FloatToStr(vSaldoReal);
Onde cdsChequesSoma é o campo agregado.
Só que da um erro:
--------------------------- Debugger Exception Notification --------------------------- Project SisFactory.exe raised exception class EDatabaseError with message ´Cannot access field ´Soma´ as type Float´. Process stopped. Use Step or Run to continue. --------------------------- OK Help ---------------------------
GOSTEI 0
Jpauloss
25/09/2007
Tem alguma ideia?
GOSTEI 0
Jpauloss
25/09/2007
[quote:c0009f8031=´Paulo Samurai´]Este edit ´saldo real´ é um dbEdit? Se for seria melhor que voce utiliza-se o campo ´saldo_real´ como receptor e não o edit ;)
De qualquer forma, é necessário depurar e verificar se os campos que compõe o saldo estão vindo com os valores corretos, senão há algum problema na consulta / atualização deles.
[]´s[/quote:c0009f8031]
Já descobri o problema do calculo. Na realidade o calculo esta sendo feito corretamente. O problema é que o calculo que eu quero precisa fazer uma soma no campo VALOR da tabela CHEQUES daí fiz isso e postei acima o erro.
Da uma olhadinha aí em cima.
De qualquer forma, é necessário depurar e verificar se os campos que compõe o saldo estão vindo com os valores corretos, senão há algum problema na consulta / atualização deles.
[]´s[/quote:c0009f8031]
Já descobri o problema do calculo. Na realidade o calculo esta sendo feito corretamente. O problema é que o calculo que eu quero precisa fazer uma soma no campo VALOR da tabela CHEQUES daí fiz isso e postei acima o erro.
Da uma olhadinha aí em cima.
GOSTEI 0
Paulo Samurai
25/09/2007
Ah, outra coisa...
Suponho que as tabelas pagamento e cheques não contenham somente um registro, mas diversos. Dessa forma não funciona o que voce deseja fazer...
Jeito ruim: Voce teria que iterar somando os valores de todos os registros somando os valores:
Esse código acima deve resolver, mas é um jeito muito tosco de obter este resultado. Uma abordagem melhor seria fazer:
Blz, uma sql dessas para cada campo que vai entrar no calculo.
E no final, as melhores abordagens na minha opinião:
a.) A tabela do cliente, ou melhor ainda, uma tabela de conta associada ao cliente, teria um campo saldo associado.... a cada operação este campo seria atualizado.
vantagem: não precisa fazer este monte de consulta (desempenho) cada vez que quiser olhar o saldo
desvantagem: tem que tomar cuidado com a consistencia para manter este campo sempre correto.
b.) Uma Stored Procedure para retornar o valor total do saldo em uma unica operação de consulta
[]´s
Suponho que as tabelas pagamento e cheques não contenham somente um registro, mas diversos. Dessa forma não funciona o que voce deseja fazer...
Jeito ruim: Voce teria que iterar somando os valores de todos os registros somando os valores:
vSaldoReal := 0; dm.cdsCheques.First; dm.cdsPagamento.First; While not dm.cdsCheques.eof do begin vSaldoReal := vSaldoReal + cdsChequesVALOR.AsFloat; dm.cdsCheques.Next; end; While not dm.cdsPagamento.eof do begin vSaldoReal := vSaldoReal - ((dm.cdsPagamentoPAGAMENTO.AsFloat)- (dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat)); dm.cdsPagamento.Next; end; saldo_real.Text:=FloatToStr(vSaldoReal);
Esse código acima deve resolver, mas é um jeito muito tosco de obter este resultado. Uma abordagem melhor seria fazer:
dm.sdsPagamento.CommandText:=´select SUM(VALOR) from cheques where id_cliente= :id_cliente´;
Blz, uma sql dessas para cada campo que vai entrar no calculo.
E no final, as melhores abordagens na minha opinião:
a.) A tabela do cliente, ou melhor ainda, uma tabela de conta associada ao cliente, teria um campo saldo associado.... a cada operação este campo seria atualizado.
vantagem: não precisa fazer este monte de consulta (desempenho) cada vez que quiser olhar o saldo
desvantagem: tem que tomar cuidado com a consistencia para manter este campo sempre correto.
b.) Uma Stored Procedure para retornar o valor total do saldo em uma unica operação de consulta
[]´s
GOSTEI 0
Jpauloss
25/09/2007
[quote:7418e4b850=´Paulo Samurai´]Ah, outra coisa...
Suponho que as tabelas pagamento e cheques não contenham somente um registro, mas diversos. Dessa forma não funciona o que voce deseja fazer...
Jeito ruim: Voce teria que iterar somando os valores de todos os registros somando os valores:
Esse código acima deve resolver, mas é um jeito muito tosco de obter este resultado. Uma abordagem melhor seria fazer:
Blz, uma sql dessas para cada campo que vai entrar no calculo.
E no final, as melhores abordagens na minha opinião:
a.) A tabela do cliente, ou melhor ainda, uma tabela de conta associada ao cliente, teria um campo saldo associado.... a cada operação este campo seria atualizado.
vantagem: não precisa fazer este monte de consulta (desempenho) cada vez que quiser olhar o saldo
desvantagem: tem que tomar cuidado com a consistencia para manter este campo sempre correto.
b.) Uma Stored Procedure para retornar o valor total do saldo em uma unica operação de consulta
[]´s[/quote:7418e4b850]
Valeu pela atenção!
Coloquei exatamente como vc me disse:
Só que não está fazendo o calculo correto parece que em vez de somar o dm.cdsPagamentoJUROS.AsFloat ele parece que esta diminuindo duas vezes. O que será?
Suponho que as tabelas pagamento e cheques não contenham somente um registro, mas diversos. Dessa forma não funciona o que voce deseja fazer...
Jeito ruim: Voce teria que iterar somando os valores de todos os registros somando os valores:
vSaldoReal := 0; dm.cdsCheques.First; dm.cdsPagamento.First; While not dm.cdsCheques.eof do begin vSaldoReal := vSaldoReal + cdsChequesVALOR.AsFloat; dm.cdsCheques.Next; end; While not dm.cdsPagamento.eof do begin vSaldoReal := vSaldoReal - ((dm.cdsPagamentoPAGAMENTO.AsFloat)- (dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat)); dm.cdsPagamento.Next; end; saldo_real.Text:=FloatToStr(vSaldoReal);
Esse código acima deve resolver, mas é um jeito muito tosco de obter este resultado. Uma abordagem melhor seria fazer:
dm.sdsPagamento.CommandText:=´select SUM(VALOR) from cheques where id_cliente= :id_cliente´;
Blz, uma sql dessas para cada campo que vai entrar no calculo.
E no final, as melhores abordagens na minha opinião:
a.) A tabela do cliente, ou melhor ainda, uma tabela de conta associada ao cliente, teria um campo saldo associado.... a cada operação este campo seria atualizado.
vantagem: não precisa fazer este monte de consulta (desempenho) cada vez que quiser olhar o saldo
desvantagem: tem que tomar cuidado com a consistencia para manter este campo sempre correto.
b.) Uma Stored Procedure para retornar o valor total do saldo em uma unica operação de consulta
[]´s[/quote:7418e4b850]
Valeu pela atenção!
Coloquei exatamente como vc me disse:
procedure TFrmPagamento.nome_clienteChange(Sender: TObject); Var vSaldoReal: Double; begin if (saldo_real.Text=´´) or (pagamento.Text=´´) or (pag_juros.Text=´´) or (saldo.Text=´´) or (juros.Text=´´) or (saldo_liquido.Text=´´) then begin saldo_real.Text:=´0´; pagamento.Text:=´0´; pag_juros.Text:=´0´; saldo.Text:=´0´; saldo_liquido.Text:=´0´; end; dm.sdsPagamento.Close; dm.sdsPagamento.CommandText:=´select * from pagamento where id_cliente= :id_cliente´; dm.sdsPagamento.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsPagamento.Open; dm.cdsPagamento.Refresh; dm.sdsCheques.Close; dm.sdsCheques.CommandText:=´select * from cheques where id_cliente= :id_cliente´; dm.sdsCheques.ParamByName(´id_cliente´).AsString:=cod_cli.Text; dm.sdsCheques.Open; dm.cdsCheques.Refresh; vSaldoReal := 0; dm.cdsCheques.First; dm.cdsPagamento.First; While not dm.cdsCheques.eof do begin vSaldoReal := vSaldoReal + dm.cdsChequesVALOR.AsFloat; dm.cdsCheques.Next; end; While not dm.cdsPagamento.eof do begin vSaldoReal := vSaldoReal - ((dm.cdsPagamentoPAGAMENTO.AsFloat)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat)); dm.cdsPagamento.Next; end; saldo_real.Text:=FloatToStr(vSaldoReal); end;
Só que não está fazendo o calculo correto parece que em vez de somar o dm.cdsPagamentoJUROS.AsFloat ele parece que esta diminuindo duas vezes. O que será?
GOSTEI 0
Paulo Samurai
25/09/2007
Eu recomendo fortemente que voce não use essa implementação com laço hehehe... mas se ainda quiser.
Bom, a questão aí pode estar nos parenteses. Como eu não tenho certeza do significado real dos seus campos não sei o que voce deseja somar ou subtrair...
Acho que a ideia é:
Saldo = Valor - Juros + PagamentoJuros + Pagamento;
Neste caso tudo pago o saldo é zero.
Basta voce prestar atenção neste caso aos parenteses lembrando que inverte o sinal.
[]´s
Bom, a questão aí pode estar nos parenteses. Como eu não tenho certeza do significado real dos seus campos não sei o que voce deseja somar ou subtrair...
Acho que a ideia é:
Saldo = Valor - Juros + PagamentoJuros + Pagamento;
Neste caso tudo pago o saldo é zero.
Basta voce prestar atenção neste caso aos parenteses lembrando que inverte o sinal.
[]´s
GOSTEI 0
Jpauloss
25/09/2007
[quote:c15d2c4c60=´Paulo Samurai´]Eu recomendo fortemente que voce não use essa implementação com laço hehehe... mas se ainda quiser.
Bom, a questão aí pode estar nos parenteses. Como eu não tenho certeza do significado real dos seus campos não sei o que voce deseja somar ou subtrair...
Acho que a ideia é:
Saldo = Valor - Juros + PagamentoJuros + Pagamento;
Neste caso tudo pago o saldo é zero.
Basta voce prestar atenção neste caso aos parenteses lembrando que inverte o sinal.
[]´s[/quote:c15d2c4c60]
SaldoReal = Valor - Pagamento-PagamentoJuros + Juros;
Os sinais estão certos no código.
Mais alguma ideia?
Bom, a questão aí pode estar nos parenteses. Como eu não tenho certeza do significado real dos seus campos não sei o que voce deseja somar ou subtrair...
Acho que a ideia é:
Saldo = Valor - Juros + PagamentoJuros + Pagamento;
Neste caso tudo pago o saldo é zero.
Basta voce prestar atenção neste caso aos parenteses lembrando que inverte o sinal.
[]´s[/quote:c15d2c4c60]
SaldoReal = Valor - Pagamento-PagamentoJuros + Juros;
Os sinais estão certos no código.
Mais alguma ideia?
GOSTEI 0
Jpauloss
25/09/2007
Consegui! Valeu pela ajuda!
Ficou assim:
Foi os parenteses mesmo.
Ficou assim:
vSaldoReal := vSaldoReal - (dm.cdsPagamentoPAGAMENTO.AsFloat)-(dm.cdsPagamentoPAGAMENTO_JUROS.AsFloat) + (dm.cdsPagamentoJUROS.AsFloat);
Foi os parenteses mesmo.
GOSTEI 0