Logo Hardware.com.br
Depoisteconto
Depoistecont... Geek Registrado
1.5K Mensagens 447 Curtidas

Filtro dentro do Listview

#1 Por Depoistecont... 26/05/2014 - 13:45
Boa tarde!

Carrego dados no listview de uma base de dados access.

Como filtrar dentro do listview em uma coluna com nomes, de acordo com o que for digitado em um textbox.

A idéia é trabalhar no evento change do textbox e que tenha uma função tipo LIKE.

Alguém? de_olho.gif

At
Depoisteconto
Depoistecont... Geek Registrado
1.5K Mensagens 447 Curtidas
#3 Por Depoistecont...
26/05/2014 - 17:17
Basole disse:
Baixe este modelo no link, acho que faz isso que vc. quer:

http://zip.net/bcnvrD


Basole, obrigado pela resposta.

Já tinha visto esse trabalho. Na verdade não se aplica a minha idéia pois ele pesquisa na planilha.

Os dados da minha aplicação estão no access e eu uso uma query sql para carregá-los até o listview.

Em tese, eu poderia reorientar essa consulta no banco a cada letra digitada, mas fica inviável.

Não sei como fazer um with dentro do listview recompondo a lista de acordo com o texto digitado no textbox.

A pesquisa continua, se souber outra posta ae.boa.gif

At
“O Estado não é uma ampliação do círculo familiar”, HOLANDA, Sérgio Buarque, Raízes do Brasil, 1936



Slugman
Slugman Super Participante Registrado
415 Mensagens 113 Curtidas
#5 Por Slugman
27/05/2014 - 09:58
Executar a query toda vez vai deixar seu código pesado. A melhor alternativa é voce rodar a query uma vez e adicionar esses dados em um array. Dessa maneira voce roda a query uma só vez no evento Initialize do userform e o array com todo seu conteudo ficará disponivel a todo momento.

Ai, dentro do Change do textbox voce coloca um codigo que verifica se o valor do textbox é igual a cada valor do array.

Parece meio complicado mas não é. Procure o método GetRows, pois ele retorna um array com o resultado da Query em vez de colar esse resultado com o CopyFromRecordSet.

Caso precise de mais ajuda posta ai. Tenho uma planilha aqui que faz exatamente isso. Ela faz a alegria dos nossos Contadores.
Phenom 965|M4A79-T|Corsair Force 2 80gb|Zotac GTX 660|Corsair VX 550|CoolerMaster CM690
Depoisteconto
Depoistecont... Geek Registrado
1.5K Mensagens 447 Curtidas
#6 Por Depoistecont...
27/05/2014 - 12:03
Basole disse:
Nao sei se ja baixou este modelo...enfim, utiliza o like p/ pesquisar no bd mdb:

http://www.sendspace.com/file/eh5scy

abrxxx.


Boa contribuição. É como eu tinha dito, em tese é reorientar a consulta, mas adicionando o LIKE. Resolve o problema? Sim, mas quero ver algo mais rápido.

Imagine, filtrar entre 10mil registros ou entre 10.

Obrigado.

At

Slugman disse:
Executar a query toda vez vai deixar seu código pesado. A melhor alternativa é voce rodar a query uma vez e adicionar esses dados em um array. Dessa maneira voce roda a query uma só vez no evento Initialize do userform e o array com todo seu conteudo ficará disponivel a todo momento.

Ai, dentro do Change do textbox voce coloca um codigo que verifica se o valor do textbox é igual a cada valor do array.

Parece meio complicado mas não é. Procure o método GetRows, pois ele retorna um array com o resultado da Query em vez de colar esse resultado com o CopyFromRecordSet.

Caso precise de mais ajuda posta ai. Tenho uma planilha aqui que faz exatamente isso. Ela faz a alegria dos nossos Contadores.


Essa é a sintaxe sugerida:

[code=rich]
array = recordset.GetRows(Rows, Start, Fields )
[/code]

Assim eu carrego o listview:

[code=rich]
Dim Conect As New Classeconexao
Dim Banco As ADODB.Recordset
Dim SQL As String

Set Banco = New ADODB.Recordset

sql = " SELECT * FROM Cadastro "
sql = sql & " WHERE Empresas = '" & Me.Empresa.Text & "'"

Conect .Conectar

With Banco
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.Source = SQL
.ActiveConnection = Conect.Conn
.Open
End With

While Not banco.EOF

'Preenche o listview...

banco.MoveNext
Wend

Set Banco = Nothing

cx.Desconectar
[/code]

Como consigo gravar o recordset para depois utilizá-lo em outras consultas rápidas?

A variável do array precisa ser pública?

Obrigado.

