Visual Basic 6 -  Acessando e filtrando dados com DAO (para novatos)


  No artigo de  hoje eu vou recordar como podemos acessar uma base de dados MS Access , navegar pelos registros e filtrar dados usando a tecnologia DAO.

A ADO - Data Access Objects (DAOs) e a Open Database Connectivity (ODBC) são APIs que lhe dão a capacidade de escrever aplicações que são independentes de qualquer sistema de gerenciamento de banco de dados específico (DBMS).

A DAO é familiar para os programadores que acessam banco de dados usando o Microsoft Access ou Microsoft Visual Basic e usa o mecanismo de banco de dados Microsoft Jet para fornecer um conjunto de objetos de acesso a dados. Os principais objetos usados são :

- database
- tabledef
- querydef
- recordset

O objeto Recordset representa um conjunto de registros de uma tabela ou o conjunto de registros resultante de uma consulta SQL e contém a coleção Fields que contém o objeto Field que representa uma coluna de dados de um Recordset.

A DAO funciona melhor com arquivos MDB como os criados pelo Microsoft Access, mas você também pode acessar fontes de dados ODBC através de DAO e o motor de banco de dados Microsoft Jet.

Este artigo é para quem esta iniciando ou precisa usar o Visual Basic 6 para acessar um banco de dados usando DAO. Ele é bem simples e mostra como usar os objetos DataBase e Recordset para acessar, navegar e filtrar dados em uma aplicação Visual Basic.

Recursos usados:

Definindo o banco de dados

A primeira coisa a fazer é definir o banco de dados e a tabela que vamos acessar.

Neste exemplo eu vou acessar uma tabela Funcionarios do banco de dados Cadastro.mdb. Esse banco de dados foi criado no MS Access e será fornecido no projeto.  

Abaixo vemos a estrutura da tabela Funcionarios:

Note que a tabela é bem simples mas você pode acessar qualquer outra tabela com mais campos definidos.

Criando o projeto no Visual Basic 6

Abra o Microsoft Visual Basic 6, selecione o projeto do tipo STANDARD EXE e clique no botão Abrir:

Salve o projeto como Funcionarios e o formulário padrão como Main_Form.

No menu Project clique em References e inclua as referências como indica a figura a seguir:

Clique novamente no menu Project e a seguir em Components e marque o componente conforme exibido na figura abaixo:

Agora no formulário padrão Main_Form inclua a partir da ToolBox os seguintes controles :

Disponha os controles no formulário conforme o leiaute da figura a seguir:

No início do formulário vamos definir as variáveis objeto Database e Recordset:

Dim db As DAO.Database
Dim rsFunci As DAO.Recordset

A seguir no evento Load do formulário vamos definir o código abaixo:

Private Sub Form_Load()
On Error Resume Next
  lblDataHora.Caption = Now()
  Set db = OpenDatabase(App.Path & "\Cadastro.mdb")
  Set rsFunci = db.OpenRecordset("SELECT * FROM Funcionarios")
End Sub

Neste código estamos atribuindo a data e a hora á Label lblDataHora e a seguir definindo o banco de dados Cadastro.mdb e criando o recordset rsFunci com todos os registros da tabela Funcionarios.

No evento Click do botão de comando - Exibir Registro de Funcionarios - inclua o seguinte código :

rivate Sub cmdFuncionarios_Click()
On Error Resume Next
'exibe o frame
frmFunci.Visible = True
'exibe o codigo e nome do funcionario nas caixas de texto do formulario
With rsFunci
    txtId.Text = .Fields("id")
    txtNome.Text = .Fields("nome")
    .MoveFirst
    .MoveLast
    .MoveFirst
End With
frmProcurar.Enabled = True
lblRegistros.Caption = "Número de Funcionários : " & rsFunci.AbsolutePosition + 1 & " de " & rsFunci.RecordCount
End Sub

No evento Click do botão Procurar inclua o código a seguir:

Private Sub cmdProcurar_Click()
'se o frame esta visivel então exibe a lista de funcionarios
If frmFunci.Visible = True Then
    Call Procurar(txtProcurar, lstFuncionarios, rsFunci, "nome")
End If
End Sub

Neste código estamos chamando a rotina Procurar() passando TextBox, o ListBox , o recordset e o campo a ser procurado.

Vamos então criar a rotina Procurar em um módulo no projeto de forma que seja visível a todos no projeto.

No menu Project clique em Add Module e a seguir clique no botão Abrir:

Salve o módulo com o nome modProcurar.bas.

Defina a rotina Procurar no módulo com o seguinte código:

