Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activésDivulgation complète : je ne suis pas codeur et JSL me donne des moments particulièrement difficiles, mais je pense que cette partie du script que j'écris devrait être beaucoup plus facile qu'elle ne l'a été. J'utilise fréquemment le filtre de données, avec "Rechercher" et "Expressions régulières" activés (voir image), mais il n'y a pas d'option pour enregistrer ces paramètres, ils doivent donc être réactivés à chaque fois que j'ouvre le filtre. Ce que je voudrais, c'est un script de table intégré qui :
1) ouvre le filtre de données
2) ajoute automatiquement la colonne actuellement sélectionnée (c'est-à-dire que je sélectionne une colonne, puis lance le script)
3) Activez "Rechercher"
4) Activez "Expression régulière"

Malheureusement, l'option de sauvegarde du script ne sauvegarde que ceci :
Current Data Table() << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( :name ), Display( :name, Size( 160, 225 ), List Display ) )
);Find et Regex ne sont pas enregistrés avec le script. . .
Mais, voici la partie qui m'a forcé à demander de l'aide, je ne peux pas comprendre comment passer le nom de la colonne actuellement sélectionnée aux fonctions "columns()" et "Display()".
J'ai essayé beaucoup de choses, par exemple ceci:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( col_selected ), Display( col_selected, Size( 160, 225 ), List Display ) )
);Mais j'obtiens une erreur :
"Colonne spécifiée introuvable dans la table de données. dans l'accès ou l'évaluation de 'columns' , columns( col_selected ) /*###*/"
Probablement parce que col_selected est une liste, mais je n'arrive pas à comprendre comment extraire uniquement le nom de la liste à un élément. Ça ne devrait vraiment pas être si difficile.
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activésMerci @Mark_Bailey cela fonctionne également bien qu'il ne filtre que la première colonne si plusieurs sont sélectionnés. Cependant, l'utilisation de votre suggestion pour obtenir la référence de colonne m'a permis de créer une boucle FOR qui fait exactement ce que je veux.
Names Default to Here( 1 );
dt = Current Data Table( );
list = dt << Get Selected Columns( );
obj = dt << Data Filter( );
For( i = 1, i <= N Items( list ), i++,
obj << Add Filter( columns( Column( list[i] ) )
)
);
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activésCette façon est alambiquée. Ce n'est pas la seule façon qui fonctionne, cependant. Les expressions sont des constructeurs puissants mais elles ne sont pas toujours nécessaires. Gardez à l'esprit que l'argument Columns() attend une référence de colonne. C'est tout ce qu'il y a à faire. Il peut s'agir d'une valeur littérale (nom de colonne), d'une valeur stockée dans une variable ou d'une valeur renvoyée par une fonction.
Names Default to Here( 1 );
// open example data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// select a column (mimic result by interactive user)
dt << Go To( :age );
// identify selection
col = dt << Get Selected Columns( String );
// obtain column reference
col = Column( col[1] );
// launch data filter on selected column
df = dt << Data Filter(
Add Filter( Columns( col ) )
);
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activés@ionatx Je suis d'accord.J'ai moi-même lutté avec cela et j'ai finalement trouvé la solution ici sur les forums.Ma compréhension approximative est que vous devez passer par tout ce charivari pour insérer une expression dans une autre expression. Avec votre code d'origine, col_selected n'a jamais été évalué.Data Filter() n'a vu que les caractères "col_selected" qu'il n'a pas reconnu comme titre de colonne, il a donc renvoyé l'erreur " Colonne spécifiée introuvable dans la table de données ".Vous l'incluez donc dans Expr(), ce qui signifie qu'il s'agit d'une expression qui doit être évaluée.Ensuite, enfermez le tout dans Eval Expr() pour forcer l'évaluation des éléments qui sont enfermés dans Expr().Enveloppez ensuite un Eval () autour de l'ensemble expression qui essentiellement exécute l'expression pour produire la sortie souhaitée.Tout semble très compliqué, mais c'est comme ça que ça marche.
Voulez-vous en savoir plus?https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activés@Chris_Rodrigues ça a marché, je ne comprends pas pourquoi ça a marché, mais ça a marché.
@Jeff_Perkinson merci pour le suivi, et oui, je le ferai.
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activés@Chris_Rodrigues a une poignée sur la façon d'obtenir la variable à évaluer dans le message Data Filter(), et je peux confirmer qu'il n'y a pas de support JSL pour activer les options Find et Regex.
Si vous pensez que cela serait utile, assurez-vous de l'inscrire dans le champ Liste de souhaits JMP .
Re : Script pour ouvrir le filtre de données sur la colonne actuellement sélectionnée, avec Find et Regex activésPour passer une variable comme col_selected à la fonction Data Filter, vous devez utiliser la construction Eval(Eval Expr(Expr())).JSL est tellement bizarre.Mais voici à quoi ça ressemble :
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
Eval(
Eval Expr(
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( Expr(col_selected) ), Display( Expr(col_selected), Size( 160, 225 ), List Display ) )
);
)
);Pour les options Rechercher et Regex... Je doute que ce soit même possible.Si vous regardez la documentation de Data Filter() dans le guide de script, il n'y a aucune mention de ces options.Je doute que l'interface de script ait ce niveau de granularité et que ces cases à cocher ne puissent être affichées que de manière interactive.Je peux me tromper, cependant.Quelqu'un d'autre pourrait proposer une solution pour cela.