Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéJe veux avoir une requête où, si les utilisateurs ne sélectionnent rien, une liste vide est renvoyée. Voici un exemple modifié à partir de la page JMP Query Builder suivante.
https://www.jmp.com/support/help/14/query-and-join-data-tables-with-jmp-query-builde.shtml
Plutôt que de filtrer par scores, comme sur la page Web, je l'ai modifié pour que les utilisateurs sélectionnent les états. Lorsqu'aucun état n'est sélectionné, je veux qu'une liste ou une table vide soit renvoyée.
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 c'est possible, je pense que cela se produirait avec la clause Where. J'ai essayé Not In List, Not Or et remplacé _AllRows_ par une liste vide, {}. Quoi que je fasse, si aucun état n'est sélectionné dans la zone de liste, tous les états sont renvoyés ou j'obtiens une erreur.
Nous concevons une application avec plusieurs listes déroulantes filtrant les choix pour une requête SQL. Certaines zones de liste auront des centaines de choix. Une liste manuelle n'est pas bonne, car les utilisateurs ne connaîtront pas tous les choix. Pour nos besoins, lorsqu'aucun élément n'est sélectionné, il sera préférable d'avoir une liste vide renvoyée. Est-ce possible? Si oui, peut-il être démontré avec l'exemple SAT que j'ai posté ci-dessus ?
Merci pour toute suggestion ou idée.
Re : Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéselected_states = Data Table("SATQuery");
x=expr(selected_states<<GET script="">0,
selected_states<<SELECT all="" rows=""></SELECT></GET>J'espère que les sauts de ligne sont apparus cette fois.
Re : Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéBryon, oui, je vois. Si aucune ligne n'est sélectionnée, _AllRows_ est écrit dans le script de table. Alors qu'une liste, par exemple {Alabama,Alaska}, est écrite si un ou tous les états sont sélectionnés. Ainsi, tant que _AllRows_ n'est écrit que lorsqu'aucune ligne n'est sélectionnée, votre correctif fonctionnera.
Pour les lecteurs, voici ce que j'ai ajouté au script exact dans mon message d'origine.
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>Cela fonctionne pour moi dans JMP 14. La table est débarrassée. Il doit être facilement modifiable pour d'autres situations nécessitant une liste vide. Et, vous pouvez omettre la ligne d'impression.
Merci pour cette solution/astuce. J'attends de voir si quelqu'un poste quelque chose de mieux. Sinon, ce sera la solution acceptée demain.
Re : Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéTout d'abord, merci d'avoir posté un exemple clair de ce que vous faites. Très utile.
avec le script tel qu'il est, essayez de faire ces deux choses.
1. exécutez le script, ne sélectionnez rien, cliquez sur ok
2. exécutez le script, sélectionnez tous (ou certains des états)
Comparez le script source dans les deux tables résultantes, en particulier autour de la ligne 57.
quand rien n'est sélectionné, c'est vraiment différent de quand tout est sélectionné.
C'est totalement de la triche mais ça marche !
Au début du script, modifiez la première ligne comme ceci :
dtq=New SQL Query(
Ajoutez ces lignes au bas de votre script.
x=expr(dtq<<GET script="">0,
dtq<<SELECT all="" rows=""><BR /></SELECT></GET>
La requête renvoie une table de données, avec dtq comme handle. Ensuite, le script obtient le script source de la table et le transforme en une chaîne entre guillemets, avec "xx" comme handle. L'argument Contient vérifie si le tableau entier a été inclus, ce qui se produit lorsque rien n'est sélectionné dans la boîte de dialogue. Dans ce cas, le texte "_AllRows_" est inclus dans le script source. Si cela est vrai, toutes les lignes du tableau sont sélectionnées puis supprimées.
Comme je l'ai dit, c'est totalement de la triche, mais ça marche dans ce cas.
Re : Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéMerci d'avoir répondu, Stéphane. J'ai du mal à voir comment la programmation dynamique résoudra mon problème.
Je connais les clauses, sauf pour renvoyer des listes vides si l'utilisateur ne sélectionne rien. Il existe une poignée de colonnes connues que chaque utilisateur devra filtrer n'importe où, de ne rien choisir dans cette colonne à tout choisir, et tout ce qui se trouve entre les deux. Je veux que none soit la valeur par défaut si l'utilisateur ne sélectionne rien dans la liste. Dans l'exemple SAT que j'ai posté, la question est de savoir comment renvoyer des états zéro si l'utilisateur n'en sélectionne aucun.
Je ne vois pas en quoi la construction dynamique de clauses aiderait, bien qu'il me manque peut-être quelque chose. En d'autres termes, même si je construis des clauses dynamiquement, je ne vois pas quoi mettre dynamiquement dans les filtres pour renvoyer des listes vides si rien n'est sélectionné. Et, s'il peut être entré dans des filtres dynamiques, alors pourquoi ne peut-il pas être programmé de manière statique dans un ensemble connu de filtres List Box ?
Re : Faire en sorte que la zone de liste dans le générateur de requêtes renvoie une liste vide lorsqu'aucun élément n'est sélectionnéLa méthode de la force brute consiste à créer chaque clause de l'utilisateur sous forme de chaînes, puis à utiliser JSL dynamique pour exécuter les chaînes combinées. Voir question connexe : Dynamic-Filters-pour-SQL-Query