TEngo un program de captacion de comprobantes de diarios, y tengo dos maquinas en red, quiero que mi programa hecho en visual foxpro 9, se pueda ejecutar desde ambas maquinas y se almacene en una sola, si me puede decir como hacer esto, las dos maquinas tienen Windows XP, y estan en red, se ven una a la otra y puedo enviar y recibir archivos desde una a la otra, pero no puedo hacer que grabe desde la 2da a la primera, me ayuda por favor si es tan amable,,.
1 respuesta
Respuesta de miraestemar
1
1
miraestemar, Desarrollo de Sistemas en Visual Fox Pro
Te cuento que todavía no trabajo con el VFP 9, pero de todas maneras te respondo lo que le respondí una vez a un chico que me consulta de como trabajar en RED desde VFP. Paso a explicar: Primero y principal, no hace falta hacer buffering, siempre que se bloquee la o las tablas para que solo un usuario pueda 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.