Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataCiao a tutti,
Sto creando un'applicazione/dashboard con un sacco di report al suo interno. Alla fine vorrei dare agli utenti la possibilità di fare una "query" della tabella dati principale e salvarla se ne hanno bisogno in seguito.
Attualmente ho un pulsante che apre un'altra finestra e chiede all'utente di selezionare le colonne di filtraggio (da un elenco preselezionato).
Una volta selezionati, premono un altro pulsante che dovrebbe quindi creare una casella di riepilogo per ciascuna delle colonne di filtraggio con tutti i valori distinti disponibili. Il mio pensiero è che da qui l'utente selezionerebbe i valori per cui desidera che venga eseguito il filtraggio in ciascuna casella di riepilogo e quindi premerebbe un pulsante finale per salvare tali valori e quindi verrebbe creata una clausola filtro/where che sottoimposterà la tabella dati principale e la salverà per loro in una posizione nota.
Credo di essere a metà strada. Riesco a far funzionare la prima finestra e la selezione della colonna filtro. Quindi riesco a visualizzare i valori nelle caselle di riepilogo, ma non riesco a creare il pulsante giusto per salvare i valori selezionati. Inoltre, credo di avere il problema di non sapere quante colonne filtro creeranno gli utenti, quindi devo avere un'espressione per definire un numero sconosciuto di colonne. Ho visto alcuni esempi con istruzioni Eval(Parse(Eval Into, ma non l'ho ancora capito.
Ogni aiuto sarà apprezzato. Forse c'è un modo molto più snello per farlo.
Ecco parte del codice che ho finora
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>Automazione e scripting</LINGO-LABEL><LINGO-LABEL>Esplorazione e visualizzazione dei dati</LINGO-LABEL><LINGO-LABEL>Finestre</LINGO-LABEL></LINGO-LABS>Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataHai mai pensato di creare un filtro dati in base alle colonne selezionate dall'utente?
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataSì, ma meno confusione c'è, meglio è, poiché non molti utenti sono nuovi a JMP e voglio che sia il più semplice possibile per loro visualizzare e ottenere i dati filtrati con la semplice pressione di un pulsante.
Potrebbe funzionare anche farlo con il filtro locale
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataVorrei creare un filtro dati (che puoi ripulire se necessario), ma ecco un'opzione per utilizzare le caselle di riepilogo
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: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataGrazie, funziona come volevo.
Tuttavia, per quanto riguarda il passo successivo, mi trovo un po' in una situazione di stallo.
Per creare il filtro dati, pensavo di inserire direttamente l'array associato alle selezioni dell'utente, ma non funziona.
Poi ho pensato di suddividere ciò che entra nel filtro dati e di usare Expr e altri comandi stringa per farlo apparire esattamente come se avessi usato il triangolo rosso dopo aver creato un filtro dati interattivo, ma credo di sbagliarmi da qualche parte nella sintassi.
Questo è il mio codice dal tuo esempio 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 ))));
Ma esiste un modo più diretto e intuitivo per farlo?
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataSe hai già le selezioni in un array associativo, hai ancora bisogno del filtro dati? Il mio precedente suggerimento di usare il filtro dati era di evitare la creazione di caselle di riepilogo "extra" per selezionare i valori di riga.
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataUna volta che ho le selezioni (sia i nomi delle colonne che i valori) volevo sottoinsiemi di dati ed estrarre solo ciò che è filtrato dalle selezioni utente. Per questo avrei bisogno di un filtro dati, giusto?
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataA seconda di cosa intendi per "estrarre", puoi usare << Ottieni righe dove + sottoinsieme o << Seleziona dove + sottoinsieme o << Seleziona dove + Nascondi ed escludi
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataSì, esattamente. Volevo usare alcuni di quei metodi, ma non ero sicuro di come farlo quando non so quale colonna e quali valori ha selezionato l'utente. Le selezioni sono ora in un array associativo, ma tradurle in una clausola Where è stata la difficoltà per me. Ecco perché ho provato a costruire la clausola Where con il precedente pezzo di codice che ho mostrato, ma non ci sono riuscito. Forse c'è un modo più diretto per lavorare con l'array associativo per costruire la clausola Where
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataL'uso diretto del filtro dati sarebbe l'opzione più semplice, ma l'abbiamo già esclusa. Le selezioni utente dovrebbero essere combinate tramite AND o OR?
Re: Filtraggio di una tabella dati con un'applicazione di filtraggio personalizzataEcco alcune opzioni
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);