Você está na página 1de 6

ADO - Localizando informaes

Vamos comear este novo milnio tratando de um assunto que creio vai interessar muita gente - Como localizar informaes usando a ADO . Antes de mais nada devo informar que estou usando a verso 2.5 da ADO . Quer saber qual verso da ADO esta instalada na sua mquina ? Use a ferramenta Component Checker (Comcheck.exe). Voc pode fazer o download no endereo http://www.microsoft.com/data/download.htm . O resultado final da execuo do Component Checker e mostrado abaixo:

Naturalmente quando falamos a nvel de dados (campos e registros) estamos tratando com o objeto Recordset . Vamos ento mostrar como encontrar dados especficos em um Recordset ADO. Lembrando que um objeto Recordset possui muitas funes teis. Dentre elas podemos citar as mais usadas: bookmark , Find , Seek , Filter , etc Usando Bookmarks (marcadores). Um bookmark de um recordset como um cursor que aponta para um registro especfico dentro do Recordset identificando-o de forma nica. Fazendo uma analogia , ao ler um livro voc no costumar usar um marcador para indicar em qual pgina parou ? Sim , voc pe o marcador na pgina para quando retornar a leitura localizar com rapidez onde parou a leitura. Assim funciona um bookmark. Para us-lo em um objeto recordset as etapas so: Defina uma varivel para ser usada como marcador : Dim marcador as variant Quando desejar marcar uma posio em um recordset no registro atual usando a varivel definida acima , faa: marcador=rs.bookmark Para retornar a posio marcada no item anterior faa: rs.bookmark=marcador Mas tome cuidado , pois nem todos os registros suportam bookmarks. Para verificar se um recorset suporta bookmarks use a seguinte instruo: blnmarcador = rs.Supports(adBookmark). Assim o mtodo Supports usando o argumento adBookmark retorna TRUE se o recordset suporta bookmarks e FALSE caso no suporte.

Localizando dados com ADO


Basicamente temos dois mtodos para localizar dados em um recordset usando ADO: Find e Seek.

1- ) Usando o mtodo Find


O mtodo Find usado para encontrar um registro que contm um determinado valor em um determinado campo do registro. Voc define um critrio de busca e se o critrio satisfeito o ponteiro do registro se posiciona no registro que atendeu o critrio, se o critrio no foi atendido o ponteiro se posiciona no fim do recordset. A sintaxe a seguinte:

Find (criteria, SkipRows, searchDirection, start)


Parametros criteria - Uma String contendo o nome da coluna , o operador de comparao e o valor que desejamos localizar.

