La Web del Programador: Comunidad de Programadores
 
    Pregunta:  295 - CUANDO BLOQUEAR EN RED CON CLIPPER
Autor:  Julio
Quisiera conocer la opinión de alguién que halla desarrollado aplicaciones en Red, resulta que trabajo en Clipper y necesito hacer una transacción que involucra más de 3 archivos, mi inquietud es: Se tiene que bloquer el archivo1 y si es exitoso el archivo2 y si también es exitoso el bloqueo entonces regresar al 1 hacer modificaciones y asi con los demás y una vez que se acabó todad la transacción desbloquear todos, O se tiene que bloquear uno solo, relizar la transacción, desbloquearlo, bloquear el siguiente y así con el resto?.
Pero si se acepta la 2a opción en el caso de que no se pueda bloquer al 3er archivo, tendria que haber una rutina de dejar todo como estaba, sino habrá inconsistencia en la información.

Gracias


  Respuesta:  Luis Ponce
bloquea solo el registro que necesitas con RLOCK() y cuando termines de hacer lo que quieres lo desbloqueas UNLOCK

  Respuesta:  José Revoredo
La respuesta de Claudio es la que mejor se ajusta a tu pregunta. Entiendo que tu rollo es referido al RollBack en Clipper. (Que no existe de fácil como en una BDR). Hay ejemplos en el manual de programación y guía de utilidades Clipper. Pero tienes que aprender a programarlo usando el BEGIN SEQUENCE y END SEQUENCE, así como el RECOVER USING.
Sería una terrible ventaja que existiese COMMIT y ROLLBACK no ?

  Respuesta:  Gerardo A. Mendoza
Hola:
Mira para desarrollar una aplicación en red tienes que considerar varias cosas. Definitivamente lo óptimo es tener todos los recursos disponibles antes de hacer la transacción; después liberarlos. Es importante que consideres la cantidad de accesos a las tablas en lo referente a actualización.
En una aplicación de inventarios tenga que actualizar la tablas de E/S, una de Kárdex y la de saldos del artículos (3 tablas) obtengo los recuros actualizo Kárdex (alta), Saldos (actualización) y el detalle lo marcó (actualizo) en un campo de proceso ok; libero las tres tablas.
Para esto utiliza una rutina de persistencia en la cual trato de tomar el recurso (tabla), en caso de estar ocupado 5 segs. mando un mensaje en el cual el usuario puede continuar o abortar.
De acuerdo a la operación del usuario, se que a lo más dos usuarios actualizaran dichas tablas, así que este proceso funciona muy bien.
Como referencia, al final del día se emite un reporte de las e/s, en el cual si existe alguna transacción erronea la imprime, lo cual me permite tomar las medidas necesarias, o detectar porque no se pudo actualizar. Es importante que el usuario, al ver este mensaje te avise o tenga una opción para corregirlo. Si funciona!

Si tienes más dudas házmelo saber y con gusto puedo contestartelas.

UN GRAN SALUDO DESDE MEXICO :-)


  Respuesta:  Juan Reyes
CUANDO BLOQUEAR EN RED CON CLIPPER ?, cuando necesites esto :

1.- Bloquear una DBf, cuando necesites hacerle un PACK , ZAP, REPLACE, Etc.

..USE Clientes NEW EXCLUSIVE
..If NetErr()
....."No se pudo abrir ..."
.....RETURN
..EndIf
..
..ZAP
..
..
2.- Bloquear un registro, cuando necesites actualizar sus datos, ya que esta base de datos se abrió en modo compartido.
..If lIngresar
.....Clientes->( JrInsertRec() )
.....Clientes->Rut := cRut
..Else
.....Clientes->( JrLockRec() )
..EndIf
..Clientes->RSocial := cRSocial
..Clientes->Direc := cDirec
..Clientes->credito := "S"
..Clientes->( DbCommit() )
..Clientes->( DbUnLock() )
3.- Necesitas bloquear el registro antes de que lo vas a borrar.
..Clientes->(JrLockRec())
..Clientes->(JrDbDelete())
..Clientes->(DbCommit())
..Clientes->(DbUNLock())
chao amigo
:-)

  Respuesta:  Claudio
Hola, llevo tiempo en esto de la programación de Clipper en entorno de red, especialmente en redes novell. Tenía muchos problemas a la hora de efectuar transacciones en estos sistemas, sobretodo considerando que pudiesen ocasionarse casos fortuitos como cortes de luz u otros. Solucioné estos problemas creando mecanismos de rollback, para ello redefiní el comando BEGIN SEQUENCE, RECOVER y END SEQUENCE y cada vez que necesito efectuar transacciones, encierro todo el código entre dichos comandos y listo!!!. Ha sido una solución que hasta el momento ha trabajado perfecto; pero el tema es demasiado largo para exponerlo aquí. Prometo que si respondes, te enviaré el código fuente de estas rutinas con un ejemplo.

  Respuesta:  Marco Scolamieri
Con Clipper viene un archivo LOCKS.PRG, con funciones de RED.
Solo tenes que bloquear el Registro que queres actualizar y una vez actualizado lo desbloqueas
If Rec_lock(0)
Replace ... With ...
Replace ... With ...
...
EndIf
Unlock (Desbloquea)
Si necesitas el archivo o algo mas, escribime