Access Básico
Figura 1 – Formulário Inicial com todos os módulos em forma de botões para acesso do usuário.
Como consultor, tenho uma empresa, e é vital controlar despesas e
receitas corretamente. Então, procurei desenvolver um controle
finan-ceiro próprio com o Access (minha principal ferramenta de trabalho)
para adequá-lo totalmente às minhas necessidades.
Desde o início quis ter um painel de controle com um calendário-guia
seme-lhante ao Outlook. Não só para consultar os meses do ano, mas, também,
para poder interagir meus extratos com ele. Para incrementar ainda mais,
adicionei um processo para indicar os feriados fixos e móveis.
Quando isso foi feito, eu usava o Access 2000, mas, agora, já o
con-verti para XP e acredito que em 97 também funcionará, pois muitas
rotinas desse aplicativo foram desenvolvidas em outros projetos
nessa versão.
Além do calendário, o projeto possui uma proposta para a tela de
cadastros de um sistema, um gerador automático para lançamentos
e gráficos para acompanhamentos e previsões de despesas e
recei-tas. Há, ainda, muitos outros recursos interessantes utilizados em
outros projetos, que desenvolvi nesses últimos anos, os quais serão
demonstrados.
Ao executar o arquivo, automaticamente, temos o Menu Principal do
sistema. Composto por 4 módulos, eles podem ser acessados
clicando-se no botão correspondente. Como efeito visual, esclicando-se formulário tem
um controle para minimizar e restaurar o formulário quando uma
das opções do sistema for solicitada e um rótulo com data e hora
atualizado automaticamente.
Controle Financeiro com
Calendário interativo
Paulo Sergio Sarraino *
FINANCEIRO_FA.EXE (Access 2000, XP e 2003) Disponível para download em www.forumaccess.com.br
DISPONÍVEL PARA DOWNLOAD
Artigo para Access 2000, XP e 2003
Pré-requisitos: Conhecimentos de Access e VBA
CADASTROS
Há 4 tipos de cadastros no sistema:
•
Contas
: as contas bancárias que se deseja controlar;
Deve-se informar a identificação da conta, tipo (corrente, poupança
ou previdência), nome do banco, nome da conta, data inicial de
controle e saldo inicial.
•
Receitas
: um plano de contas de recebimentos ou entradas que
as contas terão;
Deve-se informar código (seguindo o padrão) e descrição.
•
Despesas
: um plano de contas de pagamentos ou saídas que
as contas terão;
Deve-se informar código (seguindo o padrão) e descrição.
•
Feriados
: uma tabela para os feriados fixos e outras datas que
achar necessário indicar;
Deve-se informar a data (dd/mm) e o motivo pelo feriado.
Um grupo de opção funciona como menu lateral para acessar os
cadastros do sistema de acordo com o botão clicado, trocando a
origem de dados do subformulário ao lado (veja a sub
grpCadas-tros_AfterUpdate()).
Private Sub grpCadastros_AfterUpdate() Dim subf As String
‘opções de cadastro... Select Case Me.grpCadastros Case 1: subf = “frm_Contas_sub” Case 2: subf = “frm_Receitas_sub” Case 3: subf = “frm_Despesas_sub” Case 4: subf = “frm_Feriados_sub” End Select
‘...atribuo o cadastro solicitado ao subformulário e o total de registros ao contador no rodapé da tela
With Me.subfCadastros .SourceObject = subf
Me.txtcont = .Form.RecordsetClone.RecordCount & “ registros” End With
End Sub
No rodapé da tela, há um botão de inclusão e de exclusão que, por
ter rotinas genéricas, funciona para o cadastro que estiver ativo
no momento. Há ainda um rótulo com a quantidade de registros do
cadastro e o botão de saída.
contí-classificados pelo clique em suas opções – (veja as funções ClassForm
e ClassSubForm no módulo bas_Geral). Para a classificação, cada
campo da listagem deve receber na sua propriedade “Tag” o número
correspondente ao botão do grupo de opção acima. Assim, ao clicar no
3º botão da listagem, a rotina classificará o registro de acordo com o
conteúdo do 3º campo exibido de forma ascendente. Um segundo clique
no mesmo botão classificará os registros em ordem decrescente.
Function ClassForm(strObj As Form, valctl As OptionGroup, snt As Integer) ‘classifica um formulário tipo tabela de dados conforme o valor de um grupo de opção escolhido (geralmente no cabeçalho)
‘neste formulário cada campo deve ter sua propriedade Marca (Tag) sincronizado com os valores de opção do grupo ‘snt (sentido de classificação) deve ter o valor 0 (ascend.) ou 1 (descend.)
On Error GoTo ClassForm_Err Dim ctrCrit As Control
For Each ctrCrit In strObj.Controls If Val(ctrCrit.Tag) = valctl Then If snt = 0 Then
strObj.OrderBy = “[“ & ctrCrit.ControlSource & “]” Else
strObj.OrderBy = “[“ & ctrCrit.ControlSource & “]” & “ DESC” End If
Exit Function End If Next
MsgBox “Índice de classificação não encontrado!!”, vbExclamation, “Atenção!”
ClassForm_Err:
If Err = “3117” Or Err = “2465” Then
MsgBox “Essa classificação não é possível!” & vbCrLf & “Campo tipo Memorando”, vbCritical, “Atenção!”
strObj.OrderBy = “” strObj.OrderByOn = True Else
MsgBox “Erro desconhecido: “ & vbCrLf & Err & “ - “ & Err.Description End If
Exit Function End Function
Figura 2 – Cadastro de Contas, inclusão e exclusão dos registros
e o gerenciamento dos dados.
Temos o Calendário Interativo exibindo um trimestre do ano (detalhado
adiante), uma combobox para indicar a conta que estamos analisando
e algumas funções no rodapé da tela:
•
Re-Indexa Lançamentos
: faz a reclassificação dos registros do
extrato (como a data do lançamento pode repetir, há um número
auxiliar na tabela para facilitar a ordenação dos registros) – (veja
a sub cmdIndex_Click());
•
Transferência entre Contas
: permite acessar uma tela para
registrar transferências de valores entre as contas bancárias
cadastradas;
•
Baixa
: realiza a “baixa” do pagamento ou recebimento em
foco marcando seu status “OK?” como True e gerando o registro
no extrato da conta correspondente – (veja a sub cmdBaixa_
Click());
•
Gerador de Lançamentos
: permite acessar uma tela que
gerencia a criação de pagamentos ou recebimentos múltiplos. Muito
útil para planejar os próximos meses com despesas (como água,
luz, telefone, impostos, etc.) e receitas (depósitos programados e
contratos de serviços com clientes);
•
Status
: filtra os registros com os status disponíveis (Pagar/
Pagos/Todos para os dados de Pagamentos e Receber/Recebidos/
Todos para os dados de Recebimentos) – (veja a sub
lstOK_Afte-rUpdate()).
Temos também um controle guia que permite acessar os 3 grupos
de registros:
•
Lançamentos
: o extrato das contas bancárias;
Com a conta selecionada no alto da tela, o subformulário traz os
dados a partir da data inicial definida (veja a sub
txtDtInicial_Afte-rUpdate()). Essa data inicial (último dia do mês anterior) ajuda a
calcular o saldo anterior como referência na tela.
Os registros são informados com a data do lançamento, histórico,
complemento (se necessário) e valor que, através da formatação
condicional, exibe em vermelho ou azul conforme a origem do
histórico informado (despesa ou investimento). Pode-se navegar
pelos registros como uma planilha Excel graças à função DoKeys no
módulo bas_Geral.
O saldo é calculado, automaticamente, linha a linha, utilizando a
função DSum() com a data do lançamento e um numerador
seqüen-cial atribuído automaticamente.
No rodapé do subformulário, temos os totalizadores de Receitas e
Despesas do período listado e o Saldo Atual da conta (figura 3).
•
Pagamentos
: “Contas a Pagar” e as já pagas;
Com a conta selecionada no alto da tela, o subformulário traz todos
os registros gerados na tela de Pagamentos.
Os registros são informados com a data prevista de pagamento,
histórico, complemento (se necessário) e valor previsto. O campo
“OK?” indica se o pagamento está “baixado” ou não. Pode-se
navegar pelos registros como uma planilha Excel graças à função
DoKeys no módulo bas_Geral.
Access Básico
Figura 3 – Painel de Controle, toda movimentação explícita nas abas de Lançamentos, Pagamentos e Recebimentos
Na abertura da tela, assumimos que apenas os registros não-pagos
nos interessam e, por isso, temos uma filtragem inicial que segue
o campo Status no rodapé da tela. Alterando o Status desejado,
os registros são filtrados automaticamente e as datas listadas são
marcadas em negrito no calendário.
•
Recebimentos
: “Contas a Receber” e as já recebidas.
Com a conta selecionada no alto da tela, o subformulário traz todos
os registros gerados na tela de Recebimentos.
Os registros são informados com a data prevista de recebimento,
histórico, complemento (se necessário) e valor previsto. O campo
“OK?” indica se o recebimento está “baixado” ou não.
Pode-se navegar pelos registros como uma planilha Excel graças
à função DoKeys no módulo bas_Geral.
Na abertura da tela, assumimos que apenas os registros
não-recebidos nos interessam e, por isso, temos uma filtragem inicial
que segue o campo Status no rodapé da tela. Alterando o Status
desejado, os registros são filtrados automaticamente e as datas
listadas são marcadas em negrito no calendário (figura 5).
TRANSFERÊNCIA ENTRE CONTAS
Como dito anteriormente, temos uma tela que facilita a geração de
registros de transferência (veja abaixo). Nela informamos as contas
de origem e de destino, a data do lançamento e o valor. O sistema
gerará automaticamente o lançamento de débito e crédito nas contas
envolvidas (figura 6).
Figura 4 – Painel de Controle exibe todos os pagamentos de acordo com o filtro de “Status”.
Figura 5 – Painel de Controle exibe todos os recebimentos de acordo com o filtro de “Status”.
Private Sub cmdTransferir_Click() ‘valida parâmetros da transferência
If IsNull(Me.cmbConta_org) Or IsNull(Me.cmbConta_dst) Or _ IsNull(Me.txtDtTransf) Or IsNull(Me.txtValor) Or Me.txtValor = 0 Then MsgBox “Alguma das informações necessárias não foram informadas!” & vbCrLf & “Favor verifique.”, vbCritical, “Atenção!”
Exit Sub End If
If Me.cmbConta_org = Me.cmbConta_dst Then
MsgBox “Informe contas diferentes para a transferência.”, vbInformation, “Atenção!”
Exit Sub End If
If MsgBox(“Deseja efetuar a transferência?”, vbQuestion + vbYesNo, “Atenção!”) = vbNo Then Exit Sub
Dim rst As Recordset
‘cria os registros de transferência...
Set rst = CurrentDb.OpenRecordset(“tbl_Lançamentos”, dbOpenDynaset)
With rst
.AddNew ‘...cadastra o débito
!ID_Lancto = Nz(DMax(“ID_Lancto”, “tbl_Lançamentos”), 0) + 1 !Dt_Lancto = Me.txtDtTransf
!ID_Conta = Me.cmbConta_org
Figura 6 – O aplicativo tem funcionalidade de transfêrencia de valores entre contas específicadas pelo usuário.
!Tipo_Lancto = “D” .Update
.AddNew ‘...cadastra o crédito
!ID_Lancto = Nz(DMax(“ID_Lancto”, “tbl_Lançamentos”), 0) + 1 !Dt_Lancto = Me.txtDtTransf !ID_Conta = Me.cmbConta_dst !Histórico = “R99” !Complemento = Me.cmbConta_org.Column(1) !Vl_Lancto = Me.txtValor !Tipo_Lancto = “R” .Update .Close End With ‘atualiza controles If EstáCarregado(“frm_Lançamentos”) Then With Forms!frm_Lançamentos !frm_Lançamentos_sub.Requery .txtDtInicial_AfterUpdate End With End If ‘atualiza controles If EstáCarregado(“frm_PainelControle”) Then With Forms!frm_PainelControle !frm_Lanctos_sub.Requery .txtDtInicial_AfterUpdate End With End If
MsgBox “Transferência concluída.”, vbInformation, “Atenção!” Me.cmdFechar.SetFocus
End Sub
GERADOR DE LANÇAMENTOS
Com uma conta selecionada na tela do Painel de Controle, pode-se
chamar o Gerador de Lançamentos para facilitar o trabalho de
cadas-tramento de múltiplas ocorrências de um pagamento ou recebimento.
Informamos a data inicial, a quantidade de parcelas a gerar, o
his-tórico, complemento (se necessário), um indicativo para os registros
(por mês/ano - mm/aaaa - ou por quantidade - 01/nn) e o valor (veja
a sub cmdGerLancto_Click()).
Dim rst As Recordset Dim i As Integer, dt_aux As Date
‘valida parâmetros informados For Each ctl In Me.Controls If ctl.Tag = “x” Then If IsNull(ctl) Then
MsgBox “Algum parâmetro não foi informado!” & vbCrLf & “Verifique.”, vbExclamation, “Atenção!” Me.txtDtInicial.SetFocus Exit Sub End If End If Next dt_aux = Me.txtDtInicial ‘gera lançamentos...
If Me.txtHistórico.Column(2) = “R” Then ‘Receita
Set rst = CurrentDb.OpenRecordset(“tbl_CtaReceber”, dbOpenDynaset) With rst For i = 1 To Me.txtQtdParc .AddNew !Dt_Recto = dt_aux !Histórico = Me.txtHistórico
If Me.grpComplemento = 1 Then ‘mm/aaaa
!Complemento = Trim(Me.txtComplemento & “ “ & Format(dt_aux, “mm/yyyy”))
Else ‘01/nn
!Complemento = Trim(Me.txtComplemento & “ “ & Format(i, “00”) & “/” & Format(Me.txtQtdParc, “00”)) End If !Vl_Recto = Me.txtValor !ID_Conta = Me.txtCodConta !flagRecto = False .Update
dt_aux = DateAdd(“m”, 1, dt_aux) Next .Close End With Forms!frm_PainelControle!frm_Rectos_sub.Form.Requery Else ‘Despesa
Set rst = CurrentDb.OpenRecordset(“tbl_CtaPagar”, dbOpenDynaset) With rst For i = 1 To Me.txtQtdParc .AddNew !Dt_Pagto = dt_aux !Histórico = Me.txtHistórico
If Me.grpComplemento = 1 Then ‘mm/aaaa
!Complemento = Trim(Me.txtComplemento & “ “ & Format(dt_aux, “mm/yyyy”))
Else ‘01/nn
!Complemento = Trim(Me.txtComplemento & “ “ & Format(i, “00”) & “/” & Format(Me.txtQtdParc, “00”))
End If
!Vl_Pagto = Me.txtValor !ID_Conta = Me.txtCodConta Figura 7 – Para gerar múltiplos lançamentos o sistema implementa mais esta
Access Básico
!flagPagto = False .Update
dt_aux = DateAdd(“m”, 1, dt_aux) Next .Close End With Forms!frm_PainelControle!frm_Pagtos_sub.Form.Requery End If
MsgBox “Lançamentos gerados.”, vbInformation, “Atenção!” Me.cmdFechar.SetFocus
End Sub
CONSULTAS
Podemos consultar todos os lançamentos de Despesas e Receitas
baixadas no sistema. Uma caixa de listagem com todos os tipos criados
no sistema permite acessar os registros de cada item e
disponibiliza-os em 2 visões:
Dados
: os registros são listados pela data de lançamento, conta,
complemento e valor. Pode-se navegar pelos registros como uma
planilha Excel graças à função DoKeys no módulo bas_Geral.
Gráfico
: os valores dos registros são agrupados por mês/ano e
exibidos num gráfico evolutivo.
EVOLUÇÕES
Com a tela de Evoluções temos uma visão mais ampla da evolução
dos nossos registros.
Os dados de Despesas, Receitas e os Lançamentos efetuados são
exi-bidos em gráficos evolutivos e podem ser parametrizados para limitar
os dados que desejamos consultar (veja a sub grpClass_Click()).
Figura 8 – O histórico mostra lançamentos e despesas, e suas respectivas informações como (Data, Conta, Complemento e Valor).
Figura 9 – Exibição dos gráficos por receita ou despesa selecionada.
Private Sub grpClass_Click() Dim dt_aux As Date Dim strQuery As String
‘atribui consultas relacionadas aos tipos de valores (real e previsto) strQuery = IIf(Me.grpRP = 1, “qry_TotalLançamentos “, “qry_ PrevLançamentos “)
Me.cboAno.RowSource = “SELECT Year(Periodo) AS Expr1 “ & _ “FROM “ & strQuery & _
“GROUP BY Year(Periodo) “ & _ “ORDER BY Year(Periodo) DESC;”
‘tipos de períodos disponíveis para os gráficos... Select Case Me.grpClass
Case 1 ‘Total
Me.cboAno.Visible = False
Me.grfEvolRD.RowSource = “SELECT Format(Periodo,’mm/yyyy’) AS Expr1, Sum(Total_Rct) AS SomaDeTotal_Rct, Sum(Total_Dsp) AS SomaDeTotal_ Dsp “ & _
“FROM “ & strQuery & _
“GROUP BY Format(Periodo,’mm/yyyy’) “ & _ “ORDER BY First(Periodo);”
Me.grfEvolSaldo.RowSource = “SELECT Periodo, SaldoFinal “ & _ “FROM qry_EvolSaldo;”
Case 2 ‘Por Ano Me.cboAno.Visible = True Me.cboAno.SetFocus
Me.grfEvolRD.RowSource = “SELECT Format(Periodo,’mm/yyyy’) AS Expr1, Sum(Total_Rct) AS SomaDeTotal_Rct, Sum(Total_Dsp) AS SomaDeTotal_ Dsp “ & _
“FROM “ & strQuery & _
“WHERE Year(Periodo) = “ & Me.cboAno & “ “ & _ “GROUP BY Format(Periodo,’mm/yyyy’) “ & _ “ORDER BY First(Periodo);”
Me.grfEvolSaldo.RowSource = “SELECT Periodo, SaldoFinal “ & _ “FROM qry_EvolSaldo “ & _
“WHERE Year(Periodo) = “ & Me.cboAno & “;”
Case 3 ‘Últimos 12 meses Me.cboAno.Visible = False dt_aux = DateAdd(“yyyy”, -1, Date)
dt_aux = Format(DateAdd(“m”, -1, dt_aux), “mm/dd/yyyy”) Me.grfEvolRD.RowSource = “SELECT Format(Periodo,’mm/yyyy’) AS Expr1, Sum(Total_Rct) AS SomaDeTotal_Rct, Sum(Total_Dsp) AS SomaDeTotal_ Dsp “ & _
“FROM “ & strQuery & _
“WHERE Periodo >= #” & dt_aux & “# “ & _ “GROUP BY Format(Periodo,’mm/yyyy’) “ & _ “ORDER BY First(Periodo);”
Me.grfEvolSaldo.RowSource = “SELECT Periodo, SaldoFinal “ & _ “FROM qry_EvolSaldo “ & _
“WHERE Periodo >= #” & dt_aux & “#;” End Select
End Sub
desejado) ou os Últimos 12 Meses.
•
Real/Previsão
: com base no controle de Baixa do sistema, os
dados são separados em lançamentos já efetivados e previstos.
Há 2 visões disponíveis:
•
Receitas x Despesas
: com esse gráfico podemos analisar como
está o andamento dos nossos pagamentos (vermelho) contra
as receitas (verde) conferindo os dados dispostos em 2 linhas
evolutivas.
•
Saldo
: além dos parâmetros já informados, temos ainda uma
combo para informar a conta desejada e assim consultar a
evolu-ção do saldo pelo período informado. Não será possível escolher
a opção Previsão para o Saldo.
CALENDÁRIO INTERATIVO
Figura 10 – Comparação entre receitas(verde) e despesas(vermelho) em modo gráfico.
Figura 11 – O evolução do saldo é exibido através do período em que o usuário deseja consultar.
Esse calendário tem várias funções no sistema. Além da exibição
do mês desejado, ele foi construído para indicar os feriados fixos e
móveis, indicar as ocorrências de pagamentos e recebimentos das
contas bancárias cadastradas e servir como acesso rápido ao período
do extrato de uma conta.
E ainda temos, abaixo dele, 3 botões que permitem navegar pelos
meses anteriores e posteriores ou ir diretamente para o dia atual de
processamento (veja as subs cmdMes_ant_Click(), cmdMes_seg_
Construído totalmente com objetos do
Access poderemos notar que existe
apenas 1 formulário criado para
exibição do mês (frm_Mes). Como
o Painel de Controle precisa exibir 3
meses consecutivos, o frm_Mes foi
inserido 3 vezes como subformulário
e, baseado no nome distinto de cada
objeto, controla a exibição do mês
necessário em cada um deles.
A partir daí, será chamada a rotina
que gera os dias do mês (nome do
subform.Form.GeraMes), pesquisa os
feriados fixos e calcula os móveis.
As indicações em negrito das
ocor-rências de pagamentos e
recebimen-tos e atribuída pela caixa de listagem
de Status das ocorrências.
O formulário frm_Mês é a base para a geração do calendário. Possui
42 labels que representam as posições possíveis para os dias do mês
(d01, ..., d42), 7 labels com os dias da semana (lblDom, ...lblSab) e mais
2 que abrigam o nome do mês (lblMes) e o ano (lblAno) e uma textbox
que contem a data-parâmetro para formar o calendário (txtdata - esse
controle é invisível). Todos dispostos como uma “folhinha” de mês. O
resto é com as rotinas internas de controle e formatação.
O formulário frm_Mes
possui 3 rotinas:
Sub GeraMes
: com base
na data recebida pelo
for-mulário Painel de Controle,
constrói o mês desejado
e pesquisa os feriados
cadastrados. Para os
feria-dos móveis temos uma
função (veja a
CalcFeria-dosMoveis()) que realiza
o cálculo para o ano que estamos vendo e elabora uma matriz com
as datas válidas. Para essa função, pesquisei inúmeros sites na
Internet e o próprio GD do Fórum, e descobri que ela é totalmente
válida para todos os anos a partir de 1583 (antes disso o calendário
era juliano);
Function PesquisaFeriado (dt As Date) As String
: uma pesquisa
na tabela de feriados fixos e na matriz de feriados móveis do ano
informado retorna as comemorações do dia se a data passada pelo
parâmetro é encontrada;
Function SelecionaDia
: acesso rápido ao extrato de uma conta a
partir de uma data selecionada. A função é atribuída ao evento OnClick
dos dias do mês.
Access Básico
Public Sub GeraMes()
Dim i As Integer, j As Integer, dt_aux As Date Dim F As String
j = 1
Me.cboMes = Choose(Month(Me.txtdata), “Janeiro”, “Fevereiro”, “Março”, “Abril”, “Maio”, “Junho”, “Julho”, “Agosto”, “Setembro”, “Outubro”, “Novembro”, “Dezembro”)
Me.cboAno = Year(Me.txtdata)
dt_aux = CDate(“01/” & Month(Me.txtdata) & “/” & Year(Me.txtdata))
‘limpa formatações e definições atuais For i = 1 To 42
With Me(“d” & Format(i, “00”)) .Caption = “” .BorderStyle = 0 .BackStyle = 0 .ForeColor = 10040115 .ControlTipText = “” End With Next
‘calcula e carrega os feriados móveis do ano solicitado CalcFeriadosMoveis Year(Me.txtdata)
‘gera o calendário do mês solicitado ‘inicia no dia da semana da data inicial For i = WeekDay(dt_aux) To 42
‘se a data estiver dentro do mês solicitado If j <= Day(DateAdd(“m”, 1, dt_aux) - 1) Then ‘atribui e formata o dia ao controle... With Me(“d” & Format(i, “00”)) ‘...o dia no caption .Caption = j
‘...a função SelecionaDia no OnClick
.OnClick = “=SelecionaDia(‘d” & Format(i, “00”) & “’)” ‘...formata em vermelho se for domingo
If .Tag = “dom” Then .ForeColor = 255 ‘...formata com cor e borda se for o dia atual
If (j = Day(Date)) And (Month(Me.txtdata) = Month(Date)) And (Year(Me.txtdata) = Year(Date)) Then .BorderStyle = 1: .BackStyle = 1 ‘...pesquisa feriados para o dia
F = PesquisaFeriado(CDate(j & “/” & Month(Me.txtdata) & “/” & Year(Me.txtdata)))
‘...atribui feriados ao ControlTipText do dia e formata em vermelho If F <> “” Then .ControlTipText = F: .ForeColor = 255 End With j = j + 1 End If Next End Sub
Function PesquisaFeriado(dt As Date) As String ‘pesquisa feriados fixos e atribui os móveis Dim rst As Recordset
Dim fer As String Dim i As Integer
‘feriados fixos...
Set rst = CurrentDb.OpenRecordset(“Select Comemoração “ & _
“From tbl_Feriados “ & _
“Where Day(Feriado) = “ & Day(dt) & “ And Month(Feriado) = “ & Month(dt) & “;”, dbOpenSnapshot)
With rst
Do While Not .EOF
fer = fer & !Comemoração & vbCrLf .MoveNext Loop .Close End With Set rst = Nothing ‘feriados móveis... For i = 1 To UBound(mat)
If dt = mat(i, 2) Then fer = fer & mat(i, 1) & vbCrLf Next
PesquisaFeriado = fer
End Function
Public Function SelecionaDia(ctr As String) ‘seleciona o dia informado em ctr Dim i As Integer
‘formata controles para exibir o dia selecionado em destaque If Me(ctr).Caption <> “” Then
For i = 1 To 42 With Me.Parent.Form
.sub_Mes_ant.Form(“d” & Format(i, “00”)).BackStyle = 0 .sub_Mes_atu.Form(“d” & Format(i, “00”)).BackStyle = 0 .sub_Mes_seg.Form(“d” & Format(i, “00”)).BackStyle = 0 End With
Next
Me(ctr).BackStyle = 1
‘passa o dia selecionado para o formulário-pai atualizar o início do extrato Me.Parent.Form.txtDtInicial = CDate(Me(ctr).Caption & “/” & Month(Me. txtdata) & “/” & Year(Me.txtdata))
Me.Parent.txtDtInicial_AfterUpdate End If
End Function
CONCLUSÃO
Bem, com isso, termino a demonstração do meu Controle Financeiro.
Há diversas idéias no momento - tais como integrar cálculo de impostos
e despesas com empresas de contabilidade, ampliar as possibilidades
dos gráficos e permitir gerar lançamentos com fórmulas complexas -,
mas isso fica para o futuro.
Espero que tenham gostado da matéria e que ela lhes possibilite gerar
melhorias em seus aplicativos. Fiquem à vontade para mandar idéias,
sugestões e críticas. Abraços.
* Paulo Sergio Sarraino (sarraino@sti.com.br) é sócio-majoritário da PSS
Consultoria em Informática Ltda. Possui graduação em Tecnologia em Processamento de Dados pela FASP (1997) e pós-graduação em Análise de Sistemas c/ ênfase em Gerência de Projetos pela FIAP (2000). Atua como consultor em Análise e Desenvolvimento de Sistemas em ambiente Office e Internet (especialista em Access, VBA e ASP) há 10 anos.