Meilleure façon d'afficher les données sous forme de liste déroulante ? Certainement pas via un filtre de données.
Salut tout le monde,
Je travaille avec deux tables de données liées par des clés primaires et étrangères, contenant chacune des milliers d'enregistrements. Mon objectif est d'afficher les valeurs de ces tables dans des listes déroulantes (j'utilise actuellement des ComboBox) et, en fonction des sélections, de générer dynamiquement des sous-ensembles ou des tables transposées.
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.
Est-il possible d'exploiter le moteur de filtrage des données en arrière-plan et de le connecter à des listes déroulantes d'interface utilisateur personnalisées ? Ou existe-t-il une approche plus efficace pour obtenir un filtrage dynamique et réactif sous forme de liste déroulante en JSL ?
Toute suggestion ou tout exemple serait grandement apprécié !
Merci d'avance.
Automatisation et scriptageAnalyse et modélisation de données de baseRe : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Veuillez consulter les nouvelles vues de filtre dans JMP19.
Vous pouvez peut-être utiliser le tableau de données lui-même, ainsi que la vue filtre située à droite du tableau :

Lorsque la vue vous convient, ouvrez-la simplement comme une nouvelle table.
Vous trouverez plus de détails dans cette présentation : Tutoriel pour développeurs : Améliorations des tableaux de données par @Mandy_Chambers .
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Nous passons de l'ancienne version de JMP à JMP 19. Cette solution ne fonctionnera donc pas avec l'ancienne version. Auriez-vous une idée pour afficher plus rapidement un grand nombre de données dans la liste déroulante ? Les filtres de données sont plus rapides, mais leur interface utilisateur est peu personnalisable.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Quelle étape est la plus lente pour vous ? La création de la liste déroulante ? La recherche des valeurs ? La création du sous-ensemble ?
Pourriez-vous partager un exemple de script ? Il y a peut-être des optimisations à effectuer.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.
CE QUE JE FAIS :
1. Chargement de deux grandes tables de données (dont une contenant plus de 100 000 lignes)
2. Les joindre en faisant correspondre les touches
3. Extraction des valeurs uniques de toutes les colonnes de filtre et stockage de ces valeurs dans une table cache distincte
4. Création d'une interface utilisateur personnalisée avec plusieurs listes déroulantes ComboBox (13 filtres au total)
5. Chargement des valeurs de la ComboBox à partir de la table de cache
6. L'utilisateur sélectionne des valeurs dans les listes déroulantes et clique sur le bouton pour créer un sous-ensemble filtré.
// 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 : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.L'utilisation d'un tableau récapitulatif est un bon moyen d'obtenir des valeurs uniques.
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 : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Merci pour votre suggestion. Elle a effectivement amélioré les performances, mais les listes déroulantes restent lentes car chacune contient encore beaucoup de données uniques. Je devrai peut-être trouver un moyen d'utiliser un filtre de données et d'y ajouter des boutons ; ce sera sans doute la meilleure solution si je ne trouve pas de solution satisfaisante pour les listes déroulantes personnalisées.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Que diriez-vous d'utiliser un tableau avec un filtre de données ?
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 : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Vous pouvez manipuler les filtres de données dans une certaine mesure, mais vous atteindrez rapidement des limites. À moins que le problème de vitesse ne provienne des listes déroulantes (leur affichage), de nombreuses optimisations sont encore possibles. Si vous pouviez fournir un script permettant de créer un tableau d'exemple (ou un autre tableau d'exemple) pour tester la vitesse, il serait beaucoup plus facile de démontrer ces optimisations potentielles.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Ce script pourrait peut-être être utile, car cette table contient également des milliers de lignes.
Vous pouvez supprimer cette partie et vous pourrez alors constater le problème avec les listes déroulantes.
// 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 );
)
)
)
);
J'avais le même problème et j'ai malheureusement dû passer au filtre de données.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Je pense que faire défiler 20 000 entrées dans une liste déroulante serait une expérience utilisateur assez désagréable, même si elle fonctionnait correctement. Il serait préférable d'utiliser une liste avec une fonction de recherche, ce qui offrirait une meilleure expérience. Vous pouvez en créer une avec JSL en combinant une zone de texte et une liste, ou utiliser un filtre de données ou un sélecteur de colonnes, par exemple.
Re : Meilleure façon d’afficher des données sous forme de liste déroulante ? Pas avec un filtre de données.Merci d'avoir partagé ce script. Il décrit en effet parfaitement le problème que je rencontre.