ROTINA GENERICA PARA DATACOMBO

USUARIO.EXCLUIDOS 14/09/2006 12:00:19
#171403
Olá comunidade!
Preciso de um auxilio em uma rotina de autopreenchimento de um objeto DATACOMBO que esta funcionando perfeitamente mas eu gostaria de torna-la genérica para outros DATACOMBOS do meu form.
No meu form existem 9 DATACOMBOS, então imaginem 9 rotinas iguais para cada um deles!!!!
Seria possivel criar uma função para chamar de dentro do evento keyup e torna-la genérica para qualquer DATACOMBO?
Exemplo:
Private Sub cmbprocessador_KeyUp(KeyCode As Integer, Shift As Integer)
AutoPreenchimento(par1,par2,par3)
end Sub


Abaixo minha rotina q esta funcionando:

Private Sub cmbprocessador_KeyUp(KeyCode As Integer, Shift As Integer)
'AutoFill Datacombo
With cmbprocessador
txtLen = Len(.Text)
Select Case KeyCode
Case vbKeyDelete 'trap these keys to not perform search
Case vbKeyBack
Case vbKeySpace
Case vbKeyHome
Case Else
rst_processador.MoveFirst
Do While Not rst_processador.EOF
If Trim(UCase(Left(rst_processador!PROCESSADOR_MODELO, txtLen))) = Trim(UCase(.Text)) And Trim(.Text) <> "" Then
.Text = rst_processador!PROCESSADOR_MODELO & " "
.SelStart = txtLen
.SelLength = Len(.Text) - Len(Trim(txtLen))
Exit Do
End If
rst_processador.MoveNext
Loop
End Select
End With
End Sub

USUARIO.EXCLUIDOS 14/09/2006 15:17:20
#171490
Não entendi muito bem a razão da filtragem de dados no evento KeyUp, pois os DataCombo já posicionam sobre o registro correto mediante a digitação, dependendo apenas de suas propriedades.

Se de fato é um DATACOMBO, seria necessário apenas carregar os dados da tabela e, para isso, basta usar algumas das propriedades do componente em uma função que receba os parà¢metros:

1 - O objeto Datacombo (byref, of course);
2 - Um objeto Recordset (byref, of course);
3 - A string de conexão com o banco;
4 - A instrução de consulta SQL;
5 - O nome do campo á listar (opcional, com padrão = "display");
6 - O nome do campo para Identidade(opcional, com padrão = "id").


'Múdulo (exemplo)
'...
[c]Public Sub MontaCombo(ByRef cmb As DataCombo, _
ByRef rst As ADODB.Recordset, _
ByVal cns As String, _
ByVal sql As String, _
Optional ByVal lst As String = "display", _
Optional ByVal idt As String = "id")
If Not rst Is Nothing Then
If Not rst.State = 0 Then rst.Close
Set rst = Nothing
End If
Set rst = New ADODB.Recordset
With rst
.ActiveConnection = cns
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Source = sql
.Open
Set .ActiveConnection = Nothing
End With
With cmb
Set .RowSorce = rst
.ListField = lst
.BoundColumn = idt
If Not rst.RecordCount = 0 Then
.BoundText = rst.Fields(idt).Value
End If
End With
End Sub

'...
[/c]


'Formulário (exemplo)
'...
Option Explicit
'...
Private rs() As ADODB.Recordset
'...
[c]Private Sub Form_Load()
Dim cs As String
Dim sq As String
Dim nr As Integer
cs = "Microsoft.Jet.OLEDB.4.0;Data Source=C:\Bases\mdb.mdb;"
ReDim rs(5) As ADODB.Recordset
For nr = 0 To 5
Set rs(nr) = New ADODB.Recordset
Next
sq = "SELECT CODIGO AS ID, DESCRICAO AS DISPLAY FROM TB_CIDADES;"
MontaCombo DataCombo1, rs(0), cs, sq
sq = "SELECT CODIGO AS ID, DESCRICAO AS DISPLAY FROM TB_UF;"
MontaCombo DataCombo2, rs(1), cs, sq
sq = "SELECT SIGLA AS ID, NOME AS DISPLAY FROM TB_PAIS;"
MontaCombo DataCombo3, rs(2), cs, sq
sq = "SELECT CODIGO AS ID, NOME AS DISPLAY FROM TB_VENDEDOR;"
MontaCombo DataCombo4, rs(3), cs, sq
sq = "SELECT CODIGO AS ID, NOME AS DISPLAY FROM TB_PRODUTO;"
MontaCombo DataCombo5, rs(4), cs, sq
sq = Empty
cs = Empty
End Sub

'...
[/c]
USUARIO.EXCLUIDOS 14/09/2006 15:46:19
#171498
Olá professor, tudo bem?

Agradeço por sua resposta!
Na verdade, o efeito desta rotina é um autocompletar quando se estiver digitando dentro de uma DATACOMBO.
Sei que se mudar a propriedade Style de 0 para 1, podemos ver que ao digitar dentro do DATACOMBO, a procura é efetuado automaticamente na lista mas não dentro do campo, por isso a rotina acima.
Sendo assim quando inserido a rotina acima no evento keyup, o resultado é obtido perfeitamente mas não acredito ser profisional digita-la em todos eventos keyup dos DATACOMBO existentes no meu form, entende?
Por isso imaginei esta rotina em forma de função, apenas citando ela dentro dos keyups com os parametros necessários para seu funcionamento como o nome do recordset, o campo para pesquisa e o nome do objeto atual ( activecontrol ).
Obrigado.
Tópico encerrado , respostas não são mais permitidas