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
Crie um novo projeto Standard.EXE
Inclua um modulo de classe usando o menu Project|Add Class Module e nomeio como clsClientes
Na janela Properties da classe clsCLientes mude a propriedade DataSourceBehavior para 1 - vbDataSource (veja figura abaixo)
Inclua uma referência a biblioteca ADO no menu Project|References
Na seção de declarações da classe defina um objeto Recordset privado para lidar com o acesso ao banco de dados
Private rsClientes As ADODB.Recordset
No evento Initialize da classe inclua o código para criar o objeto 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 :
|
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...