Manipulieren Sie den lokalen Datenfilter von JSLAngesichts einer Liste von Werten möchte ich diese an die Grenzen eines lokalen Datenfilters schreiben. Hier ist ein (fast) funktionierendes Beispiel (Datenfilter entfernen und basierend auf dynamischer Erstellung des Datenfilterausdrucks erneut hinzufügen), aber es fühlt sich zu kompliziert an, ist dies der beste Weg, dies zu tun? (Es muss auch dynamisch für andere Tabellen mit unterschiedlicher Anzahl von Spalten funktionieren)
dt = Open("$SAMPLE_DATA\Fitness 3D.jmp");
sm = dt << Scatterplot Matrix(
Y( :Runtime, :RstPulse, :RunPulse, :MaxPulse ),
X( :Age, :Weight, :Oxy ),
Fit Line( 0 ),
Local Data Filter( Add Filter( columns( :Age, :Weight, :Oxy ) ) )
);
ColExp = expr(columns( :Age, :Weight, :Oxy ));
//Modify this expression based on list values
AndExp = expr(Where(:Age >=0 & :Age <=100));
sm << Remove Local Data Filter;
Eval(
Insert(
Expr( Send( sm ) ),
Insert(
Expr( Local Data Filter() ),
Insert(
insert(
expr(Add filter()),
name expr(ColExp)
),
//name expr(WhereExp)
insert(
expr(Where()),
name expr(AndExp)
)
)
)
)
);Für ein Stretchgoal möchte ich auch eine Schaltfläche anhängen, die beim Drücken die aktuellen Grenzwerte aus dem lokalen Datenfilter in eine Liste oder Matrix einliest.
SkripterstellungBetreff: Lokalen Datenfilter von JSL manipulierenDieses Beispiel gilt für den (globalen) Datenfilter, aber es zeigt, wie Sie ein Where()-Argument hinzufügen können, um Grenzen nach Ihren Wünschen einzurichten. Das heißt, Sie können die Einschränkung festlegen, wenn Sie den Filter öffnen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
obj = dt << Data Filter();
obj << Add Filter( columns( :POP ) );
obj << Add Filter(
columns( :Region, :State, :City ),
Where( :Region == "S" ),
Where( :State == {"SC", "NC"} )
);Betreff: Lokalen Datenfilter von JSL manipulierenDie Verwendung von Substitute könnte hier eine etwas sauberere Option sein.
dt = Open("$SAMPLE_DATA\Fitness 3D.jmp");
sm = dt << Scatterplot Matrix(
Y(:Runtime, :RstPulse, :RunPulse, :MaxPulse),
X(:Age, :Weight, :Oxy),
Fit Line(0),
f = Local Data Filter(Add Filter(columns(:Age, :Weight, :Oxy)))
);
ColExp = Expr(
columns(:Age, :Weight, :Oxy)
);
AndExp = Expr(
Where(:Age >= 0 & :Age <= 50)
);
Eval(Substitute(
sm << Remove Local Data Filter;
Expr(
f = sm << Local Data Filter(
_cols_,
_where_
)
),
Expr(_cols_), Name Expr(ColExp),
Expr(_where_), Name Expr(AndExp)
));
// You can try to parse this for local data filter limits
w = f << Get where clause;
show(w);
Für Grenzen könnten Sie die Where-Klausel analysieren oder vielleicht auf die DFIntMinMaxBox und NumberEditBoxes darin zugreifen (ich würde versuchen, die Where-Klausel zu analysieren). Es könnte auch andere Methoden dafür geben (Show Properties(f) könnte einige Ideen haben).

Betreff: Lokalen Datenfilter von JSL manipulierenOk, danke für die Bestätigung, dass mir keine viel einfachere Option (wie f[1] << set limit(1, 2);) oder so etwas fehlt. Ausdrucksmanipulation soll es dann sein 
Und ja, für die Schaltfläche werde ich wahrscheinlich xpath verwenden, um alle numbereditboxen zu extrahieren und aus der Reihenfolge kann ich ihre Bedeutung ableiten. Ich wollte nur sicherstellen, dass Sie den lokalen Datenfilter nicht direkt abfragen können, um Ihnen die Grenzwerte mitzuteilen.