¿Como puedo ordenar las filas de un grid?

Tengo un grid con filas correspondientes a una factura, y necesito que tras seleccionar una fila, pueda cambiarla de posición dentro del mismo grid, para subir la línea en una posición cada vez que pulse un botón y bajar una posición con otro botón.

La cuestión es poder ordenar las filas en su posición para arriba o para abajo para que queden como yo quiero y poder imprimir el ticket en el orden que yo establezca.

¿Cómo puedo subir o bajar las filas después de seleccionarlas?

Respuesta
1

Un placer poder colaborar... aunque la pregunta ya tenga bastante tiempo. Para eso, yo implemente la siguiente solución.

Cada registro que se agrega al cursor en cuestión mientras el cliente compra, debe guardar también un numero consecutivo ascendente... osea que si grabas 5 registros de productos, el orden debe ser 1, 2, 3... y así para cada registro. Eso es vital. El orden siempre debe estar dado o depender de algo... no puede surgir de la nada. Yo te sugiero que para eso, al hacer el insert del producto en el cursor, contes cuantos registros tienes ya cargados en dicho cursor y sumes + 1, osea, ocupa como "autogenerador" la cantidad de registros(que se puede obtener con RECCOUNT() ) y a eso le sumes +1, lo guardas en una variable y le sumas + 1 y lo insertas junto con los datos del producto.

Para ejemplificar lo que deduzco necesitas, hace lo siguiente: vamos a "EMULAR" el comportamiento de desplazamiento de registros en el grid de un modo sencillo.

1. Crea un formulario y agregale un grid de 2 columnas y dos botones, uno que sea para SUBIR y otro para BAJAR.

2. En el evento INIT del form, copia este código: con esto creas el cursor, estableces un ORDER por el campo registro (de tipo numérico) y agregamos algunos registros de prueba:

LOCAL lnReg

THIS.AutoCenter = .t.

CREATE CURSOR temp(registro N(4), nombre C(10))

INDEX ON registro TAG reg
SET ORDER TO reg

SELECT temp
GO TOP

COUNT FOR NOT DELETED(temp.registro) TO lnReg

lnReg = lnReg + 1

INSERT INTO temp(registro, nombre) VALUES(lnReg, "AAA")
lnReg = 0

SELECT temp
GO TOP
COUNT FOR NOT DELETED(temp.registro) TO lnReg
lnReg = lnReg + 1
INSERT INTO temp(registro, nombre) VALUES(lnReg, "BBB")
lnReg = 0

SELECT temp
GO TOP
COUNT FOR NOT DELETED(temp.registro) TO lnReg
lnReg = lnReg + 1
INSERT INTO temp(registro, nombre) VALUES(lnReg, "CCC")
lnReg = 0

SELECT temp
GO TOP
COUNT FOR NOT DELETED(temp.registro) TO lnReg
lnReg = lnReg + 1
INSERT INTO temp(registro, nombre) VALUES(lnReg, "DDD")
lnReg = 0

SELECT temp

GO TOP

THISFORM.grid1.RecordSource = "temp"

**-----------------------//

3 . En el boton SUBIR, evento click, copia este codigo: 

LOCAL lnRegistro, lnAnterior

SELECT temp

lnRegistro = temp.registro
lnAnterior = lnRegistro - 1

IF lnAnterior =< 0
**
ELSE
REPLACE temp.registro WITH 0 FOR temp.registro = lnRegistro
SELECT temp
REPLACE temp.registro WITH lnRegistro FOR registro = lnAnterior
REPLACE temp.registro WITH lnAnterior FOR temp.registro = 0
ENDIF

**
SELECT temp
GO TOP

RELEASE lnRegistro, lnAnterior

THISFORM. Refresh()

**-----------------------------

4. En el botón BAJAR, evento Click, copia este código:

LOCAL lnRegistro, lnSiguiente

SELECT temp

lnRegistro = temp.registro
lnSiguiente = lnRegistro + 1

lntotalReg = RECCOUNT()

IF lnSiguiente > lntotalReg
**
ELSE
REPLACE temp.registro WITH 0 FOR temp.registro = lnRegistro
SELECT temp
REPLACE temp.registro WITH lnRegistro FOR registro = lnSiguiente
REPLACE temp.registro WITH lnSiguiente FOR temp.registro = 0
ENDIF

**
SELECT temp
GO TOP

RELEASE lnRegistro, lnSiguiente

THISFORM. Refresh()

**-----------------------

5. Guarda los cambios y ejecuta. Posiciónate en un registro y dale BAJAR o SUBIR y veras como se desplazan los registros, según entiendo tu explicación.

¿Qué hacemos? Ocupamos un campo numérico para almacenar el numero consecutivo del registro. Según la necesidad (subir o bajar) se le suma o resta una unidad, se reemplaza el numero de registro del producto que esta antes o después (según el caso) y se reordena!

Adecualo a tus necesidades, pero básicamente así es como funcionaria para tal fin.

Si tienes dudas, avisame! Atento a cualquier consulta!

Un abrazo!

Desde Managua, Nicaragua!

Ravenn :D :D :D :D 

¡Muchísimas Gracias!  mejor respuesta no podría obtener...

¿Te ha funcionado bien? Si necesitas algo, avisame! Por acá andaré! :) Suerte y un abrazo!

2 respuestas más de otros expertos

Respuesta
2

Si el orden que deseas está dado por un orden de índice solo bastaría que abras la tabla de detalles con el indice y se irá ordenando. En cambio si lo que necesitas es un orden aleatorio sin ningún criterio específico; se me ocurre que podrías crear un campo numérico en el que definas ya automáticamente o manualmente el orden solo cambiando la numeración del mismo campo y sobre éste que exista un indice.

Hola, gracias por responder, te comento...
El orden no está dado por un orden de indice, son lineas que se van añadiendo según el cliente va comprando productos, lo único que quiero es que la fila seleccionada actualmente se mueva un lugar más arriba cuando le haga clic a un botón y una fila hacía abajo si hago clic  en otro botón. 

En principio no puedo añadir un campo nuevo numérico y ordenarlo por ese número, porque en cuanto haga varios movimientos ya no será posible.

Me serviría saber como llamar a la línea actual y restarle una posición dentro del grid al pulsar un botón, o sumarle una posición al pulsar otro botón, pero en visual fox pro, no tengo experiencia.

Podrías crear una tabla cursor, por ej.:

Select Select(1)
Create Cursor csrDetalle (Orden n(3), Detalle c(40), Precio n(10,2), Cantidad n(10,2), Total n(10,2))
Index on Orden Tag Orden

Sobre éste table cursor cargas los detalles y el orden será según el número de Orden que indiques, bastará que cambies el número de orden según le des un click al boton subir o bajar; y con ésto se re-ordenará.

Cuando guardes la factura solo usas el comando insert into para cargar todo el detalle dentro de tu tabla fija de detalles y en el orden que hayas establecido.

Respuesta
1

https://msdn.microsoft.com/es-es/library/bb383929(v=vs.90).aspx 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas