AUTO COMPLETAR PESQUISANDO NA TABELA

NILTON.VIANNA 28/09/2010 00:05:45
#353959
Boa noite amigos,

Estou tentando fazer uma busca no textbox, na seguinte maneira

Ao digitar um novo Cliente no txt.nome.text
Quando for digitar tipo Paulo, abre um listbox + ou – com 5 linhas
(esse listbox fica no modo Visible=False , True so quando estiver no Cadastro)
Ex: Paulo Roberto
Paulo Almeida de Araujo
Paulo ........
Pois bem minha idéia é assim quando digitar Paulo Araujo no textbox, caso tenha cadastrato ao teclar enter
Ele preenche o resto dos campos, caso não aja o nome continuo fazendo o cadastro.
(Já fiz o teste de autocompletar um textbox ok. Mais no meu caso seria busca na tabela)

Não sei se fui claro no exemplo.
Se alguen tiver uma idéia favor me ajudar
*Obs estou usando o Firebird,
Grato
Nilton
NILTON.VIANNA 28/09/2010 00:44:08
#353961
é que estou tentando pegar direto da tabela CadPaciente o Campo [Ô]Nome[Ô]

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
On Error Resume Next
If KeyCode = 8 Then [ô]Backspace
Text1.SelStart = Text1.SelStart - 1
Text1.SelLength = Len(Text1)
ElseIf KeyCode = 27 Then [ô]Esc
Text1.Text = Empty
ElseIf KeyCode = 40 Then [ô]Seta para Baixo
If List1.Visible = True Then
List1.Text = Text1.Text
List1.Visible = False
Else
Set Tabela = CnSql.OpenRecordset([Ô]SELECT NOME FROM CAD_PACIENTE WHERE NOME Like [ô][Ô] & Mid(Text1.Text, 1, Text1.SelStart) & [Ô]*[ô] ORDER BY NOME Asc[Ô])
List1.Clear
Do Until Tabela.EOF
DoEvents
List1.AddItem Tabela([Ô]NOME[Ô])
Tabela.MoveNext
Loop
If Tabela.RecordCount > 8 Then List1.Height = 225 * 8 Else List1.Height = 225 * Tabela.RecordCount
List1.Visible = True
List1.Text = Text1.Text
List1.SetFocus
End If
End If
End Sub

MARCELO.TREZE 28/09/2010 00:55:59
#353962
e o que está errado no seu código

mas tente assim

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then [ô]Esc
Text1.Text = Empty
ElseIf KeyCode = 40 Then [ô]Seta para Baixo
If List1.Visible = True Then
List1.Text = Text1.Text
List1.Visible = False
End If

Set Tabela = CnSql.OpenRecordset([Ô]SELECT NOME FROM CAD_PACIENTE WHERE NOME Like [ô][Ô] & Text1.Text & [Ô]*[ô] ORDER BY NOME Asc[Ô])
List1.Clear
Do Until Tabela.EOF
DoEvents
List1.AddItem Tabela([Ô]NOME[Ô])
Tabela.MoveNext
Loop
If Tabela.RecordCount > 8 Then List1.Height = 225 * 8 Else List1.Height = 225 * Tabela.RecordCount
List1.Visible = True
List1.Text = Text1.Text
List1.SetFocus
End If
End Sub
NILTON.VIANNA 28/09/2010 01:10:47
#353963
Valeu Marcelo pela Ajuda..
é seguinte que eu vi um exemplo esta assim, com access
no meu caso seria no FIrebird
Minha Tabela é CAD_PACIENTE = Campo NOME
Minha Conexao é = CnSql (Ado)

estou tentando adaptar no meu projeto

