Comment afficher un message « Fichier en cours d'utilisation »Salut,
Je crée actuellement un fichier JMP qui fait office de base de données. Par conséquent, je voudrais afficher un message "Fichier en cours d'utilisation" et garder le fichier verrouillé pour modification lorsque quelqu'un d'autre a déjà ouvert la base de données et apporte des modifications au fichier. Par exemple, le même message que vous recevez lorsque vous ouvrez un fichier Excel sur un emplacement de serveur déjà utilisé par quelqu'un d'autre :

Je pense avoir déjà trouvé une partie de la réponse dans le post suivant de la communauté : Accès multi-utilisateur
Si j'ai raison, je devrais encore trouver comment verrouiller la table si elle est ouverte par un autre utilisateur.
Quelqu'un pourrait-il m'aider à créer un tel script ?
Merci
Accès aux donnéesRe : Comment afficher un message "Fichier en cours d'utilisation"Cela fonctionnera probablement dans JMP 14. J'ai signalé le problème JMP 15/16 que je voyais.
Si vous devez le faire fonctionner en 15, vous pouvez faire quelque chose comme cette fonction que j'ai utilisée dans le complément 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
)
);Cela fonctionne en essayant d'enregistrer le fichier dès qu'il est ouvert et en captant le message du journal. S'il n'y a pas de message de journal, la sauvegarde a fonctionné. Vous voudriez réorganiser un peu cela, probablement en ne fermant pas la table si la sauvegarde a réussi, et en n'utilisant pas privé . L'inconvénient est que si le fichier est très volumineux, la sauvegarde supplémentaire peut prendre un certain temps et double le risque d'avoir une panne de courant pendant une sauvegarde, corrompant les données. (Pour FileSnapper, le fichier est une sentinelle, petit, sur le point d'être supprimé et recréé à chaque fois, donc ça marche bien.)
Re : Comment afficher un message "Fichier en cours d'utilisation"Ok, merci d'avoir regardé ce Craig.
Je vais essayer de configurer le script de David dans mon fichier JMP.
Re : Comment afficher un message "Fichier en cours d'utilisation"Hmm. Je peux voir que cela fonctionne dans JMP 14, mais peut-être pas 15.
Re : Comment afficher un message "Fichier en cours d'utilisation"Le script de David contient le code qui vérifie l'indication 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.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Plusieurs exemplaires de JMP ouverts, même tableau en deux exemplaires, l'un d'eux est verrouillé par l'autre.
Re : Comment afficher un message "Fichier en cours d'utilisation"Merci pour la réponse Craige.
Serait-il possible d'afficher un message/avertissement indiquant que le fichier est déjà utilisé par quelqu'un d'autre ? Actuellement, le deuxième utilisateur peut ignorer que le fichier est déjà ouvert par un autre utilisateur. Ainsi, si le deuxième utilisateur apporte des modifications au fichier, ces modifications ne peuvent pas être enregistrées dans le fichier d'origine.
Re : Comment afficher un message "Fichier en cours d'utilisation"Une table JMP est verrouillée en écriture par le premier utilisateur qui l'ouvre. Les utilisateurs suivants obtiennent un accès en lecture seule (ils ne peuvent pas enregistrer leurs modifications). Le script @David_Burnham écrit suppose que l'utilisateur avec le verrou fermera la table assez rapidement (200 essais), puis ouvrira la table pour le nouvel utilisateur, qui devrait obtenir le verrou pour le nouvel utilisateur. Cela pourrait très bien fonctionner pour 2 ou 3 utilisateurs qui utilisent un programme soigneusement écrit pour mettre à jour la table. Ce n'est pas pour un utilisateur qui pourrait ouvrir la table puis aller déjeuner sans la refermer.
Re : Comment afficher un message "Fichier en cours d'utilisation"Peux-tu poster le test ? Et le fichier est-il un fichier réseau ou un fichier local ? Je ne suis pas sûr de ce que JMP ou le système d'exploitation pourraient faire différemment, mais au moins parfois, je pense que JMP enregistre dans un autre fichier, puis supprime/renomme/échange pour réduire au maximum la fenêtre de panne de courant. Il se pourrait que ce processus fasse obstacle. @briancorcoran
Re : Comment afficher un message "Fichier en cours d'utilisation"Lors des tests, je trouve un scénario dans lequel je peux ouvrir la table sans message dans savelog , mais lorsque je viens de sauvegarder, j'obtiens une erreur "Impossible d'obtenir le marqueur de fin de fichier". Non seulement cela empêche la sauvegarde des dernières données, mais le fichier entier disparaît et toutes les données sont perdues.
Dans l'environnement de test j'ai 2 scripts, identiques sauf qu'un script met à jour la 1ère colonne du tableau et le 2ème script met à jour la 2ème colonne. Chaque script tente de mettre à jour la table 100 fois. Si l'open rapporte (via savelog ) que la table est verrouillée, il attend et réessaye (dans le sens de mon script d'origine). Cependant, peut-être une ou deux fois sur 100 tentatives, une erreur de marqueur de fin de fichier se produira. Cela peut se produire lors de l'ouverture du fichier (avec le test savelog ) ou lors de la sauvegarde des résultats (fermeture et sauvegarde en supposant qu'il existe un accès en écriture). J'ai implémenté un test de sauvegarde similaire à la fermeture, mais il est alors trop tard, le mal est fait.
Mon expérience de cette erreur est que si vous l'obtenez en essayant de sauvegarder les résultats, vous rencontrez de gros problèmes et risquez de perdre complètement la table. J'essaie donc de me concentrer sur l'élimination de l'erreur qui se produit en premier lieu en essayant d'obtenir de manière fiable un accès en lecture-écriture lors de l'ouverture de la table. 99 % du temps, j’y parviens, mais je peux toujours obtenir l’erreur. Je soupçonne que ce qui se passe, c'est qu'il y a une faible chance que les deux scripts obtiennent un accès en lecture-écriture au fichier (au moins, comme indiqué par savelog), mais à un moment donné, un script conserve un accès en lecture-écriture et l'autre script obtient la fin du fichier. erreur de marqueur - probablement lorsque l'autre script a effectué une mise à jour).
Re : Comment afficher un message "Fichier en cours d'utilisation"Les problèmes sont pires avec un lecteur réseau (activé dans mon cas) avec un fichier sur OneDrive. Mais mes tests ont été effectués avec un fichier local. Windows 10, JMP 17.
Les scripts « locktest1 » et « locktest2 » sont identiques sauf que le premier script met à jour la colonne 1 du tableau des résultats tandis que le deuxième script met à jour la colonne 2.
En exécutant chaque script simultanément dans des instances JMP distinctes, il est possible de tester la logique de gestion des verrouillages de fichiers.
La ligne 75 des scripts contient le chemin de la table des résultats. Placez le tableau des résultats dans un emplacement approprié et mettez à jour la variable path pour pointer vers cet emplacement.
Ouvrez une session JMP et ouvrez locktest1. Afficher le journal intégré.
Ouvrez une deuxième session JMP et ouvrez loctest2, avec un journal intégré.
Exécutez les deux scripts (j'exécute le premier, j'attends que le journal indique i=5, puis j'exécute le second, mais ce n'est qu'une superstition).
La boucle définie à la ligne 79 effectue 50 itérations. Si les deux scripts se terminent avec succès, le résultat devrait être que le tableau des résultats contienne des nombres de 1 à 50 dans chacune des deux colonnes.
Il existe un script de table qui vous permettra de réinitialiser le contenu de la table.
En pratique, il existe 3 modes de défaillance possibles :
- Un ou plusieurs messages « Impossible d'obtenir le marqueur de fin de fichier » s'affichent. Cette erreur se produit lors de la sauvegarde et il n'est pas possible de sauvegarder les résultats. Il y aura donc des valeurs manquantes dans le tableau des résultats.
- À un moment donné, le tableau des résultats disparaîtra. Si le fichier ne peut pas être trouvé, les scripts abandonnent l'exécution avec un message « fichier non trouvé ».
- Parfois, les deux scripts ne parviennent pas à verrouiller la table. Ceci est indiqué par les deux scripts effectuant 500 tentatives pour obtenir un verrou. Si vous abandonnez les scripts, puis essayez d'ouvrir la table des résultats, elle aura une variable de table file_lock . La table sera verrouillée dans les deux instances de JMP. La seule façon de le déverrouiller est de fermer les deux sessions de JMP.
50 itérations suffisent généralement pour observer (1) et (2), mais il faut parfois augmenter le nombre d'itérations pour voir (2). Le scénario (3) est plus probable avec des centaines d'itérations et avec l'attente sur la ligne 100 supprimée.
Re : Comment afficher un message "Fichier en cours d'utilisation"Désolé, j'ai perdu la trace. J'ai fait une vidéo de la table de données disparaissant du bureau et je l'ai envoyée à l'équipe de développement. Merci!