AUTO COMPLETAR PESQUISANDO NA TABELA
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
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
é 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
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
e o que está errado no seu código
mas tente assim
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
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
é 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
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
o código acima serve apenas para teste.
agora para preencher conforme digitação:
coloque o código abaixo dentro do evento kEYDOWN
teste com este código
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
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
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
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
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....
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