Cómo mostrar un mensaje "Archivo en uso"Hola,
Actualmente estoy creando un archivo JMP que actúa como base de datos. Por lo tanto, me gustaría mostrar un mensaje "Archivo en uso" y mantener el archivo bloqueado para editarlo cuando alguien ya abrió la base de datos y está realizando cambios en el archivo. Por ejemplo, el mismo mensaje que recibe cuando abre un archivo de Excel en una ubicación de servidor que ya está siendo utilizada por otra persona:

Creo que ya encontré parte de la respuesta en la siguiente publicación de la comunidad: Acceso multiusuario
Si estoy en lo cierto, aún necesitaría descubrir cómo bloquear la tabla si otro usuario la abre.
¿Alguien podría ayudarme a crear un script de este tipo?
Gracias
Acceso a los datosRe: Cómo mostrar un mensaje de "Archivo en uso"Probablemente funcionará en JMP 14. Informé el problema JMP 15/16 que estaba viendo.
Si debe hacer que funcione en 15, puede hacer algo como esta función que usé en el complemento FileSnapper.
FileSnapper:isFileOpenElsewhere = Function( {filepath}, {dt, savelog},
If( endswith(filepath,".jmp") & File Exists( filepath ),
dt = Open( filepath, private );
savelog = Log Capture( dt << save );
close(dt,"nosave");
Length( savelog ) != 0; // error message means another JMP has dt open
, // else
0 // not open if not exists
)
);Funciona intentando guardar el archivo tan pronto como se abre y detectando el mensaje de registro. Si no hay ningún mensaje de registro, el guardado funcionó. Querría reorganizar eso un poco, probablemente no cerrar la tabla si el guardado fue exitoso, y no usar privado . La desventaja es que si el archivo es muy grande, el guardado adicional puede llevar algo de tiempo y duplica la posibilidad de que se produzca un corte de energía durante el guardado, lo que corrompería los datos. (Para FileSnapper, el archivo es un centinela, pequeño, a punto de eliminarse y volver a crearse cada vez, por lo que funciona correctamente).
Re: Cómo mostrar un mensaje de "Archivo en uso"Ok, gracias por investigar a este Craig.
Intentaré configurar el script de David en mi archivo JMP.
Re: Cómo mostrar un mensaje de "Archivo en uso"Mmm. Puedo ver que funciona en JMP 14, pero tal vez no en 15.
Re: Cómo mostrar un mensaje de "Archivo en uso"El script de David tiene el código que verifica la indicación visible:
Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Varias copias de JMP abiertas, misma tabla en dos copias, una de ellas bloqueada por la otra.
Re: Cómo mostrar un mensaje de "Archivo en uso"Gracias por la respuesta Craige.
¿Sería posible generar un mensaje/advertencia de que otra persona ya está utilizando el archivo? Actualmente, el segundo usuario podría no saber que otro usuario ya abrió el archivo. Entonces, si el segundo usuario realiza cambios en el archivo, estos cambios no se pueden guardar en el archivo original.
Re: Cómo mostrar un mensaje de "Archivo en uso"Una tabla JMP está bloqueada para escritura por el primer usuario que la abre. Los usuarios subsiguientes obtienen acceso de solo lectura (no pueden guardar sus cambios). La secuencia de comandos @David_Burnham write asume que el usuario con el candado cerrará la tabla bastante pronto (200 intentos) y luego abre la tabla para el nuevo usuario, que debería obtener el candado para el nuevo usuario. Podría funcionar bastante bien para 2 o 3 usuarios que usan un programa cuidadosamente escrito para actualizar la tabla. No es para un usuario que pueda abrir la mesa y luego ir a almorzar sin cerrarla.
Re: Cómo mostrar el mensaje "Archivo en uso"¿Puedes publicar la prueba? ¿Y el archivo es un archivo de red o un archivo local? No estoy seguro de qué podrían hacer diferente JMP o el sistema operativo, pero al menos a veces creo que JMP guarda en un archivo alternativo, luego elimina/cambia el nombre/intercambia para que la ventana de una falla de energía sea lo más pequeña posible. Podría ser que el proceso se esté interponiendo. @briancorcoran
Re: Cómo mostrar el mensaje "Archivo en uso"Los problemas son peores con una unidad de red (en mi caso) con un archivo en OneDrive. Pero mis pruebas han sido con un archivo local. Windows 10, JMP 17.
Los scripts "locktest1" y "locktest2" son idénticos excepto que el primer script actualiza la columna 1 de la tabla de resultados mientras que el segundo script actualiza la columna 2.
Al ejecutar cada script simultáneamente en instancias JMP separadas, es posible probar la lógica para manejar bloqueos de archivos.
La línea 75 de los scripts contiene la ruta de la tabla de resultados. Coloque la tabla de resultados en una ubicación adecuada y actualice la variable de ruta para que apunte a esta ubicación.
Abra una sesión JMP y abra locktest1. Muestra el registro incrustado.
Abra una segunda sesión JMP y abra loctest2, con un registro integrado.
Ejecute los dos scripts (yo ejecuto el primero, espero hasta que el registro muestre i=5 y luego ejecuto el segundo, pero eso es sólo superstición).
El bucle definido en la línea 79 realiza 50 iteraciones. Si los dos scripts finalizan exitosamente, el resultado debería ser que la tabla de resultados contenga números del 1 al 50 en cada una de las dos columnas.
Hay un script de tabla que le permitirá restablecer el contenido de la tabla.
En la práctica, existen 3 posibles modos de fallo:
- Se muestran uno o más mensajes de "no se puede obtener el marcador de fin de archivo". Este error ocurre al guardar y no es posible guardar los resultados. Por lo tanto, faltarán algunos valores en la tabla de resultados.
- En algún momento, la tabla de resultados desaparecerá. Si no se puede encontrar el archivo, los scripts cancelan la ejecución con un mensaje de "archivo no encontrado".
- En ocasiones, ambos scripts no logran bloquear la mesa. Esto lo indican ambos scripts que realizan 500 intentos para obtener un bloqueo. Si cancela los scripts y luego intenta abrir la tabla de resultados, tendrá una variable de tabla file_lock . Ambas instancias de JMP tendrán la tabla bloqueada. La única forma de desbloquearlo es cerrar ambas sesiones de JMP.
Generalmente, 50 iteraciones son suficientes para observar (1) y (2), pero ocasionalmente es necesario aumentar el número de iteraciones para ver (2). El escenario (3) es más probable con cientos de iteraciones y sin la espera en la línea 100.
Re: Cómo mostrar el mensaje "Archivo en uso"Durante las pruebas, encuentro un escenario en el que puedo abrir la tabla sin ningún mensaje en el registro de guardado , pero cuando llego a guardar aparece el error "No se puede obtener el marcador de fin de archivo". Esto no sólo impide que se guarden los datos más recientes, sino que todo el archivo desaparece y se pierden todos los datos.
En el entorno de prueba tengo 2 scripts, idénticos excepto que un script actualiza la primera columna de la tabla y el segundo script actualiza la segunda columna. Cada script intenta actualizar la tabla 100 veces. Si la apertura informa (a través de savelog ) que la tabla está bloqueada, entonces espera y vuelve a intentarlo (según las líneas de mi script original). Sin embargo, tal vez una o dos veces de cada 100 intentos se produzca un error de marcador de fin de archivo. Esto puede ocurrir al abrir el archivo (con la prueba del registro de guardado ) o al guardar los resultados (cerrar y guardar suponiendo que hay acceso de escritura). Implementé una prueba de registro de guardado similar al cerrar, pero para entonces ya es demasiado tarde, el daño ya está hecho.
Mi experiencia con este error es que si lo recibes al intentar guardar los resultados, estás en un gran problema y corres el riesgo de perder la tabla por completo. Así que trato de concentrarme en eliminar el error que ocurre en primera instancia tratando de obtener acceso de lectura y escritura de manera confiable al abrir la tabla. El 99% de las veces lo logro, pero eventualmente siempre puedo obtener el error. Sospecho que lo que sucede es que existe una pequeña posibilidad de que ambos scripts obtengan acceso de lectura y escritura al archivo (al menos, según lo informado por savelog), pero en algún momento un script mantiene el acceso de lectura y escritura y el otro script finaliza el archivo. error de marcador (probablemente cuando el otro script ha realizado una actualización).
Re: Cómo mostrar el mensaje "Archivo en uso"Lo siento, perdí la pista de esto. Hice un vídeo de la tabla de datos desapareciendo del escritorio y se lo envié al equipo de desarrollo. ¡Gracias!