Elenco delle tabelle: come aggiornare in modo interattivo e non perdere la selezioneHo visto discussioni su questo argomento e non sono riuscito a trovare la soluzione.
Il problema è il seguente:
Sto lavorando con l'elenco di tabelle visualizzato in una casella di riepilogo. Uso N Table() per ottenere un elenco di nomi per tutte le tabelle.
Quello che voglio è che se faccio clic per selezionare qualsiasi riga in quell'elenco, l'elenco stesso venga aggiornato e controllato se ci sono nuove tabelle aperte o alcune tabelle sono state chiuse.
Buono per farlo è usare Set Items (openDTs) ogni volta che faccio clic per selezionare. Aggiorna perfettamente l'elenco delle tabelle: il problema è che elimina la selezione.
Se utilizzo Append(openDTs) nella casella di riepilogo, aggiunge tutte le nuove tabelle aperte, ma se chiudo la tabella, non elimina la tabella chiusa.
Qual è il modo più elegante e corretto per far aggiornare l'elenco delle tabelle, riflettendo le tabelle aperte e chiuse ad ogni clic sull'elenco, in modo da mantenere la selezione?
Re: Elenco tabelle: come aggiornare interattivamente e non perdere la selezionemiguello,
Kevin Anderson ha pubblicato una sceneggiatura dalla 2a edizione del nostro libro, JSL Companion nella discussione a questo link
Confronta le liste ma con stringhe parziali
Quindi, la mia raccomandazione è di modificare la tua prima funzione che restituisce un elenco di elementi selezionati nella casella di riepilogo. Quindi utilizzare la funzione Lfunc() con contiene o utilizzare una funzione di intersezione che trova un'intersezione dell'elenco selezionato con ctbls, l'elenco delle tabelle correnti. L'elenco risultante sarà quello che devi selezionare. Il collegamento descrive una tecnica semplice che utilizza gli array associativi per trovare un'intersezione, o guarda lo script allegato dal capitolo 5: funzione uniq_intersect(ctbls, venditore) .
Spero che sia chiaro. Non ho aggiunto altro ieri, poiché l'altra tua funzione era così vicina.
Re: Elenco tabelle: come aggiornare interattivamente e non perdere la selezioneGrazie, Giorgia!
Questo è sicuramente un modo più elegante per avere un elenco di tabelle aggiornato. L'unica piccola domanda è: qual è il modo migliore per aggiornare la casella di riepilogo con un elemento selezionato senza perdere la selezione?
Re: Elenco tabelle: come aggiornare interattivamente e non perdere la selezionemiguello,
Se si utilizza JMP 14, è disponibile un nuovo comando Get Data Table List() che restituisce un elenco di tabelle di dati aperte. Se non si utilizza JMP 14, è necessario il comando N Table().
Anche Sottoscrivi all'elenco delle tabelle di dati(, OnOpen() | OnClose() | OnRename() ) è disponibile su JMP 12, 13,14.
Di seguito è riportato uno script per esplorare le sottoscrizioni alle tabelle. Nota invece di show ctbls, puoi aggiornare l'elenco ad ogni modifica.
Nota finale, NTable() "conta" le tabelle di dati invisibili, ma le tabelle di dati private non vengono conteggiate.
Names Default To Here( 1 );
//---Use one of these functions
//---- JMP 14 function
//ctbls = Get Window List( Type("DataTables")) << Get Window Title();
// --- User function to returns a list of table names
curtbl_fn = Function({}, {nt, tlist={}, i},
nt= NTable();
If(nt >0,
For(i=1, i<=nt, i++,
Insert into(tlist, Data Table(i) << get name)
);
); // end if
tlist
); //end Function
//------ functions to handle when a new table is created, whe a table is renamed and when a table is closed.
fnew = Function( {dtab},
Insert Into(ctbls, dtab << Get Name );
show(ctbls, NTable())
);
fnnme = Function( {dtab, b},{i},
show(dtab, b);
i = contains(ctbls, b );
If (i>0, ctbls[i] = dtab << get name);
show(ctbls, NTable())
);
fclose = Function( {dtab}, {i},
i = contains(ctbls, dtab<<GET name="">0, remove from(ctbls, i));
show(ctbls, NTable());
);
Open("$Sample_Data/Variability Data/2 Factors Crossed.jmp");
Open("$Sample_Data/Baseball.jmp");
Open("$Sample_Data/Basketball.jmp");
Open("$Sample_Data/Football.jmp");
Open("$Sample_Data/Fishing.jmp");
Open("$Sample_Data/Pogo Jumps.jmp");
//_____________________________________________________________________
//--- Run to here ------------------------
//use the JMP 14 command or the functions
ctbls =curtbl_fn();
show(ctbls, NTable());
//--- Run to here and check the log------------------------
aSub = Subscribe to Data Table List( , OnOpen( fnew ) );
Subscribe to Data Table List( aSub, OnRename( fnnme ) );
Subscribe to Data Table List( aSub, OnClose( fclose ) );
dt = Open( "$SAMPLE_DATA/Iris.jmp" );
Wait( 2 );
dt << setname( "yyy" );
// two printouts: one for OnOpen() and one for OnRename()
//--- Run to here and check the log------------------------
Close(Data Table("Fishing"), NoSave);
//--- Run to here and check the log------------------------
//Check Table manipulations
Data Table("yyy") << Subset (All Rows, All Columns, Output Table Name ("Iris redux") );
//--- Run to here and check the log------------------------
Unsubscribe to Data Table List(asub, All);
print("should not do anything");
Close(Data Table("Baseball"), NoSave);</GET>
Re: Elenco tabelle: come aggiornare interattivamente e non perdere la selezionePer ora ho risolto in questo modo:
Ricordo il nome della tabella selezionata, quindi utilizzo Imposta elementi per riscrivere completamente, quindi scorrere l'intero elenco e confrontare il nome ricordato con il nuovo elenco (ordine, quindi indeces potrebbe essere diverso ora!). Non appena ho colpito lo stesso nome, ricordo quell'indice e settato usando questo indice.
Ecco il codice:
listofTablesSelect=Function({this},{selectedIndex},
// This function is called when the List Box selection changes
selectedIndex = this << Get Selected;
selectedTableName = selectedIndex[1];
refreshListofTables();
for (i=1, i<=N Items(listofTablesList = this<<GET items=""></GET>Dove refreshListofTables utilizza gli elementi impostati:
refreshListofTables = Function({},
Show("Trying to refresh list of tables");
openDTs = List();
For( i = 1, i <= N Table(), i++,
Insert Into( openDTs, Data Table( i )<<GET name=""></GET>L'unica cosa che non mi piace: la finestra di registro mostra "la ricorsione JSL prevenuta" - dov'è esattamente la recussione? È
this << Set Selected(recallIndex);
chiamando efficacemente il tutto
refreshListofTables
di nuovo, quindi andando in resurrezione?
Qualche modo per aggirarlo?
grazie,
M