Die beste Methode, Daten als Dropdown-Menü anzuzeigen? Nicht der Datenfilter.
Hallo zusammen,
Ich arbeite mit zwei Datentabellen, die ich über Primär- und Fremdschlüssel verknüpft habe und die Tausende von Datensätzen enthalten. Mein Ziel ist es, Werte aus diesen Tabellen in Dropdown-Menüs anzuzeigen (derzeit verwende ich Kombinationsfelder) und basierend auf der Auswahl dynamisch Teilmengen oder transponierte Tabellen zu generieren.
Currently, I’m using ComboBox to populate unique values from the data tables, but performance is quite slow and especially with larger datasets. I’ve found that JMP’s built-in Data Filter is powerful but not very customizable for UI integration.
Gibt es eine Möglichkeit, die Datenfilter-Engine im Hintergrund zu nutzen und sie mit benutzerdefinierten UI-Dropdowns zu verbinden? Oder gibt es einen effizienteren Ansatz, um responsives, dynamisches Filtern als Dropdown in JSL zu realisieren?
Wir wären für jegliche Vorschläge oder Beispiele sehr dankbar!
Dank im Voraus.
Automatisierung und SkripterstellungGrundlagen der Datenanalyse und ModellierungBetreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Bitte schauen Sie sich die neuen Filteransichten in JMP19 an.
Vielleicht können Sie die Datentabelle selbst verwenden – und die Filteransicht auf der rechten Seite der Tabelle:

