COMBOBOX FILTRAR, MAS NAO PELAS PRIMEIRAS LETRAS

ROTTZEUS 02/09/2011 11:35:42
#383208
Bom dia pessoal, estou com uma dúvida e nem sei se é possível da forma que penso.
Possuo no sistema em VB6 uma combobox que gostaria que a medida que o usuário fosse digitando na propria combo (style=Dropdown Combo) ela iria filtrando nos itens da lista todos aqueles que possuem o texto digitado, só que em qualquer parte do item. Hoje já consigo isso porém ele filtra somente pelas iniciais do que está sendo digitado. Ou seja, o que quero é que numa pesquisa por marca de carro, por exemplo, quando o usuário digitar 40, permitisse que mostrasse os seguintes itens abaixo (contidos na lista)

407 [ô]Comentário - Este veículo não precisaria ser duplicado, pois alguns usuários simplesmente digitam 407 e outros buscam por peugeot 407
Mercedes Benz 240D
NISSAN 240
Peugeot 407
Volvo S40
Volvo V40

Se alguem puder me dar uma ajuda!!!

PS. O complicado é que pretendo fazer isso com a própria combobox, ao inves de usar um textbox em conjunto com outro objeto (grid, ou a própria combo)
ALVAROVB2009 02/09/2011 12:08:19
#383212
ROTTZEUS na combobox eu desconheço, o melhor mesmo seria usar o text e um grid
ASHKATCHUP 02/09/2011 12:14:09
#383215
Na própria combobox não rola... Você TERÁ que usar um textbox de apoio.
MARCELO.TREZE 02/09/2011 13:22:40
#383226
Bom tenho que discordar na propria combo rola sim, porém não em tempo de digitação, e sim de forma que vc digite 407, ou peugeot 407, e clique em um botão pesquisar, para preencher combo somente com os dados baseados na busca

poste como preenche o combo.

ROTTZEUS 02/09/2011 13:57:06
#383235
Eu preencho a combo no evento load, para não sobrecarregar o sistema toda hora que o usuário for digitar alguma marca de veículo. O sistema é de controle de estacionamento, ou seja, utiliza-se esta combo muitas vezes. Preencho a partir do BD. Meu problema é só que alguns usuários conhecem como 407 e outros como peugeot ..., neste exemplo, fora BMW, Mercedes, Honda, ...
E de certa forma, preciso identificar o mais próximo do MODELO do veículo para que haja cobrança diferenciada entre os veículos maiores e menores, entenda-se como categoria. Neste exemplo, um Peugeot Boxer (Van) a cobrança seria diferente do 407, também Peugeot.
No combo, seria bem melhor né, mas não sei se é possível sem sobrecarregar o sistema ou utilizar text+grid e maior trabalho no desenvolvimento, afim de ter o mesmo efeito que se consegue na combo.

Mas se alguem souber, ou alguma outra dica, sempre é bem vinda!!
Valeu!!!
MARCELO.TREZE 02/09/2011 17:32:29
#383279
Tá vc carrega no load, mas de onde vem os dados, vc insere manualmente, ou eles estão em um banco de dado?
ASHKATCHUP 02/09/2011 22:43:15
#383295
Citação:

Bom tenho que discordar na propria combo rola sim, porém não em tempo de digitação,



Foi o que eu disse, Marcelo. SOMENTE usando a combo, nao da. TEM que ter um textbox com botão de pesquisar...

EDERMIR 03/09/2011 11:26:35
#383305
Eu tenho uma solução utilizando uma TEXTBOX e um PICLIST (além de barras de rolagem e mudança de cor mostrando o texto digitado dentro do texto encontrado.).
LUIS.HERRERA 03/09/2011 12:57:07
#383306
Rottzeus sou da mesma visão do Marcelo Treze, tudo dá para se fazer,quando se sabe como (rs).

Acho que é possível sim como quer, mas a forma mais prática e fácil é usar dois controles visuais como um textbox e um flexgrid como os colegas já disseram. Seria usar o flexgrid como se fosse a lista do combo, logo abaixo do textbox, assim teria quase o mesmo efeito, onde ao ir digitando (change) do textbox, iria preenchendo o flexgrid com os dados, eu acho mais prático.

Agora se quer usar mesmo o combo, vou dar uma idéia de como fazer, só que tem de ser o DBCombo e não o combo comum. Eu uso ele para fazer isso, só que pegando o início da string, o que você não quer. Então vamos a solução.

1- Você faz uma pesquisa no banco (recordset) carregando todos os itens da sua tabela.

2- Agora povoa a combo com sua lista completa.

3- Cria um outro recordset desconectado que será montado a cada digitação (change) no dbcombo, com os dados apropriados.

4- pesquisa os itens no recorset principal, pelo change do dbcombo e povoa o recordset auxiliar.

5- Associa o novo recordset ao dbcombo para exibir os dados pesquisados.

Isso é a teoria, agora vamos a prática:
Usando um código que já postei aqui a muito tempo, vamos tentar implementar...

