Lista de tablas: cómo actualizar interactivamente y no perder la selección.He visto discusiones sobre este tema y no pude encontrar la solución.
El problema es el siguiente:
Estoy trabajando con la lista de tablas que se muestra en un cuadro de lista. Utilizo la forma N Table () de obtener una lista de nombres para todas las tablas.
Lo que quiero es que si hago clic para seleccionar alguna línea en esa lista, la lista se actualice y verifique si hay nuevas tablas abiertas o si se cerraron algunas tablas.
Lo bueno para hacer eso es usar Set Items (openDTs) cada vez que hago clic para seleccionar. Actualiza la lista de tablas muy bien, el problema es que elimina la selección.
Si uso Anexar (openDTs) en el cuadro de lista, agrega todas las tablas nuevas que se abrieron, pero si cierro la tabla, no se borra la tabla cerrada.
¿Cuál es la forma más elegante y correcta de actualizar la lista de las tablas, reflejando las tablas abiertas y cerradas en cualquier clic en la lista, para que la selección se mantenga?
Re: Lista de tablas: cómo actualizar interactivamente y no perder la selecciónmiguello
Kevin Anderson publicó un guión de la segunda edición de nuestro libro, JSL Companion en la discusión en este enlace.
Compara listas pero con cadenas parciales
Por lo tanto, mi recomendación es modificar su primera función que devuelve una lista de elementos seleccionados en el cuadro de lista. Luego use la función Lfunc () con contiene o use una función de intersección que encuentre una intersección de la lista seleccionada con los ctbls, la lista de tablas actuales. La lista resultante será la que debe seleccionar. El enlace describe una técnica simple que usa matrices asociativas para encontrar una intersección, o mira la secuencia de comandos adjunta del capítulo 5: función uniq_intersect (ctbls, sellist) .
Espero que eso quede claro. No agregué más ayer, ya que su otra función era tan cercana.
Re: Lista de tablas: cómo actualizar interactivamente y no perder la selecciónGracias, Georgia!
Esta es definitivamente una forma más elegante de tener una lista actualizada de tablas. La única pequeña pregunta es: ¿cuál es la mejor manera de actualizar el cuadro de lista con un elemento seleccionado sin perder la selección?
Re: Lista de tablas: cómo actualizar interactivamente y no perder la selección miguello
Si está utilizando JMP 14, hay un nuevo comando Obtener lista de tablas de datos () que devuelve una lista de tablas de datos abiertas. Si no está utilizando JMP 14, se requiere el comando N Table ().
También puede suscribirse a la lista de tablas de datos (, OnOpen () | OnClose () | OnRename ()) disponible en JMP 12, 13,14.
A continuación se muestra un script para explorar las suscripciones de tablas. Tenga en cuenta que en lugar de mostrar ctbls, puede actualizar la lista en cada cambio.
Nota final, NTable () "contará" las tablas de datos invisibles, pero las tablas de datos privadas no se cuentan.
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: Lista de tablas: cómo actualizar interactivamente y no perder la selecciónPor ahora lo resolví de esta manera:
Recuerdo el nombre de la tabla seleccionada, luego uso Set Items para volver a escribir por completo, luego recorro en toda la lista y comparo el nombre recordado con la nueva lista (orden, por lo tanto, ¡los índices pueden ser diferentes ahora!). Tan pronto como golpeé el mismo nombre, recuerdo ese índice y lo puse en secreto usando este índice.
Aquí está el código:
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>Donde refreshListofTables usa Set Items:
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>Lo único que no me gusta: la ventana de registro muestra "recursión JSL evitada", ¿dónde está exactamente la recusión? Es
this << Set Selected(recallIndex);
efectivamente llamando a la totalidad
refreshListofTables
De nuevo, ¿por lo tanto entrar en resursión?
¿Alguna forma de evitarlo?
Gracias,
METRO