VB - Criando classes que agem como fonte de dados


Tudo bem , os controles vinculados de dados são realmente limitados e não são aconselháveis em projetos comerciais robustos e mais complexos.

O VB6 trouxe consigo um recurso que até então não existia em suas versões anteriores. Você pode usar classes que agem como fonte de dados e não estará mais limitado aos controles vinculados.

No VB6 é possível vincular diretamente as classes a um banco de dados sem precisar estabelecer a esta vinculação durante a construção do projeto. Você pode então atribuir uma fonte de dados a um consumidor de dados durante a execução.

Além disto você esta trabalhando com classes e com isto esta encapsulando o seu código relativo ao acesso aos dados e as regras de negócios no módulo de classe.

Vamos então neste artigo criar uma classe que forneça dados para uma aplicação. Esta classe atuará como uma fonte de dados e você é quem vai controlar a implementação de código e sua classe será mais reutilizável do que os controles vinculados de dados do VB6.

Vamos supor que você tem um banco de dados , o já famoso Northwind.mdb , e quer a acessar a tabela Clientes deste banco de dados. A estrutura da tabela clientes e seus dados são exibidos abaixo. (esta tabela eu criei para o exemplo deste artigo, você pode usar qq tabela)

Vou acessar os dados usando um Data Source Name - DSN - que aponta para o banco de dados Northwind.mdb. Veja como fazer isto no artigo : Criando um DSN

Private rsClientes As ADODB.Recordset

Private Sub Class_Initialize()
  
  Set rsClientes = New ADODB.Recordset
  
  With rsClientes
       .Source = "Select * from Clientes"
       .CursorType = adOpenKeyset
       .LockType = adLockOptimistic
       .ActiveConnection = "DSN=Macoratti;"
       .Open
 End With

 DataMembers.Add "Clientes" 
End Sub

No código estamos definindo a fonte de dados(Source) , no caso todos os registros da tabela clientes.
O cursor usado é do tipo adOPenKeySet muito apropriado para usarmos com um controle DataGrid.
Para tornar os dados fornecidos pelo controle editáveis estou usando um bloqueio do tipo adLockOPtimistic.
A conexão ativa é o DSN definido previamente.

A coleção DataMembers fornecida pela biblioteca Microsoft Data Binding faz o registro da fonte de dados permitindo assim que os consumidores de dados usem a classe como uma fonte de dados.

No evento GetDataMember da classe inclua o código abaixo que irá retornar um objeto Recordset com base no parâmetro DataMember do evento.(Este evento ficou disponível quando definimos a propriedade DataSourceBehavior)

Private Sub Class_GetDataMember(DataMember As String, Data As Object)
Select Case DataMember
    Case ""
         Set Data = Nothing
    Case "Clientes"
         Set Data = rsClientes
    Case Else
         MsgBox "Erro de dados", vbCritical
End Select
End Sub

O argumento Data é um objeto ; com isto você poderá ter acesso a outros tipos de objetos e não somente a um recordset.

Agora temos que definir os métodos públicos na classe clsClientes para controlar o conjunto de registros . Eu vou definir apenas quatro métodos para fazer a paginação pelos registros mas você pode criar quantos métodos desejar na sua classe.

Abaixo o código para os métodos da classe clsClientes que iremos acessar.

Public Sub movefirst()
  rsClientes.movefirst
End Sub

Public Sub movelast()
   rsClientes.movelast
End Sub

Public Sub movenext()
   rsClientes.movenext
   If rsClientes.EOF Then
       rsClientes.movelast
   End If
End Sub

Public Sub moveprevious()
   rsClientes.moveprevious
   If rsClientes.BOF Then
       rsClientes.movefirst
   End If
End Sub

Pronto você tem uma classe com acesso a dados que funciona como uma fonte de dados e lhe permite acessar estes dados e se movimentar pelos registros. Vamos testar a classe em um novo projeto VB.

No formulário padrão form1. inclua um componente DataGrid onde iremos exibir os dados e quatro botões de comando que iremos usar para fazer a movimentação pelos registros. Abaixo o formulário com os controles:

O nome dos controles usados são :
  • DataGrid - dg1
  • cmdPrimeiro
  • cmdAnterior
  • cmdProximo
  • cmdUltimo

Na seção de declaração de variáveis do form defina uma variável do tipo da classe clsClientes:

Option Explicit
Private clientesDados As clsClientes

NO evento Load do formulário vamos criar um instância da classe clsClientes , atribuir a fonte de dados ao controle datagrid e definir o DataMember.

Private Sub Form_Load()
Set clientesDados = New clsClientes
Set dg1.DataSource = clientesDados
dg1.DataMember = "Clientes"
End Sub

Finalmente em cada evento click de cada botão insira o código relacionado com a movimentação do botão usando os métodos definidos na classe:

Private Sub cmdAnterior_Click()
clientesDados.moveprevious
End Sub
Private Sub cmdPrimeiro_Click()
clientesDados.movefirst
End Sub
Private Sub cmdProximo_Click()
clientesDados.movenext
End Sub
Private Sub cmdUltimo_Click()
clientesDados.movelast
End Sub

Agora é só executar  e teremos algo parecido com a figura abaixo:

Você acabou de usar uma classe definida por você mesmo para funcionar como uma fonte de dados sem usar controles vinculados.

Bom trabalho garoto...

Até mais ver...