Sub Procurar(txtbox As TextBox, lstbox As ListBox, rs As Recordset, campo As String)
lstbox.Clear
'procura pelo campo informado no textbox
rs.FindFirst campo & " like '" & txtbox.Text & "*'"
If rs.NoMatch Then
    MsgBox "Nenhum registro foi encontrado", vbExclamation, "Procurar"
    Exit Sub
End If
Do Until rs.NoMatch = True
    
    Main_Form.MousePointer = vbHourglass    
    rs.FindNext campo & " like '" & txtbox.Text & "*'"
    lstbox.AddItem rs.Fields(campo)   
    Main_Form.lblinfo.Caption = "O número de registros similares ao critério informado << " _
    & UCase(txtbox.Text) & " >> é igual " & lstbox.ListCount & " Registros."    
Loop
Main_Form.MousePointer = vbDefault
End Sub

Neste código usamos os seguintes métodos do objeto Recordset:

Nota: Temos também os métodos FindPrevious e FindLast.

E estamos incluindo os registros que atendem o critério de busca no ListBox - lstbox.

Você pode usar o evento Click do controle ListBox e tratar quando o usuário seleciona um item da listbox. A seguir um exemplo que trata este evento e exibe o nome do cliente em um Msgbox:

Private Sub lstFuncionarios_Click()
    MsgBox (lstFuncionarios.Text)
End Sub

Vamos agora definir o código no evento Click de cada um dos botões de comando para navegar pelos registros:

Private Sub cmdPrimeiro_Click()
On Error Resume Next
With rsFunci
    .MoveFirst
    txtId.Text = .Fields("id")
    txtNome.Text = .Fields("nome")   
    If .BOF Then
       .MoveNext
    End If
End With
lblRegistros.Caption = "Número de Funcionários : " & rsFunci.AbsolutePosition + 1 & " de " & rsFunci.RecordCount
End Sub

Private Sub cmdAnterior_Click()
On Error Resume Next
With rsFunci
    .MovePrevious
    txtId.Text = .Fields("id")
    txtNome.Text = .Fields("nome")
    
    If .BOF Then
        .MoveFirst
    End If   
End With
lblRegistros.Caption = "Número de Funcionários : " & rsFunci.AbsolutePosition + 1 & " de " & rsFunci.RecordCount
End Sub

Private Sub cmdProximo_Click()
On Error Resume Next
With rsFunci
    .MoveNext
    txtId.Text = .Fields("id")
    txtNome.Text = .Fields("nome")
    If .EOF Then
        .MoveLast
    End If
End With
lblRegistros.Caption = "Número de Funcionários : " & rsFunci.AbsolutePosition + 1 & " de " & rsFunci.RecordCount
End Sub

Private Sub cmdUltimo_Click()
On Error Resume Next
With rsFunci
    .MoveLast
    txtId.Text = .Fields("id")
    txtNome.Text = .Fields("nome")
    If .EOF Then
    .MovePrevious
    End If
End With
lblRegistros.Caption = "Número de Funcionários : " & rsFunci.AbsolutePosition + 1 & " de " & rsFunci.RecordCount
End Sub

Neste código estamos usando os métodos de movimentação que  permitem a passagem de um registro para outro no interior dos recordsets, e alteram a posição do ponteiro do registro ao passar de um registro ativo para outro registro. Você pode usar os métodos de movimentação sobre quaisquer recordsets. Vejamos a seguir os métodos de movimentação:

MoveFirst:
Movimenta o ponteiro do registro ativo para o primeiro registro do recordset aberto.
MoveNext:
Movimenta o ponteiro do registro ativo para o registro seguinte. Se não houver registro seguinte , você está no último registro, o flag de final de arquivo EOF será ativado.
MovePrevious:
Desloca o ponteiro do registro ativo para o registro anterior no recordset aberto. Se não houver registro anterior, você está no primeiro registro, o flag de início de arquivo BOF será ativado.
MoveLast:
Movimenta o ponteiro do registro ativo para o último registro do recordset aberto.
Move n
Desloca o ponteiro de registro n registros para frente (n positivo) ou para trás (n negativo) a partir do registro ativo no recordset aberto. Se o deslocamento levar o ponteiro de registro além dos limites do recordset ocorrerá um erro.

Para concluir temos o código do botão Sair:

Private Sub cmdSair_Click()
    Unload Me
    End
End Sub

Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui:   Funcionarios_VB6.zip

Porque a palavra da cruz é loucura para os que perecem; mas para nós, que somos salvos, é o poder de Deus.
1 Coríntios 1:18

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