At
“O Estado não é uma ampliação do círculo familiar”, HOLANDA, Sérgio Buarque, Raízes do Brasil, 1936



Slugman
Slugman Super Participante Registrado
415 Mensagens 113 Curtidas
#7 Por Slugman
27/05/2014 - 12:25
Na primeira linha do programa voce declara uma variavel Variant que vai carregar o resultado da sua query:

Private aContas() As Variant

Depois, nesse pedaço de código que voce postou, antes desse While... se esse código for uma função que voce chama, voce deve criar um array e retornar esse array como resultado:

Dim aDados() As Variant
aDados = Banco.GetRows
MeuProgramaQueRodaAQuery = aDados

Caso voce faça tudo no mesmo programa, apenas atribua o recordset ao array criado no inicio:

aContas = Banco.GetRows

Nesse ponto, voce pode fechar a conexão com o banco mas seu listview ainda não possui itens. Voce precisa fazer um loop por esse array aContas e preenche-lo, e depois chamar o Form.

A partir dai, sempre que o Change do seu textbox for chamado voce apaga toda a listview e refaz o loop pelo array comparando pra ver se atende sua condição, ou seja, toda vez que disparar o Change o form vai recarregar o listview. Como o conteudo vai estar guardado no array, voce não vai precisar rodar a query outra vez.

Apenas uma dica. Identifique na query apenas os campos que voce realmente quer que aparecem, pois selecionando todos os campos a query fica mais lenta e dá mais trabalho de manipular na hora de popular a listview.

Tenta ver se isso ajuda. Qualquer coisa vai postando que eu te ajudo a montar o código.
Phenom 965|M4A79-T|Corsair Force 2 80gb|Zotac GTX 660|Corsair VX 550|CoolerMaster CM690
Depoisteconto
Depoistecont... Geek Registrado
1.5K Mensagens 447 Curtidas
#9 Por Depoistecont...
03/06/2014 - 14:09
Slugman disse:
Na primeira linha do programa voce declara uma variavel Variant que vai carregar o resultado da sua query:

Private aContas() As Variant

Depois, nesse pedaço de código que voce postou, antes desse While... se esse código for uma função que voce chama, voce deve criar um array e retornar esse array como resultado:

Dim aDados() As Variant
aDados = Banco.GetRows
MeuProgramaQueRodaAQuery = aDados

Caso voce faça tudo no mesmo programa, apenas atribua o recordset ao array criado no inicio:

aContas = Banco.GetRows

Nesse ponto, voce pode fechar a conexão com o banco mas seu listview ainda não possui itens. Voce precisa fazer um loop por esse array aContas e preenche-lo, e depois chamar o Form.

A partir dai, sempre que o Change do seu textbox for chamado voce apaga toda a listview e refaz o loop pelo array comparando pra ver se atende sua condição, ou seja, toda vez que disparar o Change o form vai recarregar o listview. Como o conteudo vai estar guardado no array, voce não vai precisar rodar a query outra vez.

Apenas uma dica. Identifique na query apenas os campos que voce realmente quer que aparecem, pois selecionando todos os campos a query fica mais lenta e dá mais trabalho de manipular na hora de popular a listview.

Tenta ver se isso ajuda. Qualquer coisa vai postando que eu te ajudo a montar o código.


A rotina que carrega o Listview é uma Sub que é chamada por um Combobox.

Ficou assim:

[code=rich]
Private aContas() As Variant
______________________________________

Sub CarregarListview ()

Dim Conect As New Classeconexao
Dim Banco As ADODB.Recordset
Dim SQL As String

Set Banco = New ADODB.Recordset

sql = " SELECT * FROM Cadastro "
sql = sql & " WHERE Empresas = '" & Me.Empresa.Text & "'"

Conect .Conectar

With Banco
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.Source = SQL
.ActiveConnection = Conect.Conn
.Open
End With

aContas = Banco.GetRows

While Not banco.EOF

'Preenche o listview...

banco.MoveNext
Wend

Set Banco = Nothing

cx.Desconectar
[/code]

Dá erro logo quando eu chamo a Sub.

Procedimento muito grande.

Não entendi de_olho.gif

At

joseA disse:
Veja esse link: http://www.tomasvasquez.com.br/forum/viewtopic.php?f=22&t=1422


Grande joseA, seja bem vindo!

Obrigado por responder, trata-se do mesmo exemplo do basole.

Resolve essa questão, mas procuro outra mais limpa.

Ainda está em aberto, estou lendo as sugestões e tentando entendê-las para adaptar.

At
“O Estado não é uma ampliação do círculo familiar”, HOLANDA, Sérgio Buarque, Raízes do Brasil, 1936



© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal