Vfp en red

Si tengo que desarrollar una aplicación que ingresan diferentes usuarios con contraseña, desde terminales a la Bd que esta en un servidor, si no puede pasar que varios usuarios estén actualizando al mismo tiempo una tabla, pero si que uno este actualizando y otro consultando, o dos consultando al mismo tiempo, ¿lo mismo tengo que usar buffering para esta aplicación?. ¿Me podrás pasar alguna dirección que pueda encontrar un ejemplo de aplicación en red?.

1 Respuesta

Respuesta
1
A ver si te puedo ayudar, hace un tiempo hice una aplicación para que funcione en red. Primero y principal, no hace falta hacer buffering, siempre que se bloquee la o las tablas para que solo 1 puede modificar un registro y el resto solo consultar, no va a hacer falta hacer buffering.
*****************************************
Pasemos a la ayuda:
1º) Lo que hice en mi proyecto es crear un prg que va a servir como principal, esto es lo primero que se va a ejecutar (botón derecho sobre el prg y establecer como principal), este es el código que puse en ese prg:
SET DATE TO FRENCH
SET EXACT ON
SET TALK OFF
SET SAFETY OFF
SET CENTURY ON
SET DELETE ON
SET REFRESH TO 1,1
SET EXCLUSIVE OFF
SET AUTOSAVE ON
SET OPTIMIZE ON
SET REPROCESS TO AUTOMATIC
SET MULTILOCKS ON
Local lcPath
Public directorio
directorio = ""
lcPath = sys(16,0) && Devuelve el nombre del programa que se está ejecutando
directorio = left(lcPath,rat("\",lcPath)-1) && Extrae de la cadena la última barra '\'
directorio = right(directorio,len(directorio)-at(' ',directorio,2))
directorio = alltrim(directorio)
SET DEFAULT TO (directorio)
OPEN DATABASE DIRECTORIO+"\BASEDATOS" SHARED
DO FORM (directorio+"\principal")
READ EVENTS
*****************************************
2º) Si voy a dar de alta, por ejemplo a un cliente, primero verifico si voy a poder bloquear la tabla clientes con el FLOCK, (FLOCK( ) devolverá verdadero (.T.) Si logra bloquear la tabla y devolverá falso (.F.) Si la tabla o algún registro de la tabla ya están bloqueados por otro usuario); si logro bloquear la tabla pero el cliente que voy a insertar ya existe desbloqueo la tabla con UNLOCK. Si por el contrario, no existe el cliente que estoy por insertar, entonces inserto el registro y luego desbloqueo la tabla con UNLOCK.
Este es un ejemplo del código que uso:
SELE CLIENTES
IF FLOCK()
GO TOP
LOCATE FOR (DNI = THISFORM.TXTDNI.VALUE)
IF FOUND()
UNLOCK
MESSAGEBOX("El Dni ingresado corresponde al Cliente: "+ALLTRIM(CLIENTES.AYN)+CHR(13)+"Verifique el número de documento.",(0+48+0),"Atención")
THISFORM.TXTDNI.SETFOCUS
ELSE
APPEND BLANK
GATHER MEMVAR
THISFORM.MODIFICAR.ENABLED = .T.
THISFORM.IMPRIMIR.ENABLED = .T.
THISFORM.COMMAND2.ENABLED = .T.
THISFORM.PRIMERO.ENABLED = .T.
THISFORM.ANTERIOR.ENABLED = .T.
THISFORM.SIGUIENTE.ENABLED = .T.
THISFORM.ULTIMO.ENABLED = .T.
THISFORM.NUEVO.ENABLED = .T.
THISFORM.COMMAND1.ENABLED = .T.
THISFORM.CANCELAR.ENABLED = .F.
THISFORM.GUARDAR.ENABLED = .F.
THISFORM.TXTDNI.ENABLED = .F.
Thisform. Primero. Setfocus
Se le clientes
SCATTER MEMVAR
THISFORM. REFRESH
UNLOCK
MESSAGEBOX("Los datos se guardaron con éxito.",(0+64+0),"Información")
Endif
Endif
*****************************************
3º) Si voy a modificar un registro, hago algo parecido a la inserción de registros, el código sería este:
B = MESSAGEBOX("Desea guardar los cambios.",(4+32+0),"Atención")
IF (B = 6)
IF FLOCK()
Gather memvar
UNLOCK
MESSAGEBOX("Los cambios se modificaron con éxito.",(0+64+0),"Información")
Se le clientes
SCATTER MEMVAR
Thisform. Primero. Setfocus
THISFORM. REFRESH
Endif
ELSE
Se le clientes
Scatter memvar
Thisform. Primero. Setfocus
THISFORM. REFRESH
Endif
*****************************************
Siempre tienes que tener cuidado con el bloqueo y desbloqueo, si bloqueaste una tabla, debes desbloquearla ni bien termines de hacer las actualizaciones o inserciones. Por ejemplo:
IF FLOCK()
UNLOCK
Endif
EL FLOCK() va a quedar haciendo un ciclo si la tabla esta bloqueada, una vez que la tabla es desbloqueada por otro usuario, va ingresar por el IF FLOCK() y va a ejecutar el código que le sigue, no hace falta presionar varias veces el botón guardar (por ejemplo), hasta esperar que se desbloquee la tabla. Esta acción de quedarse esperando hasta que se desbloquee la tabla se logra con el código que puse en el prg, más precisamente en la línea SET REPROCESS TO AUTOMATIC (Especifica que Visual FoxPro intenta bloquear indefinidamente el registro o el archivo), si no pones esta línea el FLOCK solo intentará bloquear 1 vez.
Con respecto a las consultas, las podes hacer en cualquier momento, ya que cuando se bloquea una tabla con el FLOCK, la tabla estará disponible tanto para lectura como para escritura para el usuario que ha efectuado el bloqueo. Los otros usuarios de la red tendrán acceso de sólo lectura sobre la tabla.
*****************************************
*****************************************
Bueno, eso es todo, espero que te sirva mi ayuda. Suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas