ADO Total - Uma livraria de funções para acesso a dados

Seria bom se para cada necessidade que tivessemos em relação a alguma tarefa de programação no VB pudessemos consultar uma livraria de rotinas e nela encontrassemos exatamente aquilo que estavamos procurando, geralmente não isto o que ocorre. Ás vezes mesmo usando quase que as mesmas rotinas , acabamos reescrevendo código gastando um tempo precioso , e ainda ficamos com aquele sentimento : "...mas eu acho que eu já fiz algo parecido antes..."

Tudo é uma questão de organização , e , se começarmos a montar uma livraria de rotinas específicas para cada tarefa que formos executando à medida que a necessidade nos empurra para a pesquisa , codificação e testes, no final de um certo veremos nossos esforços recompensados por termos á mão uma ferramenta valiosa que poderá economizar tempo e dinheiro.

Para dar uma mãozinha para você , neste artigo eu vou montar um livraria com rotinas para acesso e tratamento de dados para a ADO. Nesta livraria teremos rotinas para : criar tabelas , relacionamentos , índices , campo autonumeração , links externos , etc.

Eu vou colocar todas as rotinas em um módulo .bas , mas você pode também usar um módulo de classe. Vamos então ao código que nos interessa...

- Você deve criar um novo projeto no VB e inserir no projeto um módulo : opção - Add Module - do menu Project e alterar seu nome para AdoTotal ( ou algum outro nome do seu agrado)

- A seguir inclua as seguintes referências no seu projeto : ( menu Project|References )

1- Microsoft Data Objects 2.7 Library

2- Microsoft ADO Ext. 2.1 for DDL and Security

No módulo bas inclua como primeira linha o seguinte código : Option Explicit

1 - Criando um nova tabela em uma base de dados Access

Esta primeira rotina irá criar uma nova tabela em um banco de dados Access. Basta informar o nome do banco de dados de destino e o nome da nova tabela.

Estou colocando no 'queixo duro' os nomes dos campos e seus tipos de dados no código , mas você pode melhorar a rotina tornando-a mais genérica. No exemplo eu estou criando um tabela com a seguinte estrutura :

O código da rotina é dado abaixo:

Sub CriaTabela(strCaminhoDB As String, nomeTabela As String)

'define as variáveis objeto a serem usadas
Dim catDB As ADOX.Catalog
Dim novaTabela As ADOX.Table
Dim i As Integer

Set catDB = New ADOX.Catalog

'abre o objeto catalogo
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strCaminhoDB

Set novaTabela = New ADOX.Table

'cria um novo objeto table
With novaTabela
.Name = nomeTabela
'cria campos e os anexa a coleção columns do novo objeto table
With .Columns
.Append "Nome", adVarWChar
.Append "Endereco", adVarWChar
.Append "Telefone", adVarWChar
.Append "email", adVarWChar
.Append "Curriculo", adLongVarWChar
End With
End With

'cria a nova tabela incluindo o objeto table a coleção tables do banco de dados
catDB.Tables.Append novaTabela

Set catDB = Nothing

End Sub
Exemplo de utilização da função:

- nome do banco de dados de destino: Teste.mdb

- localização : c:\teste

- nome da tabela a ser criada: novaTabela

- chamada da função em seu formulário :

Criatabela("c:\teste\teste.mdb","NovaTabela")

2- Criando um relacionamento entre tabelas

Supondo que temos duas tabelas : Pessoal e Funci com as seguintes estruturas :

 

Vamos supor que nos precisamos criar um relacionamento (vou chamá - lo : novorelacionamento ) entre estas tabelas. A tabela Funci será a tabela estrangeira e a chave estrangeira será o campo codigoFunci. A tabela relacionada será a tabela Pessoal e sua chave será o campo codigoPessoal. O que desejamos fazer esta descrito na tela abaixo :

A rotina para realizar esta tarefa em nossa livraria será a seguinte :

Sub criaRelacionamento(strCaminhoDB As String, strTabelaEstrangeira As String, strNomeRelacionamento As String, _
strChaveTabelaEstrangeira As String, strTabelaRelacionada As String, strChaveTabelaRelacionada As String)

Dim catDB As ADOX.Catalog
Dim tabela As ADOX.Table
Dim chave As ADOX.Key

Set catDB = New ADOX.Catalog
'abre o objeto catalogo
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strCaminhoDB

Set chave = New ADOX.Key

'cria uma chave estrangeira para definir o relacionamento
With chave
'define o nome para o relacionamento na coleção Keys
.Name = strNomeRelacionamento
'define o nome da tabela relacionada
.RelatedTable = strTabelaRelacionada
.Type = adKeyForeign
'inclui o campo chave estrangeira a coleção Columns
.Columns.Append strChaveTabelaEstrangeira
'define o campo no qual chave estrangeira esta relacionado
.Columns(strChaveTabelaEstrangeira).RelatedColumn = strChaveTabelaRelacionada
End With

Set tabela = New ADOX.Table
'abre a tabela e inclui a chave estrangeira
Set tabela = catDB.Tables(strTabelaEstrangeira)
tabela.Keys.Append chave

Set catDB = Nothing

End Sub

