Connecter des filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesSupposons que j'ai deux fenêtres Graph Builder de différentes tables de données, chacune avec un filtre de données local filtrant sur "numéro d'exécution" et "heure".
Est-il possible de connecter les deux filtres de données locaux afin qu'ils restent synchronisés ?
Ou peut-être avec JSL pour extraire les paramètres actuels du filtre de données local #1 et les appliquer au filtre de données local #2 ?
(Je suppose que l'étape 1 consiste à obtenir une référence aux filtres de données locaux, je n'ai même pas encore compris comment faire cela - voici ce que j'ai jusqu'à présent :
// get the last Graph Builder
win = Get Window List();
graphs = Filter Each({w}, win,
If(Length(w << XPath("//OutlineBox[@helpKey='Graph Builder']")) > 0, 1, 0)
);
last_gb = graphs[N Items(graphs)][OutlineBox("Graph Builder")] << Get Scriptable Object;
localDataFilter = last_gb << XPath("//OutlineBox[text()='Local Data Filter']");)
Automatisation et scriptRe : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesPourriez-vous concaténer les tables ensemble, puis utiliser une sorte de colonne de regroupement pour les séparer en différents graphiques ? Cela pourrait être plus facile que de jouer avec les gestionnaires de changement de filtre.
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesPas vraiment - un tableau est un résumé de haut niveau des résultats de l'exécution, et nous identifions les problèmes à partir de ce résumé, puis passons au tracé détaillé de l'exécution et sélectionnons l'exécution spécifique dans le filtre de données.Il n'est pas évident pour moi comment la fusion de ces deux tables permettrait ce type de comportement.
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesQu'en est-il des jointures virtuelles ?
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesposte similaire :
https://community.jmp.com/t5/Discussions/Virtual-linking-two-tables-via-JSL-scripting/mp/657682/highlight/true#M84705
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesJe suppose que l'on a besoin de filtres de données non locaux tels que la fonctionnalité Dispatch/Receive des liens virtuels diffusera les paramètres de filtre.
Pour mon cas, c'était trop lent.
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesEt si vous souhaitez copier l'intégralité du filtre, vous pouvez utiliser le copier/coller :
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb1 = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
);
gb2 = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :sex ), X( :age, Position( 1 ) ), Y( :weight ), Overlay( :sex ) ),
Elements( Bar( X( 1 ), X( 2 ), Y, Legend( 3 ) ) )
);
df1 = gb1 << Local Data Filter(
Add Filter(
columns( :age ),
Where( :age == 15 ),
Display( :age, N Items( 6 ) )
)
);
df1 << copy local data filter();
gb2 << paste local data filter();
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesJ'aime l'idée, mais il y a évidemment quelque chose que je ne comprends pas dans votre solution, car elle se bloque lorsque j'essaie de l'exécuter.
Voici ce que j'ai jusqu'à présent :
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb1 = dt << Graph Builder(
Graph Spacing( 5 ),
Variables( X( :sex ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) )
);
gb2 = dt << Graph Builder(
Graph Spacing( 5 ),
Variables( X( :sex ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) )
);
df1 = gb1 << Local Data Filter(
Add Filter(
columns( :sex ),
Where( :sex == "M" ),
Display( :sex, N Items( 2 ) )
)
);
df2 = gb2 << Local Data Filter(
Add Filter(
columns( :sex ),
Where( :sex == "F" ),
Display( :sex, N Items( 2 ) )
)
);
broadcastFilter = Function( {},
//get the script
filterScript = df1 << get Script();
//search for the "Add filter" part
For( i = 1, i <= N Arg( filterScript ), i++,
If( Head( Arg( filterScript, i ) ) == Expr( Add Filter() ),
filterExpression = Arg( filterScript, i )
)
);
// broadcast it to the other Data filter
Eval(
Substitute(
Expr(
df2 << Start Over << _filter_
),
Expr( _filter_ ), Name Expr( filterExpression )
)
);
);
// activate the Filter Change Handler
rs = df1 << Make Filter Change Handler( broadcastFilter );Voici l'erreur : "broadcastFilter a 0 paramètres () mais 1 arguments (18) ont été fournis".Une idée de quoi ça parle ?Je ne pense pas fournir d'arguments dans cette dernière ligne...
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesOh. Désolé.
broadcastFilter = Function( {x}, Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesÀ la fin, je suis revenu aux filtres de données locaux et j'ai ajouté un gestionnaire de changement de filtre au premier filtre de données.
Cela fonctionne très bien - Si vous n'oubliez pas le
rs=
Gestionnaire de changement de filtre
broadcastFilter=Function({x}, // Make Filter Change Handler need a function with 1 Argument
//get the script
filterScript = DataFilter1 << get Script();
//search for the "Add filter" part
For( i = 1, i <= N Arg( filterScript ), i++,
If( Head( Arg( filterScript, i ) ) == Expr( Add Filter() ),
filterExpression = Arg( filterScript, i )
)
);
// broadcast it to the other Data filter
Eval( Substitute( Expr( Datafilter2 << Start Over << _filter_ ), Expr( _filter_ ),
Name Expr( filterExpression ) ) );
// activate the Filter Change Handler
rs = DataFilter1 << Make Filter Change Handler( broadcastFilter); // will call broadcastFilter() with 1 Argument: # of selected rows
edit: argument x ajouté et commenté. Une fonction
broadcastFilter=Function({},-sans arguments - ne fonctionne pas.
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesWaouh, ça marche !J'aimerais comprendre ce que fait ce code...
Dernière question - en supposant que j'ai déjà une fenêtre Graph Builder ouverte avec un filtre de données local, je sais comment obtenir la variable d'objet gb .jsl :
win = Get Window List();
graphs = Filter Each({w}, win, If(Length(w << XPath("//OutlineBox[@helpKey='Graph Builder']")) > 0, 1, 0) );
gb = graphs[N Items(graphs)][OutlineBox("Graph Builder")] << Get Scriptable Object;... mais comment puis-je obtenir la variable objet df1 à partir de la variable objet gb ?(J'ai l'impression d'avoir essayé 100 choses différentes...)
Re : Connecter les filtres de données locaux entre les fenêtres du générateur de graphiques à partir de différentes tables de donnéesUne option consiste à utiliser une idée similaire à celle que vous utilisez pour le générateur de graphiques
df = (gb << top parent)[Outline Box("Local Data Filter")] << Get Scriptable Object;
le filtre de données local n'est pas à l'intérieur du générateur de graphes, vous devez donc d'abord passer au niveau supérieur (dans ce cas, j'utilise << top parent). L'utilisation de XPath avec l'attribut helpKey et la valeur Data Filter pourrait être une solution un peu plus robuste et ce serait quelque chose comme ça
(gb << top parent) << XPath("//OutlineBox[@helpKey='Data Filter']")
Modifier : si vous avez la possibilité de plusieurs filtres de données dans la même fenêtre, vous devrez peut-être rendre la définition du point de départ un peu plus spécifique que d'utiliser simplement << top parent.