Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeEst-il possible d'appliquer un gestionnaire d'état de ligne à une table de données et de faire en sorte que ce gestionnaire continue de fonctionner si la table de données est modifiée ; par exemple, si une colonne est triée par un script ou interactivement par un utilisateur ?
J'ai actuellement deux tables de données : une table avec des statistiques récapitulatives, une avec des données brutes. L'utilisateur sélectionne une ligne dans le tableau récapitulatif, le gestionnaire d'état de ligne détecte quelle ligne est sélectionnée, extrait le nom du paramètre et crée un graphique à partir du tableau de données brutes à l'aide du paramètre sélectionné.
Cela fonctionne bien (bien qu'il récupère la ligne qui a d'abord été désélectionnée avant de trouver la nouvelle ligne sélectionnée), mais il casse si l'utilisateur trie le tableau récapitulatif (par exemple s'il veut regarder le Cpk le plus bas, ou une autre métrique ).
Je vois le même problème dans l'exemple simple suivant basé sur l'aide au script :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << Select Rows( 1 );
dt << sort( by( :weight ), replace table, order( ascending ) );
dt << Select Rows( 9 );La sortie est :
Scriptable[]
[1]
Je pense que cela peut être lié à cet élément de la liste de souhaits : https://community.jmp.com/t5/JMP-Wish-List/Improve-JMP-s-state-handlers-hover-label-row-state-handler/idi-p/527992 . Y a-t-il une solution de contournement?
J'utilise JMP17.0 sur MacOS.
Merci!
Automatisation et scriptRe : Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeAu fait, je me rends compte que l'exemple scripté que j'ai donné pourrait être facilement résolu en ajoutant
rs = dt << make row state handler( f );
immédiatement après ma commande Sort(). C'est le cas interactif (où un utilisateur trie manuellement le tableau par une colonne puis sélectionne une ligne) qui pose problème.
J'ai essayé une solution de contournement en ajoutant un script à la table qui réinitialise le gestionnaire d'état de ligne :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << new script("Fix Row State Handler",
rs = dt << make row state handler( f );
); // errors when the script is run!
dt << Select Rows( 1 );
wait(0);
dt << sort( by( :weight ), replace table, order( ascending ) );
rs = dt << make row state handler( f ); // fixes issue when scripting
dt << Select Rows( 9 );mais j'obtiens une erreur lorsque je clique sur le triangle vert pour exécuter le script :
Send Expects Scriptable Object in access or evaluation of 'Send' , dt << /*###*/make row state handler( f ) /*###*/ at line 6 in ...
Cependant, même si cela fonctionnait, ce ne serait pas idéal car cela nécessite qu'un utilisateur se souvienne de le faire après avoir trié la table.
Merci,
Matthieu.
Re : Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeBonjour,
Vous pouvez peut-être utiliser un rapport pour piloter le script. Les zones de tableau peuvent exécuter des scripts lorsque des lignes sont sélectionnées et ne semblent pas se casser lorsque le tableau récapitulatif est trié. Essayez ce qui suit pour vous faire une idée.
Names Default To Here(1);
dt = open ("$Sample_Data\Car Physical Data.jmp");
dtSum = dt << summary( group(:Country), mean(:weight) );
nw = new window("ex",
dtb = Data Table Box( dtSum,
<< Set Selectable rows,
<< Set Click Sort )
);
//do something when a row is selected. Here, we just print the country.
dtb << Set Row Change Function ( function( { this },
selCountry = this[1][this << get selected rows];
print(evalinsert("Selected country is: ^selCountry[1]^."))
) );
Acclamations,
brady
Re : Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeSalut Brady, c'est génial, merci ! Cela m'a donné une solution beaucoup plus robuste et utilisable que j'avais auparavant.
Une question : est-il possible d'interroger la boîte de table de données de JSL pour savoir par quelle colonne (le cas échéant) l'utilisateur a trié la table ?
Salutations,
Matthieu.
Re : Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeBonjour Matthieu,
Je ne sais pas comment interroger pour voir quelle colonne (le cas échéant) a été utilisée pour trier la table. Vous pouvez forcer cela en vérifiant les colonnes, mais cela peut coûter cher, selon la taille de la table.
Re : Faire en sorte que le gestionnaire d'état de ligne cesse de fonctionner si la table est triéeSalut Brady,
Merci pour le conseil.
Je ne sais pas comment interroger pour voir quelle colonne (le cas échéant) a été utilisée pour trier la table. Vous pouvez forcer cela en vérifiant les colonnes, mais cela peut coûter cher, selon la taille de la table.
Pourriez-vous m'aider avec la méthode du forçage brutal ? J'ai essayé de regarder les propriétés de DataTableColBox et de la fenêtre elle-même et je n'ai rien trouvé qui m'aide à voir si elle est triée.
Merci,
Matthieu.