Haga que List Box en Query Builder devuelva una lista vacía cuando no haya elementos seleccionadosQuiero tener una consulta donde, si los usuarios no seleccionan nada, se devuelve una lista vacía. Aquí hay un ejemplo modificado de la siguiente página JMP Query Builder.
https://www.jmp.com/support/help/14/query-and-join-data-tables-with-jmp-query-builde.shtml
En lugar de filtrar por puntajes, como en la página web, lo modifiqué para que los usuarios seleccionen estados. Cuando no se seleccionan estados, quiero que se devuelva una lista o tabla vacía.
New SQL Query(
Version( 130 ), Connection( "JMP" ),
JMP Tables(
["SAT" => "\C:\Program Files\SAS\JMPPRO\14\Samples\Data\SAT.jmp",
"SATByYear" => "\C:\Program Files\SAS\JMPPRO\14\Samples\Data\SATByYear.jmp"]
),
QueryName( "SATQuery" ),
Select( Distinct,
Column( "State", "t1" ),
Column( "% Taking (2004)", "t1" ),
Column( "2004 Verbal", "t2" ),
Column( "2004 Math", "t2" )
),
From(
Table( "SATByYear", Alias( "t1" ) ),
Table( "SAT", Alias( "t2" ),
Join( Type( Left Outer ),
EQ( Column( "State", "t1" ), Column( "State", "t2" ) ) &
EQ( Column( "% Taking (2004)", "t1" ),
Column( "% Taking (2004)", "t2" ) )
& EQ( Column( "X", "t1" ), Column( "X", "t2" ) )
& EQ( Column( "Y", "t1" ), Column( "Y", "t2" ) )
& EQ( Column( "Population", "t1" ), Column( "Population", "t2" ) )
& EQ( Column( "Latitude", "t1" ), Column( "Latitude", "t2" ) )
& EQ( Column( "Longitude", "t1" ), Column( "Longitude", "t2" ) )
)
)
),
Where(
In List( Column( "State", "t1" ),
_AllRows_,
UI( SelectListFilter(
ListBox,
Base( "Categorical",
Prompt( "State:", Character, PromptName( "t1.State_1" ),
ValueSource( Column( "State", Alias( "State" ), Table( "SATByYear" ) ) )
)
)
)
)
)
)
) << Run;Si es posible, creo que sucedería con la cláusula Where. Probé Not In List, Not Or y reemplacé _AllRows_ con una lista vacía, {}. Haga lo que haga, si no se selecciona ningún estado del cuadro de lista, se devuelven todos los estados o aparece un error.
Estamos diseñando una aplicación con varios cuadros de lista que filtran opciones para una consulta SQL. Algunos cuadros de lista tendrán cientos de opciones. Una lista manual no es buena porque los usuarios no conocerán todas las opciones. Para nuestros propósitos, cuando no se seleccione ningún elemento, será preferible que se devuelva una lista vacía. es posible? Si es así, ¿se puede demostrar con el ejemplo SAT que publiqué anteriormente?
Gracias por cualquier sugerencia o idea.
Re: Hacer que el cuadro de lista en Query Builder devuelva una lista vacía cuando no hay elementos seleccionadosselected_states = Data Table("SATQuery");
x=expr(selected_states<<GET script="">0,
selected_states<<SELECT all="" rows=""></SELECT></GET>Espero que los saltos de línea hayan aparecido esta vez.
Re: Hacer que el cuadro de lista en Query Builder devuelva una lista vacía cuando no hay elementos seleccionadosBryan, sí, ya veo. Si no se selecciona ninguna fila, se escribe _AllRows_ en el script de la tabla. Mientras que, se escribe una lista, por ejemplo, {Alabama,Alaska}, si se selecciona alguno o todos los estados. Entonces, siempre que _AllRows_ solo se escriba cuando no se seleccionen filas, su solución funcionará.
Para los lectores, esto es lo que agregué al guión exacto en mi publicación original.
selected_states = Data Table("SATQuery"); <BR />x=expr(selected_states<<GET script=""></GET>xx=char(eval(evalexpr(x)));<BR />if ( contains(xx, "_AllRows_") > 0,<BR /> selected_states<<SELECT all="" rows=""> selected_states<<DELETE rows=""></DELETE> Print("All Good")<BR />);</SELECT>Me funciona en JMP 14. La mesa está limpia. Debería ser fácilmente modificable para otras situaciones que requieran una lista vacía. Y puede omitir la línea Imprimir.
Gracias por esta solución/truco. Esperaré a ver si alguien publica algo mejor. Si no, será la solución aceptada mañana.
Re: Hacer que el cuadro de lista en Query Builder devuelva una lista vacía cuando no hay elementos seleccionadosPrimero, gracias por publicar un claro ejemplo de lo que estás haciendo. Muy útil.
Con el guión tal como está, intente hacer estas dos cosas.
1. ejecute el script, no seleccione nada, haga clic en Aceptar
2. ejecute el script, seleccione todos (o algunos de los estados)
Compare el script de origen en ambas tablas resultantes, especialmente alrededor de la línea 57.
cuando no se selecciona nada es realmente diferente de cuando se selecciona todo.
¡Esto es una trampa total, pero funciona!
Al comienzo del script, edite la primera línea de esta manera:
dtq=New SQL Query(
Agregue estas líneas al final de su script.
x=expr(dtq<<GET script="">0,
dtq<<SELECT all="" rows=""><BR /></SELECT></GET>
La consulta devuelve una tabla de datos, con dtq como identificador. Luego, el script obtiene el script de origen de la tabla y lo convierte en una cadena entre comillas, con "xx" como identificador. El argumento Contiene comprueba si se incluyó toda la tabla, lo que sucede cuando no se selecciona nada en el cuadro de diálogo. En este caso, el texto "_AllRows_" se incluye en el Script de origen. Si esto es cierto, todas las filas de la tabla se seleccionan y luego se eliminan.
Como dije, es totalmente trampa, pero funciona en este caso.
Re: Hacer que el cuadro de lista en Query Builder devuelva una lista vacía cuando no hay elementos seleccionadosGracias por responder, Esteban. Tengo dificultades para ver cómo la programación dinámica resolverá mi problema.
Sé cuáles son las cláusulas, excepto devolver listas vacías si el usuario no selecciona nada. Hay un puñado de columnas conocidas que cada usuario necesitará filtrar en cualquier lugar, desde no elegir nada de esa columna hasta elegir todo, y cualquier cosa intermedia. Quiero que ninguno sea el predeterminado si el usuario no selecciona nada en la lista. En el ejemplo de SAT que publiqué, la pregunta es cómo hacer que se devuelvan cero estados si el usuario no selecciona ninguno.
No veo cómo ayudaría la construcción dinámica de cláusulas, aunque es posible que me esté perdiendo algo. En otras palabras, incluso si construyo cláusulas dinámicamente, no veo qué poner dinámicamente en los filtros para devolver listas vacías si no se selecciona nada. Y, si se puede ingresar en filtros dinámicos, ¿por qué no se puede programar estáticamente en un conjunto conocido de filtros de cuadro de lista?
Re: Hacer que el cuadro de lista en Query Builder devuelva una lista vacía cuando no hay elementos seleccionadosLa forma de fuerza bruta es construir cada cláusula del usuario como cadenas y luego usar JSL dinámico para ejecutar las cadenas combinadas. Ver pregunta relacionada: Filtros dinámicos para consultas SQL