CALCULAR JUROS NA SQL

MOREIRA 10/03/2010 13:15:29
#336537
Olá Pessoal, estou fazendo uma consulta sql, já esta funcionando a contagem de dias de atraso. mas preciso calcular os juros apos a data de vencimento e colocar o resultado, vejam na imagem em anexo..

Exemplo: 5% após o Vencimento...

Private Sub CmdBusc_Click()
Set Rst = New ADODB.Recordset
Sql = [Ô]Select Id, DtVencto, VlrParc, PrazoPgto, DateDiff(Now(), DtVencto) As DiasAtraso From Tbl_Receber Where IdCli = [ô][Ô] & TxtId.Text & [Ô][ô]And Status = [ô]Em Aberto[ô] Order By DtVencto Asc[Ô]
Rst.Open Sql, Conexao, 3
If Not Rst.EOF Then
With G
.Rows = 1
.Cols = 6
.ColWidth(0) = 0
.ColWidth(1) = 1555
.ColWidth(2) = 1555
.ColWidth(3) = 800
.ColWidth(4) = 1000
.ColWidth(5) = 1555

[ô]Cabecalho do Grid
.TextMatrix(0, 0) = [Ô]Id[Ô]
.TextMatrix(0, 1) = [Ô]Dt. Vencto[Ô]
.TextMatrix(0, 2) = [Ô]Vlr. Parc R$[Ô]
.TextMatrix(0, 3) = [Ô]Parc.[Ô]
.TextMatrix(0, 4) = [Ô]D. Atraso[Ô]
.TextMatrix(0, 5) = [Ô]Vlr. a Pagar R$[Ô]

