Há tempos não publico uma nova dica... então dando continuidade, vai um código para atualizar valores pelo IGP-M (índice geral de preços - mercado).
Antes de mais nada, vale levar em consideração alguns aspectos importantes desta atualização (o cálculo em si é simples):
- Embora o IGP-M seja publicado sempre no final do mês, eu coloquei na minha tabela o primeiro dia apenas para facilitar o SELECT. Poderia criar uma função para entrar sempre com o último dia do mês que é o mais usual nestes casos, foi só uma opção mesmo;
- No site da FVG - http://fgv.br é difícil encontrar as tabelas de índices, geralmente estão em arquivos PDF. No site do Debit é mais fácil e tem uma URL fixa: https://www.debit.com.br/consulta30.php?&indice=igpm;
- Cuidado com as variações negativas: contratos de aluguel por exemplo, costumam ter cláusulas do tipo "correção pela variação positiva do IGP-M" o que equivale a dizer que, caso o índice seja negativo, não haverá redução do valor atualizado, o que pelo cálculo ocorre. Nos meses onde a variação é negativa, o valor "atualizado" é simplesmente mantido. Muito cuidado nesta questão;
- Para conferir os cálculos utilize a calculadora do cidadão no site do Banco Central: https://www3.bcb.gov.br/CALCIDADAO/publico/exibirFormCorrecaoValores.do?method=exibirFormCorrecaoValores
- Como sempre, não esqueçam de marcar a referência Microsoft Activex Data Objects (a versão mais recente que tiver, eu utilizo a 2.8)
Bem, abaixo segue o código e uma imagem da minha tabela para melhor entendimento.
;-)
Option Compare Database Option Explicit Dim rst As ADODB.Recordset Dim ssql As String Dim acumulador As Double Dim i As Integer Public Function Atualiza_IGPM(MesInicio As Integer, _ AnoInicio As Integer, _ MesFim As Integer, _ AnoFim As Integer, _ valor As Double) As Double ssql = "SELECT * FROM tabela1 WHERE " ssql = ssql & "DataIndice >= #" & MesInicio & "/1/" & AnoInicio & "#" ssql = ssql & "ORDER BY DataIndice" Set rst = New ADODB.Recordset rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.MoveFirst 'Primeiro índice acumulador = 0 acumulador = (rst!indice / 100) + 1 rst.MoveNext Do While Not rst.EOF 'Acumular taxas acumulador = acumulador * ((rst!indice / 100) + 1) If rst!mes = MesFim And rst!ano = AnoFim Then Exit Do Else rst.MoveNext End If Loop Atualiza_IGPM = Round(valor * ((acumulador - 1) * 100), 5) rst.Close Set rst = Nothing End Function
Nenhum comentário:
Postar um comentário