「ファイルが使用中」というメッセージを表示する方法こんにちは、
現在、データベースとして機能する JMP ファイルを作成しています。そのため、他のユーザーがすでにデータベースを開いてファイルを変更しているときに、「ファイルは使用中です」というメッセージを表示し、ファイルを編集用にロックしたままにしておきたいと思います。たとえば、他のユーザーがすでに使用しているサーバー上の Excel ファイルを開いたときに表示されるメッセージと同じメッセージです。

次のコミュニティ投稿ですでに答えの一部を見つけたと思います: マルチユーザーアクセス
私の考えが正しければ、別のユーザーがテーブルを開いた場合にテーブルをロックする方法をまだ見つけ出す必要があります。
誰かそのようなスクリプトの作成を手伝ってくれませんか?
ありがとう
データアクセスRe:「使用中のファイル」メッセージを表示する方法おそらくJMP14で動作します。 私が見たJMP15/16の問題を報告しました。
15で動作させる必要がある場合は、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
)
);それは、ファイルが開かれるとすぐにファイルを保存しようとし、ログメッセージをキャッチすることによって機能します。 ログメッセージがない場合、保存は機能しました。 保存が成功した場合はテーブルを閉じず、使用しないで、少し再配置する必要がありますプライベート。 欠点は、ファイルが非常に大きい場合、余分な保存に時間がかかる可能性があり、保存中に電源障害が発生してデータが破損する可能性が2倍になることです。 (FileSnapperの場合、ファイルは番兵であり、小さく、削除されようとしており、毎回再作成されるため、正常に機能します。)
Re:「使用中のファイル」メッセージを表示する方法わかりました、このクレイグを調べてくれてありがとう。
JMPファイルでDavidのスクリプトを設定してみます。
Re:「使用中のファイル」メッセージを表示する方法うーん。 JMP 14で動作することがわかりますが、15では動作しない可能性があります。
Re:「使用中のファイル」メッセージを表示する方法Davidのスクリプトには、目に見える兆候をチェックするコードがあります。
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.JMPの複数のコピーが開いており、同じテーブルが2つのコピーになっており、一方が他方によってロックアウトされています。
Re:「使用中のファイル」メッセージを表示する方法応答クレイジをありがとう。
ファイルがすでに他の誰かによって使用されているというメッセージ/警告を促すことは可能でしょうか? 現在、2番目のユーザーは、ファイルが別のユーザーによって既に開かれていることに気付かない可能性があります。 したがって、2番目のユーザーがファイルに変更を加えた場合、これらの変更を元のファイルに保存することはできません。
Re:「使用中のファイル」メッセージを表示する方法JMPテーブルは、最初に開いたユーザーが書き込むためにロックされています。 後続のユーザーは読み取り専用アクセスを取得します(変更を保存することはできません)。 スクリプト@David_Burnham書き込みは、ロックされたユーザーがかなりすぐにテーブルを閉じ(200回試行)、次に新しいユーザーのテーブルを開くことを前提としています。これにより、新しいユーザーのロックが取得されます。 慎重に作成されたプログラムを使用してテーブルを更新する2〜3人のユーザーにとってはかなりうまくいく可能性があります。 テーブルを開いて、閉じずに昼食に行く可能性のあるユーザー向けではありません。
Re: 「ファイルが使用中」というメッセージを表示する方法テストを投稿できますか?また、そのファイルはネットワーク ファイルですか、それともローカル ファイルですか? JMP や OS の動作がどのように異なるのかはわかりませんが、少なくとも時々、JMP は代替ファイルに保存し、その後削除/名前変更/入れ替えを行って、電源喪失による障害の発生時間をできるだけ小さくしているのではないかと思います。そのプロセスが邪魔になっている可能性があります。 @ブライアンコーコラン
Re: 「ファイルが使用中です」というメッセージを表示する方法OneDrive 上のファイルを含むネットワーク ドライブ (私のインスタンスではオン) では、問題がさらに悪化します。ただし、私のテストはローカル ファイルで行っています。Windows 10、JMP 17。
スクリプト「locktest1」と「locktest2」は、最初のスクリプトが結果テーブルの列 1 を更新するのに対し、2 番目のスクリプトは列 2 を更新することを除いて同一です。
各スクリプトを別々の JMP インスタンスで同時に実行することにより、ファイルロックを処理するロジックのストレス テストを行うことができます。
スクリプトの 75 行目には、結果テーブルのパスが含まれています。結果テーブルを適切な場所に配置し、この場所を指すようにパス変数を更新します。
JMP セッションを開き、locktest1 を開きます。埋め込まれたログを表示します。
2 番目の JMP セッションを開き、ログが埋め込まれた loctest2 を開きます。
2 つのスクリプトを実行します (私は最初のスクリプトを実行し、ログに i=5 が表示されるまで待ってから 2 番目のスクリプトを実行しますが、これは単なる迷信です)。
79 行目で定義されたループは 50 回の反復を実行します。 2 つのスクリプトが正常に終了すると、結果テーブルの 2 つの列のそれぞれに 1 ~ 50 の数字が含まれるはずです。
テーブルの内容をリセットできるテーブル スクリプトがあります。
実際には、3 つの障害モードが考えられます。
- 1 つ以上の「ファイルの終わりマーカーを取得できません」というメッセージが表示されます。保存時にこのエラーが発生し、結果を保存することができません。したがって、結果テーブルには欠損値がいくつか存在します。
- ある時点で、結果テーブルは消えます。ファイルが見つからない場合、スクリプトは「ファイルが見つかりません」というメッセージを表示して実行を中止します。
- 場合によっては、両方のスクリプトがテーブルのロックの取得に失敗することがあります。これは、両方のスクリプトがロックの取得を 500 回試行していることからわかります。スクリプトを中止して結果テーブルを開こうとすると、 file_lockテーブル変数が含まれます。 JMP の両方のインスタンスでテーブルがロックされます。ロックを解除する唯一の方法は、JMP の両方のセッションを閉じることです。
通常、(1) と (2) を観察するには 50 回の反復で十分ですが、場合によっては (2) を確認するために反復数を増やす必要があります。シナリオ (3) は、数百回の反復と 100 行目での待機が削除された場合に発生する可能性が高くなります。
Re: 「ファイルが使用中」というメッセージを表示する方法テスト中に、 savelogにメッセージが表示されずにテーブルを開くことができるシナリオを見つけましたが、保存しようとすると「ファイルの終わりのマーカーを取得できません」というエラーが表示されます。これにより、最新のデータが保存されないだけでなく、ファイル全体が消えて、すべてのデータが失われます。
テスト環境には 2 つのスクリプトがあり、1 つのスクリプトはテーブルの 1 列目を更新し、2 番目のスクリプトは 2 列目を更新する点を除いて同一です。各スクリプトはテーブルの更新を 100 回試行します。open でテーブルがロックされていると報告された場合 ( savelog経由)、待機して再試行します (元のスクリプトの行に沿って)。ただし、100 回の試行のうち 1 回か 2 回は、ファイル終了マーカー エラーが発生します。これは、ファイルを開くとき ( savelogテストを使用)、または結果を保存するとき (書き込みアクセスがあるという前提で閉じて保存) に発生する可能性があります。閉じるときに同様のsavelogテストを実装しましたが、その時は手遅れで、被害は発生しています。
このエラーに関する私の経験では、結果を保存しようとしたときにこのエラーが発生すると、大きな問題に陥り、テーブル全体が失われるリスクがあります。そのため、テーブルを開くときに確実に読み取り/書き込みアクセスを取得しようとすることで、最初に発生するエラーを排除することに重点を置いています。99% の確率でこれを達成できますが、最終的には必ずエラーが発生します。おそらく、両方のスクリプトがファイルへの読み取り/書き込みアクセスを取得する可能性はわずかですが (少なくとも savelog によって報告されるように)、ある時点で 1 つのスクリプトが読み取り/書き込みアクセスを維持し、もう 1 つのスクリプトがファイル終了マーカー エラーを取得します (おそらく、もう 1 つのスクリプトが更新を行ったとき)。
Re: 「ファイルが使用中」というメッセージを表示する方法すみません、忘れてしまいました。データ テーブルがデスクトップから消える様子をビデオに撮って、開発チームに送りました。ありがとうございます!