Spanish [SOLUCIONADO]Busqueda en el instante

ferpahud

Active Member
Licensed User
Hola buenos dias,

La verdad no se bien que nombre tiene, pero lo que quiero hacer, por ejemplo, es una busqueda sobre un editext, donde vaya escribiendo la palabra que quiero encontrar, y me aparezcan las sugerencias.

Por ejemplo, si tengo una base de datos SQLite interna, con una tabla cliente, y quiero buscar a los clientes por su nombre, cuando escriba en el editext la letra "a" aparezcan todos los clientes que comiencen con esa letra, si pongo "al", todos los que comiencen con "al" y asi... y pueda presionar alguna de las sugerencias y que el editext se complete con el valor elegido.

Alguien sabe como hacerlo? Desde ya muchas gracias por su tiempo, saludos!
 

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas.
Echale un ojo al evento TextChanged.
Se activa cuando se va escribiendo.
Un saludo.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola te dejo un código de ejemplo.

Usando un AutoCompleteEditText

B4X:
Sub Buscar_TextChanged (Old As String, New As String)
    Dim lstBusqueda As List 
    lstBusqueda.Initialize
        c = s.ExecQuery("SELECT nombre FROM tutabla WHERE nombre LIKE '%" & Old & "%' ORDER BY nombre") 
    For I = 0 To c.RowCount - 1
        c.Position = I
        lstBusqueda.Clear
        lstBusqueda.Add(c.GetString("nombre")) 
    Next
       Buscar.SetItems(lstBusqueda)
       Buscar.InputType = Buscar.INPUT_TYPE_TEXT
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Lo puedes hacer directamente en el EditText pero empleando un AutoCompleteEditText que es lo mismo pero con mas características, entre otras que te salga una lista conforme vas escribiendo, y lo mejor, sin hacer nada ;), sólo cargando la lista.

B4X:
Dim Nombre As AutoCompleteEditText
Nombre.Initialize("NombreEvento")

' aqui cargas tu lista de clientes
Nombre.SetItems2(NombreClientesSQLite,Typeface.DEFAULT,Gravity.LEFT,TamañoTexto,ColorTexto)
 
' NombreClientesSQLite puede ser un Array, un List .....

Saludos
 

ferpahud

Active Member
Licensed User
Hola te dejo un código de ejemplo.

Usando un AutoCompleteEditText

B4X:
Sub Buscar_TextChanged (Old As String, New As String)
    Dim lstBusqueda As List
    lstBusqueda.Initialize
        c = s.ExecQuery("SELECT nombre FROM tutabla WHERE nombre LIKE '%" & Old & "%' ORDER BY nombre")
    For I = 0 To c.RowCount - 1
        c.Position = I
        lstBusqueda.Clear
        lstBusqueda.Add(c.GetString("nombre"))
    Next
       Buscar.SetItems(lstBusqueda)
       Buscar.InputType = Buscar.INPUT_TYPE_TEXT
End Sub

Muchas gracias, una pregunta en
B4X:
Buscar.SetItems(lstBusqueda)
"Buscar" es el nombre de el AutoCompleteEditText?

Lo cambie por el nombre de mi AutoCompleteEditText y me figura el siguiente error:
An error has occurred in sub:pedido_activity_create
(java line:357)
java.lang.RuntimeException:
java.lang.RuntimeException: Filed etnombre was declared with the wrong type

EDICION: Ya pude solucionarlo, estaba mal declarado el AutoCompleteEditText
 
Last edited:

ferpahud

Active Member
Licensed User
Hola

Lo puedes hacer directamente en el EditText pero empleando un AutoCompleteEditText que es lo mismo pero con mas características, entre otras que te salga una lista conforme vas escribiendo, y lo mejor, sin hacer nada ;), sólo cargando la lista.

B4X:
Dim Nombre As AutoCompleteEditText
Nombre.Initialize("NombreEvento")

' aqui cargas tu lista de clientes
Nombre.SetItems2(NombreClientesSQLite,Typeface.DEFAULT,Gravity.LEFT,TamañoTexto,ColorTexto)

' NombreClientesSQLite puede ser un Array, un List .....

Saludos

En este caso, en "NombreEvento", que iria?
 

ferpahud

Active Member
Licensed User
Hola te dejo un código de ejemplo.

Usando un AutoCompleteEditText

B4X:
Sub Buscar_TextChanged (Old As String, New As String)
    Dim lstBusqueda As List
    lstBusqueda.Initialize
        c = s.ExecQuery("SELECT nombre FROM tutabla WHERE nombre LIKE '%" & Old & "%' ORDER BY nombre")
    For I = 0 To c.RowCount - 1
        c.Position = I
        lstBusqueda.Clear
        lstBusqueda.Add(c.GetString("nombre"))
    Next
       Buscar.SetItems(lstBusqueda)
       Buscar.InputType = Buscar.INPUT_TYPE_TEXT
