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