¿Cómo saber si una tabla es un subconjunto vinculado?Hola todos,
Me gustaría determinar (usando JSL) si la tabla de datos actual está vinculada a una tabla principal o no.
Intenté "<< Obtener nombres de variables de tabla" pero no funcionó.
¿Tiene alguna idea de cómo podemos obtener esta información?
¡Gracias de antemano por tu ayuda!
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?¡Gracias una vez más por tu rápida respuesta, Ian!
Combinaré las dos partes y haré algunas pruebas, ¡pero confío en que funcionará! 
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Sin probar (como siempre . . . 
NamesDefaultToHere(1);
ClearLog();
// See if a table is a summary of another table
isSummary =
Function({dt}, {Default Local},
ts = dt << Get Table Script Names;
if (Contains(ts, "Source"),
ss = dt << getProperty("Source");
if (Head(Arg(ss, 2)) == Expr(Summary), 1, 0),
0
);
);
// Make a summary table
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = dt1 << Summary(Mean( :height ));
Print(isSummary(dt1));
Print(isSummary(dt2));Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Hola Ian,
¡Gracias por el codigo! Creo que puedo usar algo así para resolver mi problema. Solo necesito agregar un control adicional para la tabla de resumen. Tal vez algo así podría funcionar: tratar de obtener el script "Fuente" de una tabla y verificar si contiene la palabra "resumen".
tengo que hacer unas pruebas...
De nuevo, gracias por tu ayuda.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Podrías probar esto (en la línea que mencioné anteriormente):
NamesDefaultToHere(1);
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0, linked = 1, linked = 0);
dt1 << clearSelect;
dt2 << clearSelect;
linked;
);
// Look at the open tables in the session and see which pairs are linked
linkedTables = Function({}, {Default Local},
nt = NTable();
linkMat = J(nt, nt, .);
tblNames = {};
for(t1=1, t1<=nt, t1++,
InsertInto(tblNames, DataTable(t1) << getName);
for(t2=t1+1, t2<=nt, t2++,
if(rLinked(DataTable(t1), DataTable(t2)), linkMat[t1, t2] = 1, linkMat[t1, t2] = 0);
);
);
EvalList({linkMat, tblNames});
);
// Make some active tables
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Get the 'link matrix'
linkedOrNot = linkedTables();
dt4 = AsTable(linkedOrNot[1], << setName("Linked Tables"), << columnNames(linkedOrNot[2]));
dt4 << NewColumn("Column", Character, Values(linkedOrNot[2]));
dt4 << moveSelectedColumns({"Column"}, ToFirst);
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Gracias por la información adicional Ian.
Tienes toda la razón, un comportamiento "correcto" depende de la situación. No estaba diciendo que uno sea mejor que otro, sino solo tratando de explicar por qué a veces las cosas salen mal con mi guión.
También estoy de acuerdo en que crear un subconjunto vinculado puede no ser siempre la mejor manera de enfocarse en algunas filas específicas. Sin embargo, dado que mi script puede ser utilizado por otras personas, no puedo controlar lo que han hecho antes y con qué tipo de tabla están trabajando. Entonces, la idea es encontrar una manera de detectar si una tabla está vinculada (es decir, no es compatible con mi script). En ese caso, podría mostrar una advertencia y detener el script.
Bueno, si no es factible, tal vez pueda encontrar otra forma de tratar este caso en particular.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Supongo que el comportamiento 'correcto' en este caso está abierto a interpretación, pero si ve algo que considera indeseable, envíe un correo electrónico a support@jmp.com.
Sin embargo, en este caso, si tiene la intención de usar las tablas de subconjuntos vinculados para 'aislar' ciertas filas para el análisis, un enfoque más convencional podría ser usar el filtro de datos, o la versión local del mismo. Si está guardando fórmulas que se generaron usando solo una parte de los datos, es posible que necesite algún código adicional para seleccionarlas.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?De hecho, si trabajo con un subconjunto vinculado a una tabla y guardo los residuos de Fit Model, se almacenan en la primera tabla principal. Sin embargo, acabo de comentar que la fórmula de predicción se guarda en ambas tablas. Eso es bastante extraño...
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Create a subset
dt2=dt1 << Subset(
Selected Rows( 0 ),
Rows( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ),
Selected columns only( 0 ),
link to original data table(1)
);
// Direct the analysis to the subset table
fml = dt2 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula are saved in both dt1 and dt2 and residulas are saved only in dt1
fm << prediction formula;
fm << residuals;En este ejemplo, me gustaría tener residuos y fórmulas de predicción solo en dt2.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Acerca de " En particular, guarda los residuales y otras columnas de la plataforma Fit Model, en la tabla de datos actual "entonces tal vez he entendido mal. Pero siempre debería poder obtener las predicciones de 'Modelo de ajuste' para ir a la tabla correcta:
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Open another table
dt2 = Open("$SAMPLE_DATA/Bands Data.jmp");
// Direct the analysis to the first table
fml = dt1 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula goes to the first, not the current table
Print(CurrentDataTable());
fm << predictionFormula;
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?En realidad, estoy usando un script que ejecuta varios análisis. En particular, guarda los residuales y otras columnas de la plataforma Fit Model, en la tabla de datos actual. Si esta tabla está vinculada a otra, las columnas se guardan en la tabla original y no en la actual y hace que mi script falle.
Entonces, cuando un usuario inicia el script, me gustaría verificar primero si la tabla actual no está vinculada a otra. Y dado que no estoy al tanto de lo que hizo el usuario antes, esa es la razón por la que no puedo saber qué podría estar vinculado a qué.
¡Avíseme si necesita más explicaciones o si algo no está claro!
Además de responder a la última publicación de Ian, veo cómo podríamos construir esta matriz de enlace, pero si tenemos una tabla de resumen, no estoy seguro de que el script anterior funcione. Si no me equivoco cuando selecciona filas en la tabla original, no se selecciona nada en la tabla de resumen.
Desafortunadamente, este caso sigue siendo problemático.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Voy con la respuesta de Ian entonces.
¿Por qué necesita la información de la tabla vinculada? Tal vez haya otro enfoque.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Sí, el escenario de la 'tabla de resumen' es el que probé. De ahí mis respuestas anteriores. Pero todavía me quedo reflexionando sobre cómo su sesión de JMP puede llegar a un estado en el que no sabe qué está vinculado a qué. Pero eso esta bien.
Podría crear fácilmente una 'matriz de enlace' usando 'NTable()' y lo que he dado anteriormente.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Gracias por la sugerencia Craig!
¡Intenté "Obtener nombres de variables de tabla" pero no "Obtener variables de tabla"!
Hice algunas pruebas y parece que funciona bastante bien!
Hasta ahora, solo hay un caso particular en el que no funciona. Si creo una tabla de resumen vinculada a la tabla original, no se crea ninguna variable de tabla.
¿Alguna idea para este último punto?
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?es posible que pueda usar la variable de tabla; necesitará algunas pruebas porque no estoy seguro de si siempre está configurado (actualización: probé varias formas de hacer un subconjunto y parece que la variable de la tabla siempre se crea):
dt<<GETTABLEVARIABLE></GETTABLEVARIABLE>
This linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableEste subconjunto vinculado tiene una variable de tabla
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Gracias Ian, ¡esa es una forma bastante conveniente de resolver el problema!
Solo necesito dar un paso más. ¿Cómo podemos hacer eso si no sabemos cuál es la tabla principal potencial (dt en su código)?
¿Tenemos que probar todas las mesas de apertura o hay una solución más rápida?
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?No, lo entendí, pero estaba insinuando que podrías evitar el 'problema'. Pero si quieres contarlo retrospectivamente, podrías hacer algo como:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0,
linked = 1,
linked = 0
);
dt1 << clearSelect;
linked;
);
Print(rLinked(dt, dt2), rLinked(dt, dt3));Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Gracias por tu respuesta Ian.
Sin embargo, mi objetivo no es crear un subconjunto vinculado, sino determinar si una tabla existente está vinculada a otra o no.
Lo siento si no fui lo suficientemente claro!
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?FWIW, asumiendo que su código hace las tablas, puede hacer subconjuntos vinculados o no vinculados según lo requiera:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Es extraño que un usuario tenga que configurar un árbol de decisiones para saber si una tabla está vinculada o no.
Supongo que Jmp sabe qué tablas están vinculadas.
Entonces, ¿por qué no se puede acceder a dicha información a través de JSL?
¿Lo es?
editar: gracias por proporcionar la función con JMP18 : )
(vea abajo)
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Una consulta JSL para consultar una tabla sobre si es un subconjunto vinculado no existía previamente. Sin embargo, esta conversación llamó la atención de JMP Development, y ahora se agregó un mensaje JSL en la próxima versión principal de JMP (JMP 18).
dt << es un subconjunto vinculado; //devolverá 1 o 0
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?@hogi - Ahora que es una petición diferente.
Según tengo entendido, el enlace se crea (o no) en el momento de la creación de la tabla. Ese todavía está siendo investigado.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Cortar el enlace significa clonar las filas que comparte la tabla de subconjuntos de la tabla principal. La solicitud de desvinculación de dtA podría crearse un prototipo con
- use tablas->subconjunto para hacer una copia completa de dtA en dtB
- cerrar dtA
- cambiar el nombre de dtB al nombre de dtA
lo cual es imperfecto porque cualquier plataforma abierta en dtA pierde su conexión con los datos. Podría resultar ser bastante código C++ para un conjunto bastante pequeño de casos de uso.@anne_sa explica un caso de uso que podría beneficiarse. Pero eso parece abrir una lata de gusanos diferente: de repente, la tabla vinculada de add-in_1 ya no está vinculada porque add-in_2 la desvinculó. Me inclino a pensar que poder preguntar sobre el estado del enlace para decidir si se necesita un clon podría ser el punto óptimo aquí.
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Maravilloso 
¿Agregarán una funcionalidad para cortar el enlace?
funcionalidad para cortar la conexión entre una tabla vinculada y la tabla principal
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?Si trato de concatenar tablas con la opción Agregar a la primera tabla,
el guión se detiene con el mensaje:
Cannot append to table: Big Class. Possible reasons for this include: the table is locked, the table is in a platform with a by group, or there is a linked subset of the table. in access or evaluation of 'Concatenate' , Concatenate(/*###*/Data Table( "Subset of Big Class" ), Append to first table)
El mensaje de error fue muy útil para identificar el problema.
Pero, ¿cómo hacer que el script sea robusto frente a los subconjuntos vinculados?
Una función de suma:
dt << obtener una lista de subconjuntos vinculados()
ayudará. Entonces puedo cerrar los subconjuntos a través de JSL.
Alternativas:
- Jmp actualiza las tablas de datos vinculados
- Jmp corta el enlace automáticamente
- concatenar obtenga una nueva opción: Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
Re: ¿Cómo saber si una tabla es un subconjunto vinculado?No es fácil mantener todos los subconjuntos vinculados y los informes "vivos" cuando se ordenan o agregan datos.
La solución más sencilla: evitar que un usuario ordene una tabla, agregue filas o concatene tablas cuando haya subconjuntos o informes vinculados abiertos. *)
Desde la perspectiva del usuario:
Espero que se pueda optimizar en una futura versión de JMP.
¿Tu script falló o te quedaste atascado con mensajes de error como?

... entonces por favor vota:
Ordenar la tabla de datos + agregar filas + concatenar -> hacerlo posible
*)
con un subconjunto entintado:
ordenar → no
agregar filas → no
concatenar → no
con un informe abierto:
suerte → no
añadir filas → sí (!)
concatenar → sí (!)
con tablas resumen vinculadas:
sort → no [¿¡por qué SORT no "corta el enlace"?!?]
añadir filas → sí²
concatenar → sí²
² JMP corta automáticamente el enlace:
