Filtros dinámicos para consulta SQLAsí que no sé nada realmente sobre SQL, así que utilicé JMP Query Builder y basé todo mi código en eso.
Básicamente, quiero permitir que el usuario filtre los datos que desee a través de una pantalla emergente en la que pueda elegir la columna para filtrar y luego qué valores desea filtrar.Todas las columnas de mi tabla JMP son nombres de columna válidos en mi base de datos.Así que llegué al punto en que creé una matriz asociativa que contiene todos los filtros y valores que el usuario eligió donde las claves son los filtros.
El problema que tengo está en la nueva consulta SQL, donde puedo usar "Dónde" para hacer el filtrado real, no estoy seguro de cómo puedo agregar mi matriz asociativa.
Estoy seguro de que hay una mejor manera de hacer esto.¿Alguna idea?
_dt = Current Data Table();
selection = Associative Array();
//Create a window to collect filter information
TestIdWindow = New Window( "Filters Window",
<<MODAL></MODAL>
Re: Filtros Dinámicos para Consulta SQLgracias estebanDéjame probar tu sugerencia hoy.No pensé en crear la consulta SQL completa como una cadena, solo la parte Dónde.
En cuanto a su comentario sobre tener solo 5-12 opciones para filtrar, ese era en realidad el objetivo inicial.Pero luego no pude decidir qué 5-12 cosas creo que todos los usuarios querrían filtrar, así que pensé bien, si ya puedo hacer algunas de ellas estáticamente, qué difícil sería hacerlo dinámico.Luego explotó y aquí estoy 
Re: Filtros Dinámicos para Consulta SQLHay una función para usar columnas categóricas en su SQL llamada _AllRows_ que puede invocar si el usuario no elige:
//window for selection
// get data
PickFilter = Function( {chosenCostCentre},
//{Default Local},
//deal with user making no choice
If(NItems(chosenCostCentre[1])==0,
chosenCostCentre[1] = "_AllRows_";
);
...Luego, utilizando JSL dinámico, puede insertar este texto en lugar de la lista si no hay una lista:
...
//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( );
]\"
)
)
);Del mismo modo, al usar JSL dinámico, puede escribir cada cláusula como una cadena separada, con el valor predeterminado establecido en cláusula = ""; y solo actualícelos si el usuario elige esa columna de una lista inicial de columnas para filtrar.
En este punto, si no está limitando al usuario al decidir previamente cuáles son las 5-12 columnas más importantes, entonces ¿por qué no están usando el generador de consultas JMP incorporado y simplemente escribe el JSL posterior a SQL?
Re: Filtros Dinámicos para Consulta SQLSé cuál es el código de la cláusula, pero es posible que el usuario no quiera hacer un filtro en cada columna, solo en algunas.¿Está bien que algunos de los códigos de las cláusulas se comparen con nada?
Además, puede haber cerca de cien columnas, no quiero tener que agregar explícitamente un código de cláusula para cada columna.
Probé eso con un par de columnas, pero estoy tratando de construir esta cláusula where dinámicamente.Estoy tomando algunas precauciones en mi código para forzar que todas las cláusulas sean categóricas... pero solo necesito descubrir cómo hacer la cláusula where con In Lists dinámicamente.
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: Filtros Dinámicos para Consulta SQLPrimero intente ejecutar su consulta SQL con todos los filtros aplicados manualmente a las columnas que elegirá el usuario. Esto generará el código de cláusula where requerido en el que puede colocar listas de valores elegidos por el usuario.