Passo do item 1 e 2 acima:
Private Sub Form_Load()
If Conectar Then
Set rsMarcas = New ADODB.Recordset
rsMarcas .CursorLocation = adUseClient
rsMarcas .Open [Ô]SELECT cmpID,cmpMarcas FROM tabMARCAS WHERE cmpINATIVO = 0 ORDER BY cmpMarcas asc;[Ô], cn, adOpenStatic, adLockReadOnly, adCmdTableDirect
rsMarcas .ActiveConnection = Nothing

[ô]Povoa com todos os itens iniciais
Set cboMarcars.DataSource = Nothing [ô]reseta o combo
cboMarcars.BoundColumn = [Ô]cmpID[Ô] [ô]Informa o Campo chave para uma futura pesquisa
cboMarcars.ListField = [Ô]cmpMarcas[Ô] [ô]Informo ao combo qual campo exibir
Set cboMarcars.RowSource = rsMarcas [ô]preenche o combo
cboMarcars.Refresh
end if

Passo do item 3 acima:

[ô]também no load
Set rsMarcasFiltro = New ADODB.Recordset
rsMarcasFiltro .Fields.Append [Ô]cmpID[Ô], adInteger
rsMarcasFiltro .Fields.Append [Ô]cmpMarcas[Ô], adVarChar, 40, adFldMayBeNull
rsMarcasFiltro .ActiveConnection = Nothing
rsMarcasFiltro .CursorLocation = adUseClient
rsMarcasFiltro .Open

Passo do item 4 acima:

Private Sub cboMarcars_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
[ô] Faz o que quiser ao pressionar Enter
KeyAscii = 0
ElseIf KeyAscii <> 8 Then
[ô]ao digitar no combo faz a pesquisa
DBComboAutomatica cboMarcars, rsMarcas, KeyAscii
KeyAscii = 0
End If
End Sub

[ô]Função que faz a pesquisa (aqui só terá de trocar o Letf = pesquisa palas iniciais, por um MID que pesquisa no texto todo e alterar o final para associar ao outro recordset auxiliar. Isso vai ficar por sua conta.
[ô] dcbo -> seu dbcombo passado por referencia
[ô] regAdo - > o recordset onde irá pesquisar
[ô] KeyAscii -> a tecla digitada da pesquisa
[ô] myCmpPesquisa e bChecaIDBound -> se quiser definir um campo diferente de pesquisa, no caso de tabelas com nomes de campos diferentes
Public Sub DBComboAutomatica(dcbo As DataCombo, regAdo As Recordset, KeyAscii As Integer, Optional myCmpPesquisa As String, Optional bChecaIDBound As Boolean = True)

If regAdo.RecordCount < 1 Then
MeuAlerta [Ô]Não há itens para selecionar neste campo.[Ô] & vbNewLine & [Ô]Cadastre os dados necessários no menu Cadastro ou informe ao Administrador.[Ô], Critico
Exit Sub
End If

Dim Buffer As String

Buffer = Left(dcbo.Text, dcbo.SelStart) & Chr(KeyAscii)

regAdo.MoveFirst
Do While Not regAdo.EOF
If UCase(Left(regAdo(dcbo.ListField), Len(Buffer))) = UCase(Buffer) Then
If bChecaIDBound = True Then
Select Case myCmpPesquisa
Case [Ô]cmpIDCOLABORADOR[Ô]
dcbo.BoundText = regAdo!cmpIDCOLABORADOR
Case [Ô]deptoTrocaArea[Ô]
dcbo.BoundText = regAdo!cmpIDArea
Case Else
dcbo.BoundText = regAdo!cmpID
End Select
End If
Exit Do
End If
regAdo.MoveNext
Loop

[ô]aqui é o centro do funcionamento, quando encontrar um item posiciona o recordset no registro encontrado, depois associa ao combo passado. Como você estará usando um outro recordset para montar a lista só com o que interessa, terá de alterar da seguinte forma:
[ô] mudar a associação para montar o recordset auxiliar com os dados encontrados no recordset principal
[ô]associar o recordset auxiliar ao combo, ou seja trocar o recordset do combo, isso é feito pelas linhas explicada no load do form acima.
[ô] aí faz a associação abaixo no combo com o novo recordset auxiliar já associado a ele.

If Not regAdo.EOF Then
dcbo.Text = regAdo(dcbo.ListField)
dcbo.SelStart = Len(Buffer)
dcbo.SelLength = Len(dcbo.Text)
End If
End Sub

Nota: Como disse deve funcionar, pois já uso o esquema, só que filtrando o início e não pelo meio. é bem trabalhoso, pois ainda tem que escrever o código de montagem do recordset auxiliar pelos itens encontrados. por isso disse que é mais fácil e rápido usar um textbox e o flexgrid.

Boa sorte.
LLAIA 03/09/2011 17:40:39
#383318
Nunca gostei desse negócio de carregar trocentos itens em um controle no load. Eu faria uma combobox vazia, e no momento da pesquisa apareceria uma inputbox, receberia o critério, consultava e carregaria no combo só o que o cliente precisa.
ROTTZEUS 05/09/2011 13:38:38
#383397
Beleza Pessoal, irei tentar os outros métodos recomendados e qualquer dúvida volto a postar. Como disse, seria bem mais prático e menos trabalhoso se a própria combo já fizesse isso. Talvez tentarei criar esse controle, como ocx, pois utilizarei muito no sistema.

Abraços e obrigado a todos.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas