Sei sulla pagina 1di 8

ADO - Trabalhando com Recordsets sem uma base de dados

Qual seria sua reao se algum dissesse que pode trabalhar com Recordsets ADO sem utilizar qualquer fonte de dados externa ? Espanto ? Descrena

? Curiosidade ? ...

Qualquer que seja a sua reao vou logo dizer que isto perfeitamente possvel e vivel e com algumas vantagens . Quer saber quais so elas ?

1. Voc no precisa criar um banco de dados ( Uau... ) 2. Como o seu sistema no depende de uma base de dados externas ele fica
mais porttil

3. Voc no tem que se preocupar em como se conectar a uma base de dados 4. 5. 6.


( ela no existe .. :-) A quantidade de cdigo fica reduzida e a manuteno fica mais fcil Sua aplicao fica com um tamanho menor e necessita de menos recursos para ser executado. Voc usa todo o seu conhecimento sobre o modelo de objeto ADO

Bem , se voc ainda esta incrdulo , e , daqueles que precisa ver para crer , vamos mostrar uma aplicao completa com um recordset ADO sem usar um banco de dados. ( se quiser pode dar uma olhada no artigo - Retornando dados com GetRows - onde j arranhamos o assunto...) Vamos criar um pequeno programa , uma agenda pessoal , para armazenar os endereos dos amigos , parentes , etc... Estaremos trabalhando com as opes de incluir , alterar e excluir os registros do nosso arquivo de dados, tudo isto sem usar um banco de dados...

Criando a aplicao - Agenda


Inicie um novo projeto no VB padro Standard EXE Escolha no menu principal a opo Projetct | References e selecione Microsoft ActiveX Data Objects 2.x ( verso superior a 2.0 ) Agora insira os controles no formulrio padro como exibidos na figura abaixo:

Estamos usando : um controle ListView(ListAgenda) , sete textbox(0...7) , sete labels (0...7) , um frame e trs botes de comando: cmdincluir, cmdsalvar, cmdexcluir Pronto o 'esqueleto' j esta montado , vamos agora para o 'recheio' - o cdigo...

Voc deve estar se perguntando - Como vamos usar um Recordset sem um banco de dados ? Se voc ainda no sabe , a ADO permite utilizar um recordset desconectado . este conceito que vamos usar. Podemos desconectar e mais tarde fazer a conexo com uma base de dados , mas este no vai ser nosso caso. Simplesmente vamos usar o recordset desconectado. Para definir um recordset desconectado podemos dizer que: "Um recordset desconectado um recordset do lado do cliente que no tem uma conexo ativa a uma fonte de dados ou banco de dados." S para voc ter uma idia da utilidade desta tcnica , imagine um servidor de banco de dados que pode lidar com apenas um certo nmero limitado de conexes ativas ao mesmo tempo. Assim quando um aplicativo precisa esperar a entrada do usurio ou qualquer outra ao do usurio , porque manter a conexo aberta por todo este tempo ? Voc pode , no caso acima, recuperar os dados de uma fonte de dados , armazenar os dados em um recordset e desconectar o recordset da fonte de dados para libera recursos da conexo. O aplicativo altera os dados ou incluir novos dados ao recordset e depois se reconecta e a fonte de dados e escreve as mudanas ocorridas. Entendeu ??? As duas principais tcnicas para criar um recordset desconectado so :

1. Prepare e abra um recordset do lado do cliente e preencha-o com os dados 2.


do banco de dados; A seguir desconecte o Recordset ( veja abaixo ) . Prepare um recordset do lado do cliente e apos definir as propriedades dos campos use o mtodo Open para que o recordset seja preenchido com os registros.

A primeira coisa a fazer para gerar um recordset (rsagenda) desconectado :

1. criar uma varivel objeto - Set rsagenda = ADODB.Connection 2. a seguir definir a conexo ativa atravs da propriedade
ActiveConnection para Nothing = adUseClient

Set ActiveConnection = Nothing

3. Definir o tipo do cursor como estando do lado do Cliente - CursorLocation


Pronto , j temos nosso recordset desconectado e pronto para ser usado. Precisamos no entanto fazer os ajustes finais , os quais sejam :

4. Definir o tipo de bloqueio - LockType = adLockBatchOptimistic -

indicando que as atualizaes no recordset ocorrero no modo otimista e em lote. ( durante a edio outros usurios no podero alterar o contedo do registro)

E a estrutura do Recordset ? de onde vir ?


