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