Martín: fiajte en en Help de Tableupdate que tiene un item de desbloquear datos. El tema es que al tener el Multilocks en ON al final de la transacción deberías forzar un Unlock
Pablo Sigüenza _____ De: GUFA@mug.org.ar [mailto:g...@mug.org.ar] En nombre de Martín A. Glanz Enviado el: Viernes, 18 de Junio de 2010 04:54 p.m. Para: GUFA List Member Asunto: [GUFA] Problemas con bloqueo registros Pablo: Haciendo el Do while que proponés sería como hacer un Set Reprocess to -2 o Automatic? En el caso del Append blank no estoy usando RLOCK() ya que de eso se encarga el VFP y creo que es ahí dónde se me produce el problema. Voy probando y luego cuento. Gracias. Martín De: GUFA@mug.org.ar [mailto:g...@mug.org.ar] En nombre de Pablo Pioli Enviado el: Viernes, 18 de Junio de 2010 04:18 p.m. Para: GUFA List Member Asunto: [GUFA] Problemas con bloqueo registros El RLock puede fallar. No manejas ese caso? Si estas seguro que haces el Unlock siempre y en seguida yo haria Do While !RLock() Enddo ----- Original Message ----- From: Martín A. Glanz <mailto:martingl...@tarjetafaro.com.ar> To: GUFA List Member <mailto:GUFA@mug.org.ar> Sent: Friday, June 18, 2010 2:15 PM Subject: [GUFA] Problemas con bloqueo registros Estimados: Tengo un sistema que ha incrementado sustancialmente sus movimientos y me genera en forma aleatoria problemas de bloqueo de registros. El proceso en el que se genera errores es básicamente esto: *** Obtengo el número de operación Use numera in 0 shared Select numera Go 1 =CursorSetProp("Buffering", 1, "numera") =Rlock() lccontador1=Padl(Alltrim(Str(Val(numera.contador) + 1)),8,"0") Replace numera.contador With lccontador1 Unlock Use in select(numera) Use otraTabla in 0 shared Select otraTabla =CursorSetProp("Buffering", 5, "otraTabla") Use detalles in 0 shared Select detalles =CursorSetProp("Buffering", 5, "detalles") Use cabecera in 0 shared Select cabecera =CursorSetProp("Buffering", 5, "cabecera") *** Registro en table detalle For j=1 To lnDetalles Select Detalles Append Blank Replace . Replace Replace Replace Next j *** Registro Cabecera Select cabecera Append Blank Replace If lNecesario Sele otraTabla If seek(registro,otratabla,miIndica) Replace endif Endif Begin Transaction If ! ( Tableupdate(2,.T., "Cabecera") And Tableupdate(2,.T., "Detalles") And iif(lNecesario,Tableupdate(2,.T., "otraTabla"),.t.)) Rollback =Tablerevert(.T.,"Cabecera") =Tablerevert(.T.,"Detalles") If lNecesario =Tablerevert(.T.,"otraTabla") Endif Use in select(Cabecera) Use in select(Detalles) Use in select(otraTabla) Return ERROR Else End Transaction Return lcContador1 Endif Tengo seteado el Multilocks=ON y Set Reproccess = 5 Hay módulos que corren en VFP6 y otros en VFP9 (en este caso tengo el Set EngineBehavior=70). Los datos residen en un servidor Dell (muy cojudito) con W2008 R2 64bits y este proceso se lleva a cabo en muchas terminales, aunque principalmente en un HP ML110 con W2008. La frecuencia de este proceso llega a 400/500 repeticiones hora y por lo que puedo ver el problema está en que no logra establecer el bloqueo de los registros de la tabla Detalles. ¿Está bien el SET REPROCCESS? ¿Sería preferible utilizar INSERT SQL en lugar de APPEND BLANK Replace ? ¿Sugerencias? Como corresponde, agradecido de antemano. Martín Se certificó que el correo entrante no contiene virus. Comprobada por AVG - www.avg.es Versión: 9.0.829 / Base de datos de virus: 271.1.1/2946 - Fecha de la versión: 06/18/10 03:35:00