Come sapere se una tabella è un sottoinsieme collegato?Ciao a tutti,
Vorrei determinare (usando JSL) se la tabella dati corrente è collegata o meno a una tabella principale.
Ho provato "<< Ottieni nomi variabili tabella" ma non ha funzionato.
Hai idea di come possiamo ottenere queste informazioni?
Grazie in anticipo per il vostro aiuto!
Ri: Come sapere se una tabella è un sottoinsieme collegato?Grazie ancora per la tua velocissima risposta Ian!
Unirò le due parti e farò alcuni test, ma confido che dovrebbe fare il lavoro! 
Ri: Come sapere se una tabella è un sottoinsieme collegato?Non testato (come al solito... 
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));Ri: Come sapere se una tabella è un sottoinsieme collegato?Ciao Ian,
Grazie per il codice! Penso di poter usare qualcosa del genere per risolvere il mio problema. Ho solo bisogno di aggiungere un controllo aggiuntivo per la tabella di riepilogo. Forse qualcosa del genere potrebbe funzionare: cercare di ottenere lo script "Source" di una tabella e controllare se contiene la parola "summary".
devo fare delle prove...
Grazie ancora per il vostro aiuto.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Potresti testare questo (secondo le linee che ho menzionato prima):
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);
Ri: Come sapere se una tabella è un sottoinsieme collegato?Grazie per le informazioni aggiuntive Ian.
Hai perfettamente ragione, un comportamento "corretto" dipende dalla situazione. Non stavo dicendo che uno è meglio di un altro, ma solo cercando di spiegare perché a volte le cose vanno male con la mia sceneggiatura.
Sono anche d'accordo sul fatto che la creazione di un sottoinsieme collegato potrebbe non essere sempre il modo migliore per concentrarsi su alcune righe specifiche. Tuttavia, poiché il mio script può essere utilizzato da altre persone, non posso controllare cosa hanno fatto prima e con quale tipo di tabella stanno lavorando. Quindi l'idea è solo quella di trovare un modo per rilevare se una tabella è collegata (cioè non compatibile con il mio script). In tal caso potrei visualizzare un avviso e interrompere lo script.
Beh, se non è fattibile, forse posso trovare un altro modo per affrontare questo caso particolare.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Suppongo che il comportamento "corretto" in questo caso sia aperto all'interpretazione, ma se vedi qualcosa che consideri indesiderabile, invia un'e-mail a support@jmp.com.
In questo caso, tuttavia, se si intende utilizzare le tabelle dei sottoinsiemi collegati per "isolare" determinate righe per l'analisi, un approccio più convenzionale potrebbe essere quello di utilizzare il filtro dati, o la sua versione locale. Se stai salvando formule che sono state generate utilizzando solo una parte dei dati, potresti aver bisogno di codice aggiuntivo per curarle.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Infatti, se lavoro con un sottoinsieme collegato ad una tabella e se salvo i residui del Fit Model, questi vengono memorizzati nella prima tabella principale. Tuttavia, ho appena notato che le formule di previsione sono salvate in entrambe le tabelle! Questo è abbastanza strano...
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;In questo esempio vorrei avere i residui e la formula di previsione solo in dt2.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Per quanto riguarda " In particolare, salva i residui e le altre colonne della piattaforma Fit Model, nella tabella dati corrente " allora forse ho capito male. Ma dovresti sempre essere in grado di ottenere le previsioni del "modello di adattamento" per andare alla tabella corretta:
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;
Ri: Come sapere se una tabella è un sottoinsieme collegato?In realtà sto usando uno script che esegue diverse analisi. In particolare, salva i residui e le altre colonne della piattaforma Fit Model, nella tabella dati corrente. Se questa tabella è collegata ad un'altra, le colonne vengono salvate nella tabella originale e non in quella corrente e fa fallire il mio script.
Quindi, quando un utente avvia lo script, vorrei verificare prima se la tabella corrente non è collegata a un'altra. E poiché non sono a conoscenza di ciò che l'utente ha fatto prima, questo è il motivo per cui non sono in grado di sapere cosa potrebbe essere collegato a cosa.
Fammi sapere se hai bisogno di ulteriori spiegazioni o se qualcosa non è chiaro!
Oltre a rispondere all'ultimo post di Ian, vedo come potremmo costruire questa matrice di collegamento ma se abbiamo una tabella di riepilogo, non sono sicuro che lo script precedente funzionerà. Se non sbaglio quando selezioni le righe nella tabella originale, nella tabella di riepilogo non viene selezionato nulla.
Quindi, purtroppo, questo caso è ancora problematico.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Allora vado con la risposta di Ian.
Perché hai bisogno delle informazioni sulla tabella collegata? Forse c'è un altro approccio.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Sì, lo scenario "tabella di riepilogo" è quello che ho provato, quindi le mie risposte sopra. Ma continuo a riflettere su come la tua sessione JMP possa entrare in uno stato in cui non sai cosa è collegato a cosa. Ma va bene.
Potresti facilmente creare una "matrice di collegamento" usando "NTable ()" e quello che ho dato sopra.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Grazie per il suggerimento Craig!
Ho provato "Ottieni nomi variabili tabella" ma non "Ottieni variabile tabella"!
Ho fatto alcune prove e sembra funzionare abbastanza bene!
Finora, c'è solo un caso particolare in cui non funziona. Se creo una tabella di riepilogo collegata alla tabella originale, non viene creata alcuna variabile di tabella.
Qualche idea per quest'ultimo punto?
Ri: Come sapere se una tabella è un sottoinsieme collegato?potresti essere in grado di utilizzare la variabile table; avrà bisogno di alcuni test perché non sono sicuro che sia sempre impostato (aggiornamento: ho provato diversi modi per creare un sottoinsieme e sembra che la variabile table sia sempre creata):
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 variableThis linked subset has a table variableQuesto sottoinsieme collegato ha una variabile di tabella
Ri: Come sapere se una tabella è un sottoinsieme collegato?Grazie Ian, questo è davvero un modo abbastanza conveniente per risolvere il problema!
Devo solo fare un ulteriore passo avanti. Come possiamo farlo se non sappiamo qual è la potenziale tabella principale (dt nel tuo codice)?
Dobbiamo testare tutte le tabelle di apertura o esiste una soluzione più rapida?
Ri: Come sapere se una tabella è un sottoinsieme collegato?No, ho capito, ma stavo insinuando che potevi evitare il 'problema'. Ma se vuoi raccontare in modo retrospettivo, potresti fare qualcosa del tipo:
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));Ri: Come sapere se una tabella è un sottoinsieme collegato?Grazie per la tua risposta Ian.
Tuttavia il mio obiettivo non è creare un sottoinsieme collegato, ma determinare se una tabella esistente è collegata a un'altra o meno.
Scusa se non sono stato abbastanza chiaro!
Ri: Come sapere se una tabella è un sottoinsieme collegato?FWIW, supponendo che il tuo codice crei le tabelle, puoi creare sottoinsiemi collegati o non collegati come richiesto:
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");R: Come sapere se una tabella è un sottoinsieme collegato?È strano che un utente debba impostare un albero decisionale per scoprire se una tabella è collegata o meno.
Presumo che Jmp sappia quali tabelle sono collegate.
Allora perché tali informazioni non sono accessibili tramite JSL?
Davvero?
modifica: grazie per aver fornito la funzionalità con JMP18 : )
(vedi sotto)
Ri: Come sapere se una tabella è un sottoinsieme collegato?Una query JSL per interrogare una tabella sul fatto che si tratti di un sottoinsieme collegato non esisteva in precedenza. Tuttavia, questa conversazione ha attirato l'attenzione di JMP Development e ora è stato aggiunto un messaggio JSL nella prossima versione principale di JMP (JMP 18).
dt << è un sottoinsieme collegato; // restituirà 1 o 0
Ri: Come sapere se una tabella è un sottoinsieme collegato?@hogi - Questa è una richiesta diversa.
Da quanto ho capito, il collegamento viene creato (o meno) al momento della creazione della tabella. Quello è ancora sotto inchiesta.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Tagliare il collegamento significa clonare le righe che la tabella del sottoinsieme condivide dalla tabella principale. La richiesta di unlinking dtA potrebbe essere prototipata con
- usa tables->subset per creare una copia completa di dtA in dtB
- chiudere dtA
- rinominare dtB con il nome di dtA
che è imperfetto perché qualsiasi piattaforma aperta su dtA perde la connessione ai dati. Potrebbe rivelarsi un bel po 'di codice C++ per un insieme abbastanza piccolo di casi d'uso.@anne_sa spiega un caso d'uso che potrebbe trarne vantaggio. Ma questo sembra aprire un diverso barattolo di vermi: improvvisamente la tabella collegata di add-in_1 non è più collegata perché add-in_2 l'ha scollegata. Sono propenso a pensare che essere in grado di chiedere informazioni sullo stato del collegamento per decidere se è necessario un clone potrebbe essere il punto debole qui.
Ri: Come sapere se una tabella è un sottoinsieme collegato?Meraviglioso 
Aggiungerete una funzionalità per tagliare il collegamento?
funzionalità per tagliare la connessione tra una tabella collegata e la tabella principale
Ri: Come sapere se una tabella è un sottoinsieme collegato?Se provo a concatenare le tabelle con l'opzione Aggiungi alla prima tabella,
lo script si interrompe con il messaggio:
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)
Il messaggio di errore è stato molto utile per identificare il problema.
Ma come rendere lo script robusto rispetto ai sottoinsiemi collegati?
Una funzione di addizione:
dt << ottieni l'elenco dei sottoinsiemi collegati()
aiuterà. Quindi posso chiudere i sottoinsiemi tramite JSL.
Alternative:
- Jmp aggiorna le tabelle di dati collegati
- Jmp interrompe automaticamente il collegamento
- concatenate ottieni una nuova opzione: Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
R: Come sapere se una tabella è un sottoinsieme collegato?Non è facile mantenere "attivi" tutti i sottoinsiemi collegati e i report quando i dati vengono ordinati o aggiunti.
La soluzione più semplice: impedire a un utente di ordinare una tabella, aggiungere righe o concatenare tabelle quando sono aperti sottoinsiemi o report collegati. *)
Dal punto di vista dell'utente:
Spero che possa essere ottimizzato in una futura versione di JMP.
Il tuo script si è bloccato o sei rimasto bloccato da messaggi di errore come

... allora per favore votate:
Ordina la tabella dati + aggiungi righe + concatena -> rendilo possibile
*)
con un sottoinsieme inchiostrato:
ordina → no
aggiungi righe → no
concatenare → no
con un rapporto aperto:
fortuna → no
aggiungi righe → sì (!)
concatenare → sì (!)
con tabelle riassuntive collegate:
ordina → no [perché SORT non "taglia il collegamento"?!?]
aggiungi righe → sì²
concatenare → sì²
² JMP taglia automaticamente il collegamento:
