none
Búsqueda instantánea ComboBox (Base de datos grande) RRS feed

  • Pregunta

  • Tengo un problema al hacer una búsqueda instantánea en mi combobox. La forma en la que lo lleno es la siguiente:

     Public Sub GetNombresTodos(ByVal combo As ComboBox, ByVal str As String)
            combo.DataSource = Nothing
            combo.DisplayMember = Nothing
            combo.ValueMember = Nothing
            Dim Query As String = Replace(str, " ", "%")
            ConectaAccess(1).Close()
            Try
                ConectaAccess(1).Open()
                Dim sql As New OleDb.OleDbCommand("SELECT TOP 100 Paciente.IdPaciente as Clave, Paciente.Paciente as Nombre FROM Paciente WHERE((Paciente.Paciente) LIKE '%" & Query & "%') ORDER BY Paciente.Paciente ASC;", ConectaAccess(1))
                da = New OleDb.OleDbDataAdapter(sql)
                ds = New DataSet
                da.Fill(ds, "Pacientes")
                With combo
                    .DataSource = ds.Tables(0)
                    .ValueMember = "Clave"
                    .DisplayMember = "Nombre"
                    .SelectedIndex = 0
                End With
            Catch ex As Exception
                MsgBox(ex.StackTrace)
            End Try
            da.Dispose()
            ds.Dispose()
            combo.DroppedDown = True
        End Sub

    Esta función se dispara en cada evento KeyUp y tarda varios segundos en mostrar resultados, además de que no es muy precisa. La tabla de donde saco los datos tiene poco mas de 105,000 registros, ¿conocen algún método para acelerarla?


    • Editado Angel ACREC miércoles, 21 de septiembre de 2016 20:30
    • Cambiado Enrique M. Montejo viernes, 23 de septiembre de 2016 6:52 Pregunta relacionada con el acceso a datos.
    miércoles, 21 de septiembre de 2016 20:29

Todas las respuestas

  • Hola,

    La unica que le queda al motor con la condicion LIKE %ALGO% es recorrer todos los registros de la tabla y solo recuperar los que cumplan la condicion.

    Para mi tu problema esta en como planteas la solucion a la busqueda. Yo lo que haria es tener en la tabla Pacientes dos campos, uno para el apellido y otro para el nombre. Agregar Indice por el campo apellido. 

    En tu formulario pondria un text box para que el operador ingrese el apellido, o las primeras letras del apellido. Un boton "Buscar", entonces en el evento click del boton voy a tu procedimiento y lleno el combo. La SQL seria:

    SELECT Paciente.IdPaciente as Clave, Paciente.Apellido,Paciente.Nombre FROM Paciente WHERE Paciente.Apellido LIKE " & Query & "%') ORDER BY Paciente.Apellido,Paciente.Nombre


    Victor Koch

    miércoles, 21 de septiembre de 2016 21:13