¿Cuál es la mejor manera de mostrar los datos como un menú desplegable? No como un filtro de datos.
Hola a todos,
Estoy trabajando con dos tablas de datos que he unido mediante claves primarias y foráneas, y que contienen miles de registros. Mi objetivo es mostrar los valores de estas tablas en menús desplegables (actualmente uso cuadros combinados) y, según las selecciones, generar dinámicamente subconjuntos o tablas transpuestas.
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.
¿Existe alguna forma de aprovechar el motor de filtrado de datos internamente y conectarlo a menús desplegables personalizados de la interfaz de usuario? ¿O existe un método más eficiente para lograr un filtrado dinámico y adaptable como menú desplegable en JSL?
¡Cualquier sugerencia o ejemplo sería muy apreciado!
Gracias de antemano.
Automatización y scriptingAnálisis y modelado de datos básicosRe: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.Por favor, eche un vistazo a las nuevas Vistas de filtro en JMP19.
Quizás puedas usar la propia tabla de datos y la vista de filtro en el lado derecho de la tabla:

Cuando esté satisfecho con la vista, simplemente ábrala como una tabla nueva.
Encontrará más detalles en esta charla: Tutorial para desarrolladores: Mejoras en la tabla de datos por @Mandy_Chambers .
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.Estamos migrando de una versión anterior de JMP a JMP 19. Por lo tanto, esta solución no funcionará en la versión anterior. ¿Alguna idea para mostrar grandes cantidades de datos más rápidamente en el menú desplegable? Los filtros de datos son más rápidos, pero su interfaz de usuario no es muy personalizable.
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.¿Qué parte te resulta lenta? ¿Crear el cuadro combinado? ¿Buscar los valores? ¿Crear el subconjunto?
¿Podrías compartir un ejemplo de script? Quizás se podrían realizar algunas optimizaciones.
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.
LO QUE ESTOY HACIENDO:
1. Carga de dos tablas de datos grandes (una con más de 100.000 filas)
2. Unirlos mediante la coincidencia de claves
3. Extraer los valores únicos de todas las columnas de filtro y almacenarlos en una tabla de caché separada.
4. Creación de una interfaz de usuario personalizada con múltiples menús desplegables ComboBox (13 filtros en total).
5. Carga de valores de ComboBox desde la tabla de caché
6. El usuario selecciona valores de los menús desplegables y hace clic en el botón para crear un subconjunto filtrado.
// 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>
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.Utilizar una tabla resumen es una buena forma de obtener valores únicos.
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);
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.Gracias por tu sugerencia. Sin duda mejoró un poco el rendimiento, pero los menús desplegables siguen siendo lentos, ya que aún hay muchos datos únicos en cada uno. Quizás tenga que buscar la manera de usar un filtro de datos y luego agregar botones, ya que podría ser la mejor opción si no encuentro una buena solución para los menús desplegables personalizados.
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.¿Qué tal si usamos Tabulate con un filtro de datos?
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" ) ) )
);
Re: ¿Cuál es la mejor manera de mostrar datos como un menú desplegable? No como un filtro de datos.Puedes manipular los filtros de datos hasta cierto punto, pero pronto te encontrarás con limitaciones. A menos que el problema de velocidad se deba a la visualización de los cuadros combinados, aún hay mucho que se puede optimizar. Si puedes proporcionar un script para crear una tabla de ejemplo (o una tabla de ejemplo) que permita probar la velocidad, será mucho más fácil demostrar estas posibles optimizaciones.
Re: ¿Cuál es la mejor manera de mostrar los datos como un menú desplegable? No con un filtro de datos.Quizás este script pueda ayudar ya que esta tabla también tiene miles de filas.
Puede eliminar esta parte y podrá ver el problema con los cuadros combinados.
// 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 );
)
)
)
);
Estaba teniendo un problema similar y lamentablemente tuve que cambiar al filtro de datos.
Re: ¿Cuál es la mejor manera de mostrar los datos como un menú desplegable? No con un filtro de datos.Creo que sería una experiencia bastante mala para el usuario desplazarse por 20 000 entradas en un cuadro combinado, incluso si funcionara correctamente. En su lugar, se podría, por ejemplo, usar un cuadro de lista con búsqueda adicional, lo que podría mejorar la experiencia del usuario. Se puede crear uno con JSL usando un cuadro de edición de texto + un cuadro de lista, o usar un filtro de datos o un selector de columnas de filtro, por ejemplo.
Re: ¿Cuál es la mejor manera de mostrar los datos como un menú desplegable? No con un filtro de datos.Gracias por compartir este script. De hecho, describe con precisión el problema que tengo.