Filtri dinamici per query SQLQuindi non so nulla di SQL, quindi ho usato JMP Query Builder e ho basato tutto il mio codice su quello.
Fondamentalmente, voglio consentire all'utente di filtrare tutti i dati desiderati tramite una schermata pop-up in cui possono selezionare la colonna da filtrare, quindi quali valori vogliono filtrare.Tutte le colonne nella mia tabella JMP sono nomi di colonne validi nel mio database.Quindi sono arrivato al punto in cui ho creato un array associativo che contiene tutti i filtri e i valori che l'utente ha scelto dove le chiavi sono i filtri.
Il problema che ho è nella nuova query SQL in cui posso usare "Dove" per eseguire il filtraggio effettivo, non sono sicuro di come aggiungere il mio array associativo.
Sono sicuro che c'è un modo migliore per farlo.qualche idea?
_dt = Current Data Table();
selection = Associative Array();
//Create a window to collect filter information
TestIdWindow = New Window( "Filters Window",
<<MODAL></MODAL>
Re: Filtri dinamici per query SQLGrazie stefano.Lasciami provare il tuo suggerimento oggi.Non ho pensato di creare l'intera query SQL come una stringa, solo la parte Where.
Per quanto riguarda il tuo commento sull'avere solo 5-12 opzioni da filtrare, quello era in realtà l'obiettivo iniziale.Ma poi non sono riuscito a decidere su quali 5-12 cose penso che tutti gli utenti vorrebbero filtrare, quindi ho pensato bene, se posso già farne alcune in modo statico, quanto sarebbe difficile renderlo dinamico.Poi è esploso ed eccomi qui 
Re: Filtri dinamici per query SQLC'è una funzione per l'utilizzo di colonne categoriali nel tuo SQL chiamata _AllRows_ che puoi invocare se l'utente non fa scelta:
//window for selection
// get data
PickFilter = Function( {chosenCostCentre},
//{Default Local},
//deal with user making no choice
If(NItems(chosenCostCentre[1])==0,
chosenCostCentre[1] = "_AllRows_";
);
...Quindi usando il JSL dinamico puoi inserire questo testo al posto dell'elenco se non c'è un elenco:
...
//get report names from filter table
Eval(
Parse(
Eval Insert(
"\[
dtFilterNames = New SQL Query(
Connection( connectionString ),
QueryName( "RvwReports" ),
Select( Column( "ReportID", "t1" ), Column( "ReportName", "t1" ) ),
From( Table( "RvwReports", Schema( "dbo" ), Alias( "t1" ) ) ),
Where(
In List(
Column( "CostCentreCommon", "t1" ),
^chosenCostCentre[1]^,
UI( SelectListFilter( CheckBoxList, Base( "Categorical" ) ) )
)
)
) << Run Foreground( );
]\"
)
)
);Allo stesso modo, usando il JSL dinamico puoi scrivere ogni clausola come una stringa separata, con l'impostazione predefinita su clausola=""; e aggiornali solo se l'utente seleziona quella colonna da un elenco iniziale di colonne su cui filtrare.
A questo punto, se non stai limitando l'utente decidendo in anticipo quali sono le 5-12 colonne più importanti, perché non usano il generatore di query JMP integrato e scrivi semplicemente il JSL post-SQL?
Re: Filtri dinamici per query SQLSo qual è il codice della clausola, ma l'utente potrebbe non voler eseguire un filtro su ogni colonna solo su alcune.Va bene che alcuni dei codici delle clausole non siano paragonabili a nulla?
Inoltre, potrebbero esserci circa un centinaio di colonne, non voglio dover aggiungere esplicitamente un codice di clausola per ogni colonna.
L'ho testato con un paio di colonne, ma sto cercando di costruire questa clausola where in modo dinamico.Sto prendendo alcune precauzioni nel mio codice per forzare tutte le clausole a essere categoriche... ma devo solo capire come eseguire dinamicamente la clausola where con gli elenchi In.
Where(
In List(
Column( "Column 1", "t1" ),
{"some value 1",
"some value 2"},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
) & In List(
Column( "Column 2", "t1" ),
{Some value 3, some value 4},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
)
)
Re: Filtri dinamici per query SQLPer prima cosa prova a eseguire la tua query SQL con tutti i filtri applicati manualmente alle colonne da cui l'utente sceglierà. Questo genererà il codice della clausola dove richiesto in cui puoi inserire elenchi di valori scelti dall'utente.