FILTRANDO LISTVIEW AO DIGITAR

ALANTB 14/04/2015 08:25:17
#445902
Olá, tenho um listview que está carregando os nomes de funcionários conforme critérios da query sql. Na medida em que se digita caracteres em um textbox ele também filtra os nomes dos funcionários. O problema que estou enfrentando é que se o usuário para de digitar e resolve apagar os caracteres já digitados com BACKSPACE , para iniciar uma nova sequência de digitação, o listview era para carregar os funcionários conforme a string sql. Mas, ao limpar o txt ele carrega TODOS os funcionários da tabela de funcionários ignorando os critérios do select da query sql. Somente volta a carregar normalmente quando fecho e abro novamente o form. Para melhor verificação segue o código que estou usando(vb6/access2007):

AQUI CARREGA O LISTVIEW:

Public Sub ListaClientes()
Dim rs As New ADODB.Recordset

[ô]limpa o cabeçalho
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear

[ô]define a conexão e abre o Recordset com os dados da tabela Clientes
With rs
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.CacheSize = 50

.Source = [Ô]SELECT tbContrato.codMatricula, tbFunc.Nome, tbFunc.codFunc, tbContrato.codFunc [Ô] & _
[Ô]FROM tbFunc INNER JOIN tbContrato ON tbFunc.codFunc = tbContrato.codFunc [Ô] & _
[Ô]WHERE tbContrato.codFuncao=2 Or tbContrato.codFuncao=3[Ô] [ô] ao limpar o txt ele ignora esse critério.

Debug.Print
.ActiveConnection = conn
.Open
End With

[ô]Cria o cabeçalho do controle ListView
ListView1.ColumnHeaders.Add , , [Ô]Código[Ô], 900, lvwColumnLeft
ListView1.ColumnHeaders.Add , , [Ô]Nome[Ô], 3550, lvwColumnLeft


[ô]Preenche o controle listview com os dados da tabela
Dim i As Integer
For i = 0 To rs.RecordCount - 1
Set LIClientesID = ListView1.ListItems.Add(, [Ô]A[Ô] & rs(0), rs(0))
If Not IsNull(rs(0)) Then
LIClientesID.SubItems(1) = [Ô][Ô] & rs!Nome


End If
rs.MoveNext
Next i

[ô]fecha o recordset e libera a variável
rs.Close
Set rs = Nothing
End Sub

PARA FILTRAR:

Private Sub txtProcurar_Change()
Dim sql As String
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear


sql = [Ô]SELECT tbContrato.codMatricula,tbFunc.Nome, tbContrato.codFuncao [Ô] & _
[Ô]FROM tbFunc INNER JOIN tbContrato ON tbFunc.codFunc = tbContrato.codFunc [Ô] & _
[Ô]where tbFunc.nome like [ô][Ô] & txtProcurar.Text & [Ô]%[ô][Ô]

ListaClientes1 (sql)

End Sub

Public Sub ListaClientes1(sql As String)
Dim rstClientes1 As New ADODB.Recordset

[ô]limpa o cabeçalho
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear

[ô]define a conexão e abre o Recordset com os dados da tabela Clientes
Set rstClientes1 = New ADODB.Recordset

With rstClientes1
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.CacheSize = 50
.Source = sql
.ActiveConnection = conn
.Open
End With

[ô]Cria o cabeçalho do controle ListView
ListView1.ColumnHeaders.Add , , [Ô]Matrícula[Ô], 900
ListView1.ColumnHeaders.Add , , [Ô]Nome[Ô], 4400, lvwColumnLeft


[ô]Preenche o controle listview com os dados da tabela
Dim i As Integer
For i = 0 To rstClientes1.RecordCount - 1
Set LIClientesID = ListView1.ListItems.Add(, [Ô]A[Ô] & rstClientes1(0), rstClientes1(0))
If Not IsNull(rstClientes1(0)) Then
LIClientesID.SubItems(1) = rstClientes1(1) [ô]nome


End If
rstClientes1.MoveNext
Next i

[ô]fecha o recordset e libera a variável
rstClientes1.Close
Set rstClientes1 = Nothing

End Sub
LUIZCOMINO 14/04/2015 11:28:22
#445904
se fizer assim não resolve?

if  len(txtProcurar.Tex) =0 then 
ListView1.ListItems.Clear
else
sql = [Ô]SELECT tbContrato.codMatricula,tbFunc.Nome, tbContrato.codFuncao [Ô] & _
[Ô]FROM tbFunc INNER JOIN tbContrato ON tbFunc.codFunc = tbContrato.codFunc [Ô] & _
[Ô]where tbFunc.nome like [ô][Ô] & txtProcurar.Text & [Ô]%[ô][Ô]

ListaClientes1 (sql)
end if
OMAR2011 14/04/2015 12:08:40
#445908
Resposta escolhida
ALANTB, pela seu post tem que colocar condição para o preenchimento desejado.

Private Sub txtProcurar_Change()
Dim sql As String
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear

If Trim(txtProcurar.Text) = [Ô][Ô] Then
ListaClientes
Exit sub
Else
sql = [Ô]SELECT tbContrato.codMatricula,tbFunc.Nome, tbContrato.codFuncao [Ô] & _
[Ô]FROM tbFunc INNER JOIN tbContrato ON tbFunc.codFunc = tbContrato.codFunc [Ô] & _
[Ô]where tbFunc.nome like [ô][Ô] & txtProcurar.Text & [Ô]%[ô][Ô]

ListaClientes1 (sql)
End if

End Sub

é mais ou menos assim.
ALANTB 14/04/2015 21:22:28
#445930
OMAR2011, funcionou perfeitamente..é isso mesmo que eu precisava. Vou encerrar!!!!
Tópico encerrado , respostas não são mais permitidas