> ## Recordsets : Tables, Dynasets e Snapshots.

##### Conteúdo

- Como abrir um banco de dados.
- Recordsets
- Tabelas: uso, vantagens/desvantagens, abertura.
- Dynasets: uso , vantagens/desvantagens, configuração
- Snapshots: uso , vantagens/desvantagens, configuração
- Métodos de Movimentação: Movefirst, Movenext,...
- Métodos de Localização: FindFirs, FindNext, ...
- Uso do método Seek.

### Como abrir um banco de dados via DAO.

> 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.

> Conteúdo

### Recordsets

> 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

> Conteúdo

### Tabelas: uso, vantagens/desvantagens, abertura.

> 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.

> Conteúdo

### Dynasets: uso, vantagens/desvantagens, abertura.

> 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.

> Conteúdo

### Snapshots: uso, vantagens/desvantagens, configuração.

> 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.

> Conteúdo

### Métodos de Movimentação: MoveFirst, MoveNext,...

> 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.
> Conteúdo

### Métodos de Localização: FindFirst, FindNext,...

> 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

> Conteúdo

### Uso do método Seek.

> 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.

> Conteúdo

Retorna