La Web del Programador: Comunidad de Programadores
 
    Pregunta:  51443 - ERROR AL INTENTAR BLOQUEAR UN REGISTRO
Autor:  Andres Gramaglia
Programo en clipper 5.20 (con rtlink) y tengo el siguiente problema: Me aparece el siguiente error cuando estoy ejecutando el programa en red (windows 98/xp): Advertencia DBFNTX/1035 Lock Failure (intento realizar muchos bloqueos simultaneos). El programa está depurado, cada rlock() tiene su unlock(). Tengo Files=240, set clipper=f240 y fcbs=255. En una red novell funciona perfectamente. Muchas Gracias

  Respuesta:  JUAN HERNANDEZ MEDINA
Bueno,, amigo yo no creo que se pueda bloquear simultaneamente mas de un registro por vez y menos si se trata de diferentes AREAS de trabajo o bases de datos. Recuerda que la programación en clipper sigue siendo lineal (proceso por vez) Tu puedes bloquear un registro con rlock() como tu mismo ya lo indicaste o incluso un archivo completo con flock(). El trabajo con redes en clipper en realidad es muy simple pero requiere su entendimiento. En primer intancia yo utilizo en mi file de configuracion la siguiente sentencia para indicarle al compilador que mi aplicación sera multiusuario: SET EXCLUSIVE OFF (yo lo declaro siempre al principio de la ejecucion de mis aplicaciones en un PRG de configuracion de mi entorno de trabajo), posteriormente hay que saber en que puntos se deben considerar los bloqueos para evitar las colisiones de datos y esto es simple. Tan solo hay que considerar que tipos de operaciones AFECTAN FISICAMENTE los datos, por ejemplo cuando hacemos cambios a un registro, lo borramos, etc.en otras palabras cuando empleamos comandos o funciones tales como REPLACE, PACK, ZAP, DELETE basicamente. OJO con ZAP y PACK ya que estas requieren bloqueo del file completo. Yo prefiero, abrirlo en EXCLUSIVE cuando voy a realizar un ZAP o pack.
Ahora bien para ir modificando los registro bloquealos uno a uno. Es decir, por ejemplo si vas a modificar un dato registro por registro segun una condicion:

do while .not. eof()
w_dato = VALOR
br() // Bloquea registro
replace VALOR with w_dato + 1
qb() // Quita bloque
skip + 1
enddo

// Mis funciones de bloqueo simplificadas para este emjemplo:
function br
do while .t.
if rlock()
exit
endif
enddo
return()

function qb
unlock()
return()