conflicto de actualizacion

19/04/2005 - 18:44 por Luis Fernando Bedoya | Informe spam
Me pueden colaborar con la siguiente situacion ; les agradezco de antemano



Tengo una aplicacion con tres tablas
1. documentos, (Guarda el nro de la facturas o consecutivos)
2. enc_mov ( encabezados de las facturas)
3. mov ( items de las facturas )

set multilock on
set reprocess to 30 seconds

abro las tablas

aplico el comando siguiente a cada una de las tablas
CURSORSETPROP("Buffering", 3, "DOCUMENTOS")
CURSORSETPROP("Buffering", 3, "enc_mov")
CURSORSETPROP("Buffering", 5, "Mov")

Cuando creo o modifico una nueva factura hago un Begin transaction

y cuando las grabo hago un tableupdate para cada tabla si es exitosa hago un
end transaction , sino un rollback


IF TABLEUPDATE( 1, .t. ,"DOCUMENTOS") AND TABLEUPDATE( 1, .t. ,"MOV") AND
TABLEUPDATE( 1, .t. ,"ENC_MOV")
=MESSAGEBOX("Transaccion Exitosa",64,"TRANSACCION",1)
END TRANSACTION


ELSE
ROLLBACK
TABLEREVERT( .t.,"DOCUMENTOS")
TABLEREVERT( .t.,"MOV")
TABLEREVERT( .t.,"ENC_MOV")
®RROR( aCualError)
FOR j= 1 TO 7
MESSAGEBOX( acualerror(j) )
NEXT
=MESSAGEBOX("Error en la Transaccion",0,"E R R O R TRANSACCION")
ENDIF



al parecer funciona bien , excepto , cuando por coincidencia 2 usuarios
intentan modificar una misma factura exactamente
al mismo tiempo.


El error es "conflicto de actualizacion", si le digo pasar por alto, el
programa continua pero lo que hace es unir las dos actualziaciones

el sistema trabaja los registros en un cursor , luego al actualizar hace un
delete from y luego hace los insert

Como me recomiendan manejar este tipo de situacion?

Gracias

Luis Fernando Bedoya
 

Leer las respuestas

#1 Esparta Palma
19/04/2005 - 19:05 | Informe spam
Algunas recomendaciones:

1.- Usa Vistas, te evitarás el problema de hacer Delete(s) e Insert(s)
2.- Utiliza todos los parámetros de la función TableUpdate(), uno de
ellos le indicas que no force los cambios, cuándo encuentre un error, no
los "sobreescribirá"
3.- No intentes poner interface en una transacción, déjalos fuera de ese
bloque, esto lo digo porque hay un Messagebox antes de END TRANSACTION.



ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/ <- Tech
http://www.espartha.com/blog/ <- Personal
VFP Bookmarks http://del.icio.us/esparta/vfp

Luis Fernando Bedoya wrote:
Me pueden colaborar con la siguiente situacion ; les agradezco de antemano



Tengo una aplicacion con tres tablas
1. documentos, (Guarda el nro de la facturas o consecutivos)
2. enc_mov ( encabezados de las facturas)
3. mov ( items de las facturas )

set multilock on
set reprocess to 30 seconds

abro las tablas

aplico el comando siguiente a cada una de las tablas
CURSORSETPROP("Buffering", 3, "DOCUMENTOS")
CURSORSETPROP("Buffering", 3, "enc_mov")
CURSORSETPROP("Buffering", 5, "Mov")

Cuando creo o modifico una nueva factura hago un Begin transaction

y cuando las grabo hago un tableupdate para cada tabla si es exitosa hago un
end transaction , sino un rollback


IF TABLEUPDATE( 1, .t. ,"DOCUMENTOS") AND TABLEUPDATE( 1, .t. ,"MOV") AND
TABLEUPDATE( 1, .t. ,"ENC_MOV")
=MESSAGEBOX("Transaccion Exitosa",64,"TRANSACCION",1)
END TRANSACTION


ELSE
ROLLBACK
TABLEREVERT( .t.,"DOCUMENTOS")
TABLEREVERT( .t.,"MOV")
TABLEREVERT( .t.,"ENC_MOV")
®RROR( aCualError)
FOR j= 1 TO 7
MESSAGEBOX( acualerror(j) )
NEXT
=MESSAGEBOX("Error en la Transaccion",0,"E R R O R TRANSACCION")
ENDIF



al parecer funciona bien , excepto , cuando por coincidencia 2 usuarios
intentan modificar una misma factura exactamente
al mismo tiempo.


El error es "conflicto de actualizacion", si le digo pasar por alto, el
programa continua pero lo que hace es unir las dos actualziaciones

el sistema trabaja los registros en un cursor , luego al actualizar hace un
delete from y luego hace los insert

Como me recomiendan manejar este tipo de situacion?

Gracias

Luis Fernando Bedoya


Preguntas similares