Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outilsActuellement, il est assez compliqué de créer un script de fonctionnalités similaires à celles que l'on trouve déjà dans la barre d'outils. Ajoutez un nouvel élément qui pourrait être utilisé à cette fin, il devrait également se mettre à jour automatiquement. C'est un type d'élément assez courant que j'ajoute à mes interfaces utilisateur pour permettre à l'utilisateur de modifier la table de données actuelle, de la mettre au premier plan ou simplement de voir rapidement quelle est la table de données actuelle.
Automatisation et scriptsRe : Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outilsPar « fonctionnalité similaire à celle déjà trouvée dans la barre d'outils », j'entends une zone de liste déroulante dont la liste serait mise à jour lorsque la table de données est ouverte, renommée ou fermée.
La fonctionnalité serait un peu différente de celle de la barre d'outils car elle ne devrait pas changer de tableau lorsque le tableau de données actuel change, mais se déclencher de la même manière que << Définir la fonction le fait pour la zone de liste déroulante.
Cas d'utilisation :
- J'ai un outil qui peut effectuer des analyses complexes sur différents types de tables de données, mais le démarrage de cet outil prend beaucoup de temps
- Dans le cas « normal », vous exécuteriez simplement l'outil sur Current Data Table(). Mais si vous souhaitez l'exécuter sur plusieurs tables, il serait avantageux de disposer d'un changeur de table facile à utiliser en raison du long démarrage.
Par exemple , le module complémentaire Data Table Tools est un module complémentaire doté d'une zone de liste et d'un bouton d'actualisation de la liste de table qui pourrait être remplacé par cet élément (s'il correspond à l'interface utilisateur).
Re : Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outilsCe script me donne une meilleure idée de ce que vous voulez, mais ce que vous entendez par « fonctionnalité similaire à celle que l'on trouve déjà dans la barre d'outils » n'est toujours pas clair. Voulez-vous une nouvelle boîte d'affichage qui montre toutes les tables ouvertes, qui peut être utilisée dans n'importe quelle fenêtre de rapport scriptée ? La sélection des colonnes dans la table est-elle importante ? Il serait utile que vous puissiez décrire un exemple d'utilisation de cette fonction.
Re : Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outilsLe code est un peu brouillon car je viens de l'« emprunter » à l'un de mes outils (je devrais probablement l'écrire dans une classe). Mais en gros :
- J'ai une zone de liste déroulante avec une liste de tables de données initiales et une table de données actuelle définie comme sélection actuelle
- J'ai défini la fonction Combo Box qui mettra à jour le sélecteur de colonnes de filtre en fonction du changement de valeur (modification du tableau de données). Cela ne modifie pas le tableau de données actuel ni ne change lorsque le tableau de données actuel change.
- J'ai un sélecteur de filtre de colonne qui est censé utiliser la même table que celle visible dans la zone de liste déroulante
- J'utilise l'abonnement à la liste des tables de données pour suivre les nouvelles tables, les renommages et la fermeture des tables de données. Et les fonctions essaient de gérer tous ces changements et la façon dont ils affectent la zone de liste déroulante
- Lorsque la fenêtre est fermée, je supprime mon abonnement à la liste des tables de données
Exemple de code :
Voir plus...
Names Default To Here(1);
// To initialize Combo Box
init_dt_list = Get Data Table List() << Get Name;
If(N Items(init_dt_list) == 0,
Throw("No tables open");
);
dt = Current Data Table();
init_dt_idx = Contains(init_dt_list, dt << get name());
nw = New Window("test",
window:dt = dt;
H List Box(
Lineup Box(N Col(2),
window:cb_table = Combo Box(init_dt_list, << Set(init_dt_idx), << Set Function(function({this},
// must be done this way to recover from no tables open?
If((this << get selected) != "(SELECT TABLE)",
all_items = this << get items;
If(Contains(all_items, "(SELECT TABLE)"),
this << Remove Item(Contains(all_items, "(SELECT TABLE)"));
);
window:dt = Datatable((this << get selected));<BR />
// redo filter col selector
(window:ob_column_selection << child) << Delete Box();
Eval(EvalExpr(nw:ob_column_selection << Append(V List Box(
window:fcs = Filter Col Selector(Datatable(Expr(Datatable(window:dt))), << Set N Lines(5)),
window:fcs[IfBox(1)] << Set(1);
))));
);
)),
<< Set Tip("Data Table")
),
window:btn_table = Button Box("", << Set Function(function({this},
window:dt = Datatable(window:cb_table << Get Selected);
window:dt << Bring Window To Front;
)),
<< Set Icon("ActivateDataTable"),
<< Set Tip("View Data Table")
)
),
window:ob_column_selection = Outline Box("Column Selector",
V List Box( // Necessary evil for easier filter col selector updating
window:fcs = Filter Col Selector(Datatable(dt), << Set N Lines(5)),
window:fcs[IfBox(1)] << Set(1)
)
)
)
);
// Functions for different changes in data table list
Eval(EvalExpr(f_open = function({dtab},
cur_dts = Reverse(Get Data Table List() << Get Name);
cur_dt = Expr(nw:cb_table) << Get Selected;
If(cur_dt == "(no tables)",
nw:dt = Datatable(dtab);
);
Expr(nw:cb_table) << Set Items(cur_dts);
Expr(nw:cb_table) << Set(Contains(cur_dts, cur_dt));
If(N items(cur_dts) == 1,
// add (SELECT TABLE) temp item to recover from empty table situation
Expr(nw:cb_table) << Append Item("(SELECT TABLE)");
Expr(nw:cb_table) << Set(2, Run Script(0));
);
)));
Eval(EvalExpr(f_rename = function({dtab, b},
cur_dts = Reverse(Get Data Table List() << Get Name);
cur_dt = Expr(nw:cb_table) << Get Selected;
Substitute Into(cur_dts, b, (dtab << get name));
If(cur_dt == b,
cur_dt = dtab << get name;
);
Expr(nw:cb_table) << Set Items(cur_dts);
Expr(nw:cb_table) << Set(Contains(cur_dts, cur_dt));
)));
Eval(EvalExpr(f_close = function({dtab},
cur_dts = Reverse(Get Data Table List() << Get Name);
Remove From(cur_dts, Contains(cur_dts, dtab << get name));
cur_dt = Expr(nw:cb_table) << Get Selected;
If(cur_dt == dtab << get name(),
cur_dt = Current Data Table() << get name;
);
nw:cb_table << Set Items(cur_dts);
Expr(nw:cb_table) << Set(Contains(cur_dts, cur_dt));
If(N Items(cur_dts) == 0,
nw:cb_table << Set Items({"(no tables)"});
);
)));
// Subscription to data table list
aSub = Subscribe to Data Table List(, OnOpen(f_open));
Eval(EvalExpr(Subscribe to Data Table List(Expr(aSub), On Rename(f_rename))));
Eval(EvalExpr(Subscribe to Data Table List(Expr(aSub), OnClose(f_close))));
// To remove subscription
Eval(EvalExpr(nw << On Close(
Try(Unsubscribe to Data Table List(Expr(aSub), "ALL"));
)));
Ce que j'aimerais avoir, c'est un élément plus simple pour gérer cette même opération. Je pourrais l'écrire moi-même sous forme de classe, mais je pense que cela pourrait également être utile pour d'autres scripteurs JSL qui créent des interfaces utilisateur. Un moyen simple de gérer cela est d'utiliser simplement des boutons au lieu de l'abonnement à la table de données (actualisation de la liste des tables), mais cela pourrait être un moyen beaucoup plus propre.
Re : Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outilsL'utilisation de la barre d'outils ne suffit pas à mes besoins.
J'ai écrit un scénario qui fait "en grande partie" ce que je veux, mais l'écrire est inutilement compliqué (à mon avis). Je le partagerai ici en septembre quand je reprendrai le travail.
Re: Ajouter un élément de zone d'affichage spécial pour la liste de tables de données similaire à la barre d'outils - Statut modifié en : Informations nécessaires@jthi quand vous dites barre d'outils, voulez-vous dire la barre d'outils JMP qui peut être affichée en haut de chaque fenêtre de rapport ?

Il est possible de personnaliser les barres d'outils JMP, comme décrit ici : https://www.jmp.com/support/help/en/16.2/index.shtml#page/jmp/customize-toolbars.shtml# . Cela répond-il à vos besoins ?
Sinon, pouvez-vous partager une maquette, un script ou un wireframe de ce que vous aimeriez pouvoir faire ?