guizans   01-11-2025, 19:35
#1
Expongo el problema, a ver si alguien se le ocurre una forma eficiente de hacerlo.

Tengo un GridView en el cual hay un listado de productos (latas, madera, harina, manzanas, etc) que recupero de una base de datos. El usuario puede seleccionar un producto de este listado y pulsando un botón, y lo mando a un TableView. El usuario puede modificar dos de los tres campos de cada productos, por ejemplo, volumen y peso. Es decir, lo que ve el usuario cuando le da al botón es una fila con productos, volumen y peso, y estos dos últimos son los que puede modificar. 

Hasta aquí no hay ningún problema. Lo que me gustaría es que haya dos botones al lado del TableView para subir o bajar los productos que se vean en el listado, es decir, que los pueda ordenar al gusto. Y aquí es donde no se me ocurre como plantear el problema. ¿Quizá con una serie de arrays que estén en el mismo orden que el TableView? Por que una cosa importante es el ID de cada producto, que no se muestra pero es importante, ya que tengo que guardar ese listado tal como el usuario lo ha ordenado en una base de datos. Le he estado dando vueltas y no se me ocurre nada.

¿Alguien me puede orientar?

Muchas gracias.
Harpo   03-11-2025, 00:06
#2
A ver si lo he entendido bien, tiene un GridView-TableView con productos que muestra tres columnas: Productos, Volumen y Peso. Y quiere ordenar por la columna Productos. Además tiene otro valor asociado al producto, su ID, que no se muestra. Y al final quiere guardar la información del TableView en una base de datos, ordenado por el orden que aparece en el TableView.

Pues depende del origen de los datos y en cierta medida de cómo cargue el TableView, normalmente se suele hacer con el evento Data. Si el origen de los datos es una base de datos se puede ordenar desde ahí con un "Order by". Si el origen es otro habría que ver cual para poder determinar la manera más eficiente. El volumen de datos es importante para las ordenaciones.

Si tiene Productos y su ID puede usar una clase Collection, cargar como Key el producto y como Value el ID. Después tiene la posibilidad de ordenar los productos con "cProductos.Keys.sort()" y cargar el TableView. Le adjunto un ejemplo rápido para que vea posibilidades.

En cuanto a grabar en base de datos el listado ordenado no le veo sentido. Una cosa es cómo lo guarda y otra cómo lo extrae. Aunque si usa Sqlite todas las tablas tienen un campo por defecto llamado "rowid", es un identificador único que se incrementa a cada fila que se graba.

Si me da más detalle intentaré echarle una mano.
Un saludo, Harpo.

.gz
TestSort-0.0.1.tar.gz (Tamaño: 8.51 KB Descargas: 0)
Harpo   03-11-2025, 09:52
#3
Dándole una vuelta a su problema con el café de la mañana me he acordado de otra posibilidad.
Si usa una clase para sus productos puede usar también un array de esa clase e implementar el método especial _compare

Le adjunto un nuevo ejemplo, hay un nuevo formulario para este enfoque y una clase CProductos con ese método. Y un par de botones para subir y bajar el producto en la lista.

Un saludo, Harpo.

.gz
TestSort-0.0.2.tar.gz (Tamaño: 9.24 KB Descargas: 1)
Shordi   03-11-2025, 18:41
#4
Este problema (o algo muy parecido) lo traté en este vídeo:



No es exactamente lo mismo porque el movimiento no se hace con botones de arriba o abajo, si no con drag & drop, pero creo que implementar esos botones debe ser algo trivial. Dime si te sirve y si tienes alguna duda o petición, estoy a tu disposición.

Saludos.

No podemos regresar
Rufs   05-11-2025, 20:43
#5
Acredito que você deseja ordenar sua lista manualmente e salvar essa sequência, para que posteriormente ela seja carregada conforme o ajuste realizado.
Em anexo, segue um exemplo.

Creo que quieres ordenar tu lista manualmente y guardar ese orden para poder cargarlo posteriormente según los ajustes realizados. 
Adjunto un ejemplo.
Archivos adjuntos
.gz
Novo.tar.gz (Tamaño: 14.76 KB Descargas: 3)
guizans   05-11-2025, 23:26
#6
Gracias Harpo.