End With
I = 1
Do While Not Rst.EOF
With G
.Rows = I + 1
.TextMatrix(I, 0) = [Ô][Ô] & Rst!Id
.TextMatrix(I, 1) = [Ô][Ô] & Format(Rst!DtVencto, [Ô]dd/mm/yyyy[Ô])
.TextMatrix(I, 2) = [Ô][Ô] & Format(Rst!VlrParc, [Ô]###,##0.00[Ô])
.TextMatrix(I, 3) = [Ô][Ô] & Rst!PrazoPgto
.TextMatrix(I, 4) = [Ô][Ô] & Rst!DiasAtraso
[ô]--->>.TextMatrix(I, 5) = [Ô][Ô] & Rst!Juros


End With
I = I + 1
Rst.MoveNext
Loop
End If
Rst.Close
Set Rst = Nothing
End Sub

MARCIO.TEIXEIRA 10/03/2010 13:34:13
#336542
Vair depender muito da sua regra de calculo de juros,

Se a regra for simplesmente adicionar 5% ao valor da parcela independente do número de dias de atras ai vai um jeito simples de resolver:

[Ô]Select Id, DtVencto, VlrParc, PrazoPgto, DateDiff(Now(), DtVencto) As DiasAtraso ,
iif(DiasAtraso > 0, VlrParc * ((5/100)+1),VlrParc)
From Tbl_Receber Where IdCli = [ô][Ô] & TxtId.Text & [Ô][ô]And Status = [ô]Em Aberto[ô] Order By DtVencto Asc[Ô]

Caso o BD seja Access da pra usar o iif, se for outro BD ai terá que usar [Ô]Case When[Ô] por exemplo
MOREIRA 10/03/2010 13:45:05
#336545
desculpa, esqueci de mencionar o db é MYSQL
DANIKULL 10/03/2010 13:51:30
#336547
Resposta escolhida
MOREIRA, boa tarde.

Nos diz uma coisa... qual será a regra usada no sistema. Será Juro sobre Juro, ou chamado juro composto, ou será Juro Simples??

No caso de Juro sobre Juro, o qualculo é feito dia a dia de atraso e ja no Juro Simples você pega o valor, multimplica por 0,05 e o resultado você multiplica elo numero de dias dai é so somar com o Valor do Débito, ok???

Responde ai para poder criar a consulta pra você ok??
MOREIRA 10/03/2010 14:09:17
#336549
Juros Compostos (Juros Sobre Juros)
RICART 10/03/2010 15:06:15
#336553
O correto é vc criar um aprocedure para executar o cálculo. Via de regra, os títulos possuem uma multa por atrazo que possui um valor fixo e a mora diária.

Desconheço casos de títulos onde faça o cálculo de juros sobre juros para períodos de dias. Como a quantidade de interações nos cálculos será grande, caso um título fique com 60 dias de atrazo, o valor será muito grande.

Não sei criar procedure no mysql, mas vejo que atenderá melhor o seu caso.
DANIKULL 10/03/2010 15:19:36
#336555
MOREIRA, boa tarde.

Vamos lá então. Como a sua SQL já está pronta e você só está enrrolado na questão do Juros, faz da Seguinte forma. Vá nesta parte da sua rotina:

With G
.Rows = I + 1
.TextMatrix(I, 0) = [Ô][Ô] & Rst!Id
.TextMatrix(I, 1) = [Ô][Ô] & Format(Rst!DtVencto, [Ô]dd/mm/yyyy[Ô])
.TextMatrix(I, 2) = [Ô][Ô] & Format(Rst!VlrParc, [Ô]###,##0.00[Ô])
.TextMatrix(I, 3) = [Ô][Ô] & Rst!PrazoPgto
.TextMatrix(I, 4) = [Ô][Ô] & Rst!DiasAtraso
[ô]--->>.TextMatrix(I, 5) = [Ô][Ô] & Rst!Juros
End With


e acrescente as seguintes linhas:

[ô]Primeiro acrescente as variáveis no local onde você as coloca, pode ser no início da função:

Dim xValor As Double [ô]Valor da Soma
Dim xJuros As Double [ô]Valor do Juros em %
Dim xDias As Integer [ô]Armazena a quantidade de Dias
Dim xTemp As Double [ô]Valor Temporário
Dim xCont As Integer [ô]Contador


[ô]Agora acrescente estas linhas de programação no local indicado

 With G
.Rows = I + 1
.TextMatrix(I, 0) = [Ô][Ô] & Rst!Id
.TextMatrix(I, 1) = [Ô][Ô] & Format(Rst!DtVencto, [Ô]dd/mm/yyyy[Ô])
.TextMatrix(I, 2) = [Ô][Ô] & Format(Rst!VlrParc, [Ô]###,##0.00[Ô])
.TextMatrix(I, 3) = [Ô][Ô] & Rst!PrazoPgto
.TextMatrix(I, 4) = [Ô][Ô] & Rst!DiasAtraso

xValor = CDbl(Format(Rst!VlrParc, [Ô]###,##0.00[Ô])) [ô]Valor
xDias = CDbl(Rst!DiasAtraso) [ô]Dias
xJuros = CDbl([Ô]0,05[Ô]) [ô]Formula do Calculo:=> 5/100 = 0,05

For xCont = 1 To xDias
xTemp = (xValor * xJuros) + xValor
xValor = xTemp
Next xCont

.TextMatrix(I, 5) = Format(xValor, [Ô]###,##0.00[Ô])

End With
I = I + 1
Rst.MoveNext
xValor = 0 [ô]Limpando a varíavel
xDias = 0 [ô]Limpando a varíavel
xJuros = 0 [ô]Limpando a varíavel

Loop

Tenta ai e veja se vai funcionar. Qualquer coisa você posta ai de novo, ok??
MOREIRA 10/03/2010 16:26:44
#336569
DANIKULL, Me fala uma coisa, nesse caso tenho uma parcela q esta com 1 dia em atraso, [ coloquei (8%) ao dia em (75,00) daria 6,00 reais = Resultado R$ 81,00

assim como tenho o mesmo valor, com 3 dias de atraso, o mesmo percentual, daria 18,00 no total então 18,00 + 75,00 = 93,00

e calculo como vc mandou ficou 94,48

Diferença de 1,48


DANIKULL 10/03/2010 17:13:00
#336581
MOREIRA, boa tarde.

O calculo que enviei é feito Juros sobre Juros, ou seja:
Dívida R$ 75,00
Juros 8% -> 8/100 = 0,08
3 Dias de Atraso

1º. Dia (75,0000 * 0,08) = 6,0000 + 75,00 => 81,0000
2º. Dia (81,0000 * 0,08) = 6,4800 + 81,00 => 87,4800
3º. Dia (87,4800 * 0,08) = 6,9984 + 87,48 => 94,4784 -> arredondando -> 94,48

Pelo que entendi você vai usar juros Simples então não vai precisa do Laço para montar os Juros, mude para o seguinte

With G
.Rows = I + 1
.TextMatrix(I, 0) = [Ô][Ô] & Rst!Id
.TextMatrix(I, 1) = [Ô][Ô] & Format(Rst!DtVencto, [Ô]dd/mm/yyyy[Ô])
.TextMatrix(I, 2) = [Ô][Ô] & Format(Rst!VlrParc, [Ô]###,##0.00[Ô])
.TextMatrix(I, 3) = [Ô][Ô] & Rst!PrazoPgto
.TextMatrix(I, 4) = [Ô][Ô] & Rst!DiasAtraso

xValor = CDbl(Text1.Text) [ô]Valor
xDias = CDbl(Text2.Text) [ô]Dias
xJuros = CDbl([Ô]0,08[Ô]) [ô]Formula do Calculo:=> 5/100 = 0,05

[ô]For xCont = 1 To xDias
xTemp = (xValor * xJuros)
xValor = (xTemp * xDias) + xValor
[ô]Next xCont

.TextMatrix(I, 5) = Format(xValor, [Ô]###,##0.00[Ô])
End With
I = I + 1
Rst.MoveNext
xValor = 0 [ô]Limpando a varíavel
xDias = 0 [ô]Limpando a varíavel
xJuros = 0 [ô]Limpando a varíavel
Loop


Veja se agora chega no valor que você precisa, ok??
MOREIRA 10/03/2010 22:40:16
#336604
DANIKULL. Fico muito grato por sua colaboração.... até o presente momento esta funcionado como pretendo usar..
Tópico encerrado , respostas não são mais permitidas