AUTO FILTRO NO FLEXGRID

GESSINGER 24/03/2011 11:01:08
#369023
Fala ai amigos, como colocar um Auto Filtro no evento chage do meu txtFiltro
isso num Flex grid.
Ex: ao digitar as primeiras letras el ja ir aparecendo o dados q começam com a letra.

Vou postar meu projetinho ai , agradeço desde ja
EWERTONESTACIO 24/03/2011 11:25:26
#369028
Fala brother,

eu fiz isso a algum tempo olha o fonte:

******************************************* funções **************************
Public Sub montaGridPublic(ByRef Grid As MSFlexGrid, ByRef rs As ADODB.Recordset)
Dim C, R, Max_Row, Max_Wid, Wid, Coluna, Linha As Long
Dim conta As Long
Grid.Clear



Grid.Rows = 1
Grid.Cols = rs.Fields.Count

[ô] For Coluna = 0 To rs.Fields.Count - 1
[ô] Grid.ColAlignment(Coluna) = vbCenter
[ô] Grid.TextMatrix(0, Coluna) = rs.Fields(Coluna).Name
[ô] Grid.col = Coluna
[ô] Grid.CellFontBold = True
[ô] [ô]If Max_Wid < Wid Then Max_Wid = Wid
[ô] [ô] Grid.ColWidth(C) = Max_Wid + 240
[ô]
[ô]
[ô] Next

For Coluna = 0 To rs.Fields.Count - 1
[ô]Grid.BackColorBkg = vbBlackness
Grid.ColAlignment(Coluna) = vbCenter
Grid.TextMatrix(0, Coluna) = rs.Fields(Coluna).Name
Grid.col = Coluna
Grid.CellFontBold = True
Grid.Font.Size = 9
Grid.CellBackColor = COR_CINZA

Next

Grid.Rows = rs.RecordCount + 1

[ô]Grid.Rows = rs.RecordCount + 1
[ô]Grid.Cols = rs.Fields.Count - 1
If Grid.Rows > 1 Then

Grid.row = 1
Grid.col = 0
Grid.RowSel = Grid.Rows - 1
Grid.ColSel = Grid.Cols - 1


Grid.Clip = rs.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString)

For Linha = 1 To rs.RecordCount
If Linha Mod 2 = 0 Then

For Coluna = 0 To Grid.Cols - 1
Grid.row = Linha
Grid.col = Coluna
Grid.CellFontBold = True
Grid.CellForeColor = COR_TEXTO
Grid.CellBackColor = COR_AZUL2
DoEvents
Next

Else
For Coluna = 0 To Grid.Cols - 1
Grid.row = Linha
Grid.col = Coluna
Grid.CellFontBold = True
Grid.CellForeColor = COR_TEXTO
Grid.CellBackColor = COR_AZUL1
DoEvents

Next
End If
Next

End If

*********************************************************************
Sub resizeGrid(ByRef Grid As MSFlexGrid)
Dim C, R, Max_Row, Wid, Max_Wid As Long

Grid.row = 0
For C = 0 To Grid.Cols - 1
Grid.col = C
Grid.CellFontBold = True
Next

Max_Row = Grid.Rows - 1
For C = 1 To Grid.Cols - 1
Max_Wid = 0
For R = 0 To Max_Row
Wid = TextWidth(Trim(Grid.TextMatrix(R, C)))
If Max_Wid < Wid Then Max_Wid = Wid
Next R
Grid.ColWidth(C) = Max_Wid + 240
Next C
End Sub


******************* fim funções ****************************************





Private Sub txtNome_Change()
On Error GoTo trata_erro


txtNome.Text = Replace(txtNome, [Ô][ô][Ô], [Ô]'[Ô])
STRSQL = [Ô]SELECT ID_CLI as ID , NOME_CLI as CLIENTE FROM TBL_CLIENTE WHERE 1=1 [Ô]

If Len(Trim(txtNome.Text) & [Ô][Ô]) <> 0 Then
STRSQL = STRSQL + [Ô]AND NOME_CLI LIKE [ô]%[Ô] & Trim(txtNome.Text & [Ô]%[ô][Ô])
End If

STRSQL = STRSQL + [Ô] ORDER BY NOME_CLI[Ô]

rsNh.Open STRSQL, conNh, adOpenStatic, adLockReadOnly
Call montaGridPublic(MSFlexGrid1, rsNh)
Call resizeGrid(MSFlexGrid1)

txtNome.Enabled = True
[ô]Screen.ActiveControl.SelLength
rsNh.Close
Set rsNh = Nothing
busy = False

End If
Exit Sub
trata_erro:

Call trataErro(Erro)
txtNome.Enabled = True
Set rsNh = Nothing
End Sub



Explicação:
Aqui eu uso um TextBox para fazer uma busca dinâmica e povoar um MSFlexGrid



Agora ficou fácil \o/


Forte abraço




GESSINGER 24/03/2011 11:35:25
#369030
pra fazer isso precisa de tanto codigo assim, com o data grid eu faço em duas linhas
EWERTONESTACIO 24/03/2011 11:43:42
#369032
sim sim ... é verdade , mas assim acho mais limpo.. pois não acho mto legal deixar uma conexão persistente entre o obj e a base de dados.
vlw
GESSINGER 24/03/2011 14:06:27
#369048
tem como vc adaptar isso ao meu projeto ?
SACOFRITO 24/03/2011 15:55:03
#369064
nao sei se entendi diroeito, mas quando quero ir buscando registros conforme esta sendo digitado, coloco a rotina de preenchimento do grid no evento change do textbox..

select * from tabela where descricao like [ô] [Ô] & txt1 & [Ô]*[ô] bla bla bla

Mas como o nosso amigo no outro topico falou, se tiverem muitos registros a serem exibidos, fica meio lento. Mas funciona. Uso essa rotina num cadastro de clientes com 5 mil registros, a lentidao é bem baixa...
MARCELO.TREZE 24/03/2011 17:33:35
#369071
Resposta escolhida
assim colega


Private Sub txtNome_Change()
If rs.State = 1 Then rs.Close
rs.Open [Ô]Select * from Fiados where nome like [ô][Ô] & txtNome.Text & [Ô]%[ô][Ô], conex, adOpenKeyset, adLockOptimistic
With GridDados
.Rows = 1
Do While Not rs.EOF
.Rows = .Rows + 1
.TextMatrix(.Rows - 1, 0) = rs!id & [Ô][Ô]
.TextMatrix(.Rows - 1, 1) = rs!Nome & [Ô][Ô]
.TextMatrix(.Rows - 1, 2) = rs!Produto & [Ô][Ô]
.TextMatrix(.Rows - 1, 3) = rs!Preco & [Ô][Ô]
.TextMatrix(.Rows - 1, 4) = Format(rs!Data & [Ô][Ô], [Ô]##/##/####[Ô])
.TextMatrix(.Rows - 1, 5) = rs!Status & [Ô][Ô]
rs.MoveNext
Loop
End With
End Sub

SACOFRITO 24/03/2011 17:35:49
#369073
O Marcelo detalhou mais o que eu disse.
Tópico encerrado , respostas não são mais permitidas