Exemplos de strings de busca: "FornecedorID >= 7" "DataPedido = #09/10/1997#" "Codigo > 7" "Nome = '" & variavel & "'" Lembrando que os valores strings devem vir entre aspas simples ('Joao') e as datas devem estar iniciadas e terminadas com o smbolo (#). SkipRows Define o deslocamento da linha atual ou o bookmark padro para iniciar a busca. O padro comear na linha atual e terminar na ltima linha searchDirection Indica a direo em que o recordset procurado. Os valores podem ser: adSearchForward ou adSearchBackward - A busca ir cessar no nicio ou no fim do recordset dependendo destes valores. Se a busca iniciada para frente e nada for encontrado o cursor do recordset definido para alm do ltimo registro e a propriedade EOF (End Of File) retorna TRUE. J se a busca feita para trs e nada for achado o cursor definido para alm do incio do arquivo e a propriedade BOF (Beginning OF File) retorna TRUE. start Define um bookmark de incio para a busca. OBS : Se voc no definir a posio do cursor na linha atual quando for iniciar a busca ir ocorrer um erro. Por isso antes de usar o mtodo Find voc pode mover o cursor para o inicio do arquivo usando o mtodo MoveFirst . Exemplo prtico: Vamos mostrar em um exemplo prtico como usar o mtodo Find. Inicie um novo projeto no VB e antes de qualquer coisa faa uma referncia a biblioteca ADO na opo do menu Project | References , como na figura abaixo:

A seguir insira o seguinte cdigo no projeto:


Dim cnn As Ne w ADO DB.conne ction Dim rst As Ne w ADO DB.R e cordse t Private Sub Form_Load() Dim crite rio As String 'Abre a cone x o cnn.O pe n "Provide r=Microsoft.Je t.O LEDB.3.51;Data Source =C :\te ste \Northwind.m db;" 'Abre o R e cordse t rst.C ursorLocation = adUse C lie nt rst.O pe n "Se le ct * From Supplie rs", cnn, adO pe nKe yse t, adLock O ptim istic, adC m dTe x t

'm ove -se para o prim e iro re gistro rst.Move First ' de fine o crite rio para busca crite rio = "C ountry Lik e 'A%'" ' inicia busca no re cordse t rst.Find criterio, 0, adSearchForward ' pe rcorre o re cordse t ate o se u final W hile Not rst.EO F De bug.Print rs("C om panyNam e ") m arcador = rst.Book m ark rs.Find crite rio, 1, adSe archForward, m arcador W e nd End Sub Vam os e x plicar passo a passo: 1-) Dim cnn As Ne w ADO DB.conne ction Dim rst As Ne w ADO DB.R e cordse t De fine as varive is obje tos usada para a cone x o e para o obje to R e cordse t 2-) Abre a cone x o cnn.O pe n "Provide r=Microsoft.Je t.O LEDB.3.51;Data Source =C :\te ste \Northwind.m db;" Abrim os um a cone x o usando o prove dor - Microsoft.Jet.OLEDB.3.51 e o Data Source - C :\te ste \Nortwind.m db 3-) Abre o R e cordse t rst.C ursorLocation = adUse C lie nt rst.O pe n "Se le ct * From Supplie rs", cnn, adO pe nKe yse t, adLock O ptim istic, adC m dTe x t De finim os o tipo de cursor usado , no caso usam os o cursor do lado do clie nte - AdUse C lie nt e abrim os um re cordse t com os parm e tros A dOpenKeySet - Pe rm ite a alte rao e adLockOptimistic - usa o bloque io pe ssim ista (m ant m o bloque io at usar o m todo para atualizar) 4-) ' de fine o crite rio para busca crite rio = "C ountry Lik e 'A%'" ' inicia busca no re cordse t rst.Find criterio, 0, adSearchForward De finim os o crit rio para busca e iniciam os a busca usando o m todo Find usando os parm e tros : sk iprows =0 , e adSe archForward - busca do nicio para o fim . 5-) W hile Not rst.EO F De bug.Print rs("C om panyNam e ") m arcador = rst.Book m ark rs.Find crite rio, 1, adSe archForward, m arcador W e nd Pe rcorre m os o re cordse t , im prim indo o cam po - CompanyName - e se posicionando a partir do book m ark ante rior com avano de um 1 re gistro para fre nte a partir do book m ark - marcador. Note que usam os o book m ark para arm aze nar a posio atual do re gistro e usam os e sta posio inicial para a prx im a busca.

1- ) Usando o mtodo Seek


O mtodo Seek permite a procura em uma coluna. Ele s encontra os valores iguais ao valor da procura e vai precisar de um provedor de dados que permita a utilizao da propriedade Index e o mtodo Seek. (Nem todos os provedores permitem). Alm disso o mtodo Seek vai requerer um cursor do lado do servidor . Atualmente , somente alguns provedores permitem usar a propriedade Index e o mtodo Seek do objeto Recordset para procurar por valores em um ndice de uma tabela. O provedor OLE DB - Provider for Microsoft Jet 4.0 - que usado para se conectar a um banco de dados access permite a utilizao do mtodo Seek.. Para verificar se o provedor suporta a propriedade Index e o mtodo Seek podemos usar o mtodo Supports com os parmetros adIndex e adSeek. Veja o exemplo abaixo:
If rs.Supports(adInde x ) the n m sgbox "Este Prove dor suporta a proprie dade Inde x " e ndif If rs.Supports(adSe e k ) the n m sgbox "Este Prove dor suporta a proprie dade Se e k " e ndif

