Visual Basic 6 - Controle de mensalidades

Em tempos de VB.NET , ASP.NET , Java , pode parecer um tanto ultrapassado falar sobre DAO - Data Access Object - (lembra dela ?).

Pois eu não me importo com isto , pois sei que nada deve ser descartado , um dia , quando você menos espera , pode precisar !!!.

Este artigo é para os que estão iniciando e tem dúvidas em como usar o Data Control e o DBGrid. Então se você esta achando este artigo muito chato ou muito simples , lembre-se que o caminho por qual você já passou outros ainda estão passando.

Neste artigo eu vou mostrar como você pode criar uma aplicação simples , muiito simples , onde vamos gerar mensalidades para um pagamento determinado. Por exemplo , você tem um escola ou academia e quer cadastrar o seu cliente e efetuar o cálculo e geração das mensalidades que para o cliente ; depois é só ir dando baixa acusando o recebimento.(Eu não implementei uma rotina especifica para isto ; logo você vai ter que fazer isto diretamente no Grid)

A interface é simples e eu vou estar usando os controles : Data Control , DBGrid e o acesso a um banco de dados Acces com DAO.

A estrutura de cada tabela é a seguinte :(você pode ajustar o projeto com mais informações)

<-Tabela Clientes <-tabela Parcelas

Vamos usar dois formulários no projeto : o formulário de cadastro para os clientes e o formulário que gera as mensalidades para cada cliente. Abaixo o layout de cada um :

 
O formulário que gera e controla as mensalidades   O formulário de cadastro de clientes

Funciona assim: O formulário de controle de mensalidades é carregado ; para cadastrar um cliente basta clicar no botão com o sinal de (+) . A seguir para gerar as mensalidades para aquele cliente informe o valor do pagamento e o número de parcelas; clique no botão -Gerar Mensalidades e , pronto ! ; você verá as mensalidades geradas no Grid. O projeto exibe as mensalidades para cada cliente , basta navegar pelos registro da tabela clientes. O código do projeto comentado segue abaixo:

Nota : Você deve vincular o controle DBGrid ao Data Control - Data2 , definindo a propriedade DataSource do DBGrid igual a Data2 na janela de propriedades do DBGrid.

1- código da seção - General Declarations do formulário ; define as variáveis de acesso aos dados.

Dim db As Database
Dim clientes As Recordset
Dim parcelas As Recordset

2- Código do evento Click do botão (+) que permite : incluir , excluir novos clientes na base de dados :

Private Sub cmdcadastrar_Click()
If MsgBox("Deseja incluir um novo Cliente ? ", vbYesNo, "Buscar Cliente") = vbYes Then
frmcadclientes.Show vbModal
Else
Exit Sub
End If
End Sub

3- Código do evento Load do formulário - frmmensalidades - define o caminho do banco de dados - Vendas.mdb - e as tabelas : clientes e parcleas. Oculta as colunas 0 , 1 do DBGrid. (estas colunas são respectivamente : CodigoParcelas e Codigo.). Há também um tratamento de erros bem básico para o caso das tabelas estarem sendo usadas por outro usuário.

Private Sub Form_Load()

On Error GoTo trata_erro

Set db = OpenDatabase(App.Path & "\vendas.mdb")
Set clientes = db.OpenRecordset("clientes")
Set parcelas = db.OpenRecordset("parcelas")

Data1.DatabaseName = App.Path & "\vendas.mdb"
Data1.RecordSource = "clientes"
Data2.DatabaseName = App.Path & "\vendas.mdb"
Data2.RecordSource = "parcelas"

DBGrid1.Columns(0).Visible = False
DBGrid1.Columns(1).Visible = False
DBGrid1.Columns(4).Visible = True

Exit Sub

trata_erro:
   If Err.Number = 3261 Then
       MsgBox " Erro : " & Err.Number & " : a tabela esta bloqueada . Verifique ! ", vbCritical, "Dados bloqueados"
   Else
       MsgBox Err.Number & " - " & Err.Description
   End If
End Sub

End Sub

4- O código do evento Click do botão - Gera Mensalidades - :

Private Sub cmdgeramensalidades_Click()
Dim mes As Integer
Dim ano As Integer
Dim data As String

