FILTRANDO REGISTROS NO FLEXGRID ...

XYKOVIEIRA 25/08/2011 17:15:51
#382503

Dias atrás, postei aqui no forum um código em VB6 onde precisava reorganizar o FlexGrid a cada confirmação de exclusão de arquivo.
O meu amigo Menudo passou uma dica que resolveu meu problema...
Agora, no mesmo project, preciso filtrar o FlexGrid, de acordo com o que for digitado numa textbox (evento Change).
Na atual configuração, ao digitar <Fern> na textbox, o ponteiro é posicionado no primeiro cliente <Fernando>. Até aí,
tudo bem.
Só que, abaixo de Fernando, aparecem os nomes de Francisco, Geraldo, Guilherme, José Carlos, Paulo, etc...
Ou seja, a rotina não está separando, no FlexGrid, apenas os nomes começados com <Fern>, e sim mostrando a partir
de <Fernando>.
Abaixo, as rotinas de carregamento do form, e do evento <Change> de Text1 (onde deve ser iniciada a procura por nome de cliente):

Dim Banco As Database
Dim Tabela As Recordset
------------------------------------------
Private Sub Form_Load()
Set Banco = OpenDatabase([Ô]C:\Local\Teste.mdb[Ô])
Set Tabela = Banco.OpenRecordset([Ô]Select * From Dados Order by Nome[Ô], dbOpenDynaset)
[ô]O recordset é carregado, já ordenado por nome de cliente.
GRDAgenda.Row = 0
GRDAgenda.Col = 0
GRDAgenda.Text = [Ô]Nome[Ô]
GRDAgenda.Col = 1
GRDAgenda.Text = [Ô]Telefone[Ô]
GRDAgenda.ColWidth(0) = 2500
GRDAgenda.ColWidth(1) = 1000
GRDAgenda.Width = 3800
cmdGravar.Enabled = False
Label3.Visible = False [ô]Label <Encontrar registro>
Text1.Visible = False [ô]Textbox de entrada de caracteres para posicionamento do FlexGrid.

While Not Tabela.EOF
GRDAgenda.AddItem [Ô][Ô] & Tabela.Fields([Ô]Nome[Ô]) & vbTab & Tabela.Fields([Ô]Telefone[Ô])
Tabela.MoveNext
Wend
GRDAgenda.RemoveItem GRDAgenda.RowSel [ô]Remove linha em branco antes da relação.
End Sub

-----------------------------------------------------
Private Sub Text1_Change()
Dim Localizar As String, Criterio As String
Localizar = Text1
Criterio = [Ô]Nome Like[ô][Ô] & Localizar & [Ô]*[ô][Ô]
Tabela.FindFirst Criterio
If Tabela.NoMatch = True Then
MsgBox [Ô]Você digitou: [Ô] & UCase(Localizar) & [Ô] ...[Ô]
Text1.Text = [Ô][Ô]
Exit Sub
Else
GRDAgenda.Rows = 1
While Not Tabela.EOF
GRDAgenda.AddItem [Ô][Ô] & Tabela.Fields([Ô]Nome[Ô]) & vbTab & Tabela.Fields([Ô]Telefone[Ô])
Tabela.MoveNext
Wend
GRDAgenda.ColSel = 0 [ô]Coluna 0 selecionada.
If Text1.Text = [Ô][Ô] Then GRDAgenda.ColSel = 1 [ô]Coluna 0 sem seleção.
End If
End Sub
----------------------------------------------
E aí, Menudo? Rola mais um help pro amigo aqui? (claro, não dispenso a ajuda de quem se disponha).