Bem . como no estamos usando um banco de dados vamos ter que criar a estrutura do recordset. Para fazer isto usamos o mtodo Append da coleo Fields e inclumos a definio de cada campo ao recordset. Para fazer isto vamos precisar conhecer o nome , tamanho e o tipo de dados de cada campo. A sintaxe para para o mtodo Append : objetoRecordset.Fields .Append NomeCampo , TipoCampo , TamanhoCampo , Atributos O nome e o tamanho dos campos so definidos com base nas informaes que desejamos armazenar. Assim, para o nosso caso , vamos armazenar : o nome , endereo ,cidade , cep , uf , telefone e email. Podemos definir o nome e o tamanho conforme a tabela abaixo :

Nome AgNome AgEndereco AgCidade AgCep Aguf Agtelefone Agemail

Tamanho 50 50 40 15 2 15 250

E o tipo de dados , como vamos definir ? Abaixo temos os principais tipos de dados suportados na ADO :
Constant adBinary adBSTR adChar adDate Description Um valor binrio (DBTYPE_BYTES). Um caractere string terminado em null-(Unicode) (DBTYPE_BSTR). Um valor String fixo. (DBTYPE_STR). Um valor Data (DBTYPE_DATE).

adBoolean Um valor Boleano (DBTYPE_BOOL).

adCurrency Um valor monetrio (DBTYPE_CY).

adDBDate adDBTime adDouble adEmpty adInteger adSingle adVariant

Um valor Data (yyyymmdd) (DBTYPE_DBDATE). Um valor para horas (hhmmss) (DBTYPE_DBTIME). Valores de precisao dupla (DBTYPE_R8). Um valor no definido (DBTYPE_EMPTY). Um inteiro de 4 bytes (DBTYPE_I4). Preciso simples (DBTYPE_R4). Um valor Variant (DBTYPE_VARIANT).

adDecimal Um valor numrico exato com precisao defnida.(DBTYPE_DECIMAL).

adNumeric Um valor numerico (DBTYPE_NUMERIC). adVarChar Um valor String (Parameter object only).

Como no nosso exemplo todos os campos so do tipo Texto podemos usar ento o tipo de dado adVarChar ou adBSTR . Vamos usar advarChar. O parmetro Atributos ( Attributes ) opcional e define atributos para os novos campos : EX: Conter valores NULL - adFldMaybeNull. O valor padro adFldDefault . Nosso recordset ser criando conforme o cdigo a seguir: With .Fields .Append .Append .Append .Append .Append .Append .Append End With
]E

"Nome", adVarChar, 50 "Endereco", adVarChar, 50 "Cidade", adVarChar, 40 "Cep", adVarChar, 15 "UF", adVarChar, 2 "telefone", adVarChar, 15 "email", adVarChar, 250

como fazemos para salvar o Recordset ?

Simples, use o mtodo Save do objeto Recordset. A sintaxe para o mtodo Save :

recordset.Save Destination, PersistFormat Destination - Um variant que representa o caminho completo do arquivo onde o Recordset ser salvo , pode ser tambm uma referncia um objeto Stream PersistFormat - Um valor PersistFormatEnum que define o formato no qual o Recordset ser salvo , os formatos possveis so: XML - adPersistXML HTML adPersistHTML e o padro adPersistADTG Ex: rsagenda.Save "c:\teste\agenda.dat" , adPersistADTG

Lembre-se que:
O mtodo Save somente pode ser invocado em um Recordset aberto . Antes de us-lo voc deve usar o mtodo Open para restaurar o recordset a partir do destino. Se a propriedade Filter estiver ativa no Recordset , ento , somente as linhas acessveis no filtro sero salvas.

Ao salvar as alteraes no recordset ele permanece aberto e voc pode salvar as mudanas mais recentes. Para alcanar um bom desempenho usando Save utilize a propriedade CursorLocation como adUseClient.

Vamos agora ao cdigo das funes utilizadas no aplicativo agenda: Na seo General Declarations do formulrios insira o cdigo abaixo , onde definimos as variveis visveis em todo o formulrio. Public rsagenda as ADODB.Recordset Public strArquivo as String Public Flag as Boolean A seguir teremos o cdigo que inicializa o nosso objeto recordset - rsagenda. O cdigo estar no evento Load do Formulrio. Vejamos:
Private Sub Form_Load() Dim icontador As Integer Dim newitem As ListItem Set rsagenda = New ADODB.Recordset Call Abre_Recordset_Desconectado Call Preenche_Lista If rsagenda.RecordCount > 1 Then rsagenda.Filter = "Nome='" & ListAgenda.SelectedItem.Text & "'" Call Preenche_Controles End If End Sub

