Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?J'utilise le Make Filter Change Handler () pour modifier dynamiquement le titre de l'axe Y en fonction des modifications apportées par l'utilisateur sur le filtre de données local. Le script utilise la solution par @hogi depuis ici . Cependant, dans mon exemple (script ci-dessous) qui représente de près mon cas réel, le titre de l'axe des ordonnées ne change qu'après que la deuxième case à cocher est cochée sur "âge". Comment faire changer la mosaïque de l'axe des ordonnées lors de la première sélection d'âge (je suis sur JMP 16.2.0) ?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\( *(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
fsh = ldf << Make Filter Change Handler(
changeTitle();
);Automatisation et scriptRe : Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?L'expression régulière utilisée ne fonctionne pas s'il n'y a qu'un seul âge sélectionné et cela se traduira par "tous les âges".
Clause Where lorsqu'un seul âge est sélectionné
"Select Where(:sex == \!"F\!" & :age == 15)"
Clause Where lorsque plusieurs âges sont sélectionnés :
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
Vous devrez apporter de légères modifications au modèle regex
Modifier:
Quelque chose comme ça pourrait marcher https://regex101.com/r/Z6pg9N/1
Re : Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?@jthi Ce qui suit semble fonctionner pour mon exemple ci-dessus
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
Cependant, pour mon cas réel, le changement de script ci-dessus ne fonctionne que lorsque les cases à cocher sélectionnées par défaut par le Add Filter () à l'intérieur de Graph Builder() sont d'abord décochées puis revérifiées. Une fois que cela fonctionne, tout va bien. Qu'est-ce qui ne va pas ?
Re : Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?Très probablement, le premier état de filtre est exécuté avant même que le gestionnaire d'état de filtre ne soit ajouté. Vous pouvez appeler changeTitle() avec une référence au filtre de données local pour vous assurer que la fonction est exécutée une fois après la création du graphique
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Where(:age == 12),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
changeTitle(ldf); // to run the changeTitle() function once
fsh = ldf << Make Filter Change Handler(
changeTitle();
);Re : Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?@jthi . L'appel de Change Title () car votre script n'a rien changé. Malheureusement, je ne peux pas partager mon script actuel (:.
Notez que la première sélection affiche tous les filtres cochés sur l'axe des ordonnées. Peut-être que cela peut fournir un indice sur ce qui se passe.
Décochez toutes les cases et cochez-les comme vous le souhaitez pour obtenir le résultat attendu.
Toutes les suggestions seront très utiles.
Re : Faire en sorte que le gestionnaire de changement de filtre () ne se déclenche qu'après le deuxième changement de filtre, pourquoi pas le premier ?Aucune idée. Vous devrez créer une sorte de maquette capable de reproduire le problème pour faciliter le débogage