KERPLUNK 26/08/2011 09:08:57
#382529
Pesquise NO BANCO, ele é a fonte de dados, não o flexgrid...
XYKOVIEIRA 26/08/2011 09:30:41
#382533
Kerplunk, em primeiro lugar, agradeço pela vontade de ajudar.
Com relação ao que você falou, entendo (salvo melhor juízo) que, no evento <Change> da textbox text1, as variáveis <Localizar> e <criterio> comparam os dados digitados na textbox com a tabela/banco de dados. O flexgrid só carrega e organiza, nos campos próprios, o conteúdo da tabela, de acordo com o caracter digitado. Só que, como disse, não o faz de forma seletiva, filtrando apenas os nomes cujas letras vão sendo introduzidas na pesquisa (text1): na verdade, aponta para o primeiro nome no banco que atende ao critério de busca, mas deixa visível no flexgrid a relação de nomes que vêm após o nome selecionado...
Estou quebrando a cabeça para ver se consigo resolver essa parada ... Não sei onde o bicho pega... Derrepente, é a p... de aspas a mais, ou ainda um asterisco a menos....
MARCELO.TREZE 27/08/2011 17:14:37
#382634
chico vc está usando DAO ou ADO

deduzo que esteja usando DAO entao seria assim

Private Sub Text1_Change()
Dim Localizar As String, Criterio As String
Localizar = Text1
Criterio = [Ô]Nome Like[ô][Ô] & Localizar & [Ô]*[ô][Ô]
Tabela.FindFirst Criterio
If Tabela.NoMatch = True Then
MsgBox [Ô]Você digitou: [Ô] & UCase(Localizar) & [Ô] ...[Ô]
Text1.Text = [Ô][Ô]
Exit Sub
Else
GRDAgenda.Rows = 1
While Not Tabela.EOF
GRDAgenda.Rows = GRDAgenda.Rows + 1
GRDAgenda.TextMatrix(GRDAgenda.Rows - 1, 0) = Tabela.Fields([Ô]Nome[Ô])
GRDAgenda.TextMatrix(GRDAgenda.Rows - 1, 0) = Tabela.Fields([Ô]Telefone[Ô])
Tabela.FindNext Criterio
Wend
GRDAgenda.ColSel = 0 [ô]Coluna 0 selecionada.
If Text1.Text = [Ô][Ô] Then GRDAgenda.ColSel = 1 [ô]Coluna 0 sem seleção.
End If
End Sub
XYKOVIEIRA 27/08/2011 22:40:37
#382656

Marcelo Treze: testei exaustivamente a sua dica no meu project, mas não teve jeito.... Ao digitar na text1 (aquela do evento <change>),
o sistema travava, e só dava para sair com Ctrl + Break...
Menudo: Fiz tudo conforme vc falou. Inclusive cancelei a rotina que tinha no evento <KeyPress> da text1, trocando-a pela sua. O módulo
também foi criado. Abaixo, transcrevo as rotinas diretamente ligadas à digitação na text1:

Dim Banco As Database
Dim Tabela As Recordset

Private Sub Form_Load()
Set Banco = OpenDatabase([Ô]C:\Local\Teste.mdb[Ô])
Set Tabela = Banco.OpenRecordset([Ô]Select * From Dados Order by Nome[Ô], dbOpenDynaset)
[ô]O recordset é carregado, já ordenado por nome de cliente.
GRDAgenda.Row = 0
GRDAgenda.Col = 0
GRDAgenda.Text = [Ô]Nome[Ô]
GRDAgenda.Col = 1
GRDAgenda.Text = [Ô]Telefone[Ô]
GRDAgenda.ColWidth(0) = 2500
GRDAgenda.ColWidth(1) = 1000
GRDAgenda.Width = 3800
cmdGravar.Enabled = False
Label3.Visible = False [ô]Label <Encontrar registro>
Text1.Visible = False [ô]Textbox de entrada de caracteres para posicionamento do FlexGrid.
Label1.Visible = False
Label2.Visible = False
TXBNome.Visible = False
TXBTelefone.Visible = False
While Not Tabela.EOF
GRDAgenda.AddItem [Ô][Ô] & Tabela.Fields([Ô]Nome[Ô]) & vbTab & Tabela.Fields([Ô]Telefone[Ô])
Tabela.MoveNext
Wend
GRDAgenda.RemoveItem GRDAgenda.RowSel [ô]Remove linha em branco antes da relação.
End Sub

