JSL: Wenn Analysen von temporären Daten abhängig sind, schließen Sie Daten, wenn die Analyse geschlossen wird ...Hallo zusammen,
Hintergrund: Ich schreibe gerade ein Add-In, in dem ich eine temporäre Datentabelle erstellen muss, um einige Datenpunkte zu speichern, die dann in Graph Builder eingegeben werden. Wenn der Benutzer den Graph Builder schließt, möchte ich, dass die temporären Daten verschwinden. Wenn ich den Graph Builder-Aufruf in einer Variablen speichere, kann ich ganz einfach ein << On Close () hinzufügen, um auch die temporären Daten zu schließen.
Es passieren jedoch seltsame Dinge, wenn mein Benutzer das Add-In zweimal für zwei verschiedene Eingaben ausführen möchte, wodurch zwei temporäre Datentabellen und zwei Graph Builder erstellt werden. In diesem Fall kann das Schließen eines der Graph Builder die falsche temporäre Tabelle schließen (wodurch der andere Graph Builder heruntergefahren wird).
Ich stelle mir vor, dass es dafür eine einfache Lösung geben muss. Ich denke, die Lösung sollte mit Namespaces sein, aber ich kann nicht herausfinden, wie ich alles miteinander verbinden kann! Es scheint, dass jedes Mal, wenn ich einen neuen Namespace erstelle, das "ns" überschrieben wird. Das Rätsel, das ich habe, besteht darin, herauszufinden, wie jede einzelne Instanz des Add-Ins mit ihrem eigenen "ns" -Wert beibehalten werden kann, und zwar so, dass ich jedem der verschiedenen "On Close" den richtigen "ns" -Wert zuführen kann "Codes, die am Ende erstellt werden.
Hier ist eine vereinfachte Version von dem, was ich versuche zu tun. Die Idee wäre, dass, wenn ich dies ausführe und dann ein- oder mehrmals auf die Schaltfläche "Make Another One" klicke und dann einen der Graph Builder entlasse, die anderen intakt bleiben, ohne sich Gedanken darüber zu machen, welcher Graph Builder Ich entscheide mich zuerst zu entlassen.
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table("Test Table",
<< New Column("Random X", << Formula(Random Normal())),
<< New Column("Random Y", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window("Test Output",
Button Box("Make Another One",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();
Auf der Suche nach Weisheit: Was soll ich als nächstes versuchen?
SkriptingBetreff: JSL: Wenn Analysen von temporären Daten abhängig sind, schließen Sie Daten, wenn die Analyse geschlossen wird ...Das Problem ist, dass Ihre Variable "ns" beim zweiten und nachfolgenden Durchlauf der Funktion ersetzt wird.Daher müssen Sie einen eindeutigen Verweis auf die Datentabelle verwenden.Unten finden Sie eine Version Ihres Codes, die den Namen der Datentabelle verwendet, um sie zu schließen.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>
Betreff: JSL: Wenn Analysen von temporären Daten abhängig sind, schließen Sie Daten, wenn die Analyse geschlossen wird ...Vielen Dank. Dies ist nützlich für einfache Lösungen wie diese.
Möglicherweise muss ich den Code neu schreiben, und selbst dann bin ich mir nicht sicher, ob es möglich ist, das zu tun, was ich tun möchte. Mein eigentliches Add-In speichert eine Reihe von DisplayBox-Referenzen auch in ns, und die DisplayBoxen lösen verschiedene zusätzliche Aktionen sowohl auf Plattformen als auch in der Datentabelle aus. Alle DisplayBox-Referenzen werden beim Neustart des Add-Ins ebenfalls kannibalisiert. Ich nehme an, wenn ich Glück habe, kann ich die meisten meiner DisplayBoxen in Triggerfunktionen konvertieren, damit ich dieses << übergeordnete Element drücken und einen Drilldown zu anderen Feldern durchführen kann, um die Ausgaben usw. zu aktualisieren. Es hört sich so an, als müsste ich ernsthaft überdenken, was ich tue.
Ich hatte gehofft, dass Names Default to Here bei jeder erneuten Ausführung des Codes einen separaten Here-Namespace erstellen würde, aber das scheint nicht der Fall zu sein ...
Gibt es noch andere gute Optionen, bevor ich diesen anderen Weg gehe?
Betreff: JSL: Wenn Analysen von temporären Daten abhängig sind, schließen Sie Daten, wenn die Analyse geschlossen wird ...Ich bin manchmal frustriert, dass "Names Default to Here ()" nicht bei jedem Aufruf des Codes separate Namespaces hat.Aber ich nutze diese Tatsache auch beim Debuggen von Code.Ich sehe also beide Vorteile.Aber hier ist eine Off-the-Wall-Idee, die separate "Hier" -Namensräume schafft.
Wenn Sie Ihre ursprüngliche JSL nehmen und // hinzufügen! In der ersten Zeile wird dieser Code automatisch ausgeführt, wenn er von Ihrer Festplatte geöffnet wird.Wenn dieses Skript geöffnet wird, hat es den eindeutigen Namensraum "Hier".Wenn Sie die Datei ein zweites Mal öffnen, hat sie einen eigenen eindeutigen "Hier" -Namensraum.
In der Vergangenheit habe ich dies einige Male benutzt ???? Merkmal ????.Mein Hauptprogramm verwendet eine Save Text File (), um die betreffende JSL an einem $ TEMP-Speicherort zu speichern. Wenn der nachfolgende Code den Code in der gespeicherten JSL ausführen muss, verwenden Sie Open (), um die Datei auszuführen.Die Übergabe von Werten an und von der gespeicherten JSL erfolgt über einen Namespace, der sowohl im Hauptprogramm als auch im gespeicherten JSL-Programm definiert ist.
Hier ist Ihr ursprüngliches Beispielcode-Setup auf diese Weise. Bei der Ausführung ist jede Instanz in ihrer Ausführung unabhängig
names default to here(1);
graphJSL = "//!
Names Default to Here(1);
MyFunction = Function({},
ns = New Namespace();
ns:dt = New Table(\!"Test Table\!",
<< New Column(\!"Random X\!", << Formula(Random Normal())),
<< New Column(\!"Random Y\!", << Formula(Random Normal())),
<< Add Rows(10),
invisible
);
ns:gb = New Window(\!"Test Output\!",
Button Box(\!"Make Another One\!",MyFunction()),
Graph Builder(
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :Random X ), Y( :Random Y ) ),
Elements( Points( X, Y, Legend( 4 ) ) )
);
);
ns:gb << On Close(Try(Close(ns:dt, No Save)); ns << Delete);
);
MyFunction();";
Save Text File( "$TEMP/Graph1.jsl", graphJSL );
open("$TEMP/Graph1.jsl");
open("$TEMP/Graph1.jsl");