Wenn Ihnen die Ansicht gefällt, öffnen Sie sie einfach als neue Tabelle.
Weitere Details finden Sie in diesem Vortrag: Entwickler-Tutorial: Datentabellen-Erweiterungen von @Mandy_Chambers .
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Wir migrieren von einer älteren JMP-Version zu JMP 19. Daher funktioniert diese Lösung in der älteren Version nicht. Gibt es eine Möglichkeit, viele Daten schneller im Dropdown-Menü anzuzeigen? Die Datenfilter sind zwar schneller, aber ihre Benutzeroberfläche lässt sich nur schwer anpassen.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Welcher Teilvorgang ist für Sie langsam? Das Erstellen der Kombinationsbox? Das Suchen der Werte? Das Erstellen der Teilmenge?
Könnten Sie ein Beispielskript teilen? Es gäbe möglicherweise einige Optimierungsmöglichkeiten.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.
WAS ICH MACHE:
1. Laden von zwei großen Datentabellen (eine mit über 100.000 Zeilen)
2. Verbinden der Schlüssel
3. Extrahieren eindeutiger Werte aus allen Filterspalten und Speichern dieser Werte in einer separaten Cache-Tabelle
4. Erstellen einer benutzerdefinierten Benutzeroberfläche mit mehreren ComboBox-Dropdown-Listen (insgesamt 13 Filter)
5. Laden der ComboBox-Werte aus der Cache-Tabelle
6. Der Benutzer wählt Werte aus Dropdown-Listen aus und klickt auf die Schaltfläche, um eine gefilterte Teilmenge zu erstellen.
// This is simplified version:
Clear Log();
// Step 1-2: Load and join two tables
LoadAndJoinData = Function({},
dt_results = Data Table("Table1");
dt_tracker = Data Table("Table2");
// Join tables by matching key
dt_joined = dt_results << Join(
With(dt_tracker),
By Matching Columns(:key1 = :key2),
Drop multiples(0, 0),
Output Table("Joined_Data")
);
Return(dt_joined);
);
// Step 3: Create cache table with unique values - THIS IS SLOW
CreateFilterCache = Function({dt_source},
Print("Creating filter cache table...");
// Create cache table to store unique values
dt_cache = New Table("Filter_Cache",
New Column("Filter_Name", Character),
New Column("Filter_Value", Character)
);
column_list = {"Column1", "Column2", "Column3", "Column4", "Column5"};
current_row = 0;
For(i = 1, i <= N Items(column_list), i++,
col_name = column_list[i];
Print(" Processing: " || col_name);
// Extract unique values
col = Column(dt_source, col_name);
col_values = col << Get Values;
aa = Associative Array();
For(j = 1, j <= N Items(col_values), j++,
val = col_values[j];
If(!Is Missing(val) & val != "",
aa[val] = 1;
);
);
unique_list = aa << Get Keys;
unique_list = Sort Ascending(unique_list);
// Store in cache table
For(k = 1, k <= N Items(unique_list), k++,
current_row++;
dt_cache << Add Rows(1);
dt_cache:Filter_Name[current_row] = col_name;
dt_cache:Filter_Value[current_row] = unique_list[k];
);
);
Print("Cache table created with " || Char(N Rows(dt_cache)) || " entries");
Return(dt_cache);
);
// Step 5: Load unique values from cache table
GetValuesFromCache = Function({dt_cache, column_name},
value_list = {};
For(i = 1, i <= N Rows(dt_cache), i++,
If(dt_cache:Filter_Name[i] == column_name,
Insert Into(value_list, dt_cache:Filter_Value[i]);
);
);
Insert Into(value_list, "", 1);
Return(value_list);
);
// Step 4-5: Create filter window and load from cache
CreateFilterWindow = Function({dt_final, dt_cache},
Print("Loading dropdowns from cache...");
// Load from cache - STILL SLOW for large lists
unique_col1 = GetValuesFromCache(dt_cache, "Column1");
unique_col2 = GetValuesFromCache(dt_cache, "Column2");
unique_col3 = GetValuesFromCache(dt_cache, "Column3");
unique_col4 = GetValuesFromCache(dt_cache, "Column4");
unique_col5 = GetValuesFromCache(dt_cache, "Column5");
Print("Creating window...");
win = New Window("Custom Filter",
V List Box(
Panel Box("Select Filters",
V List Box(
H List Box(
Text Box("Filter 1:"),
cb_1 = Combo Box(unique_col1, "", <
<SET width="">
0, dt_subset = dt << Subset( Output Table Name("Filtered_" || Format(Today(), "yyyy-mm-dd")), Rows(rowList) ); Print("Subset created: " || Char(N Rows(dt_subset)) || " rows"); ); ) ) ); ); // Main execution dt_joined = LoadAndJoinData(); dt_cache = CreateFilterCache(dt_joined); // Create cache once CreateFilterWindow(dt_joined, dt_cache); // Use cached values
</SET>
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Die Verwendung einer Zusammenfassungstabelle ist eine gute Möglichkeit, eindeutige Werte zu erhalten.
Names Default To Here(1);
col_of_interest = "age";
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:age),
Freq("None"),
Weight("None"),
output table name("uniques"),
private
);
unique_ages = dt_summary[0, 1];
Close(dt_summary, no save);
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Vielen Dank für Ihren Vorschlag. Er hat die Performance definitiv etwas verbessert, aber die Dropdown-Menüs sind immer noch langsam, da jedes Menü weiterhin viele individuelle Daten enthält. Ich werde wohl einen Weg finden müssen, einen Datenfilter zu verwenden und dort dann Schaltflächen hinzuzufügen. Das wäre wahrscheinlich die beste Option, falls ich keine bessere Lösung für die benutzerdefinierten Dropdown-Menüs finde.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Wie wäre es mit einer Tabellierung mit Datenfilter?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :sex ) ), Row Table( Grouping Columns( :name ) ) ),
Local Data Filter( Mode( Show( 0 ) ), Add Filter( columns( :sex ), Where( :sex == "F" ) ) )
);
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Sie können die Datenfilter zwar anpassen, stoßen dabei aber schnell an Grenzen. Sofern das Geschwindigkeitsproblem nicht bei den Kombinationsfeldern (deren Anzeige) liegt, gibt es noch viel Optimierungspotenzial. Wenn Sie ein Skript zur Erstellung einer Beispieltabelle (oder eine Beispieltabelle) bereitstellen können, mit der sich die Geschwindigkeit testen lässt, können wir diese Optimierungsmöglichkeiten viel einfacher demonstrieren.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Vielleicht könnte dieses Skript helfen, da diese Tabelle ebenfalls Tausende von Zeilen enthält.
Sie können diesen Teil entfernen und werden dann das Problem mit den Kombinationsfeldern erkennen können.
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// ========================================
// TEST SCRIPT - Single Column Filter (Table Air Traffic)
// Column - Flight ID
// ========================================
Clear Log();
// Todo: The associative array is not an appropriate method for large datasets with many unique values.
// Perhaps use the summary table or something else. Or find unique column values using hashing and storing in a temp table.
// Open the Air Traffic sample data table
dt = Open( "$SAMPLE_DATA/Air Traffic.jmp" );
// Safety check
If( Is Empty( dt ),
Throw( "No data table is open. Please open a data table first." );
);
Print( "Current Data Table: " || (dt << Get Name) );
Print( "Rows: " || Char( N Rows( dt ) ) );
Print( "Columns: " || Char( N Cols( dt ) ) || "\n" );
// METHOD 1: Use Summary table (most efficient for large datasets)
dt_summary = dt << Summary(
Group( :Flight ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Temp Summary" ),
private
);
unique_flights = dt_summary:Flight ID << Get Values;
Close( dt_summary, No Save );
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// // Sort unique values for faster lookup
// unique_flights = Sort List( unique_flights );
// Store reference to data table
::testDataTable = dt;
// Create filter window
::testFilterWindow = New Window( "Test Filter",
V List Box(
Text Box( "Select Flight ID:" ),
cb_flight = Combo Box( unique_flights, "" ),
H List Box(
Button Box( "Create Filtered Table",
sel_flight = cb_flight << Get Selected;
Print( "\n" || Repeat( "=", 60 ) );
Print( "Button clicked!" );
Print( "Selected Flight ID: " || Char( sel_flight ) );
// Use Where to filter (faster than For Each Row)
If( sel_flight != "",
rowList = ::testDataTable << Get Rows Where( :Flight ID == sel_flight );
Print( "Total rows matching filter: " || Char( N Items( rowList ) ) );
If( N Items( rowList ) > 0,
dt_subset = ::testDataTable << Subset(
Output Table Name( "Test Filtered - " || Format( Today(), "yyyy-mm-dd h:m:s" ) ),
Rows( rowList )
);
Print( "\nSUCCESS: Filtered table created!" );
Print( "Table: " || (dt_subset << Get Name) );
Print( "Rows: " || Char( N Rows( dt_subset ) ) );
Print( Repeat( "=", 60 ) || "\n" );
dt_subset << Bring Window To Front;
Close( ::testFilterWindow );
,
Print( "ERROR: No rows match the selected filter" );
Print( Repeat( "=", 60 ) || "\n" );
);
);
),
Button Box( "Cancel",
Close( ::testFilterWindow );
)
)
)
);
Ich hatte ein ähnliches Problem und musste leider auf Datenfilter umsteigen.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Ich denke, es wäre für den Benutzer ziemlich umständlich, 20.000 Einträge in einer Kombinationsbox durchscrollen zu müssen, selbst wenn diese einwandfrei funktionieren würde. Stattdessen könnten Sie beispielsweise eine Listenbox mit zusätzlicher Suchfunktion verwenden, was eine bessere Benutzererfahrung bieten würde. Sie können eine solche Liste mit JSL erstellen, indem Sie ein Textfeld und eine Listenbox kombinieren oder beispielsweise einen Datenfilter oder einen Spaltenfilter verwenden.
Betreff: Wie kann man Daten am besten als Dropdown-Menü anzeigen? Nicht als Datenfilter.Vielen Dank für das Teilen dieses Skripts. Es beschreibt das Problem, mit dem ich konfrontiert bin, tatsächlich sehr genau.