o exemplo que eu vi e funciona é esse;
(ele aplicase somento no txtNome.txt

[ô]*************************************************
Option Explicit
Dim BD As Database
Dim Tabela As Recordset

Private Sub Command1_Click()
Unload Me
End Sub

Private Sub Form_Load()
[ô]digite abaixo o caminho do arquivo Biblio.mdb em sua máquina
Set BD = OpenDatabase([Ô]C:\Arquivos de Programas\Microsoft Visual Studio\VB98\Biblio.mdb[Ô])
End Sub

Private Sub List1_Click()
Text1.Text = List1.Text
End Sub

Private Sub List1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then [ô]Esc
Text1.SetFocus
ElseIf KeyCode = 13 Then
Text1.Text = List1.Text
Text1.SetFocus
End If
End Sub

Private Sub Text1_Change()
Dim Pos As Integer
If Text1.SelStart = 0 Then Exit Sub
On Error Resume Next
Set Tabela = BD.OpenRecordset([Ô]SELECT TOP 1 Author FROM Authors WHERE Author Like [ô][Ô] & Mid(Text1.Text, 1, Text1.SelStart) & [Ô]*[ô] ORDER BY Author Asc[Ô])
Pos = Text1.SelStart
Text1.Text = Tabela([Ô]Author[Ô])
Text1.SelStart = Pos
Text1.SelLength = Len(Text1)
End Sub

Private Sub Text1_GotFocus()

Text1.SelStart = 0
Text1.SelLength = Len(Text1)
[ô]List1.Visible = False

End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

On Error Resume Next
If KeyCode = 8 Then [ô]Backspace
Text1.SelStart = Text1.SelStart - 1
Text1.SelLength = Len(Text1)
ElseIf KeyCode = 27 Then [ô]Esc
Text1.Text = Empty
ElseIf KeyCode = 40 Then [ô]Seta para Baixo
If List1.Visible = True Then
List1.Text = Text1.Text
List1.Visible = False
Else
Set Tabela = BD.OpenRecordset([Ô]SELECT Author FROM Authors WHERE Author Like [ô][Ô] & Mid(Text1.Text, 1, Text1.SelStart) & [Ô]*[ô] ORDER BY Author Asc[Ô])
List1.Clear
Do Until Tabela.EOF
DoEvents
List1.AddItem Tabela([Ô]Author[Ô])
Tabela.MoveNext
Loop
If Tabela.RecordCount > 8 Then List1.Height = 225 * 8 Else List1.Height = 225 * Tabela.RecordCount
List1.Visible = True
List1.Text = Text1.Text
List1.SetFocus
End If
End If
End Sub
[ô]*************************************************
Grato
Amigo
MARCELO.TREZE 28/09/2010 08:56:19
#353969
olha só com ado nas descrições que disse seria mais ou menos assim

coloque um listbox e um textbox

para preencher um list box com todos os dados da tabela seria assim.

de forma simples

Dim RS As Recordset
sql = [Ô]select * from CAD_PACIENTE order by NOME asc[Ô]
Set RS = CnSQL.Execute(sql)
List.Clear
Do While Not RS.EOF
List1.AddItem RS!NOME
RS.MoveNext
Loop


o código acima serve apenas para teste.

agora para preencher conforme digitação:

coloque o código abaixo dentro do evento kEYDOWN

Dim RS As Recordset
sql = [Ô]select * from CAD_PACIENTE where NOME like[ô][Ô] & txtNome.Text & [Ô]%[ô] order by NOME asc[Ô]
Set RS = CnSQL.Execute(sql)
List.Clear
Do While Not RS.EOF
List1.AddItem RS!NOME
RS.MoveNext
Loop


teste com este código

NILTON.VIANNA 28/09/2010 23:56:22
#354071

Até aqui tudo em ordem, mais quando txtNome for <> de RS!None ListC.Visible=False ??


Dim Sql As String
Dim RS As Recordset
Sql = [Ô]SELECT * FROM Cad_Paciente WHERE Cad_Paciente.Nome Like [ô][Ô] & txtNome & [Ô]%[ô]ORDER BY Nome[Ô]
Set RS = CnSql.Execute(Sql)
ListC.Clear
Do While Not RS.EOF
ListC.AddItem RS!Nome
ListC.Visible = True
RS.MoveNext
Loop
NILTON.VIANNA 29/09/2010 00:20:23
#354072
Achei o local certo

Private Sub txtNome_Change()
Dim Sql As String
Dim RS As Recordset
Sql = [Ô]SELECT * FROM Cad_Paciente WHERE Cad_Paciente.Nome Like [ô][Ô] & txtNome & [Ô]%[ô]ORDER BY Nome[Ô]
Set RS = CnSql.Execute(Sql)
ListC.Clear
ListC.Visible = False [ô] aqui esconde o listbox caso não tem no cadastro e continuo com o cadatro
Do While Not RS.EOF
ListC.AddItem RS!Nome
ListC.Visible = True
RS.MoveNext
Loop
End Sub

Valeu Pessoal

ADRIANOM 29/09/2010 02:58:08
#354077
Vou postar o meu código e vc testa e olha se te atende:

Faça a referência da Bibliotéca DAO 3.6 no menu Project -> References...

[ô]Em um módulo vc coloca

Public DirDB As String
Public DB as Database
Public ED As Recordset [ô]Endereço

Public Function Existe(NomeArq As String) As Integer
Existe = Len(Dir$(NomeArq$)) > 0
End Function

Public Function AbreBD()
[ô]Localiza e Acessa o banco de dados
DirDB = (App.Path & [Ô]\Bancodedados.mdb[Ô])
Set DB = OpenDatabase(DirDB, False, False, [Ô]MS Access;PWD =SuaSenhaAqui[Ô])
End Function

Public Sub Main ()
If Existe(DirDB) Then
Call AbreDB
frmSplash.show 1
Else
MsgBox [Ô]Erro ao iniciar o programa. Verifique a existência do banco de dados e arquivo de inicialização[Ô], vbCritical, [Ô]Erro...[Ô]
End
End If
End Sub

[ô]Agora é a função que preenche o combo com os dados de uma determinada tabela...
[ô]Deverá ser criado uma para cada combo com dados diferentes...
Public Sub CarregaComboEndereco(cmb As ComboBox)
cmb.Clear
Set ED = DB.OpenRecordset([Ô]Select * from Endereco order by Endereco[Ô])
If ED.RecordCount > 0 Then
ED.MoveLast
ED.MoveFirst
Do Until ED.EOF
cmb.AddItem IIf(IsNull(ED!Endereco), [Ô]<VAZIO>[Ô], UCase(ED!Endereco))
ED.MoveNext
Loop
End If
End Sub

[ô]cÓDIGO PARA AUTO PROCURAR NO COMBO QUANDO FOR SENDO DIGITADO....
Sub AutoProcura(cmb As ComboBox, KeyAscii As Integer)

Dim sBuffer As String
Dim lRetVal As Long

sBuffer = Left(cmb.Text, cmb.SelStart) & _
Chr(KeyAscii)

lRetVal = SendMessage((cmb.hWnd), CB_FINDSTRING, -1, ByVal sBuffer)

If lRetVal <> CB_ERR Then
cmb.ListIndex = lRetVal
cmb.Text = cmb.List(lRetVal)
cmb.SelStart = Len(sBuffer)
cmb.SelLength = Len(cmb.Text)
KeyAscii = 0

End If
End Sub
[ô]_________________Fim do Módulo__________________

[ô]Agora no form vc irá setar as finções aos controles.... tipo:
[ô]Form1 o combo endereço

Private Sub Form_Load()
[ô]Carrega o combo xxxx com os dados definidos no modulo
CarregaComboEndereco cmbEndereco
End Sub

Private Sub cmbEndereco_KeyPress(KeyAscii As Integer)
[ô]Irá realizar a autoprocura na medida que vai digitando cada letra
AutoProcura cmbEndereco, KeyAscii
End Sub
[ô]________________Fim do Form_________________________

Espero que eu tenha entendido a sua dúvida corretamente, e tenha lhe ajudado....
Caso seja positiva a minha ajuda, humildemente... me pontue... qualquer coisa estou as ordens....
Tópico encerrado , respostas não são mais permitidas