Spanish Un combobox al estilo .NET

Sergio Haurat

Active Member
Licensed User
Longtime User
Hace dias que estoy intentando en el foro en inglés* que alguien me ayude con lo que en principio debería ser muy simple pero evidentemente no lo es. Muchos me indican usar un SearchView que en los ejemplos dispara un dialogo B4XDialog que no necesito ni quiero y adicionalmente sólo tengo la información del texto porque pasan un List y necesito un pasar un Map para resguardar el código y la descripción asociada.

Este posteo https://www.b4x.com/android/forum/threads/class-searchview.48576/post-384063 parece ser lo más cercano a lo que necesito, pero está en B4I, no sólo no tengo la licencia, tampoco es muy fácil de traducir porque evidentemente tiene algunas cosas muy específicas para la versión de iOS

El siguiente código es parte de un sistema pero ayuda a comprender en detalle que es lo que necesito y cual es el sentido
Ejemplo combobox Visual Basic .NET::
'Crear una variable tipo datatable
Private adm_items_opr As DataTable
Dim strSQL As String
strSQL = "select"
strSQL &= " adm_lst_items_opr._id AS adm_lst_items_opr_id,"
strSQL &= " adm_lst_items_opr._desc AS adm_lst_items_opr_desc"
strSQL &= " FROM"
strSQL &= " adm_lst_items_opr"
strSQL &= " ORDER BY"
strSQL &= " adm_lst_items_opr._desc"
adm_lst_items_opr = New DataTable
'Conecto a la base de datos
MySQLCmdInterSys.CommandText = strSQL
MySQLDAInterSys.SelectCommand = MySQLCmdInterSys
MySQLDAInterSys.Fill(adm_lst_items_opr)
'Lleno el combobox (DataSource) con el resultado de la consulta a la DB
Me.cmn_leg_ref_tipo_item.DataSource = adm_lst_items_opr
'Defino que columna de la consulta será la que ve el usuario
Me.cmn_leg_ref_tipo_item.DisplayMember = "adm_lst_items_opr_desc"
'Defino que columna de la consulta será el que devuelve el valor.
Me.cmn_leg_ref_tipo_item.ValueMember = "adm_lst_items_opr_id"

Necesito hacer algo como esto de un web site con puro PHP & JavaScript
1689192746993.png


Esta es la base de datos haciendo la consulta por "ex", cuaando seleccione por ejemplo, "American Express Argentina", el evento que se dispara, imaginemos que se llama combo_ItemSelected(Value As Text) me tiene que devolver 18, esto no es un capricho, en el proyecto real, la consulta es de un listado de clientes, y esos clientes tienen unidades de negocio. La aplicación tiene que hacer otra consulta por las unidades de negocio de ese cliente y necesito en el parámetro pasarle "el 18".
1689192801916.png


* Intento de consulta original en inglés que arranca por otro lado, también voy aprendiendo sobre los eventos y otras cositas adicionales: https://www.b4x.com/android/forum/threads/b4a_minisearchview-with-an-improvement-made-by-me.148915/

Esta imágen corresponde al proyecto, cuando hago click sobre cliente debería mostrarme todas las opciones o vacío e ir filtrando a medida que tipeo. La imágen es anterior a arreglar los botones de OK y CANCELAR
1689193788231.png


Muchas Gracias
 

TILogistic

Expert
Licensed User
Longtime User
necesitas un combobox con búsqueda sensitiva?
que se llene a a través de SQL o CSV?
 

Sergio Haurat

Active Member
Licensed User
Longtime User
De un map creo sería la mejor opción. Cada vez que el usuario ingresa carga la lista y puede variar. Estar insert/update me parece que va a tornar lento el proceso de login
 

TILogistic

Expert
Licensed User
Longtime User
por lo que veo en la publicación anterior es en PHP y javascrits.
Hace llamadas AJAX a servicios REST API?
 
Last edited:

TILogistic

Expert
Licensed User
Longtime User
o este que consulta (sensitiva) y lee resultados en JSON (REST API)
 

TILogistic

Expert
Licensed User
Longtime User
una aclaración este custom view (RESP API) tiene caso sensitivo pero por las limitaciones de los proveedores de reverse code, se simulo el auto completar.

Nota:
Este custom view guarda en cada ítem todos los datos consultados, no solo descripción y valor.
 

Sergio Haurat

Active Member
Licensed User
Longtime User
o este que consulta (sensitiva) y lee resultados en JSON (REST API)
Este caso intenté modificarlo para darle otro sentido en vez de completar con lugares de Google. Imaginate que si no tengo claro que era xclv me pierdo mucho. Tengo años de experiencia en Visual Basic, desde la versión DOS que conozco el lenguaje. Habitualmente utilizo .net y otros pero parece ser un problema intentar llenar un combo con datos para visualizar por el usuario y que devuelva un código cuando dispara el evento. Estoy atascado en un desarrollo sólo por eso.
 

TILogistic

Expert
Licensed User
Longtime User
publica lo que tiene y te ayudamos.

Nota:
te envié por interno mi whatsapp
 
Last edited:

angel_

Well-Known Member
Licensed User
Longtime User
Has probado B4XSearchTemplate?

 

Sergio Haurat

Active Member
Licensed User
Longtime User
Has probado B4XSearchTemplate?

He probado de todo pero ninguno de los ejemplos hace lo que necesito

- una tabla con 2 valores, ID y Descripción
- un combo editable que se autocargue de los datos de la descripción a medida que voy escribiendo
- al seleccionar, el Evento debe devolverme el ID y no la descripción