A procedura Abre_Recordset_Desconectado , verifica se o arquivo agenda.dat ( voce pode usar qualquer nome).Se o arquivo no existir ele ser criado atravs da rotina Cria_Recordset_Desconectado:
Private Sub Abre_Recordset_Desconectado() strArquivo = "c:\teste\agenda.dat" If Dir(strArquivo) = "" Then Cria_Recordset_Desconectado End If rsagenda.Open strArquivo End Sub

A rotina Cria_Recordset_Desconectado abaixo ir criar o recordset rsagenda


com a estrutura j definida:
Private Sub Cria_Recordset_Desconectado() With rsagenda Set .ActiveConnection = Nothing .CursorLocation = adUseClient .LockType = adLockBatchOptimistic With .Fields .Append "Nome", adVarChar, 50 .Append "Endereco", adVarChar, 50

.Append "Cidade", adVarChar, 40 .Append "Cep", adVarChar, 15 .Append "UF", adVarChar, 2 .Append "telefone", adVarChar, 15 .Append "email", adVarChar, 250 End With .Open .Save strArquivo, adPersistADTG .Close End With End Sub

A seguir a rotina Preenche_Lista ir preencher o controle ListView com os dados do recordset exibindo somente o nome constante no recordset. Abaixo o cdigo:
Private Sub Preenche_Lista() With ListAgenda .View = lvwList Do Until rsagenda.EOF Set newitem = .ListItems.Add(, , rsagenda("Nome")) rsagenda.MoveNext Loop .SortKey = 0 End With Set ListAgenda.SelectedItem = newitem End Sub

A seguir usamos a propriedade Filter do recordset para filtrar o recordset , Assim : rsagenda.Filter = "Nome='" & ListAgenda.SelectedItem.Text & "'" Perceba que o filtramos pelo campo Nome igual ao item atualmente selecionado na Lista. Depois preenchemos os controles atravs da procedura Preenche_Controles abaixo:
Private Sub Preenche_Controles() If rsagenda.RecordCount > 0 Then For icontador = 0 To rsagenda.Fields.Count - 1 Set Text1(icontador).DataSource = rsagenda Text1(icontador).Text = rsagenda.Fields(icontador) Next End If End Sub

Para incluir dados no recordset basta clicar no boto - Incluir (cmdIncluir). O cdigo o seguinte:
Private Sub cmdincluir_Click(Index As Integer) Dim icontador As Integer ListAgenda.Sorted = False Set ListAgenda.SelectedItem = Nothing cmdsalvar.Enabled = True For icontador = 0 To rsagenda.Fields.Count - 1 Text1(icontador).Text = ""

Next Text1(0).SetFocus End Sub

A excluso de um registro obtida ao clicarmos no boto - Excluir (cmdexcluir) cujo cdigo :


Private Sub cmdexcluir_Click(Index As Integer) rsagenda.Delete adAffectCurrent With ListAgenda .ListItems.Remove .SelectedItem.Index .SelectedItem = .ListItems(1) rsagenda.Filter = "Nome='" & .SelectedItem.Text & "'" End With Call Preenche_Controles End Sub

A rotina mais importante que salva o recordset em um arquivo definido . Usamos o arquivo agenda.dat . O boto cmsalvar ao ser clicado dispara o seguinte cdigo:
Private Sub cmdsalvar_Click() rsagenda.AddNew For icontador = 0 To rsagenda.Fields.Count - 1 rsagenda.Fields(icontador) = Text1(icontador).Text Next Call Salvar_Recordset_Desconectado Call Preenche_Lista cmdsalvar.Enabled = False End Sub

Abaixo a procedure ListAgenda_ItemClick que atualiza os controles quando clicamos em um item da lista.
Private Sub ListAgenda_ItemClick(ByVal Item As MSComctlLib.ListItem) rsagenda.Filter = "Nome='" & ListAgenda.SelectedItem.Text & "'" Preenche_Controles End Sub

Finalmente o cdigo do evento Query_Unload que salva o recordset quando o usurio sai do aplicativo :
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) rsagenda.Save strArquivo, adPersistADTG End Sub

Abaixo a tela do aplicativo em funcionamento:

Viu como tratamos um recordset sem precisar de uma conexo com um banco de dados. A vantagem que podemos usar quase todos os mtodos e propriedades do objeto recordset ( addnew, delete , Filter , Sort , etc.. ) Eu no usei um tratamento de erros no exemplo , nem me preocupei com alguns possveis erros , meu objetivo foi mostrar como trabalhar um recordset desconectado. Acreditou agora !!!!

Potrebbero piacerti anche