Recordsets : Tables, Dynasets e Snapshots.
A primeira coisa a fazer para armazenar e/ou acessar dados é criar um banco de dados.Se já tiver um banco de dados, você tem de abrí-lo antes do seu programa poder usá-lo.
Os objetos de acesso a dados (DAO) são organizados em uma hierarquia (fig. 1- Hierarquia simplificada).
fig.1
-No topo da hierarquia temos o objeto DBEngine que controla
todos os outros objetos.Só pode existir um único objeto DBEngine.
-O objeto DBEngine possui uma coleção de de objetos Workspace
que define uma sessão para um usuário.
-Cada objeto Workspace possue uma coleção de objetos Database
que contém os bancos de dados abertos disponíveis.
-Cada objeto DataBase possue uma coleção de objetos Recordset
que representam os conjuntos de registros abertos.(Cada objeto Recordset
possui uma coleção Fields).
A abertura de um banco de dados e feita com o uso do método Opendatabase do objeto Workspace, mostrado no código abaixo :
Dim meubd as Database Set meubd = DBEngine.Workspaces(0).OpenDatabase("C:\meudir\dados.mdb")
O objeto Workspace não faz parte do banco de dados , e pode ser visto como uma definição de uma sessão para o usuário que está logado. Assim como o objeto DBEngine , o objeto Workspace é criado automaticamente e por isso não precisamos de variáveis objetos para referenciá-los. O primeiro objeto Workspace padrão criado será o primeiro da coleção Workspaces (Workspace(0) ) e a propriedade UserName do objeto será definida como 'Admin'. Você precisará usar variáveis objeto para referenciar o objeto Database, e essas variáveis comportam-se como as demais varíaveis podendo ser públicas, privadas ou locais. A diferença é que as variáveis objetos precisam ser destruídas quando não forem mais necessárias , pois as mesmas não são automaticamente destruídas quando fora do escopo como as variáveis regulares. Para destruir uma variável objeto atribua a ela a palavara chave Nothing. Ex: Set db = Nothing.
Então para abrir um banco de dados você deve usar o método OpenDatabase do objeto Workspace, e portando não precisa preceder o método de seu objeto. Assim , apenas para ilustrar , as cinco linhas de código abaixo são equivalentes e todas elas abrem a base de dados Teste.mdb.
Dim db as Database Dim db = DBEngine.Workspaces("Admin").OpenDatabase(App.Path & "\ teste.mdb")
Dim db = DBEngine.Workspaces(0).OpenDatabase(App.Path & "\ teste.mdb")
Dim db = Workspaces("Admin").OpenDatabase(App.Path & "\ teste.mdb")
Dim db = Workspaces(0).OpenDatabase(App.Path & "\ teste.mdb")
Dim db = OpenDatabase(App.Path & "\ teste.mdb")
Adivinha qual dessas linhas você vai preferir usar para abrir sua base de dados ?????
Para trabalhar com os objetos de acesso a dados você usa as variáveis do objeto para cada tipo de objeto (Database,Recordset,...). Para designar um objeto a uma variável do objeto utilize a instrução SET.
No código acima , primeiro definimos uma variável objeto de banco de dados(meubd), e a seguir usamos o método Opendatabase para designar nosso banco de dados, nome e localização à variável objeto declarada.
Após abrir o banco de dados você deve definir um Recordset para ter acesso aos dados contidos no banco de dados.
O novo objeto Recordset é o recurso mais importante relacionado com os objetos de acesso a dados.
Ele ocupa o lugar dos objetos tabela, dynaset e snapshot das versões anteriores.
Agora ao invés de abrir uma tabela ou criar um dynaset você abre um Recordset .
Há três tipos de Recordsets disponíveis:
- Tabelas - são as estruturas físicas que contém os dados em um banco de dados.
- Dynaset - são um conjunto de ponteiros para acesso a campos e registros localizados em uma ou mais tabelas.
- Snapshot- são uma cópia somente de leitura dos dados de uma ou mais tabelas.
Principais Propriedades dos Recordsets
Propriedade Descrição ------------------------------------------------------------------------ BOF True se você estiver no início do recordset. (antes do primeiro registro) EOF True se você está no fim do recordset. (depois do último registro) BookMark Fornece o identificador(ID) do registro corrente. LastModified O Bookmark do último registro que sofreu alteração. LastUpdate O Bookmark do último registro que foi atualizado. (Um registro pode ser atualizado sem alterações.) Seek Permite usar um índice e rapidamente encontrar um registro; NoMatch True se durante uma busca o registro não foi localizado.(Chegamos ao fim do arquivo.) DateCreated Retorna a data e hora em que a tabela foi criada LastUpdated Retorna a data e hora em que a tabela foi modificada Filter/Sort Permitem restringir os registros e estabelecer a ordem de classificação em um objeto Recordset do tipo Dynaset SnapShot ou Forward-only. Name Retorna o nome do banco de dados que possui o objeto Recordset Retorna o caminho completo e o nome do arquivo. RecordCount Retorna o número de registros que foram acessados. Para retornar o número real de registros use um MoveLast seguido de um Movefirst. Absolute_ Referencia a posição relativa do ponteiro do registro no Recordset. Position Devemos usar um Movelast e Movefirst para usar esta propriedade sem erros. Restartable/ Restartable Indica se um recordset pode ser criado com o método Requery. Requery
Como todos os dados de um banco de dados estão armazenados em tabelas, acessar tabelas significa acessar diretamente os dados de um arquivo.
Vantagens do uso de Tabelas
- É a única forma de Recordset que aceita o uso de índices, tornado desta forma a pesquisa em uma tabela mais rápida do que em um dynaset ou snapshot.
- As alterações efetuados pelos usuários ficam imediatamente disponíveis , não sendo necessário dar o refresh para atualizar os dados.
Desvantagens do uso de Tabelas
- Não se pode utilizar filtros para restringir os registros usando determinados critérios.
- O comando Seek só encontra o primeiro registro que atende a seus critérios.
Abertura de uma tabela para utilização
Para abrir uma tabela , defina um objeto Recordset e use o método OpenRecordset para acessar a tabela.
Informe a constante DbOpenTable para identificar o tipo de recordset criado. Veja o código abaixo:Dim meubd as Database Dim minhatbl as Recordset Set meubd = DBEngine.Workspaces(0).OpenDatabase("C:\meudir\dados.mdb") Set minhatbl = meubd.OpenRecordset("Clientes",DbOpenTable) A novidade em relação ao código acima é a definição da variável objeto tipo Recordset minhatbl e a atribuição a esta variável da tabela Clientes do banco de dados Dados.mdb.
Note que o arquivo de banco de dados é padrão Access.
Um dynaset é um conjunto de ponteiros de registros provenientes de uma ou mais tabelas ,e indicam os dados especificados existentes quando da criação do dynaset.
Os dynasets são recordsets atualizáveis e refletem as alterações feitas pelo usuário nas tabelas e no próprio dynaset.Vantagens do uso de Dynasets
- Permitem reunir informações de diversas tabelas, através de instruções SQL.
- Permitem utilizar os métodos de busca Find e o uso de filtros e ordem de classificação para mudar a visão dos dados.
Desvantagens do uso de Dynasets
- Não admitem a criação de índices e do método Seek
- Não reflete inclusões ou exclusões feitas por outros usuários. Para mostrar as alterações é necessário renovar (refresh) o dynaset
Configuração de um Dynaset
Para utilizar um dynaset você deve definir um objeto recordset (Dim) e depois gerar o dynaset com o método OpenRecordset. Para selecionar os registros você pode usar uma instrução SQL. Veja exemplo abaixo:
Dim meubd as Database Dim meudyn as Recordset Set meubd = DBEngine.Workspaces(0).OpenDatabase("C:\meudir\dados.mdb") Set meudyn = meubd.OpenRecordset("SELECT * FROM Clientes" , DbOpenDynaset)Definimos a variável objeto meudyn , abrimos o banco de dados e a seguir criamos um dynaset que é composto por todos os registros da tabela Clientes , através da instrução SQL que seleciona (SELECT) todos (*) os registros da tabela Clientes.
Obs:Também é possível criar um dynaset a partir de outro dynaset.
Um snapshot é uma cópia dos dados de um recordset em um dado instante. Ele é muito semelhante a um dynaset pois pode ser criado a partir das tabelas básicas com as mesmas instruções.(SQL, QueryDef,...). A diferença principal é que um snapshot não é pode ser atualizado.
Vantagens do uso de Snapshots
- Permitem reunir informações de diversas tabelas.
- Permitem utilizar os métodos de busca Find e o uso de filtros e ordem de classificação para mudar a visão dos dados.
- Para os snapshots, navegação pelos registros e a criação de recordsets pode ser mais rápida do que nos dynasets.
Desvantagens do uso de Snapshots
- Um snapshot não pode ser atualizado.
- Um snapshot não admite a criação de índices.
Configuração de um Snapshot
Para utilizar um snapshot você deve definir um objeto recordset (Dim) e depois gerar o snapshot com o método OpenRecordset. Para selecionar os registros você pode usar uma instrução SQL. Veja exemplo abaixo:
Dim meubd as Database Dim meusnap as Recordset Set meubd = DBEngine.Workspaces(0).OpenDatabase("C:\meudir\dados.mdb") Set meusnap = meubd.OpenRecordset("SELECT * FROM Clientes" , DbOpenSnapshot)O código é praticamente idêntico ao utilizado para a criação de um dynaset.
Os métodos de movimentação 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.
Utilizamos os métodos de localização para localizar registros que satisfaçam a critérios determinados.
Os métodos de localização somente podem ser utilizados em Dynasets e Snapshots. Não é possível utilizá-los em objetos Tabela.
Vejamos a seguir os métodos de Localização:
- FindFirst:
- A partir do ínicio do recordset , localiza o primeiro registro que atende aos critérios definidos.
- FindNext:
- A partir da posição atual no recordset , localiza o registro seguinte (próximo) que satifaz aos critérios definidos.
- FindPrevious:
- A partir da posição atual no recordset , localiza o registro seguinte(anterior) que satifaz aos critérios definidos.
- FindLast:
- A partir do ínicio do recordset , localiza o último registro que satisfaz aos critérios definidos.
Após a executar o método de localização você deve verificar o status da propriedade NOMATCH. Se Nomatch é verdadeira o método não encontrou o registro desejado , se Nomatch é falsa o ponteiro do registro se posiciona no registro encontrado.
Como exemplo suponha que temos um banco de dados Controle, no diretório Controle, que contém uma tabela Clientes, e que desejamos encontrar o cliente de nome Ana Maria Rosa nesta tabela.Veja o fragmento de código abaixo:
Dim bd as Database
Dim rs as Recordset
Dim criterio as string
Set bd = DBEngine.Workspaces(0).OpenDatabase("C:\Controle\Controle.mdb")
Set rs = bd.OpenRecordset("Clientes",DbOpenDynaset)
criterio="nome='Ana Maria Rosa'"
rs.findfirst criterio
if rs.nomatch
msgbox "Cliente não localizado. "
else
msgbox rs.Fields("nome") & " localizado no arquivo. "
endif
O método Seek somente pode ser utilizado com o recordset do tipo Table(Tabela), e, embora ele seja o mais rápido dos métodos de localização e posicionamento de registros apresenta as seguintes limitações:
- Só pode ser executado sobre uma tabela; não é possível usá-lo com um dynaset ou snapshot.
- Só pode ser usado com um índice ativo, e os parâmetros devem coincidir com os campos do índice ativo.
- Um Seek só localiza o primeiro registro que satisfaz aos valores de índices especificados.
Para invocar o método Seek é necessário fazer a chamada ao método usando os operadores de comparação (<, <="," =",">=, > , <>) , lembrando que os valores de chaves que estão sendo comparados devem ter o mesmo tipo de dados dos campos no índice de controle.Veja exemplo a seguir:
Dim bd as Database Dim rs as Recordset Set bd = DBEngine.Workspaces(0).OpenDatabase("C:\Controle\Controle.mdb") Set rs = bd.OpenRecordset("Clientes",DbOpenTable) rs.index = "Nome" rs.seek "=" , "Ana Maria Rosa" if rs.nomatch msgbox "Cliente não localizado. " else msgbox rs.Fields("nome") & " localizado no arquivo. " endif No código acima definimos um recordset rs do tipo Tabela e a seguir definimos o indíce ativo rs.index = "Nome" e invocamos o método Seek usando o operador = com nome a ser procurado.
Obs:Note que: O índice ja deve ter sido criado , o operador deve estar entre aspas e que deve ser separado por vírgula do valor a ser localizado.Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: