사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링안녕하세요 여러분,
저는 보고서가 여러 개 들어 있는 애플리케이션/대시보드를 만들고 있습니다. 마지막에 사용자에게 메인 데이터 테이블의 "쿼리"를 만들고 나중에 필요할 경우 저장할 수 있는 옵션을 제공하고 싶습니다.
지금은 다른 창을 열고 사용자에게 필터링 열(미리 선택된 목록에서)을 선택하라는 메시지를 표시하는 버튼이 있습니다.
선택한 후 다른 버튼을 누르면 각 필터링 열에 사용 가능한 모든 고유 값이 있는 목록 상자가 생성됩니다. 제 생각에는 여기에서 사용자가 각 목록 상자에서 필터링을 수행할 값을 선택한 다음 마지막 버튼을 눌러 해당 값을 저장하면 필터/where 절이 빌드되어 주 데이터 테이블의 하위 집합이 되고 알려진 위치에 저장됩니다.
저는 절반 정도 왔다고 생각합니다. 첫 번째 창과 필터 열 선택이 작동하도록 합니다. 그런 다음 목록 상자에 값을 표시할 수 있지만 선택한 값을 저장할 올바른 버튼을 만들 수 없습니다. 또한 사용자가 만들 필터 열의 수를 알 수 없다는 문제가 발생하여 알 수 없는 수의 열을 정의하는 표현식이 필요합니다. Eval(Parse(Eval Into 문이 있는 몇 가지 예를 보았지만 아직 얻지 못했습니다.
어떤 도움이라도 감사히 받겠습니다. 아마도 훨씬 더 간소화된 방법이 있을 겁니다.
지금까지 내가 가지고 있는 코드 중 일부는 다음과 같습니다.
filter_col_append_expr = Expr(
lub1 << Append(List Box(column(dt1,Char(col_filter[count_i])) <<GETASMATRIX></GETASMATRIX>
//The button which will run the whole thing is here. Some code is ommited
Panel Box("Database Query", Button Box("Query",query_expr;query_window << Append(bb3 = Button Box("Select Filter Values",query_values = lub1<<GET selected=""></GET><BR /><LINGO-LABS id="lingo-labs-828278" slang="en-US" mode="CREATE"><LINGO-LABEL>자동화 및 스크립팅</LINGO-LABEL><LINGO-LABEL>데이터 탐색 및 시각화</LINGO-LABEL><LINGO-LABEL>윈도우</LINGO-LABEL></LINGO-LABS>Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링사용자가 선택한 열을 기반으로 데이터 필터를 구축하는 것을 고려해 보셨나요?
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링네, 하지만 복잡하지 않을수록 좋습니다. JMP를 처음 사용하는 사용자가 많지 않기 때문에 가능한 한 쉽게 시각화하고 버튼 하나만 누르면 필터링된 데이터를 얻을 수 있도록 만들고 싶습니다.
로컬 필터로 하면 효과가 있을 수도 있습니다.
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링필요한 경우 정리할 수 있는 데이터 필터를 구축할 수 있지만 여기에는 목록 상자를 사용하는 한 가지 옵션이 있습니다.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
options = dt << Get Column Names("String");
filter_col_append_expr = Expr(
Summarize(dt, colvals = By(Eval(selection))); // Note that Summarize this will change numeric values to strings
lub1 << Append(List Box(colvals));
);
query_expr = Expr(
query_window = New Window("Database Query",
Spacer Box(size(1, 5)),
vlb3 = V List Box(
Text Box("Select All Filter Columns"),
H List Box(
Spacer Box(size(1, 5)),
lb3 = List Box(
options,
max selected(8)
)
),
Spacer Box(size(1, 10)),
Button Box("Select Filter Columns",
cols = lb3 << get selected;
Try(lub1 << Delete Box());
lub_collector << Append(lub1 = Lineup Box(N Col(4)));
For Each({selection}, cols,
filter_col_append_expr
);
),
lub_collector = V List Box();
)
)
);
//The button which will run the whole thing is here. Some code is ommited
nw = New Window("",
Panel Box("Database Query",
Button Box("Query",
query_expr;
query_window << Append(
bb3 = Button Box("Select Filter Values",
vals = (lub1 << XPath("//ListBoxBox")) << get selected;
user_selections = Associative Array(cols, vals);
show(user_selections);
)
);
)
)
);
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링고맙습니다. 제가 의도한 대로 작동하네요.
그러나 다음 단계에서는 약간 난관에 봉착합니다.
데이터 필터를 구축하기 위해 사용자 선택 사항에 연결 배열을 직접 넣는 것을 고려했지만 효과가 없습니다.
그런 다음 데이터 필터로 들어가는 부분을 나누고 Expr과 다른 문자열 명령을 사용해서 대화형 데이터 필터를 만든 후 빨간색 삼각형을 사용한 것처럼 보이도록 만드는 방법을 생각해 보았지만 구문 어딘가에서 잘못된 것이 있는 것 같습니다.
이것은 당신의 BigClass 예제에서 내 코드입니다
where_clause_list = {};
where_clause = "";
keys = user_selections << getkeys;
values = user_selections << getvalues;
For ( i=1, i<=NItems(keys), i++,
// Inner loop iterating over items for each category
For Each( {value}, values[i],
// Action for each category-item pair
(where_clause = where_clause || ":"||keys[i] || " ==" || " " || Char(value) || " &"|| " ");
InsertInto(where_clause_list, where_clause);
where_clause = "";));
where_clause="";
For Each({where},where_clause_list,where_clause=where_clause||where);
where_clause = Left(where_clause,Length(where_clause) -3);
Show(where_clause_list);
Show(where_clause);
where_expr = Expr(where_clause);
key_clause="";
For Each({key},keys,key_clause=key_clause||"Ascolumn("||key||")"||" ,");
key_clause = Left(key_clause,Length(key_clause) -2);
keys_expr=Expr(key_clause);
Show(key_clause);
dt << Data Filter(Add Filter(columns(key_expr),Where(where_expr),
Mode( Select( 0 ), Show( 1 ), Include( 1 ))));
하지만 이를 더욱 직접적이고 직관적으로 수행할 수 있는 방법이 있을까요?
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링연관 배열에 이미 선택 사항이 있는 경우 더 이상 데이터 필터가 필요합니까? 데이터 필터를 사용하라는 이전 제안은 행 값을 선택하기 위해 "추가" 목록 상자를 만드는 것을 피하는 것이었습니다.
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링선택 사항(열 이름과 값 둘 다)이 생기면 데이터를 하위 집합으로 나누고 사용자 선택 사항으로 필터링된 내용만 추출하고 싶었습니다. 그러려면 데이터 필터가 필요하겠죠?
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링"추출"이란 무엇을 의미하는지에 따라 << 행 가져오기 + 하위 집합 또는 << 선택 위치 + 하위 집합 또는 << 선택 위치 + 숨기기 및 제외를 사용할 수 있습니다.
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링네, 정확히 저는 그 방법 중 일부를 사용하고 싶었지만 사용자가 선택한 열과 값을 모를 때 어떻게 해야 할지 확신이 서지 않았습니다. 선택 사항은 이제 연관 배열에 있지만 Where 절로 변환하는 것이 저에게는 어려운 일이었습니다. 그래서 이전에 보여준 코드 청크로 Where 절을 구성하려고 했지만 완료되지 않았습니다. 연관 배열을 사용하여 where 절을 구성하는 더 간단한 방법이 있을지도 모릅니다.
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링데이터 필터를 직접 사용하는 것이 가장 간단한 옵션이지만 우리는 이미 그것을 배제했습니다. 사용자 선택은 AND 또는 OR로 결합해야 합니까?
Re: 사용자 정의 필터링 애플리케이션을 사용하여 데이터 테이블 필터링다음은 몇 가지 옵션입니다
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
// Build using Select Where (simplest)
// Note that we convert to Char due to using Summary and because we can have numeric values
// This could (and should) be handled earlier in some other method
user_selections = ["age" => {"13", "14"}, "sex" => {"F"}];
For Each({{col, values}, idx}, user_selections,
If(idx == 1,
dt << Select Where(Contains(values, Char(Column(dt, col)[])));
);
dt << Select Where(Contains(values, Char(Column(dt, col)[])), Current Selection("restrict")); // AND
// dt << Select Where(Contains(values, Char(Column(dt, col)[])), Current Selection("extend")); // OR
);
show(dt << get selected rows);
wait(1); // demo purposes
dt << Clear Select;
// A bit more complicated is to build expression and use that
user_selections = ["age" => {13, 14}, "sex" => {"F"}]; // simplified to use numeric value for numeric column
filter_expr = Expr(And()); // optionally use Or()
For Each({{col, values}, idx}, user_selections,
cur_expr = Substitute(
Expr(Contains(_list_, _column_)),
Expr(_list_), values,
Expr(_column_), Name Expr(AsColumn(dt, col))
);
Insert Into(filter_expr, Name Expr(cur_expr));
);
// Show(Name Expr(filter_expr));
my_rows = dt << Get Rows Where(filter_expr);
show(my_rows);