Saludos
 

josejad

Expert
Licensed User
Longtime User
Buenas:

¿Y por qué no haces tú la búsqueda cuando recibas el valor seleccionado? Es simple y rápido
B4XSearchTemplate recibe una lista en la que puedes buscar al escribir.
Cuando pulsas OK recibes el valor de la lista, y no el ID como quieres.
Pues puedes simplemente buscar el valor de la lista que has recibido donde tengas tus pares ID - valor y devuelves el ID? No hace falta que el B4XSearchTemplate te devuelva el ID, te devuelve el valor y tú buscas el ID.


Te adjunto el ejemplo original de XUI Views (he modificado la versión para B4J porque es más fácil de ejecutar en el ordenador que estar conectando el móvil, pero la versión de B4A debe funcionar igual)
B4X:
    SearchTemplate.Initialize
    Dim Items As List 'Esta lista es la que se muestra al usuario
    Items.Initialize
    Items_Map.Initialize '<------Linea añadida, Items_Map es una variable tipo Map global
    For Each line As String In File.ReadList(File.DirAssets, "colors.txt")  'En este caso, los datos están en un fichero de texto de la forma VALOR:ID (AliceBlue:F0F8FF)
        Dim s() As String = Regex.Split(":", line)
        Dim Name As String = s(0)
        Dim Valor As String = s(1) '<------Linea añadida, tomamos el otro valor para construir el mapa
        Items.Add(Name)
        Items_Map.Put(Name, Valor) <--------'Linea añadida, construimos el mapa para la búsqueda
    Next


Sub btnSearch_Click
    Wait For (Dialog.ShowTemplate(SearchTemplate, "", "", "CANCEL")) Complete (Result As Int)
    'Ahora, cuando recibes el resultado del B4XDialog, haces tu propia búsqueda
    If Result = XUI.DialogResponse_Positive Then
        btnSearch.xLBL.Text = SearchTemplate.SelectedItem
        Log(Items_Map.Get(SearchTemplate.SelectedItem))  '<-----Linea añadida, hacemos la búsqueda para devolver el ID, por ej. si seleccionas AliceBlue, mostrará F0F8FF
    End If
End Sub
 

Attachments

  • XUI Views Example.zip
    9 KB · Views: 140
Last edited:

Sergio Haurat

Active Member
Licensed User
Longtime User
Buenas:

¿Y por qué no haces tú la búsqueda cuando recibas el valor seleccionado? Es simple y rápido
B4XSearchTemplate recibe una lista en la que puedes buscar al escribir.
Cuando pulsas OK recibes el valor de la lista, y no el ID como quieres.
Pues puedes simplemente buscar el valor de la lista que has recibido donde tengas tus pares ID - valor y devuelves el ID? No hace falta que el B4XSearchTemplate te devuelva el ID, te devuelve el valor y tú buscas el ID.


Te adjunto el ejemplo original de XUI Views (he modificado la versión para B4J porque es más fácil de ejecutar en el ordenador que estar conectando el móvil, pero la versión de B4A debe funcionar igual)
B4X:
    SearchTemplate.Initialize
    Dim Items As List 'Esta lista es la que se muestra al usuario
    Items.Initialize
    Items_Map.Initialize '<------Linea añadida, Items_Map es una variable tipo Map global
    For Each line As String In File.ReadList(File.DirAssets, "colors.txt")  'En este caso, los datos están en un fichero de texto de la forma VALOR:ID (AliceBlue:F0F8FF)
        Dim s() As String = Regex.Split(":", line)
        Dim Name As String = s(0)
        Dim Valor As String = s(1) '<------Linea añadida, tomamos el otro valor para construir el mapa
        Items.Add(Name)
        Items_Map.Put(Name, Valor) <--------'Linea añadida, construimos el mapa para la búsqueda
    Next


Sub btnSearch_Click
    Wait For (Dialog.ShowTemplate(SearchTemplate, "", "", "CANCEL")) Complete (Result As Int)
    'Ahora, cuando recibes el resultado del B4XDialog, haces tu propia búsqueda
    If Result = XUI.DialogResponse_Positive Then
        btnSearch.xLBL.Text = SearchTemplate.SelectedItem
        Log(Items_Map.Get(SearchTemplate.SelectedItem))  '<-----Linea añadida, hacemos la búsqueda para devolver el ID, por ej. si seleccionas AliceBlue, mostrará F0F8FF
    End If
End Sub
Buen día José, gracias por tu ejemplo y respuesta. El método que propones tiene un problema y es el siguiente:


IDDesc
1Descripción
2Otra descripción
3Descripción

Si bien este no es el caso, porque son razones sociales de diferentes empresas, en un listado de marca/modelo, por ejemplo, una tabla de modelo puede ocurrir que sea la misma descripción y distinto producto y en ese caso, que ID sería el correcto?.

Tengo un cliente que es despachante de aduana y hago el software que administra toda su empresa, entre las tablas hay una del catálogo de producto de sus clientes y el caso que te comento, ocurre.

Saludos,
Sergio
 

Sergio Haurat

Active Member
Licensed User
Longtime User
Log(Items_Map.Get(SearchTemplate.SelectedItem)) '<---
Esta línea creo que debería llegar por el ID del número del elemento, un ejemplo de sintaxis inventada
Ejemplo de vínculo List y Map:
'Sintaxis sólo para ejemplificar
Dim idList As Int = listVar.SelectElement.Index
Dim idMap As Int = Map.ElementAt(idList).Get("IDField")
Dim strMap As String = Map.ElementAt(idList).Get("DescField")
 
Top