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


Responder a