Page 1 of 1

Bloqueo de fichero

Posted: Fri Jan 12, 2007 11:17 pm
by JoseLuis
Hola amigos
Tengo un trabajo entre manos y no se como resolverlo
La idea es que en un directorio hay varios ficheros .jpg que contienen imagenes de albaranes, cargarlos en un array, y presentar siempre el primero para trabajar, una vez hecho el trabajo, borrar dicho fichero. Hasta ahí no hay problema si hubiera un solo operador, pero en un sistema de red, si un operador tiene el jpg en pantalla y todavía no lo ha destruido, al cargar otro operador el array, también cargaría en pantalla el mismo fichero, ya que sería el primero del array; por lo que los dos trabajarían en el mismo albarán.

Me gustaría saber si hay alguna forma de cuando trabajo con un .jpg, bloquearlo para que no lo pueda capturar otro operador.

Si no fuera así, sería buena idea para impedir duplicidad, copiar éste fichero en otro directorio temporal y borrarlo del directorio anterior mientras se meten los datos de éste?

Saludos

Jose Luis

Posted: Sat Jan 13, 2007 4:53 am
by Ruben Fernandez
Jose Luis:

Quizas te pueda servir:
Archivos: Alba1.jpg, Alba2.jpg, Alba3.jpg, ....

Base de datos: con 2 campos nombre y estatus:
Nombre -> Alba1
Estatus -> H (Habilitado), U (usando,en uso)

Cuando borras el archivo tambien lo borras de la base de datos.

Es lo que se me ocurre.

Saludos

Ruben Fernandez.

Posted: Sat Jan 13, 2007 5:27 am
by Armando Picon
Complementando...

Tus jpg se encuentran inscritas en la BD. Si uno está en uso el flag de estatus debe ponerse en "U" y por tanto no se carga a tu array... cuando terminan el trabajo el status cambia a "H".

Me parece que sía una solución por la via que estás yendo.
Ruben Fernandez wrote:Jose Luis:

Quizas te pueda servir:
Archivos: Alba1.jpg, Alba2.jpg, Alba3.jpg, ....

Base de datos: con 2 campos nombre y estatus:
Nombre -> Alba1
Estatus -> H (Habilitado), U (usando,en uso)

Cuando borras el archivo tambien lo borras de la base de datos.

Es lo que se me ocurre.

Saludos

Ruben Fernandez.

Posted: Sat Jan 13, 2007 10:06 am
by JoseLuis
Entonces deduzco por vuestra idea, que tendría que haber una BD por ejemplo "Imagenes.DBF", en la que cuando un operador cualquiera entre en ésta opción haga lo siguiente:
- 1º Cargar un array con los nombres de los documentos que hay en el directorio.
- 2º Comprobar los nombres de éste array con los que hay en la BD
- 3º Añadir los que no existan.
- 4º Cuando se ponga a trabajar con ellos, que marque el que está en uso

Tendré que usar ésta opción, ya que no veo otra en la que no se duplique el trabajo en un momento dado.

Muchas gracias por vuestra ayuda

Saludos

Jose Luis

Posted: Sat Jan 13, 2007 3:54 pm
by Armando Picon
Esa es la idea...!!! De ese modo aseguras que no haya uso duplicado o mas segun los usuarios de tu programa.

yo lo hago asi

Posted: Sun Jan 14, 2007 12:20 am
by fleal
Yo lo hago asi con imagenes tif
Tengo 5 usuarios las imagenes van desde el 0001.tif hasta x número de imagenes.
El programa hace un while desde el 0001 en adelante. El primer usuario en tomar una imagen hace que el programa cree un archivo txt con el mismo nombre de la imagen. Entonces el siguiente usuario al entrar el programa verifica si existe un archivo txt con el mismo nombre de la imagen. Si ya existe pasa al siguiente archivo... y asi sucesivamente hasta que encuentre una imagen que no tenga un archivo txt con el mismo nombre.

Posted: Sun Jan 14, 2007 10:43 am
by JoseLuis
He hecho pruebas, y me es mas facil tener controlado el tema por una base de datos, ya que además puedo incluir un campo que se llama Usuario, con lo que el usuario puede dejar reservadas imágenes para pasarlas él, por ejemplo las de un determinado cliente si pertenece a su zona, etc.

