Incompatibilidade nas variáveis

Delphi

17/09/2004

Olá pessoal,

Descobri que a Unit Math não funcionava no meu computador, pelo fato de eu estar utilizando a versão Standard do Delphi 3, assim sendo, consegui hoje a versão Client/Server, mas agora outro problema segura o meu projeto. Tenho certeza de que a solução é simples, porém pela minha inexperiência não consegui resolver:

Tenho os seguintes campos em uma tabela:

(Vencimento = Data), (Valor = Moeda), (Juros = Numerico), (Pago em = Data), (Dias em atraso = Numerico ´Representa a DatadoPagamento-DataDoVencimento)
(A Pagar = Moeda)

O Código que estou utilizando é o seguinte:

---------------------------------------------------------------------------------
procedure TMensalidades_.BotaoPagarClick(Sender: TObject);
Var
X, Y: Real;
begin
// Fórmula para cálculo de juros: Valor*(1+Juros)^DiasAtrasados

X := dm_.QryMensalidadesJuros_mora.Value+1;
Y := dm_.QryMensalidadesDiasAtraso.Value;

dm_.QryMensalidadesAPagar.Value := dm_.QryMensalidadesValor.Value*Power(X,Y);
end;
---------------------------------------------------------------------------------

Quando compilo apresenta a seguinte mensagem de erro:

Incompatible types: ´Integer´ and ´Real´.


Se alguém puder dizer-me onde está o erro e como corrigí-lo, conte com o meu mais sincero obrigado.

Acreditando no auxílio de todos que formam o ClubeDelphi, antecipadamente agradeço.


Pro-luck

Pro-luck

Curtidas 0

Respostas

Uildenei

Uildenei

17/09/2004

jah tentou usar DOUBLE ao inves de REAL?

veja os tipos de dados usados nos tipos de campos da tabela.


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

Que tipo de dados seriam melhores aplicados nesta situação.

E as variáveis do tipo Double são compatíveis com Integer?


Antecipadamente agradeço pelo auxílio prestado.


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

SOBE


GOSTEI 0
Vinicius2k

Vinicius2k

17/09/2004

Colega,

Por favor, relacione para nós os tipos dos TFields envolvidos neste cálculo. (TIntegerField, TFloatField, Etc)...

- QryMensalidadesJuros_mora
- QryMensalidadesDiasAtraso
- QryMensalidadesAPagar
- QryMensalidadesValor

T+


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

Não sei muito sobre os tipos de variáveis, como falei sou iniciante. Esforçado, mas iniciante. O que posso dizer é o seguinte:

Banco de dados gerado no Paradox:

- QryMensalidadesJuros_mora = Tipo Númeric
- QryMensalidadesDiasAtraso = Tipo Numeric
- QryMensalidadesAPagar = Tipo Currency
- QryMensalidadesValor = Tipo Currency

A fórmula usada para calcular o valor A Pagar está sendo usada no evento OnClick de um botão existente no formulário.

A fórmula é a seguinte:

A Pagar = Valor * (1+Imposto) ^ Dias de atraso.

E a fórmula que estou utilizando é a seguinte:

dm_.QryMensalidadesAPagar.Value := dm_.QryMensalidadesValor.Value*Power(X,Y);
end;

Onde, dm_ é o nome do DataModulo que contém as Queries do sistemas, QryMensalidade é o nome da Query que contém os dados que deverão ser calculados. Power é a função que calcula potência (dica fornecida já pelo ClubeDelphi).

X representa (1+dm_.QryMensalidadesJuros_Mora.Value) e
Y representa dm_.QryMensalidadesDiasAtraso.Value).

Espero ter sido o mais claro possível.

Brigadão pela força pessoal.

Té +


GOSTEI 0
Vinicius2k

Vinicius2k

17/09/2004

Colega,

