Fórum Problema com calculos. ClientDataSet... #346631
25/09/2007
0
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
Curtir tópico
+ 0Posts
25/09/2007
Jpauloss
Gostei + 0
25/09/2007
Paulo Samurai
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
25/09/2007
Jpauloss
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
25/09/2007
Jpauloss
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
26/09/2007
Adriano Santos
Gostei + 0
26/09/2007
Jpauloss
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
26/09/2007
Jpauloss
Gostei + 0
26/09/2007
Paulo Samurai
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
26/09/2007
Jpauloss
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
26/09/2007
Jpauloss
Gostei + 0
26/09/2007
Jpauloss
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
26/09/2007
Paulo Samurai
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
26/09/2007
Jpauloss
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
26/09/2007
Paulo Samurai
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
26/09/2007
Jpauloss
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
Clique aqui para fazer login e interagir na Comunidade :)