CALCULAR JUROS NA SQL
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
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
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
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
desculpa, esqueci de mencionar o db é MYSQL
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??
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??
Juros Compostos (Juros Sobre Juros)
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.
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.
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:
e acrescente as seguintes linhas:
[ô]Primeiro acrescente as variáveis no local onde você as coloca, pode ser no inÃcio da função:
[ô]Agora acrescente estas linhas de programação no local indicado
Tenta ai e veja se vai funcionar. Qualquer coisa você posta ai de novo, ok??
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??
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
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
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
Veja se agora chega no valor que você precisa, ok??
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??
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