Fórum Problema com calculos. ClientDataSet... #346631

25/09/2007

0

Estou querendo fazer esse calculo:
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

Jpauloss

Responder

Posts

25/09/2007

Jpauloss

Da esse erro no primeiro e no segundo ´-´ (menos)


Responder

Gostei + 0

25/09/2007

Paulo Samurai

Não dá pra fazer conta com o AsString, então use o seguinte código:

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


Responder

Gostei + 0

25/09/2007

Jpauloss

[quote:6639437f89=´Paulo Samurai´]Não dá pra fazer conta com o AsString, então use o seguinte código:

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!


Responder

Gostei + 0

25/09/2007

Jpauloss

[quote:27c78ab415=´Paulo Samurai´]Não dá pra fazer conta com o AsString, então use o seguinte código:
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


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?


Responder

Gostei + 0

26/09/2007

Adriano Santos

Fecha o ClientDataSet e reabre depois do cálculo.


Responder

Gostei + 0

26/09/2007

Jpauloss

[quote:dd94c7f91f=´Adriano Santos´]Fecha o ClientDataSet e reabre depois do cálculo.[/quote:dd94c7f91f]

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.


Responder

Gostei + 0

26/09/2007

Jpauloss

Tem como dar um Refresh só em um campo da tabela?


Responder

Gostei + 0

26/09/2007

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


Responder

Gostei + 0

26/09/2007

Jpauloss

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:
     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   
---------------------------



Responder

Gostei + 0

26/09/2007

Jpauloss

Tem alguma ideia?


Responder

Gostei + 0

26/09/2007

Jpauloss

[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.


Responder

Gostei + 0

26/09/2007

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:

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


Responder

Gostei + 0

26/09/2007

Jpauloss

[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:

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á?


Responder

Gostei + 0

26/09/2007

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


Responder

Gostei + 0

26/09/2007

Jpauloss

[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?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar