Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diógenes Pacheco

Objeto Recordset no Access VB - Problema com o FindFirst

Recommended Posts

Oi galera!

 

Seguinte:

 

Estou desenvolvendo uma rotina dentro de um banco de dados em Access, aqui, e me encrenquei na utilização de um "findfirst".

Em uma das funções, ele funciona perfeitamente dentro da seguinte lógica:

 

Dim RS as RecordSet

Set RS = CurrentDB.OpenRecordset("Tabela Clientes")

 

...

 

Dim CPF

...

 

RS.FindFirst "CPF = '" & CPF & "'"

If RS.Nomatch = true then

...

Já em outro, com comandos iguais e uma tabela diferente utilizada, ele não funciona. Já olhei as propriedades do campo e ele está indexado, direitinho, como no que funciona. Mas o Access me retorna o erro "Erro em tempo de execução '3251': Operação não suportada para este tipo de objeto."

 

Já quebrei minha cabeça aqui e não consegui solucionar. A alternativa que eu saberia fazer era utilizar algo como:

 

RS.Movefirst

Do Until RS.Fields("Agência") = AGE

RS.MoveNext

Loop

Mas como se tratam de tabelas enormes, essa procura registro por registro torna a rotina demorada ao nível do impraticável.

 

Alguém sabe me dar a dica para fazer o movefirst funcionar (me dizer o porquê não funciona em uma tabela e em outra funciona), ou alguma alternativa que seja tão ágil quanto?

 

 

Obrigado!

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, sempre responde por aqui mesmo para que ao surgirem outras pessoas com a mesma dúvida possam achar nesse tópico a solução.

 

Tenta uma maneira diferente de realizar a procura no BD. Utiliza diretamente SQL:

Set RS = db.OpenRecordset("select * From tabela where campo = '" & valor & "'")

Uma dica para você, migre para ADO com SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, sempre responde por aqui mesmo para que ao surgirem outras pessoas com a mesma dúvida possam achar nesse tópico a solução.Tenta uma maneira diferente de realizar a procura no BD. Utiliza diretamente SQL:

Set RS = db.OpenRecordset("select * From tabela where campo = '" & valor & "'")
Uma dica para você, migre para ADO com SQL.
Vou ver se isso resolve. De qualquer forma, não sei utilizar o SQL. Quais são os comandos básicos?Partindo deles, e com a ajuda off-line do próprio Access, talvez consiga ir adiante.Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diógenes,Veja esse artigo procurando no Banco de Dados:Procurando no Banco de Dados (Find - FindFirst - FindNext) - DAO & ADO(DAO)No DAO, exite o comando FindFirst que faz a procura a partir do início da tabela, achando a primeira ocorrencia daquilo a que está sendo procurado. 'Abre o Recordset e então:Dim sArg as StringsArg = InputBox ("Por favor, digite o Nome do " &_ "Cliente:", "Localizar Nome")'P/ procurar EXATAMENTE o que foi digitado:RS.FindFirst "NomeCliente = '" & sArg & "'"'P/ procurar algum nome que COMECE com o que'foi digitado:RS.FindFirst "NomeCliente like '" & sArg & "*'"'P/ procurar algum nome que TERMINE com o que'foi digitado:RS.FindFirst "NomeCliente like '*" & sArg & "'"'P/ procurar algum nome que tenha o que foi'digitado em qualquer parte (inicio/meio/fim):RS.FindFirst "NomeCliente like '*" & sArg & "*'"If RS.NoMatch then 'Nenhum registro foi encontrado.Else 'Foi encontrado um registro.EndifBom, se algum registro tiver sido encontrado, você poderá pesquizar a próxima ocorrencia (próximo registro que contenha aquele valor procurado no campo que se está sendo feita a pesquiza), usando o comando FindNext: RS.FindNext "NomeCliente = '" & sArg & "'"'Ou:RS.FindNext "NomeCliente like '" & sArg & "*'"'Ou:RS.FindNext "NomeCliente like '*" & sArg & "'"'Ou:RS.FindNext "NomeCliente like '*" & sArg & "*'"If RS.NoMatch then 'Nenhum registro foi encontrado.Else 'Foi encontrado um registro.EndifBem, a única coisa que você precisa saber para usar os comandos FindFirst, FindLast, FindNext e FindPrevious, é que o FindFirst faz a procura SEMPRE a partir do início da tabela, que o FindLast faz a procura SEMPRE a partir do fim da tabela e os outros dois (FindNext e FindPrevious) fazem a procura SEMPRE a partir do ponto da tabela em que estão.(ADO)No ADO não existe os comandos FindFirst, FindLast, FindNext e FindPrevious, mas existe o comando Find. Usando este comando (Find) você não poderá usar o RS.NoMatch, pois ele não trabalha desta forma. Mas como eu posso fazer procuras do tipo "achar a primeira ocorrencia", "achar a próxima ocorrencia" e etc na minha tabela, sendo que eu só tenho o comando Find??? Bem, veja a sintaxe que você irá entender:RS.Find "[Campo] = [Valor]", [skipRows], [Tipo]Partes da sintaxe:[Campo] => Campo do banco de dados. O nome deve ser IDENTICO ao que está no banco de dados.[Valor] => Aquilo que se está procurando.[skipRows] => Valor entre 0 e 1. Depende do tipo de procura que está sendo feita.[Tipo] => Constante que indica como a procura deverá ser feita.Veja esta tabela para saber o que colocar em [skipRows] e em[Tipo] conforme a sua procura:Método DAO ADO-SkipRows ADO - Search directionFindFirst 0 adScarchForward (se não estiver posicionado no primeiro registro, execute o MoveFirst antes do Find)FindLast 0 adScarchBackward (se não estiver posicionado no último registro, execute o MoveLast antes do Find)FindNext 1 adScarchForward FindPrevious 1 adScarchBackward Veja um exemplo de FindFirst no ADO usando o comando Find: 'Abre o Recordset e então:Dim sArg as StringRS.MoveFirst '<<<- MUITO importante!!!sArg = InputBox ("Por favor, digite o Nome do " &_ "Cliente:", "Localizar Nome")'P/ procurar EXATAMENTE o que foi digitado:RS.Find "NomeCliente = '" & sArg & "'", adSearchForward'P/ procurar algum nome que COMECE com o que'foi digitado:RS.Find "NomeCliente like '" & sArg & "*'", adSearchForward'P/ procurar algum nome que TERMINE com o que'foi digitado:RS.Find "NomeCliente like '*" & sArg & "'", adSearchForward'P/ procurar algum nome que tenha o que foi'digitado em qualquer parte (inicio/meio/fim):RS.Find "NomeCliente like '*" & sArg & "*'", adSearchForwardIf RS.EOF Then 'Nenhum registro foi encontrado.Else 'Foi encontrado um registro.EndifBem, seguindo essa filosofia, veja:'FindLast:RS.Find "NomeCliente like '" & sArg & "'", adScarchBackward'FindNext:RS.Find "NomeCliente like '" & sArg & "'", 1, adSearchForward'FindPrevious:RS.Find "NomeCliente like '" & sArg & "'", 1, adScarchBackwardÉ isso... Bom proveito!!! 8^)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alissong, Luizgrs,

 

O artigo foi bem explicativo. Não sabia utilizar o método FIND, só os comandos Findfirst, findnext, findlast e findprevious.

De qualquer forma, o problema maior que eu tinha era o erro, e ele se resolveu ao mudar a chamada do arquivo de Set RS = Currentdb.openrecordset("Tabela Clientes") para Set RS = Currentdb.Openrecordset("Select * from Tabela Clientes").

 

Confesso que não entendi porque de uma forma funcionava e da outra não, já que, ao que me parece, os dois comandos fazem exatamente a mesma coisa. (Pelo jeito, nem tão exatamente assim.)

 

Obrigado pela força!

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.