Salut,
Grâce aux autres utilisateurs du forum, j'ai un script qui fonctionne qui inclut des sélecteurs de colonnes et des filtres de données locaux. Le script fonctionne comme prévu et l'étape suivante est que je voulais créer un package en tant que complément pour la base de clients. Je pense que je détaille le fonctionnement du complément et je peux lancer le script et il passe par l'importation de données, le nettoyage et la synthèse et crée l'interface. CEPENDANT, l'interface me donne maintenant des erreurs lorsque j'essaie d'exécuter le sélecteur de colonne qui fonctionnait bien si je lançais le script tout seul. Si je clique sur un nouvel élément dans le sélecteur de colonnes, j'obtiens l'erreur suivante J'ai joint le code qui crée cette vue. Dans mon code, je l'attache à un tableau de données récapitulatif, puis je l'exécute à partir du script. Si je cours via un complément (où je viens de joindre le script), cela donne une erreur. Si je ferme ensuite cette fenêtre et que je clique sur le bouton de la table de données, créez le même affichage, cela fonctionne comme prévu sans erreur. Je suis donc un peu confus quant à ce que je devrais changer et à mes idées?
Andy

cell_sum << new script(
"Main Interface",
cell_sum = Current Data Table();
test = Fit Group(
Oneway(
Y( :Max Discharge Capacity ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Cycle Number (>0.8)"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Discharge Capacity @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
Oneway(
Y( :"Remain % @ 50 Cycles"n ),
X( :Cathode Recipe.x ),
Quantiles( 1 ),
Means( 1 ),
Box Plots( 1 ),
Mean Diamonds( 0 ),
X Axis Proportional( 0 ),
Points Jittered( 1 ),
Grand Mean( 0 ),
),
<<{Arrange in Rows( 4 )}
);
colpick = test << Column Switcher(
:Cathode Recipe.x,
cell_sum << get column names( Ordinal, Nominal )
);
(test << top parent)[listboxbox( 1 )] << set script(
Try( test << remove local data filter );
mycurrent = ((test << top parent)[listboxbox( 1 )] << get selected)[1];
test << Local Data Filter(
Add Filter( columns( Column( mycurrent ) ), Display( Column( mycurrent ), N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
test << Local Data Filter(
Add Filter( columns( colpick << get current ), Display( colpick << get current, N Items( 15 ), Find( Set Text( "" ) ) ) )
);
);
cell_sum << run script( "Main Interface" );
JSL est différent de nombreux autres langages de programmation en ce sens qu'il ne contrôle pas automatiquement la portée comme, par exemple, Python pourrait le faire.Dans ce cas, vous utilisez la ligne
(test << top parent)[listboxbox( 1 )] << set script(... pour ajouter un script à la zone de liste.Lorsque ce script s'exécute (par l'utilisateur sélectionnant un élément), alors toute variable dans ce script doit être résolue -- c'est là que la portée entre en jeu.En Python, chaque fonction a une portée locale et chaque portée est consciente de sa portée parente et de la portée globale (et les portées sont persistantes), de sorte qu'une variable dans une fonction peut accéder aux variables de la portée parente ou de la portée globale.JSL ne fait pas cela - les fonctions ne créent pas et ne se souviennent pas des portées et toute portée créée ne conserve pas d'enregistrement de la portée qui l'a créée.Pour JSL, lorsqu'une variable non délimitée est accessible (soit par espace de noms:variable ou As Scoped( namespace, variable ) alors il ira par défaut à la Ici ou portée mondiale et c'est tout.
La recherche de portée pour les noms sans portée ressemble à ceci : Regardez l'espace de noms local s'il existe (si vous êtes dans un Local( {}, ... ) fonction ou Fonction( {}, {Local par défaut}, ... ) fonction sont les plus courants), regardez le Ici espace de noms (s'il existe), regardez l'espace de noms global.Parfois, il examine les noms de colonne (comme dans un Pour chaque ligne() une fonction).
Dans votre fichier, vous n'utilisez aucun raccourci de portée automatique (tel que Noms par défaut ici (1) ), de sorte que chaque variable a une portée globale.Ainsi, lorsque le Zone de liste le script s'exécute, il peut trouver test parce qu'il regarde dans la portée globale.Cependant, les scripts addin utilisent par défaut le Noms par défaut ici (1) une fonction que ce soit ou non c'est dans le fichier de script.Dans ce périmètre, les fichiers Ici l'espace de noms est supprimé une fois le script terminé, et le Zone de liste le script ne trouve pas test dans n'importe quelle étendue à laquelle il a accès (c'est-à-dire, son propre Ici l'espace de noms et l'espace de noms global).Vous pouvez désactiver le Noms par défaut ici (1) dans la version addin, mais je déconseille cela et il est préférable de contrôler explicitement la portée.
Cela dit, pour désactiver le Noms par défaut ici (1) dans la version addin, décochez la case suivante :

Salut,
Merci beaucoup pour votre description complète de ce qui se passait et l'explication des espaces de noms.
Je n'ai vraiment pas compris ce qu'était vraiment "Names Default to Here (1)". Appris quelque chose de nouveau.
Merci encore.
Andy