Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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...
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. criar uma varivel objeto - Set rsagenda = ADODB.Connection 2. a seguir definir a conexo ativa atravs da propriedade
ActiveConnection para Nothing = adUseClient
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)
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).
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).
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
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
.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 = ""
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
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 !!!!