So rufen Sie die Meldung „Datei wird verwendet“ aufHallo,
Ich erstelle gerade eine JMP-Datei, die als Datenbank fungiert. Daher möchte ich eine Meldung „Datei wird verwendet“ anzeigen und die Datei für die Bearbeitung gesperrt halten, wenn jemand anderes die Datenbank bereits geöffnet hat und Änderungen an der Datei vornimmt. Beispielsweise dieselbe Meldung, die Sie erhalten, wenn Sie eine Excel-Datei an einem Serverspeicherort öffnen, der bereits von jemand anderem verwendet wird:

Ich glaube, ich habe bereits einen Teil der Antwort in folgendem Community-Beitrag gefunden: Multi-User Access
Wenn das richtig ist, muss ich noch herausfinden, wie ich die Tabelle sperren kann, wenn sie von einem anderen Benutzer geöffnet wird.
Könnte jemand bitte beim Erstellen eines solchen Skripts helfen?
Danke
DatenzugriffBetreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtEs wird wahrscheinlich in JMP 14 funktionieren. Ich habe das JMP 15/16-Problem gemeldet, das ich gesehen habe.
Wenn Sie es in 15 zum Laufen bringen müssen, können Sie so etwas wie diese Funktion tun, die ich im FileSnapper-Add-In verwendet habe.
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
)
);Es funktioniert, indem versucht wird, die Datei zu speichern, sobald sie geöffnet wird, und die Protokollnachricht abgefangen wird. Wenn es keine Log-Meldung gibt, hat das Speichern funktioniert. Sie möchten das ein wenig neu anordnen, den Tisch wahrscheinlich nicht schließen, wenn das Speichern erfolgreich war, und nicht verwenden Privatgelände . Der Nachteil ist, wenn die Datei sehr groß ist, kann das zusätzliche Speichern einige Zeit dauern und es verdoppelt sich die Wahrscheinlichkeit, dass während des Speicherns ein Stromausfall auftritt und die Daten beschädigt werden. (Für FileSnapper ist die Datei ein Wächter, klein, kurz davor, gelöscht und jedes Mal neu erstellt zu werden, also funktioniert es gut.)
Betreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtOk, danke, dass Sie sich diesen Craig angesehen haben.
Ich werde versuchen, das Skript von David in meiner JMP-Datei einzurichten.
Betreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtHmm. Ich kann sehen, dass es in JMP 14 funktioniert, aber vielleicht nicht in 15.
Betreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtDavids Skript enthält den Code, der nach sichtbaren Hinweisen sucht:
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.Mehrere Kopien von JMP geöffnet, dieselbe Tabelle in zwei Kopien, eine davon wird durch die andere gesperrt.
Betreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtDanke für die Antworten Craige.
Wäre es möglich, eine Meldung/Warnung anzuzeigen, dass die Datei bereits von jemand anderem verwendet wird? Derzeit könnte der zweite Benutzer nicht wissen, dass die Datei bereits von einem anderen Benutzer geöffnet wurde. Wenn also der zweite Benutzer Änderungen an der Datei vornimmt, können diese Änderungen nicht in der Originaldatei gespeichert werden.
Betreff: Wie man eine „Datei wird verwendet“-Meldung ausgibtEine JMP-Tabelle ist für das Schreiben durch den ersten Benutzer gesperrt, der sie öffnet. Nachfolgende Benutzer erhalten schreibgeschützten Zugriff (sie können ihre Änderungen nicht speichern). Das Drehbuch @David_Burnham wrote geht davon aus, dass der Benutzer mit der Sperre die Tabelle ziemlich bald schließen wird (200 Versuche) und öffnet dann die Tabelle für den neuen Benutzer, der die Sperre für den neuen Benutzer erhalten sollte. Es könnte für 2 oder 3 Benutzer ziemlich gut funktionieren, die ein sorgfältig geschriebenes Programm verwenden, um die Tabelle zu aktualisieren. Es ist nicht für einen Benutzer, der den Tisch öffnet und dann zum Mittagessen geht, ohne ihn zu schließen.
Betreff: So zeigen Sie die Meldung „Datei wird verwendet“ anKönnen Sie den Test posten? Und ist die Datei eine Netzwerkdatei oder eine lokale Datei? Ich bin mir nicht sicher, was JMP oder das Betriebssystem anders machen könnten, aber ich glaube zumindest manchmal, dass JMP in einer anderen Datei speichert und dann löscht/umbenennt/austauscht, um das Zeitfenster für einen Stromausfall so klein wie möglich zu halten. Es könnte sein, dass dieser Prozess im Weg steht. @briancorcoran
Betreff: So zeigen Sie die Meldung „Datei wird verwendet“ anDie Probleme sind schlimmer mit einem Netzlaufwerk (in meinem Fall) mit einer Datei auf OneDrive. Aber meine Tests wurden mit einer lokalen Datei durchgeführt. Windows 10, JMP 17.
Die Skripte „locktest1“ und „locktest2“ sind identisch, außer dass das erste Skript Spalte 1 der Ergebnistabelle aktualisiert, während das zweite Skript Spalte 2 aktualisiert.
Durch die gleichzeitige Ausführung jedes Skripts in separaten JMP-Instanzen ist es möglich, die Logik für die Handhabung von Dateisperren einem Stresstest zu unterziehen.
Zeile 75 des Skripts enthält den Pfad zur Ergebnistabelle. Platzieren Sie die Ergebnistabelle an einem geeigneten Ort und aktualisieren Sie die Pfadvariable, sodass sie auf diesen Ort verweist.
Öffnen Sie eine JMP-Sitzung und öffnen Sie locktest1. Zeigen Sie das eingebettete Protokoll an.
Öffnen Sie eine zweite JMP-Sitzung und öffnen Sie loctest2 mit einem eingebetteten Protokoll.
Führen Sie die beiden Skripte aus (ich führe das erste aus, warte, bis das Protokoll i=5 anzeigt, und führe dann das zweite aus, aber das ist bloßer Aberglaube).
Die in Zeile 79 definierte Schleife führt 50 Iterationen durch. Wenn die beiden Skripte erfolgreich abgeschlossen werden, sollte das Ergebnis sein, dass die Ergebnistabelle in jeder der beiden Spalten die Zahlen 1 bis 50 enthält.
Es gibt ein Tabellenskript, mit dem Sie den Tabelleninhalt zurücksetzen können.
In der Praxis gibt es drei mögliche Fehlermodi:
- Eine oder mehrere Meldungen „Ende der Dateimarkierung konnte nicht abgerufen werden“ werden angezeigt. Dieser Fehler tritt beim Speichern auf und es ist nicht möglich, die Ergebnisse zu speichern. Daher fehlen in der Ergebnistabelle einige Werte.
- Irgendwann verschwindet die Ergebnistabelle. Wenn die Datei nicht gefunden werden kann, brechen die Skripte die Ausführung mit der Meldung „Datei nicht gefunden“ ab.
- Gelegentlich gelingt es beiden Skripten nicht, die Tabelle zu sperren. Dies wird dadurch angezeigt, dass beide Skripte 500 Versuche unternehmen, eine Sperre zu erhalten. Wenn Sie die Skripts abbrechen und dann versuchen, die Ergebnistabelle zu öffnen, wird diese eine Tabellenvariable „file_lock“ enthalten. Bei beiden JMP-Instanzen ist die Tabelle gesperrt. Die einzige Möglichkeit, es zu entsperren, besteht darin, beide JMP-Sitzungen zu schließen.
50 Iterationen reichen normalerweise aus, um (1) und (2) zu beobachten, aber gelegentlich müssen Sie die Anzahl der Iterationen erhöhen, um (2) zu sehen. Szenario (3) ist wahrscheinlicher, wenn Hunderte von Iterationen durchgeführt werden und die Wartezeit in Zeile 100 entfernt wird.
Betreff: So zeigen Sie die Meldung „Datei wird verwendet“ anBeim Testen stoße ich auf ein Szenario, in dem ich die Tabelle öffnen kann, ohne dass eine Meldung im Savelog erscheint, aber beim Speichern erhalte ich die Fehlermeldung „Ende-Markierung konnte nicht abgerufen werden“. Dadurch werden nicht nur die neuesten Daten nicht gespeichert, sondern die gesamte Datei verschwindet und alle Daten gehen verloren.
In der Testumgebung habe ich zwei identische Skripte, außer dass ein Skript die erste Spalte der Tabelle aktualisiert und das zweite Skript die zweite Spalte. Jedes Skript versucht 100 Mal, die Tabelle zu aktualisieren. Wenn beim Öffnen (über Savelog ) gemeldet wird, dass die Tabelle gesperrt ist, wartet es und versucht es erneut (entsprechend meinem ursprünglichen Skript). Allerdings tritt vielleicht ein- oder zweimal in den 100 Versuchen ein Fehler mit der Markierung des Dateiendes auf. Dies kann beim Öffnen der Datei (mit dem Savelog- Test) oder beim Speichern der Ergebnisse (Schließen und Speichern unter der Annahme, dass Schreibzugriff besteht) auftreten. Ich habe beim Schließen einen ähnlichen Savelog- Test implementiert, aber dann ist es zu spät, der Schaden ist angerichtet.
Meine Erfahrung mit diesem Fehler ist, dass Sie große Probleme haben und riskieren, die Tabelle vollständig zu verlieren, wenn er beim Versuch auftritt, Ergebnisse zu speichern. Ich versuche daher, den Fehler von vornherein zu vermeiden, indem ich versuche, beim Öffnen der Tabelle zuverlässig Lese- und Schreibzugriff zu erhalten. In 99 % der Fälle gelingt mir das, aber irgendwann kann der Fehler immer auftreten. Ich vermute, dass es eine geringe Chance gibt, dass beide Skripte Lese- und Schreibzugriff auf die Datei erhalten (zumindest laut Savelog), aber irgendwann behält ein Skript den Lese- und Schreibzugriff und das andere Skript erhält einen Dateiende-Markierungsfehler – wahrscheinlich, wenn das andere Skript eine Aktualisierung durchgeführt hat).
Betreff: So zeigen Sie die Meldung „Datei wird verwendet“ anEntschuldigung, ich habe den Überblick verloren. Ich habe ein Video davon gemacht, wie die Datentabelle vom Desktop verschwindet, und es an das Entwicklungsteam geschickt. Danke!