Eu não consigo simular seu erro...
Criei a tabela conforme a estrutura que vc passou e inseri uma query com o mesmo cálculo que vc e funciona normalmente...
A mensagem de erro do compilador sugere que um dos TFields que vc está usando seja TIntegerField, mas se a estrutura da tabela for exatamente a que vc passou, não são...
Confira por favor, no FieldsEditor (duplo click na query) o tipo de cada TField
- QryMensalidadesJuros_Mora -> TFloatField
- QryMensalidadesDiasAtraso -> TFloatField
- QryMensalidadesAPagar -> TCurrencyField
- QryMensalidadesValor -> TCurrencyField

T+


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

Os TFields combinam com o que vc me mandou:

- QryMensalidadesJuros_Mora -> TFloatField
- QryMensalidadesDiasAtraso -> TFloatField
- QryMensalidadesAPagar -> TCurrencyField
- QryMensalidadesValor -> TCurrencyField

Continua dando erro na compilação. Veja se existe algum erro no código que estou utilizando por favor.

---------------------------------------------------------------------------------
procedure TMensalidades_.BotaoCalcJurosClick(Sender: TObject);
Var
X, Y: Integer;
begin
X := dm_.QryMensalidadesDiasAtraso.Value;
Y := (1+dm_.QryMensalidadesJuros_mora.Value);

dm_.QryMensalidadesAPagar.Value := dm_.QryMensalidadesValor.Value*Power(Y,X);

end;

---------------------------------------------------------------------------------

Té +, e brigadão pela força.


GOSTEI 0
Vinicius2k

Vinicius2k

17/09/2004

Agora, tem um erro...

X e Y no seu código original eram REAL agora estão INTEGER, com esta definição de tipo, até para mim ocorre o erro, mas como REAL não ocorre... compila, executa e efetua o cálculo (apenas não sei lhe dizer se a fórmula é correta) normalmente...
Veja :
...
var x, y: Real;
begin
  x:= QryMensalidadesJuros_mora.Value + 1;
  y:= QryMensalidadesDiasAtraso.Value;
  QryMensalidadesAPagar.Value:= QryMensalidadesValor.Value * Power(x,y);
end;


Eu criei uma tabela em Paradox, nos moldes do que vc informou, e fiz a operação, usando, inclusive, os mesmos nomes que vc...

Realmente, não sei lhe explicar o que pode estar ocorrendo...

T+


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

Alô Vinícius,


Resolvi o problema da seguinte forma: O mesmo código que eu estava utilizando dentro do form de Mensalidades
utilizei no evento OnCalcFields da Query em questão.

E lá compilava perfeitamente, só que mudei o campo APagar para um campo calculado e não físico como estava anteriormente.
E criei também uma espécie de gatilho, porque o cálculo funciona em tempo de execução, e dava erro constantemente
informando que a minha Query não estava em modo de edição nem de inserção, então fiz o seguinte:



Var
X, Y: Real;
begin
if (QryMensalidadesDiasAtraso.Value <= 0) then
begin
QryMensalidades.Active := True;
end
else
begin
X := (QryMensalidadesJuros_Mora.Value/100)+1;
Y := QryMensalidadesDiasAtraso.Value;

QryMensalidadesAPagar.Value := QryMensalidadesValor.Value*Power(X,Y);
end;

Muito obrigado pela força tuas dicas ajudaram muito e, se eu puder te ajudar de alguma forma, tô na área.

Té +.


GOSTEI 0
Vinicius2k

Vinicius2k

17/09/2004

Blz. :wink:
Não tenho certeza se lhe ajudei muito, mas o importante é que está resolvido...

T+


GOSTEI 0
Pro-luck

Pro-luck

17/09/2004

Melhor ainda, troquei a seguinte linha:

QryMensalidades.Active := True;

Por:
QryMensalidadesAPagar.Value := QryMensalidadesValor.Value;



Assim se não existe atraso, paga-se o valor normal.

Té + galera...


GOSTEI 0
POSTAR