Spanish Elegir valor de una tabla y recuperar Id

Saludos, compañeros:

Necesito poner lo que sería el equivalente a un cuadro combinado de un form de Windows. Es decir, el usuario tiene que elegir un valor de una lista que viene de una tabla en mi BBDD, y una vez seleccionado, necesito conocer el Id del registro correspondiente.

Estoy probando distintas posibilidades como AutoCompleteEditText, SearchView, etc., pero no encuentro la manera de hacer que me devuelva el valor del Id, solamente el texto seleccionado.

¿Me dais alguna orientación?

Gracias de antemano.
 

edgar_ortiz

Active Member
Licensed User
Longtime User
Álex,

Aunque hay otras formas de implementarlo, lo que yo utilizo es un "Spinner", el cual es "cargado" según un "cursor" proveniente de la Base de Datos en "orden alfabético", entonces el "index" del "Spinner" es el numero de registro en el "cursor".

Nótese que el "cursor" deberá ser declarado en forma "Global".

Saludos,

Edgar
 
Édgar, buenos días:

Pero el "cursor" al que te refieres, entiendo que no deja de ser un index (0, 1, 2, 3...) y no el campo Id de mi base de datos, ¿verdad?. Con lo cual, tendría igualmente que cargar esos Ids en una array para saber qué valor pulsa el usuario.

Gracias.
 

edgar_ortiz

Active Member
Licensed User
Longtime User
No.

Imaginemos que quieres saber que "pais" selecciona el usuario, entonces el "cursor" "curPaises", debería de tener los campos (codigo,nombre), el campo "nombre" se asigna al spinner, cuando el usuario selecciona, entonces:

B4X:
'Te posicionas el "registro" correspondiente de "curPaises"
curPaises.Position = Index
' Asignas el "id" del pais
iCodigoPaisSeleccionado = CurPaises.getint("codigo")
 
Édgar, buenos días y feliz año:

Esto entiendo que es para un spinner "asociado" a una base de datos interna, de SQLite, ¿no?. Es que en mi caso (que no lo mencioné) los datos provendrán de una BBDD de SQL Server que manejo mediante jDBC.

Gracias.
 

josejad

Expert
Licensed User
Longtime User
Buenas:

Lo mejor es que uses un xCustomListView.
Vas creando los ítems que vas añadiendo al "listview", y luego recuperas el índice del ítem pulsado, y un objeto (value), dentro de este objeto puedes meter toda la información que quieras.

 

netsistemas

Active Member
Licensed User
Longtime User
Yo alguna vez he cargado el ID entre parentesis o algo así, al final o inicio, pero dentro del propio TEXTO que ve el usuario.
En otros casos, directamente tras seleccioanr el elemento, busco en la base de datos, el ID que tiene como TEXTO lo que ve el usuario.
Otra vez, he cargado en una lista los elementos.
 
Gracias por vuestras respuestas. ¿El CustomListView sería como el CustomView? Este último ya lo he utilizado, y por lo que veo en el ejemplo, se crean y se manejan de forma parecida... ¿sabéis qué diferencias hay?

Un saludo.
 

josejad

Expert
Licensed User
Longtime User
El CustomListView sería como el CustomView
Sí prácticamente igual con la ventaja de que el xCustomListView es multiplataforma y puedes utilizarlo en B4J Y B4i. Además, tiene algunas extensiones que te pueden ser útiles en otro momento del proyecto ( CLVExpandable , PreoptimizedCLV , CLVSwipe , ...)
 

TILogistic

Expert
Licensed User
Longtime User
o puedes usar esto:


 

TILogistic

Expert
Licensed User
Longtime User
Quieres hacer una búsqueda autocomplete de una SQL de base de datos. ??
Estoy probando distintas posibilidades como AutoCompleteEditText, SearchView, etc., pero no encuentro la manera de hacer que me devuelva el valor del Id, solamente el texto seleccionado.
 
Sí, como comentaba, necesitaría algo como un ComboBox de Windows, conectado a una consulta, y que, al seleccionar un item, me devolviese directamente el Id del mismo. Pero creo que no es posible hacerlo así, entiendo que tendré que cargar los datos en una array y luego buscar el valor correspondiente al index seleccionado.

Gracias por vuestra ayuda.
 

josejad

Expert
Licensed User
Longtime User
Hola Alex:

A ver si no estoy entendiendo bien lo que quieres.
Imagina que tu base de datos es:
id valor
43 tomate
44 pera
45 limón

Ahora veamos el ejemplo de xCustomListView

Si te fijas, en Activity_Create hay un bucle que va creando todos los ítems del ListView

B4X:
For i = 1 To 20
        clv2.Add(CreateListItem($"Item #${i}"$, clv2.AsView.Width, 60dip), $"Item #${i}"$)
Next

Si te fijas, al método Add del CustomListView (clv2) hay que pasarle un Panel (que lo crea la sub CreateListItem) y un valor.

1610527030265.png

Precisamente ese valor es el que te devuelve el evento _ItemClick (devuelve el índice que has pulsado, y un valor)

B4X:
Sub clv2_ItemClick(Index As Int, Value As Object)
    Log(Index & " = " & Value)
End Sub

Tú podrías hacer que ese valor sea el id de tu base de datos, así, cuando hagas click en un item, ya obtienes el id de la base de datos.

Como ves, llama a una sub (CreateListItem) que va creando cada item, y tú la puedes pasarle los valores que quieras.

Algo como:
B4X:
    Private rs As ResultSet = Starter.sql.ExecQuery($"SELECT id, item FROM myDB"$)
    Do While rs.NextRow
       clv2.Add(CreateListItem($"s.GetString("item"), clv2.AsView.Width, 60dip), rs.GetString("id")"$)
    Loop
 

TILogistic

Expert
Licensed User
Longtime User
Sí, como comentaba, necesitaría algo como un ComboBox de Windows, conectado a una consulta, y que, al seleccionar un item, me devolviese directamente el Id del mismo. Pero creo que no es posible hacerlo así, entiendo que tendré que cargar los datos en una array y luego buscar el valor correspondiente al index seleccionado.

Gracias por vuestra ayuda.

Existe una vista en XUI Views llamada B4XCombox que puedes usar.

O bien en android nativo un Spinner:


Ver Ejemplo:
- ExecuteSpinner: Executes a SELECT query and fills a Spinner view (ComboBox) with the values of the first column.
 
Last edited:

josejad

Expert
Licensed User
Longtime User
necesitaría algo como un ComboBox de Windows, conectado a una consulta, y que, al seleccionar un item, me devolviese directamente el Id del mismo
 
Gracias a todos por vuestras respuestas y vuestro tiempo. Creo que lo que más se adapta a lo que necesito es el B4XComboBox; hay un ejemplo muy bueno aquí. Me pondré con ello y seguiré planteándoos dudas, que seguro que las tendré.

Un saludo.
 

TILogistic

Expert
Licensed User
Longtime User
Gracias a todos por vuestras respuestas y vuestro tiempo. Creo que lo que más se adapta a lo que necesito es el B4XComboBox; hay un ejemplo muy bueno aquí. Me pondré con ello y seguiré planteándoos dudas, que seguro que las tendré.

Un saludo.
Buen ejemplo, es la misma lógica del POST #14.


Solo un comentario:
B4XComboBox es multiplataforma y utiliza Combox(B4J) y Spinner (B4A).

Saludos.
 
Top