Ya está acabado. La idea era que a primera hora, se escaneen todos los albaranes, y en lugar de pasarlos físicamente, pasarlos visualmente. Esto tiene la ventaja de que si necesitamos una copia en el futuro, no hay que ir a archivo a buscarla, simplemente se localiza y se imprime.

Los albaranes se escanean en una carpeta provisional de trabajo, según se van realizando, borrarlos de ésta carpeta y pasarlos a una definitiva, desde la que incluso los clientes con una clave pueden acceder a éstas imagenes.

Lo que yo no sé es si será un trabajo excesivo para el ordenador, estar continuamente por cada operador, copiando mediante copy file to, a éste directorio defitinitivo, y borrando el fichero del directorio de trabajo, en fin ya veremos.

Saludos

Jose Luis

Posted: Mon Jan 15, 2007 3:14 pm
by Armando Picon
JoseLuis wrote:He hecho pruebas, y me es mas facil tener controlado el tema por una base de datos, ya que además puedo incluir un campo que se llama Usuario, con lo que el usuario puede dejar reservadas imágenes para pasarlas él, por ejemplo las de un determinado cliente si pertenece a su zona, etc.

Ya está acabado. La idea era que a primera hora, se escaneen todos los albaranes, y en lugar de pasarlos físicamente, pasarlos visualmente. Esto tiene la ventaja de que si necesitamos una copia en el futuro, no hay que ir a archivo a buscarla, simplemente se localiza y se imprime.

Los albaranes se escanean en una carpeta provisional de trabajo, según se van realizando, borrarlos de ésta carpeta y pasarlos a una definitiva, desde la que incluso los clientes con una clave pueden acceder a éstas imagenes.

Lo que yo no sé es si será un trabajo excesivo para el ordenador, estar continuamente por cada operador, copiando mediante copy file to, a éste directorio defitinitivo, y borrando el fichero del directorio de trabajo, en fin ya veremos.

Saludos

Jose Luis
Mi sugerencia es que a tu aplicacion le dotes de un boton que lee la carpeta de trabajo y que si encuentra una imagen nueva que lo inscriba en la BD. De esa forma creo que disminuiría la carga de trabajo y que los operadores hagan algo más productivo que estar haciendo "copy file".

Posted: Mon Jan 15, 2007 7:29 pm
by JoseLuis
Hola Armando, me referia al propio programa, no al operador, puse esta rutina

Code: Select all

//----------------------------------
static function borraimagen(aAlias,ficheros)
 local numero
 numero:=Str((aAlias[24])->Orden,7)+'.jpg'
 copy file (Publicas:rimagen+ficheros) to (Publicas:eimagen+numero)
 Ferase(Publicas:rimagen+ficheros)
 While .not. (aAlias[14])->(Rlock()); end
 (aAlias[14])->( dbdelete())
 (aAlias[14])->( dbUnlock() )
 return nil
//---------------------------------
Quería decir que si no sería mucho trabajo para los discos duros del Ordenador.
Además puse un boton para cargar las imágenes, todo controlado por la BD, y funciona fabuloso

Saludos

Jose Luis

Posted: Mon Jan 15, 2007 11:10 pm
by Armando Picon
Bien... no creo que sea muchotabajo para el disco duro. Lo que puede suceder esque haya bastantes imagenes que copiar y borrar en cuyo caso, al estar la PC haciendo trabajo en bajo nivel, podría bajar la performance del equipo... no se hasta cuanto pero si que lo puede bajar.

Otra forma seria que inscribieras directamente, desde la carpeta inicial de imagenes, los nombres en la base de datos... sin borrarlas y que despues mediante una rutina utilitaria separada de este modulo efectuaras el borrado de las imagenes existentes en la carpeta inicial... porque ya no las necesitas.

Otra forma forma, que puede servirte siempre y cuando tengas disco duro suficiente, es almacenar las imágenes directamente en la BD en el momento que las inscribes (en campos blob). En este caso seria tu BD la que contenga las imagenes para consultas en linea.

Bueno... hay varias formas, cada una tiene sus particularidades a favor y en contra.