Exemplo de como chamar a rotina para o caso acima:

Call criaRelacionamento("c:\teste\teste.mdb","Funci", "novoRelacionamento", "codigoFunci", " Pessoal","codigoPessoal")

3- Criando um índice em uma tabela

A rotina abaixo cria um índice em uma tabela existente. Como exemplo vamos criar uma índice para o campo Nome da tabela Pessoal existente no banco de dados testeDB.mdb . O nome do índice será : nomeidx. Veja como seria a chamada da rotina :

Call CriaIndice("c:\teste\testedb.mdb", "Pessoal", "nomeidx", "Nome", adIndexNullsDisallow, adSortAscending)

Sub CriaIndice(strCaminhoDB As String, strNomeTabela As String, strNomeIndice As String, strCampoIndice As String, _lngIndiceNulo As ADOX.AllowNullsEnum, lngOrdenacao As ADOX.SortOrderEnum)

Dim catDB As ADOX.Catalog
Dim tabela As ADOX.Table
Dim indice As ADOX.Index

'abre o objeto catalogo no bd no qual vamos criar o indice
Set catDB = New ADOX.Catalog
'abre o objeto catalogo
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strCaminhoDB

Set tabela = New ADOX.Table
Set tabela = catDB.Tables(strNomeTabela)

'cria o objeto index e o anexa a coluna da tabela a ele
Set indice = New ADOX.Index

With indice
.Name = strNomeIndice
.IndexNulls = lngIndiceNulo
.Columns.Append strCampoIndice
.Columns(strCampoIndice).SortOrder = lngOrdenacao
End With

'anexa o objeto indice a coleçao indexes do objeto table
tabela.Indexes.Append indice
Set catDB = Nothing

End Sub

4- Criando uma tabela com campo autonumeração

A seguir temos uma rotina que cria um campo auto-numeração. Este campo é controlado pelo banco de dados e é incrementado a cada inclusão feita no banco de dados. O inconveniente é que a numeração não se repete e sempre vai aumentando ; se você fizer testes de inclusão e depois excluir todos os registros o primeiro registro será numerado sempre a partir do último que foi usado.

Vamos mostrar criar a tabela Produtos no banco de dados testeDB.mdb conforme a estrutura abaixo :

A rotina esta descrita e comentada abaixo e a chamada para criar a tabela produtos conforme a figura acima é :

Call criaCampoAutonumeracao("c:\teste\testeDB.mdb", "Produtos", "CodigoProduto")

Sub criaCampoAutonumeracao(strcaminhoDB As String, nomeTabela As String, nomeCampo As String)

Dim catDB As ADOX.Catalog
Dim tabela As ADOX.Table

'abre o objeto catalogo no bd no qual vamos criar o indice
Set catDB = New ADOX.Catalog
'abre o objeto catalogo
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strcaminhoDB

Set tabela = New ADOX.Table

With tabela
.Name = nomeTabela

Set .ParentCatalog = catDB

'cria campos e anexa-os a coleção colunas para um novo objeto table
With .Columns
.Append nomeCampo, adInteger
'torna o campo CodigoID autonumeração
.Item(nomeCampo).Properties("Autoincrement") = True
.Append "NomeProduto", adVarWChar
.Append "DescricaoProduto", adVarWChar
.Append "EstoqueProduto", adInteger
.Append "PrecoProduto", adCurrency
End With

End With

'cria uma nova tabela através da inclusão do objeto table na coleção table do banco de dados
catDB.Tables.Append tabela

Set catDB = Nothing
End Sub

5- Criando um Banco de dados Access

Function CriaNovoMDB(NomeArquivo, Formato) As Boolean
Dim catDB As ADOX.Catalog
Dim tabela As ADOX.Table

On Error GoTo trata_erro

'abre o objeto catalogo no bd no qual vamos criar o indice
Set catDB = New ADOX.Catalog
catDB.Create "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=" & Formato & ";Data Source=" & NomeArquivo
CriaNovoMDB = True
Exit Function

trata_erro:
CriaNovoMDB = False

' o tratamento de erro você pode colocar na rotina que chama a função
If Err.Number = -2147217897 Then
     MsgBox "O banco de dados <<" & NomeArquivo & ">> já existe."
Else
      MsgBox "Ocorreu um erro durante a criação do banco de dados " & NomeArquivo & vbCrLf & _
      Err.Description & vbCrLf & _
      "Erro numero : " & Err.Number
End If

End Function

Para criar um banco de dados Access a rotina acima recebe dois argumentos : o nome do arquivo do banco de dados que será criado e o formato. O formato indica em qual versão iremos criar o banco de dados . Podemos usar a seguinte tabela para as versões a serem criadas :

Const Jet10 = 1
Const Jet11 = 2
Const Jet20 = 3
Const Jet3x = 4 - Access 97
Const Jet4x = 5 - Access 2000

Então para criar um banco de dados Access chamado teste.mdb no diretorio c:\teste na versão do Jet 4.0 ( Access 2000) - invocamos a função assim :

Call CriaNovoMDB("c:\teste\teste.mdb" , 5)

6- Converter um banco de dados Access em um outro formato

aguarde que tem mais..


José Carlos Macoratti