Voc deve ter o cuidado de definir a propriedade Index assim que o Recordset for aberto para depois usar o mtodo Seek. A propriedade Index indica o nome do ndice que estar ativo. Assim , supondo que voc possua uma tabela chamada clientes e que queira fazer uma busca pela coluna Nome da tabela, vai precisar definir um ndice para esta coluna na tabela dando a ele um nome. O nome do ndice pode ser o mesmo nome da coluna . Para o nosso caso poderamos ter criado um ndice chamado Nome. (Voc poderia ter usado qualquer outro nome para definir o ndice.) Teriamos ento: rs.index = "nome " Em muitos casos quando voc usa um campo autonumerao no Access e define este campo como uma chave primria, o ndice PrimaryKey ser criado para esta coluna da tabela. Ento se for usar esta coluna para fazer uma busca usando o Seek , dever usar a sintaxe: rs.Index = "PrimaryKey" Depois que a propriedade Index foi definida para o nome do ndice existente na tabela, podemos usar o mtodo Seek para procurar na coluna desejada. Quando o mtodo seek encontrar o registro desejado o ponteiro ir se posicionar neste registro. Se nada for encontrado o ponteiro o ponteiro definido para EOF. A sintaxe a seguinte:

rs.Seek Array(ValordaColuna)
Aqui voc deve tomar cuidado. Como um ndice pode ser constitudo de uma ou mais colunas , o termo ValordaColuna - indica os valores da coluna. Vamos supor que voc quer tem uma tabela de clientes com um campo CodigoID definido como chave primria , que voc quer fazer procurar pelo cliente cujo cdigo seja igual 120. Voc dever procurar pelo valor 120 na coluna CdigoID e dever fazer:

rs.index="PrimaryKey" rs.Seek Array(120)


Se o ndice possuir mais de uma coluna , voc dever informar no vetor (array) os valores de todas as colunas contidas no ndice.Por exemplo, se uma tabela pedidos possuir um ndice chamado - Primarykey - e for constitudo pelos campos codigopedido e codigoproduto da tabela , ao usar o mtodo Seek para procurar pelo pedido cujo cdigo seja igual a 23 e cdigo de produto igual a 50 voc dever fazer:

rs.index="PrimaryKey" rs.Seek Array(23,50)


Vejamos agora um exemplo completo usando a propriedade Index e o mtodo Seek : Neste exemplo usaremos o banco de dados Northwind.mdb e a tabela Funcionrios. A estrutura e os ndices criados so dados abaixo:

Iremos usar o ndice chave Primria - CdigoDoFuncionrio - para localizar o funcionrio e exibir o seu nome. O projeto usar um formulrio , uma caixa de texto e um boto de comando ( ver figura abaixo).

Defina as variveis objeto na seo General Declarations:


Dim cnn As Ne w ADO DB.conne ction Dim rst As Ne w ADO DB.R e cordse t

O cdigo do boto de comando segue abaixo:


Private Sub Command1_Click() If Te x t1.Te x t = "" The n MsgBox " Inform e um valor para busca " Ex it Sub End If 'Abre a cone x o cnn.O pe n "Provide r=Microsoft.Je t.O LEDB.4.0;Data Source =C :\te ste \Northwind.m db;" 'Abre o R e cordse t rst.C ursorLocation = adUse Se rve r rst.O pe n "Funcionrios", cnn, adO pe nKe yse t, adLock R e adO nly, adC m dTable Dire ct If rst.Supports(adInde x ) And rst.Supports(adSe e k ) The n rst.Inde x = "C digoDoFuncionrio" rst.Move First rst.Seek A rray(CLng(Text1.Text)) If rst.EO F The n MsgBox "Funcionrio no localizado" Else MsgBox rst("C digoDoFuncionrio") & " - " & rst("nom e ") & vbC rLf End If Else MsgBox " O prove dor utilizado no suporta : Inde x e Se e k " End If Fe cham os a cone x o e o re cordse t rst.C lose cnn.C lose Se t rs = Nothing Se t cnn = Nothing End Sub

Observe que antes de iniciar a busca verificamos se o provedor suporta a utilizao de Index e de Seek . Se o mtodo Supports novo para voc , vou dar uma canja.... Voc pode usar o mtodo Supports com as seguintes constantes: Constante
adA ddNew adA pproxPosition adBookMark adDelete A dHoldRecords adResync adUpdate adUpdateBatch

Utilizao
Verifica se novos registros podem ser adicionados Verifica se as propriedades: A bsolutePage e A bsolutePosition esto disponveis Verifica se podemos usar um marcador no Recordset Verifica se os registros podero ser excludos Verifica se podemos recuperar os registros sem submeter as alteraes Verifica se o mtodo Resynd esta disponvel Verifica se o conjunto de registros permite a atualizao Verifica se o recordset permite a atualizao em lote - via UpdateBatch

Bem , vou ficando por aqui...

(terminei o artigo...)