Array
(
)

sobre calculos financeiros em ms-sql server

Luciano Silva
|
MVP
    26 fev 2014

bom dia galera,
seguinte estou precisando passar uma funçao de delphi para o ms-sql que calcula o valor presente da parcela.
acontece que
quando faço o seguinte calculo da 1
select 37/30
deveria dar o resultado 1,233333333333333....
mas dá um
dessa forma ... o calculo nao funfa
declare @dataatual datetime
declare @Vencto datetime
declare @valor money
declare @Taxa decimal(18,8)
set @taxa = 5

set @dataatual = '2014-02-26'
set @Vencto = '2014-01-20'
set @valor = 1000

declare @DifData int
declare @Indice float(53)
declare @fator float(53)
declare @fatdia numeric(38,28)

Set @DifData = DATEDIFF(dd, @Vencto, @dataatual )
If @DifData > 0 begin
Set @indice = 1+(@Taxa / 100)
set @fatdia = convert(numeric(38,28), @DifData / 30)
set @Fator = 1 / power(@indice,@fatdia)
set @fator = 1/@fator
set @valor = @valor * @fator
select @difdata, @indice, @valor, @fator, @fatdia
End

obrigado
Luciano

Isaac Jose
   - 26 fev 2014

bom dia ...
cara não entendi muito bem o resultado em si deve dar 1,2333 mais esta dando 1 redondo é isso?

se for atribua um decimal (18,3) para o campo que recebera o resultado ...
espero que funcione rsr..

att isaac

Luciano Silva
|
MVP
    26 fev 2014

primeiro lugar, obrigado por ter me respondido..
é isso mesmo o erro,

select 37/30 está retornando 1

mesmo se nao atribuir a nenhuma variavel ...
ja mudei a variavel para float, decimal, numeric com precisoes bem altas .. mesmo assim .. retorna 1

o que sera ?

Alex Lekao
   - 26 fev 2014

Oi Luciano, bom dia!!!

Tente da seguinte forma, usando a sugestao do Isaac.

#Código

select convert(decimal(18,3),37/30.0)


ou assim.
#Código
select 37/30.0

veja se da certo e posta ai.

acredito que vc sempre precisara colocar .0 ou ponto alguma coisa para que ele considere como decimal.

Abraco.

Alex - Lekao

Luciano Silva
|
MVP
    26 fev 2014

Méééééééééééstree .. enfim te encontrei ...
deu certo
no meu calculo eu dei uma adaptada
set @fatdia = convert(float(53), @DifData / 30.0)

funcionou na hora...
obrigado

se precisar de algo pode contar comigo
luciano@lckconsultoria.com.br

Alex Lekao
   - 26 fev 2014

kkkkkk...

blz... cara... mas to longe de ser mestre nisso viu... rsrsr

so tive uns probleminhas com calculos usando numeros inteiros, e descobri que tinha que quebra-lo...

com isso dava a entender que se ele fizer um calculo com inteiros ele vai considera-los inteiros.

o que fiz foi refrercar a memoria com os testes que postei como exemplo... rsrsr

Fico feliz em ter podido ajudar.

se precisar de algo posta ai, tamo aqui para ajudar.

se eu precisar de algo tbm, eu nao tenho vergonha, peco mesmo. kkkkkk

Abraco.

Alex - Lekao

Mariana Carvalho
   - 26 fev 2014

Alex, me desculpe pela pergunta, mas em que momento deve utilizado calculos usando o banco de dados?

Alex Lekao
   - 26 fev 2014

Oi Mariana,

Desculpe mas nao entendi bem.

pelo que tenho percebido o SQL Server qdo vc usa um numero inteiro para calcular, ele converte para Inteiro o resultado.

Entao os calculos que tenho feito, pelo menos alguns deles estou tendo que fazer assim, qdo tenho que pasar valores fixos, tenho que colocar o ponto zero para ele manter.

Nao sei se pode ser alguma coisas especifica de configuracao aqui no meu banco ou se eh especificamente do sql server.

Nao sei se respondi o que vc estava querendo, me desculpe se nao.

Abraco.

Alex - Lekao

Citação:
Alex, me desculpe pela pergunta, mas em que momento deve utilizado calculos usando o banco de dados?

Mariana Carvalho
   - 26 fev 2014

é justamente isso, pq essa conversão no proprio banco? a linguagem não pode fazer isso?

Faabiianooc
   - 27 fev 2014


Citação:
é justamente isso, pq essa conversão no proprio banco? a linguagem não pode fazer isso?


Sim.
Pode ser feito na aplicação, desde que o calculo seja feita na aplicação.
Isso no SQL é padrão se voce dividir inteiro por inteiro será retornado inteiro, pois ele não converte para float,decimal a menos que seja usado cast ou convert;

Exemplo
#Código

select cast(1 as float) / cast(3 as float)


Irá retornar 0,3333333

Até;