End Sub


Intento hacerlo pero no puedo, no se donde puede estar el error:

B4X:
Sub Globals
    Dim s As SQL
    Dim c As Cursor
    Dim c2 As Cursor
    Dim c3 As Cursor
    'Cliente   
    Private etId As EditText
    Private etNombre As AutoCompleteEditText
    Private btnBuscarIdCliente As Button
    Private lblId As Label
    Private lblCliente As Label
    Private lblNombre As Label
    Private btnCargarPedido As Button
    Private lblPedidoCargado As Label
   
    'Producto
    Private lblProducto As Label
    Private lvlIdProducto As Label
    Private etIdProducto As EditText
    Private lblNombreProducto As Label
    Private etNombreProducto As EditText
    Private btnBuscarProducto As Button
    Private lblCantidad As Label
    Private etCantidad As EditText
   
    Private btnCargarProducto As Button
    Private lblIdPedido As Label
    Private etIdPedido As EditText
    Private lvDetalle As ListView
    Private lblDetallePedido As Label
    Private lblTotal As Label
    Private etTotal As EditText
    Private AcEtNombre As AutoCompleteEditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("pedido")
   
    Dim ruta As String
    ruta=DBUtils.CopyDBFromAssets("distribuidora.db")
    s.Initialize(ruta,"distribuidora.db",True)
   
    'etNombre.Enabled=False
    lblPedidoCargado.Visible=False
    btnCargarPedido.Enabled=False
   
    etIdProducto.Enabled=False
    etNombreProducto.Enabled=False
    etCantidad.Enabled=False
    AcEtNombre.Initialize("Buscar_TextChanged")
End Sub

Sub Buscar_TextChanged (Old As String, New As String)
    Dim lstBusqueda As List
    lstBusqueda.Initialize
        c = s.ExecQuery("SELECT nombre FROM Cliente WHERE nombre LIKE '%" & Old & "%' ORDER BY nombre")
    For I = 0 To c.RowCount - 1
        c.Position = I
        lstBusqueda.Clear
        lstBusqueda.Add(c.GetString("nombre"))
    Next
       AcEtNombre.SetItems(lstBusqueda)
       AcEtNombre.InputType = etNombre.INPUT_TYPE_TEXT
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

En este caso, en "NombreEvento", que iria?

Dale el nombre del evento que quieras en el caso que por ejemplo quieras saber cuando pulsaron Enter

Intento hacerlo pero no puedo, no se donde puede estar el error:

Sin decir cual error te da es dificil saber que es. Correlo en debug paso a paso y sabras donde te da el error.

Por otro lado, como te he comentado arriba, si cargas en el AutoCompleteEditText.SetItems2 los nombres de los clientes , en cuanto empieces a escribir el AutoCompleteEditText te saca una ventana con los nombres que empiecen por las letras que pones.

Haz un ejemplo facil cargando varios nombres a mano y veras lo que te digo

B4X:
Dim EditNombre As AutoCompleteEditText
EditNombre.Initialize("")
Dim Nombre(6) As String

Nombre(0) ="Juan"
Nombre(1) ="Pepe"
Nombre(2) ="Antonio"
Nombre(3) ="Augusto"
Nombre(4) ="Alejo"
Nombre(5) ="Josefina"


EditNombre.SetItems2(Nombre,Typeface.DEFAULT,Gravity.LEFT,22,Colors.Black)

Veras si empiezas a escribir la A, te apareceran Antonio, Augusto y Alejo, y si añades otra letra que coincida con algun nombre saldrá este.

Como veras con esto no te hace falta hacer una búsqueda, ya la hace el propio AutoCompleteEditText, luego lo unico que tienes que hacer es lo mismo, meter a tus clientes en una array o en un list, se lo pasas al SetItems2 y ya lo tienes sin tener que hacer búsquedas.

Bueno, creo entender que es eso lo que pretendias hacer

Saludos
 
Last edited:

ferpahud

Active Member
Licensed User
Hola



Dale el nombre del evento que quieras en el caso que por ejemplo quieras saber cuando pulsaron Enter



Sin decir cual error te da es dificil saber que es. Correlo en debug paso a paso y sabras donde te da el error.

Por otro lado, como te he comentado arriba, si cargas en el AutoCompleteEditText.SetItems2 los nombres de los clientes , en cuanto empieces a escribir el AutoCompleteEditText te saca una ventana con los nombres que empiecen por las letras que pones.

Haz un ejemplo facil cargando varios nombres a mano y veras lo que te digo

B4X:
Dim EditNombre As AutoCompleteEditText
EditNombre.Initialize("")
Dim Nombre(4) As String

Nombre(0) ="Juan"
Nombre(1) ="Pepe"
Nombre(2) ="Antonio"
Nombre(3) ="Augusto"
Nombre(4) ="Alejo"
Nombre(5) ="Josefina"


