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 de miraestemar
1
1
miraestemar, Desarrollo de Sistemas en Visual Fox Pro
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.