Lassen Sie das Listenfeld im Abfrage-Generator eine leere Liste zurückgeben, wenn keine Elemente ausgewählt sindIch möchte eine Abfrage haben, bei der eine leere Liste zurückgegeben wird, wenn Benutzer nichts auswählen. Hier ist ein Beispiel, das von der folgenden JMP Query Builder-Seite geändert wurde.
https://www.jmp.com/support/help/14/query-and-join-data-tables-with-jmp-query-builde.shtml
Anstatt wie auf der Webseite nach Bewertungen zu filtern, habe ich es so geändert, dass Benutzer Zustände auswählen. Wenn keine Zustände ausgewählt sind, möchte ich eine leere Liste oder Tabelle zurückgeben.
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;Wenn es möglich ist, würde es meiner Meinung nach mit der Where-Klausel passieren. Ich habe Not In List, Not Or ausprobiert und _AllRows_ durch eine leere Liste, {}, ersetzt. Was auch immer ich mache, wenn im Listenfeld keine Staaten ausgewählt sind, werden alle Staaten zurückgegeben, oder ich erhalte eine Fehlermeldung.
Wir entwerfen eine App mit mehreren Listenfeldern, die Optionen für eine SQL-Abfrage filtern. Einige Listenfelder bieten Hunderte von Auswahlmöglichkeiten. Eine manuelle Liste ist nicht gut, da Benutzer nicht alle Auswahlmöglichkeiten kennen. Wenn keine Elemente ausgewählt sind, ist es für unsere Zwecke vorzuziehen, eine leere Liste zurückzugeben. Ist das möglich? Wenn ja, kann dies anhand des SAT-Beispiels demonstriert werden, das ich oben gepostet habe?
Vielen Dank für alle Vorschläge oder Einblicke.
Betreff: Das Listenfeld im Abfrage-Generator gibt eine leere Liste zurück, wenn keine Elemente ausgewählt sindselected_states = Data Table("SATQuery");
x=expr(selected_states<<GET script="">0,
selected_states<<SELECT all="" rows=""></SELECT></GET>Ich hoffe, dass die Zeilenumbrüche dieses Mal sichtbar sind.
Betreff: Das Listenfeld im Abfrage-Generator gibt eine leere Liste zurück, wenn keine Elemente ausgewählt sindBryon, ja, ich verstehe. Wenn keine Zeilen ausgewählt sind, wird _AllRows_ in das Tabellenskript geschrieben. Eine Liste, z. B. {Alabama,Alaska}, wird hingegen erstellt, wenn ein oder alle Bundesstaaten ausgewählt werden. Solange also _AllRows_ nur geschrieben wird, wenn keine Zeilen ausgewählt sind, funktioniert Ihr Fix.
Für die Leser hier ist, was ich dem genauen Skript in meinem ursprünglichen Beitrag hinzugefügt habe.
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>Bei mir funktioniert es in JMP 14. Der Tisch wird abgeräumt. Es sollte für andere Situationen, in denen eine leere Liste erforderlich ist, leicht modifizierbar sein. Und Sie können die Zeile „Drucken“ weglassen.
Danke für diese Lösung/Hack. Ich warte ab, ob jemand etwas Besseres postet. Wenn nicht, wird es morgen die akzeptierte Lösung sein.
Betreff: Das Listenfeld im Abfrage-Generator gibt eine leere Liste zurück, wenn keine Elemente ausgewählt sindZunächst einmal vielen Dank, dass Sie ein klares Beispiel dafür gepostet haben, was Sie tun. Sehr hilfreich.
Versuchen Sie mit dem Skript in seiner jetzigen Form die folgenden beiden Dinge.
1. Führen Sie das Skript aus, wählen Sie nichts aus und klicken Sie auf „OK“.
2. Führen Sie das Skript aus und wählen Sie alle (oder einige der Zustände) aus.
Vergleichen Sie das Quellskript in beiden resultierenden Tabellen, insbesondere in Zeile 57.
Wenn nichts ausgewählt ist, ist es wirklich anders, als wenn alles ausgewählt ist.
Das ist völliger Betrug, aber es funktioniert!
Bearbeiten Sie am Anfang des Skripts die erste Zeile wie folgt:
dtq=New SQL Query(
Fügen Sie diese Zeilen am Ende Ihres Skripts hinzu.
x=expr(dtq<<GET script="">0,
dtq<<SELECT all="" rows=""><BR /></SELECT></GET>
Die Abfrage führt eine Datentabelle erneut aus, mit dtq als Handle. Dann ruft das Skript das Quellskript aus der Tabelle ab und wandelt es in eine Zeichenfolge in Anführungszeichen mit „xx“ als Handle um. Das Argument „Contains“ prüft, ob die gesamte Tabelle enthalten war. Dies geschieht, wenn im Dialogfeld nichts ausgewählt ist. In diesem Fall wird der Text „_AllRows_“ in das Quellskript eingebunden. Wenn dies zutrifft, werden alle Zeilen in der Tabelle ausgewählt und anschließend gelöscht.
Wie gesagt, es ist völliger Betrug, aber in diesem Fall funktioniert es.
Betreff: Das Listenfeld im Abfrage-Generator gibt eine leere Liste zurück, wenn keine Elemente ausgewählt sindDanke für die Antwort, Stephen. Ich habe Schwierigkeiten zu erkennen, wie dynamische Programmierung mein Problem lösen wird.
Ich kenne die Klauseln, außer dass sie leere Listen zurückgeben, wenn der Benutzer nichts auswählt. Es gibt eine Handvoll bekannter Spalten, die jeder Benutzer filtern muss, von der Auswahl von nichts aus dieser Spalte bis zur Auswahl von allem und allem dazwischen. Ich möchte, dass „Keine“ die Standardeinstellung ist, wenn der Benutzer nichts in der Liste auswählt. In dem von mir geposteten SAT-Beispiel geht es um die Frage, wie Nullstatus zurückgegeben werden können, wenn der Benutzer keinen auswählt.
Ich verstehe nicht, wie das dynamische Erstellen von Klauseln helfen würde, obwohl mir möglicherweise etwas fehlt. Mit anderen Worten: Selbst wenn ich Klauseln dynamisch erstelle, sehe ich nicht, was ich dynamisch in Filter einfügen soll, um leere Listen zurückzugeben, wenn nichts ausgewählt ist. Und wenn es in dynamische Filter eingegeben werden kann, warum kann es dann nicht statisch in einen bekannten Satz von Listenfeldfiltern programmiert werden?
Betreff: Das Listenfeld im Abfrage-Generator gibt eine leere Liste zurück, wenn keine Elemente ausgewählt sindDie Brute-Force-Methode besteht darin, jede Klausel vom Benutzer als Zeichenfolgen zu erstellen und dann dynamisches JSL zu verwenden, um die kombinierten Zeichenfolgen auszuführen. Siehe verwandte Frage: Dynamische Filter für SQL-Abfragen