Private Sub Text1_Change()
Dim Localizar As String, Criterio As String
Localizar = Text1
Criterio = [Ô]Nome Like[ô][Ô] & Localizar & [Ô]*[ô][Ô]
Tabela.FindFirst Criterio
If Tabela.NoMatch = True Then
MsgBox [Ô]Você digitou: [Ô] & UCase(Localizar) & [Ô] ...[Ô]
Text1.Text = [Ô][Ô]
Exit Sub
Else
GRDAgenda.Rows = 1
While Not Tabela.EOF
GRDAgenda.AddItem [Ô][Ô] & Tabela.Fields([Ô]Nome[Ô]) & vbTab & Tabela.Fields([Ô]Telefone[Ô])
Tabela.MoveNext
Wend
GRDAgenda.ColSel = 0 [ô]Coluna 0 selecionada.
If Text1.Text = [Ô][Ô] Then GRDAgenda.ColSel = 1 [ô]Coluna 0 sem seleção.
End If
End Sub

Private Sub Text1_KeyPress(vTecla As Integer)
Dim sSQL As String
GRDAgenda.Redraw = False
sSQL = [Ô]SELECT * FROM Dados WHERE Nome LIKE [ô]*[Ô] & StrSQL(Text1.Text) & [Ô]*[ô] ORDER BY Nome[Ô]

GRDAgenda.Rows = 1
Set RsTabela2 = Banco.OpenRecordset(sSQL, dbOpenDynaset)
If RsTabela2.RecordCount > 0 Then
Do Until RsTabela2.EOF
GRDAgenda.AddItem RsTabela2([Ô]Nome[Ô]) & vbTab & RsTabela2([Ô]Telefone[Ô])
RsTabela2.MoveNext
Loop

End If
RsTabela2.Close
GRDAgenda.Redraw = True
End Sub

Finalmente, a rotina anterior do evento <KeyPress> de Text1:
[ô]Private Sub Text1_KeyPress(KeyAscii As Integer)
[ô]A rotina abaixo permite apenas a digitação de letras (maiúsculas ou
[ô]minúsculas), bem como o clique no comando <Backspace>. Igualmente,
[ô]não serão permitidas acentuações...

[ô]Select Case KeyAscii
[ô]Case 8 [ô]Backspace
[ô]Case 32 [ô]Barra de espaço
[ô]Case 65 To 90 [ô]a...z
[ô]Case 97 To 122 [ô]A...Z
[ô]Case Else
[ô]KeyAscii = 0
[ô]End Select
[ô]End Sub

Testando o funcionamento (digitando caracteres na text1, faz com que o FlexGrid selecione o primeiro registro que atende ao critério de
busca, mas continua exibindo o restante da lista dos dados. Exemplo: digitando [ô]ca[ô] na text1, seleciona o cliente Carlos Nunes, exibindo
o restante dos clientes após o nome selecionado: Clóvis Nascimento, Dorival Oliveira, Francisco Vieira, Geraldo Osório, etc, ao invés de
[ô]somente exibir o nome de Carlos Nunes, já que o próximo começa com [ô]D[ô])... Revi o código todo cuidadosamente, mas não encontrei nada errado...
[Ô]Onde foi que eu errei?[Ô] ....
XYKOVIEIRA 28/08/2011 20:02:10
#382683


Valeu Menudo.... (quando vc passou o código, já tinha excluído o tex1_KeyPress (com o Select Case). Com a exclusão do text1_Change, realmente,
funcionou conforme esperado). Mais uma vez, obrigado pela ajuda, irmão.
Tópico encerrado , respostas não são mais permitidas