EditNombre.SetItems2(Nombre,Typeface.DEFAULT,Gravity.LEFT,22,Colors.Black)

Veras si empiezas a escribir la A, te apareceran Antonio, Augusto y Alejo, y si añades otra letra que coincida con algun nombre saldrá este.

Como veras con esto no te hace falta hacer una búsqueda, ya la hace el propio AutoCompleteEditText, luego lo unico que tienes que hacer es lo mismo, meter a tus clientes en una array o en un list, se lo pasas al SetItems2 y ya lo tienes sin tener que hacer búsquedas.

Bueno, creo entender que es eso lo que pretendias hacer

Saludos

Muchas gracias, tu ejemplo fue de gran utilidad.

Cambie algunas cosas en el codigo para que funcionara, me daba problemas el initialize asique lo quite, y el array tiene un tamaño de 4 y contenia 6 elementos. El codigo finalmente quedo de la siguiente manera:

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private EditNombre As AutoCompleteEditText
    Dim Nombre(4) As String

    Nombre(0) ="Juan"
        Nombre(1) ="Pepe"
    Nombre(2) ="Antonio"
    Nombre(3) ="Augusto"

End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("AutoComplet")
  
  


    EditNombre.SetItems2(Nombre,Typeface.DEFAULT,Gravity.LEFT,22,Colors.Black)
End Sub

Ahora quiero hacer lo mismo pero con un List, para ir cargando mediante una consulta SQL, utilizando un ciclo for, el nombre de todos los clientes. Pero tengo problemas para declarar la lista:

B4X:
Dim names As List
    names.Initialize
    names.Add("Juan")

Me marca error y figura: "This sub should only be used for variables declaration or assignments of primitive values"

EDICIÓN: Ya pude resolverlo, habia que colocar el initialize en el acrivity crate
 
Last edited:

ferpahud

Active Member
Licensed User
Quiero presionar el boton "Buscar" para que se cargen los nombres en una lista y me habilite la busqueda:

B4X:
Sub btnBuscarIdCliente_Click

c4=s.ExecQuery("Select nombre FROM Cliente")
    For l=0 To c.RowCount-1
        c4.Position=l
    Nombre.Add(c.GetString("nombre"))
    Next
    EditNombre.SetItems2(Nombre,Typeface.DEFAULT,Gravity.LEFT,22,Colors.Black)

End Sub

Pero me da el siguiente error: java.lang.runtimeexception object should first be initialized (cursor)

Alguien sabe porque? en otros botones que uso cursores no me pasa....
 

Descartex

Well-Known Member
Licensed User
Longtime User
Cambia
B4X:
Nombre.Add(c.GetString("nombre"))
Por
B4X:
Nombre.Add(c4.GetString("nombre"))
Estas usando el nombre de un cursor (c) no inicializado en lugar de (c4) que si lo esta.
Un saludo.
 

ferpahud

Active Member
Licensed User
Cambia
B4X:
Nombre.Add(c.GetString("nombre"))
Por
B4X:
Nombre.Add(c4.GetString("nombre"))
Estas usando el nombre de un cursor (c) no inicializado en lugar de (c4) que si lo esta.
Un saludo.
Es verdad, no me di cuenta... uso tantos cursores que se me paso por alto.

Igualmente, y de forma curiosa, lo acabo de corregir pero me sigue dando el mismo error....
 

Descartex

Well-Known Member
Licensed User
Longtime User
es en la linea que te dije?
 

Descartex

Well-Known Member
Licensed User
Longtime User
correla en debug y ponle un punto de interrupcion en esa linea...
para añadir un punto de interrupcion, pincha a la izquierda del numero de linea en el que quieras.
A partir de ahi, para continuar la ejecucion de seguido, F5, para ir linea a linea, F8
 

ferpahud

Active Member
Licensed User
correla en debug y ponle un punto de interrupcion en esa linea...
para añadir un punto de interrupcion, pincha a la izquierda del numero de linea en el que quieras.
A partir de ahi, para continuar la ejecucion de seguido, F5, para ir linea a linea, F8
Gracias por la explicación!, Lo acabo de hacer, coloque el punto de interrupción justo en esa linea, cuando prieto el boton, se cierra la aplicación, no puedo ver si aparece o no el error....
 

Descartex

Well-Known Member
Licensed User
Longtime User
Si es al intentar proseguir la ejecucion, si, es ahi...
además el log (A la derecha) te dice la linea que lo "reventó" (o cercana)
 

Descartex

Well-Known Member
Licensed User
Longtime User
cuando tengas el programa parado en esa linea, pasa el mouse por encima del c4 que dice:
B4X:
        c4.Position=l
A ver que dice el emergente que sale, si sale Not initialized, el problema viene de arriba.

Otra cosa... la variable Nombre no será un cursor??? A ver si va a ser esa la q no esta inicializada.
 
Top