CURSOR EN MYSQL NO LO PUEDO ACTUALIZAR

68 views
Skip to first unread message

Javier Bernal

unread,
Sep 22, 2023, 10:51:05 PM9/22/23
to Comunidad de Visual Foxpro en Español
Buen dia, comunidad, tengo un detalle, creo un cursor en vfp9, con mysql, lo creo exitosamente y lo coloco en un grid, quiero hacer modificaciones a dos columnas del grid y que actualice el cursor y me muestre los cambios en el grid, pero no lo hace.

Si alguien tuvo esta situacion, que me apoyara para resolverlo, revise que hay una clausula readwrite en el select de mysql, pero curiosamente si lo usas sin la clausula where, funciona, pero si le agregas las condicion where marca error de sintaxis de mysql.

Saludos y espero su apoyo.

HernanCano

unread,
Sep 23, 2023, 12:14:09 AM9/23/23
to Comunidad de Visual Foxpro en Español
Luego que hagas los cambios {parece que los envías al motor con SQLExec(-update-)}, ejecutas algo como:

SQLExec(nHandle,"select * from TABLA-DEL-MOTOR","csrTemporal")

if used("csrTemporal") and reccount("csrTemporal")>0
   select CURSOR_GRID
   delete all
   append from dbf("csrTemporal")
else
   select CURSOR_GRID
   delete all
   MessageBox("No se encontraron datos")  && o algo así
endif

ThisForm.grdDatos.Refresh

Y nos cuentas.

PD: la cláusula READWITE no existe en _MySQL ni en nngún motor. 
Se usa en el SQL dentro de VFP para datos en DBFs, y por lo tanto de todas formas no tiene nada que ver con tu inconveniente.


Cristian Novoa

unread,
Sep 23, 2023, 10:23:28 AM9/23/23
to Comunidad de Visual Foxpro en Español
Hay una forma que nunca terminé utilizando, con los siguientes comandos entre otros:

- TABLEUPDATE
- CURSORGETPROP("UpdatableFieldList",lcALias)+","
- CURSORSETPROP("Buffering", 3, "cLista")
- CURSORSETPROP("SendUpdates", .F.)

Lo que hago generalmente es leer el cursor, habilitando las columnas a editar del grid.

Puedes guardar el grid o parte de el con un SELECT/READWRITE o con APPEND FROM como señalaron, para cuando se manden las actualizaciones, solo modificar las filas cambiadas en el motor.

También se pueden determinar los cambios realizados con GETNEXTMODIFIED, OLDVAL, CURVAL, TABLEUPDATE, TABLEREVERT (esto es muy interesante).

Las filas que hayas modificado, las conviertes en XML 

=CURSORTOXML("cUbicaciones", "lcXMLUbicaciones", 2)

y envías esta cadena a un procedimiento almacenado. En el procedimiento almacenado, se recibe este parámetro como tipo xml.

Acá te expongo un ejemplo de UPDATE dentro del SP. Hay que poner cuidado, en que los alias coincidan (el puesto en el CURSORTOXML y el /VFPData/cubicaciones).

Todas las actualizaciones de múltiples filas las manejo así. Paso como parámetro una tabla. NUNCA HE NECESITADO MAS QUE SQLEXEC. No se puede renunciar a los objetos de una base de datos: transacciones (hay también anidadas, hasta cierto punto, etc.), triggers, sp, (bloqueos y optimizaciones, que ni sabemos cómo funcionan), pk, fk, etc.; que nos ofrece el motor que estamos trabajando.

UPDATE pb
SET pb.ubicacion = txml.ubicacion
FROM tbl_producto_bodega pb INNER JOIN
 (
SELECT tbl.col.value('@codigo_local', 'char(10)') AS codigo_local
 , tbl.col.value('@codigo_bodega', 'char(10)') AS codigo_bodega
 , tbl.col.value('@ubicacion', 'varchar(15)') AS ubicacion
FROM @xml_ubicaciones.nodes('/VFPData/cubicaciones') AS tbl(col)
 ) txml
ON pb.rut_empresa = @rut_empresa
AND pb.codigo_local = txml.codigo_local
AND pb.codigo_bodega = txml.codigo_bodega
AND pb.codigo_producto = @codigo_anterior;

Javier Bernal

unread,
Sep 23, 2023, 11:26:20 AM9/23/23
to Comunidad de Visual Foxpro en Español
Buen Dia, ya hice los cambios, y si funciona, yo me aferre a usar un cursor y tratarlo como una tabla y ese fue mi error, aunque ya lo hacia mas o menos como me dice Hernan, nada mas que usaba un copy a una tabla, que es la usaba en el grid, bueno acerca readwrite si se que no existe en mysql, pero lo curioso es que lo que comento, no me da mensaje de error en la sintasis, cuando lo uso sin la clausula where.
Gracias por su aporte, Saludos


HernanCano

unread,
Sep 23, 2023, 7:24:15 PM9/23/23
to Comunidad de Visual Foxpro en Español
Si necesitas conversar sobre el error en el WHERE, 
y sólo si necesitas conversar sobre el error en el WHERE:

No hemos visto q hayas mostrado el WHERE. Pásalo y te decimos qué sucede, y con info suficiente para saber si es sobre DBFs o si es a un motor externo.
Reply all
Reply to author
Forward
0 new messages