Dynamische Filter für SQL-AbfragenIch weiß also nicht wirklich etwas über SQL, also habe ich den JMP Query Builder verwendet und meinen gesamten Code darauf aufgebaut.
Grundsätzlich möchte ich dem Benutzer ermöglichen, alle gewünschten Daten über einen Popup-Bildschirm zu filtern, in dem er die zu filternde Spalte und dann die zu filternden Werte auswählen kann.Alle Spalten in meiner JMP-Tabelle sind gültige Spaltennamen in meiner Datenbank.Also kam ich an den Punkt, an dem ich ein assoziatives Array erstellt habe, das alle Filter und Werte enthält, die der Benutzer ausgewählt hat, wobei die Schlüssel die Filter sind.
Das Problem, das ich habe, liegt in der neuen SQL-Abfrage, wo ich „Wo“ verwenden kann, um die eigentliche Filterung durchzuführen. Ich bin mir nicht sicher, wie ich mein assoziatives Array hinzufügen kann.
Ich bin sicher, dass es einen besseren Weg gibt, dies zu tun.Irgendwelche Gedanken?
_dt = Current Data Table();
selection = Associative Array();
//Create a window to collect filter information
TestIdWindow = New Window( "Filters Window",
<<MODAL></MODAL>
Betreff: Dynamische Filter für SQL-AbfragenDanke Stephen.Lassen Sie mich Ihren Vorschlag noch heute ausprobieren.Ich habe nicht daran gedacht, die gesamte SQL-Abfrage als Zeichenfolge zu erstellen, sondern nur den Where-Teil.
Was Ihren Kommentar betrifft, dass es nur 5–12 Optionen zum Filtern gibt, so war das eigentlich das ursprüngliche Ziel.Aber dann konnte ich mich nicht entscheiden, nach welchen 5-12 Dingen meiner Meinung nach alle Benutzer jemals filtern möchten, also dachte ich: Wenn ich ein paar davon bereits statisch machen kann, wie schwierig wäre es dann, es dynamisch zu machen?Dann explodierte es und hier bin ich 
Betreff: Dynamische Filter für SQL-AbfragenBei der Verwendung kategorialer Spalten in Ihrer SQL gibt es eine Funktion namens _AllRows_, die Sie aufrufen können, wenn der Benutzer keine Auswahl trifft:
//window for selection
// get data
PickFilter = Function( {chosenCostCentre},
//{Default Local},
//deal with user making no choice
If(NItems(chosenCostCentre[1])==0,
chosenCostCentre[1] = "_AllRows_";
);
...Dann können Sie mit dynamischem JSL diesen Text anstelle der Liste einfügen, wenn keine Liste vorhanden ist:
...
//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( );
]\"
)
)
);Ebenso können Sie mit dynamischem JSL jede Klausel als separate Zeichenfolge schreiben, wobei der Standardwert auf Clause=""; und aktualisieren Sie sie nur, wenn der Benutzer diese Spalte aus einer anfänglichen Liste von Spalten zum Filtern auswählt.
Wenn Sie den Benutzer an dieser Stelle nicht einschränken, indem Sie vorab festlegen, was die 5–12 wichtigsten Spalten sind, warum verwenden sie dann nicht den integrierten JMP-Abfrage-Builder und schreiben Sie einfach die Post-SQL-JSL?
Betreff: Dynamische Filter für SQL-AbfragenIch kenne den Klauselcode, aber der Benutzer möchte möglicherweise nicht für jede Spalte, sondern nur für bestimmte Spalten einen Filter durchführen.Ist es in Ordnung, dass einige der Klauselcodes mit nichts vergleichbar sind?
Außerdem kann es fast hundert Spalten geben, ich möchte nicht explizit für jede Spalte einen Klauselcode hinzufügen müssen.
Ich habe das mit ein paar Spalten getestet, aber ich versuche, diese Where-Klausel dynamisch zu erstellen.Ich treffe in meinem Code einige Vorsichtsmaßnahmen, um zu erzwingen, dass alle Klauseln kategorisch sind ... aber ich muss nur herausfinden, wie ich die Where-Klausel mit den In-Listen dynamisch umsetzen kann.
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" ) ) )
)
)
Betreff: Dynamische Filter für SQL-AbfragenVersuchen Sie zunächst, Ihre SQL-Abfrage mit allen Filtern auszuführen, die manuell auf die Spalten angewendet werden, aus denen der Benutzer auswählen wird. Dadurch wird der erforderliche Where-Klauselcode generiert, in den Sie vom Benutzer ausgewählte Wertelisten einfügen können.