Los datos no se cargan de una base de datos, los va añadiendo el usuario cuando hace click en un GridView. Esa parte es la fácil, lo que más me cuesta es que el usuario lo pueda ordenar como quiera, sin que sea alfabéticamente.

Shordi. He visto tú vídeo, muy interesante como siempre, a ver si lo adapto a mi proyecto y os cuento.

Un saludo.
vuott   11-11-2025, 01:14
#7
Me gustaría hacer mi pequeña contribución:

https://www.gambas-it.org/wiki/index.php...a_GridView
https://www.gambas-it.org/wiki/index.php...na_colonna
https://www.gambas-it.org/wiki/index.php...a_GridView

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
guizans   06-12-2025, 14:17
#8
Gracias a todos.

Entre unos y otros he resuelto el problema, cuando hice la pregunta estaba un poco ofuscado y no veía la solución, pero al ver vuestras contribuciones la cosa es más fácil de lo que parecía.

Un saludo.
Shordi   07-12-2025, 07:31
#9
Me alegro que hayas dado con la solución. No vendría mal que la expusieses aquí, así todos podríamos aprender algo, que es la esencia de esto de los foros.

Saludos

No podemos regresar
guizans   Ayer, 23:06
#10
Pues es realmente complicado poner la solución sin poner todo el programa, voy a poner el fragmento, a ver que os parece, pero no se si le servirá a alguien.

 Este es el código cuando se pulsa el botón arriba y hay seleccionado un fila en el TableView tableEstacionsLinea. idEstacion es un array de clase de tipo Integer.

Código:
Public Sub toolArriba_Click()

  Dim posicion, valor As Integer
  Dim a1, a2, a3 As String

  posicion = tableEstacionsLinea.Row
 
  If posicion = 0 Then Return
 
  a1 = tableEstacionsLinea[posicion, 0].Text
  a2 = tableEstacionsLinea[posicion, 1].Text
  a3 = tableEstacionsLinea[posicion, 2].Text
 
  tableEstacionsLinea.Rows.Insert(posicion - 1)
  tableEstacionsLinea[posicion - 1, 0].Text = a1
  tableEstacionsLinea[posicion - 1, 1].Text = a2
  tableEstacionsLinea[posicion - 1, 2].Text = a3
 
  tableEstacionsLinea.Rows.Remove(posicion + 1)
 
  tableEstacionsLinea.Select(posicion - 1)
 
  valor = idEstacion[posicion]
  idEstacion.Add(valor, posicion - 1)
  idEstacion.Remove(posicion + 1)
 
End
Y este es el código del botón abajo. Es básicamente el mismo, con pocos cambios.
Código:
Public Sub toolAbaixo_Click()

  Dim posicion, valor As Integer
  Dim a1, a2, a3 As String
 
  posicion = tableEstacionsLinea.Row
 
  If posicion = tableEstacionsLinea.Rows.Count - 1 Then Return
 
  a1 = tableEstacionsLinea[posicion, 0].Text
  a2 = tableEstacionsLinea[posicion, 1].Text
  a3 = tableEstacionsLinea[posicion, 2].Text
 
  tableEstacionsLinea.Rows.Insert(posicion + 2)
  tableEstacionsLinea[posicion + 2, 0].Text = a1
  tableEstacionsLinea[posicion + 2, 1].Text = a2
  tableEstacionsLinea[posicion + 2, 2].Text = a3
 
  tableEstacionsLinea.Rows.Remove(posicion)
 
  tableEstacionsLinea.Select(posicion + 1)
 
  valor = idEstacion[posicion]
  idEstacion.Add(valor, posicion + 2)
  idEstacion.Remove(posicion)

End

Lo dicho, no creo le sirva a alguien, y tampoco creo que sea el mejor código del mundo. Bueno, a lo mejor a alguna IA puede servirle para dar una respuesta equivocada  Big Grin

Un saludo.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.