JSL : Lorsque les analyses dépendent de données temporaires, fermeture des données lorsque l'analyse est fermée...Salut tout le monde,
Contexte : j'écris actuellement un complément dans lequel je dois créer une table de données temporaire pour contenir certains points de données qui sont ensuite introduits dans Graph Builder. Lorsque l'utilisateur ferme le générateur de graphiques, je souhaite que les données temporaires disparaissent. Assez simple, si j'enregistre l'appel de Graph Builder dans une variable, je peux ajouter un << On Close() pour fermer également les données temporaires.
Cependant, des choses étranges se produisent si mon utilisateur souhaite exécuter le complément deux fois sur deux entrées différentes, créant ainsi deux tables de données temporaires et deux générateurs de graphiques. Maintenant, dans ce cas, la fermeture de l'un des Graph Builders peut fermer la mauvaise table temporaire (faisant tomber l'autre Graph Builder avec elle).
J'imagine qu'il doit y avoir une solution simple à cela. Je pense que la solution devrait être avec les espaces de noms, mais je n'arrive pas à comprendre comment tout garder lié ! Il semble que chaque fois que je crée un nouvel espace de noms, le "ns" est écrasé. L'énigme que j'ai est de trouver comment conserver chaque instance distincte du complément en utilisant sa propre valeur "ns", et de telle manière que je puisse introduire la valeur "ns" correcte dans chacun des nombreux "On Close". "des codes qui finissent par être créés.
Voici une version simplifiée de ce que j'essaie de faire. L'idée serait que si j'exécute ceci, puis que je clique une ou plusieurs fois sur le bouton "Créer un autre", puis que je rejette l'un des générateurs de graphiques, les autres resteront intacts - sans aucun souci de savoir quel graphique Constructeur, je choisis de licencier en premier.
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();
À la recherche de sagesse : que dois-je essayer ensuite ?
Ingénierie Qualité et ProcédésRe : JSL : Lorsque les analyses dépendent de données temporaires, fermeture des données lorsque l'analyse est fermée...C'est une grande "fonctionnalité". Beaucoup plus rapide à implémenter pour mon code, cela n'a pris qu'une heure ou deux pour effectuer les ajustements de cette façon, en m'assurant d'avoir un espace de noms avec lequel travailler, etc., plutôt que de trouver comment remplacer toutes mes variables DisplayBox (que j'étais je n'ai pas hâte).
Dans cette solution, j'ai également ajouté un Wait() puis un Delete File() après Open() puisque ma Button Box qui déclenche une nouvelle exécution écrira simplement un nouveau fichier Temp à chaque fois que vous cliquerez dessus.
Re : JSL : Lorsque les analyses dépendent de données temporaires, fermeture des données lorsque l'analyse est fermée...Je suis parfois frustré par le fait que "Names Default to Here()" n'ait pas d'espaces de noms séparés à chaque invocation du code.Mais j’en profite également lors du débogage du code.Je vois donc les deux avantages.Mais voici une idée originale qui crée des espaces de noms « Ici » séparés.
Si vous prenez votre JSL original et ajoutez //! comme première ligne, ce code s’exécutera automatiquement lorsqu’il sera ouvert à partir de votre disque dur.Lorsque ce script est ouvert, il possède son espace de noms "Ici" unique.Si vous ouvrez le fichier une deuxième fois, il possède son propre espace de noms « Ici ».
À plusieurs reprises dans le passé, je l'ai utilisé ???? fonctionnalité ????.Mon programme principal utilise un Save Text File() pour enregistrer le JSL en question dans un emplacement $TEMP, puis chaque fois que le code suivant doit exécuter le code dans le JSL enregistré, vous utilisez un Open() pour exécuter le fichier.Le passage des valeurs vers et depuis le JSL enregistré s'effectue via un espace de noms défini à la fois dans le programme principal et dans le programme JSL enregistré.
Voici votre exemple de configuration de code original de cette manière, et lorsqu'elle est exécutée, chaque instance est indépendante dans son exécution
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");
Re : JSL : Lorsque les analyses dépendent de données temporaires, fermeture des données lorsque l'analyse est fermée...Merci. Ceci est utile pour les solutions simples comme celle-ci.
Je vais peut-être subir une énorme réécriture de code et même dans ce cas, je ne suis pas sûr qu'il soit possible de faire ce que je veux faire. Mon complément actuel stocke également un certain nombre de références DisplayBox dans ns, et les DisplayBox déclenchent diverses actions supplémentaires à la fois dans les plates-formes et dans la table de données. Toutes les références DisplayBox sont également cannibalisées lorsque le complément est relancé. Je suppose que si j'ai de la chance, je peux convertir la plupart de mes DisplayBox en fonctions de déclenchement afin de pouvoir appuyer sur ce << Parent et revenir à d'autres boîtes pour mettre à jour les sorties, etc. On dirait que je vais devoir sérieusement repenser ce que je fais.
J'avais espéré que Names Default to Here créerait un espace de noms Here distinct à chaque fois que le code serait réexécuté, mais cela ne semble pas être le cas...
Y a-t-il d'autres bonnes options avant de me lancer dans cette autre voie ?
Re : JSL : Lorsque les analyses dépendent de données temporaires, fermeture des données lorsque l'analyse est fermée...Le problème est que votre variable "ns" est remplacée lors de la deuxième exécution de la fonction et des suivantes.Par conséquent, vous devez utiliser une référence unique à la table de données.Vous trouverez ci-dessous une version de votre code, qui utilise le nom de la table de données pour la fermer.
Names Default To Here( 1 );
MyFunction = Function( {},
ns = New Namespace();
ns:dt = New Table( "Test Table",
<<NEW column=""></NEW>