mes = Format(Now, "mm")
ano = Format(Now, "yy")

For i = 1 To Val(txtnumeroparcelas.Text)
    mes = mes + 1
    If mes > 12 Then
       mes = 1
       ano = ano + 1
   End If
  dia1 = Format(Now, "dd")
  dia = Verifica_dia(dia1, mes)
  data = dia & "/" & Format(mes, "00") & "/" & Format(ano, "00")
  parcela = CCur(txtvalor.Text) / Val(txtnumeroparcelas.Text)
  Data2.Recordset.AddNew
  Data2.Recordset.Fields(1) = CLng(txtcodigo.Text)
  Data2.Recordset.Fields(2) = Format(CDate(data), "dd/mm/yy")
  Data2.Recordset.Fields(3) = CCur(parcela)
  Data2.Recordset.Fields(4) = False
  Data2.Recordset.Update
Next
End Sub
- Eu obtenho o mes e ano atual e a seguir inicio um laço for/next para o número de parcelas

- acrescento um ao mês e verifico se o mês é igual a 12 se for então passo p/ o ano seguinte

- a função verifica_dia ajusta o valor correto do dia quando o mesmo for igual a 31.

- a data é formatada e a parcela calculada (eu não me preocupei com arredondamentos).

- depois é só incluir os dados no recordset

- eles serão vistos no grid de imediato

5- O código abaixo é muito importante , ele é posto no evento Reposition do Data Control - Data1 - que esta associado a tabela clientes. Toda vez que mudarmos de registro na tabela clientes , estamos mudando a fonte de dados associada ao Data Control - Data2 - usando a variável txtcodigo . Como o Data2 esta associado ao DBGrid1 , o Grid exibirá os dados desta seleção.

Private Sub Data1_Reposition()
If txtcodigo.Text <> "" Then
Data2.RecordSource = "Select * from parcelas where codigo= " & CLng(txtcodigo.Text)
Data2.Refresh
End If
End Sub

6- Abaixo temos a rotina associada ao evento KeyPress do formulário que permite a simulação da tecla TAB quando usuário teclar ENTER . Basta incluí-la no formulário e definir a propriedade KeyPreview do mesmo como sendo igual a True ; fazendo assim funciona para todos os controles TextBox do formulário.

Private Sub Form_KeyPress(KeyAscii As Integer)

  'Esse código permite a mudança de quadro de texto através do Enter
  If KeyAscii = 13 Then
     'Se o tipo do controle ativo for TextBox
     If TypeOf Screen.ActiveControl Is TextBox Then
       'Simula o pressionamento da tecla TAB
        SendKeys "{tab}"
       'A linha a seguir evita ouvir um bip
       KeyAscii = 0
    End If
End If
End Sub

7- Finalmente a função - Verifica_dia . Ela verifica o dia do mês para cada mês , se o dia for igual a 31 , ela atribui o valor correto para os meses seguintes das mensalidades .(O mês de fevereiro talvez requere-se um tratamento mais sofisticado para o caso de ano bissexto ).Lembre-se que as funções sempre retornam um valor. No caso eu estou retornando o dia do mês já ajustado.

Nota: No VB 6 o primeiro índice de um array é igual a zero , assim : diasDoMes(0) é igual a 31 , etc.. É por isto que eu subtraio 1 do mês atual.

Public Function Verifica_dia(dia, mes)
Dim diasDoMes As Variant

dia = Val(dia)

diasDoMes = Array(31, 28, 30, 30, 31, 30, 31, 30, 30, 31, 30, 31)

If dia = 31 Then
Verifica_dia =
diasDoMes(mes - 1)
Else
Verifica_dia = dia
End If

End Function

Executando o projeto terermos as seguintes telas para a geração de mensalidades para um cliente já cadastrado:

Como você pode ver , usando uma interface simples e alguns controles vinculados básicos podemos fazer em minutos um sisteminha para resolver nosso problema...

O sistema esta completo no Super DVD Visual Basic.

No Super DVD Visual Basic você encontra recursos de aprendizado para a linguagem Visual Basic e mais de 100 programas com o código fonte aberto para estudo. Confira !

Até mais...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti