Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Hallo zusammen,
Ich möchte (mit JSL) feststellen, ob die aktuelle Datentabelle mit einer Haupttabelle verknüpft ist oder nicht.
Ich habe versucht, "<< Get Table Variable Names", aber es hat nicht funktioniert.
Haben Sie eine Idee, wie wir diese Informationen erhalten können?
Vielen Dank im Voraus für Ihre Hilfe!
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Nochmals vielen Dank für deine sehr schnelle Antwort, Ian!
Ich werde die beiden Teile kombinieren und einige Tests durchführen, aber ich vertraue darauf, dass es den Job machen sollte! 
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Ungetestet (wie immer . . . 
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));Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Hallo Jan,
Vielen Dank für den Code! Ich denke, ich kann so etwas verwenden, um mein Problem zu lösen. Ich muss nur ein zusätzliches Steuerelement für die Übersichtstabelle hinzufügen. Vielleicht könnte so etwas funktionieren: Versuchen Sie, das "Source" -Skript einer Tabelle zu erhalten und zu prüfen, ob es das Wort "summary" enthält.
Ich muss ein paar Tests machen...
Danke nochmal für deine Hilfe.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Sie könnten dies testen (in der Richtung, die ich zuvor erwähnt habe):
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);
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Vielen Dank für die zusätzlichen Informationen Jan.
Sie haben völlig recht, ein "richtiges" Verhalten hängt von der Situation ab. Ich habe nicht gesagt, dass eines besser als das andere ist, sondern nur versucht zu erklären, warum manchmal etwas mit meinem Skript schief geht.
Ich stimme auch zu, dass das Erstellen einer verknüpften Teilmenge möglicherweise nicht immer der beste Weg ist, sich auf bestimmte Zeilen zu konzentrieren. Da mein Skript jedoch von anderen Personen verwendet werden kann, kann ich nicht kontrollieren, was sie zuvor getan haben und mit welcher Art von Tabelle sie arbeiten. Die Idee ist also, einen Weg zu finden, um festzustellen, ob eine Tabelle verknüpft ist (dh nicht mit meinem Skript kompatibel ist). In diesem Fall könnte ich eine Warnung anzeigen und das Skript stoppen.
Nun, wenn es nicht machbar ist, kann ich vielleicht einen anderen Weg finden, um mit diesem speziellen Fall umzugehen.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Ich nehme an, dass das „richtige“ Verhalten in diesem Fall offen für Interpretationen ist, aber wenn Sie etwas sehen, das Sie für unerwünscht halten, senden Sie bitte eine E-Mail an support@jmp.com.
Wenn Sie in diesem Fall jedoch beabsichtigen, die verknüpften Teilmengentabellen zu verwenden, um bestimmte Zeilen für die Analyse zu „isolieren“, könnte ein konventionellerer Ansatz darin bestehen, die zu verwenden Datenfilter, oder die lokale Version davon. Wenn Sie Formeln speichern, die nur mit einem Teil der Daten generiert wurden, benötigen Sie möglicherweise zusätzlichen Code, um diese zu kuratieren.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Wenn ich mit einer Teilmenge arbeite, die mit einer Tabelle verknüpft ist, und wenn ich die Residuen des Anpassungsmodells speichere, werden sie in der ersten Haupttabelle gespeichert. Ich habe jedoch gerade angemerkt, dass Vorhersageformeln in beiden Tabellen gespeichert sind! Das ist ziemlich merkwürdig...
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 diesem Beispiel möchte ich Residuen und Vorhersageformeln nur in dt2 haben.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Hinsichtlich " Insbesondere werden die Residuen und andere Spalten aus der Fit-Modell-Plattform in der aktuellen Datentabelle gespeichert „Dann habe ich das vielleicht falsch verstanden. Aber Sie sollten immer in der Lage sein, die Vorhersagen von „Modell anpassen“ zu erhalten, um zum richtigen Tisch zu gelangen:
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;
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Eigentlich verwende ich ein Skript, das mehrere Analysen durchführt. Insbesondere werden die Residuen und andere Spalten aus der Fit-Modell-Plattform in der aktuellen Datentabelle gespeichert. Wenn diese Tabelle mit einer anderen verknüpft ist, werden Spalten in der ursprünglichen Tabelle und nicht in der aktuellen gespeichert, und mein Skript schlägt fehl.
Wenn also ein Benutzer das Skript startet, möchte ich zuerst prüfen, ob die aktuelle Tabelle nicht mit einer anderen verknüpft ist. Und da ich nicht weiß, was der Benutzer zuvor getan hat, kann ich nicht wissen, was mit was verknüpft werden könnte.
Lassen Sie mich wissen, wenn Sie weitere Erklärungen benötigen oder etwas nicht klar ist!
Neben der Beantwortung von Ians letztem Beitrag sehe ich, wie wir diese Verknüpfungsmatrix erstellen könnten, aber wenn wir eine Übersichtstabelle haben, bin ich mir nicht sicher, ob das vorherige Skript funktionieren wird. Wenn ich mich nicht irre, wenn Sie Zeilen in der ursprünglichen Tabelle auswählen, ist in der Übersichtstabelle nichts ausgewählt.
Daher ist dieser Fall leider immer noch problematisch.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Ich gehe dann mit Ians Antwort.
Warum benötigen Sie die verknüpften Tabelleninformationen? Vielleicht gibt es noch einen anderen Ansatz.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Ja, das Szenario "Zusammenfassungstabelle" habe ich ausprobiert - daher meine obigen Antworten. Aber ich denke immer noch darüber nach, wie Ihre JMP-Sitzung in einen Zustand geraten kann, in dem Sie nicht wissen, was mit was verknüpft ist. Aber das ist in Ordnung.
Sie könnten leicht eine 'Verknüpfungsmatrix' mit 'NTable()' und dem, was ich oben angegeben habe, erstellen.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Danke für den Vorschlag Craige!
Ich habe "Get Table Variable Names" versucht, aber nicht "Get Table Variable Names"!
Ich habe einige Tests gemacht und es scheint ziemlich gut zu funktionieren!
Bisher gibt es nur einen speziellen Fall, wo es nicht funktioniert. Wenn ich eine Übersichtstabelle erstelle, die mit der ursprünglichen Tabelle verknüpft ist, wird keine Tabellenvariable erstellt.
Irgendeine Idee für diesen letzten Punkt?
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Sie können möglicherweise die Tabellenvariable verwenden. Es wird einige Tests erfordern, da ich nicht sicher bin, ob es immer festgelegt ist (Update: Es wurden mehrere Möglichkeiten zum Erstellen einer Teilmenge ausprobiert, und es scheint, dass die Tabellenvariable immer erstellt wird):
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 variableDiese verknüpfte Teilmenge hat eine Tabellenvariable
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Danke Ian, das ist in der Tat ein ziemlich bequemer Weg, um das Problem zu lösen!
Ich muss nur noch einen Schritt weiter gehen. Wie können wir das tun, wenn wir nicht wissen, was die potenzielle Haupttabelle ist (dt in Ihrem Code)?
Müssen wir alle Eröffnungstabellen testen oder gibt es eine schnellere Lösung?
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Nein, ich habe verstanden, wollte aber andeuten, dass Sie das „Problem“ vermeiden könnten. Aber wenn du es rückblickend sagen willst, könntest du so etwas tun:
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));Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Danke für deine Antwort Jan.
Mein Ziel ist es jedoch nicht, eine verknüpfte Teilmenge zu erstellen, sondern festzustellen, ob eine vorhandene Tabelle mit einer anderen verknüpft ist oder nicht.
Entschuldigung, wenn ich mich nicht klar genug ausgedrückt habe!
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?FWIW, vorausgesetzt, Ihr Code erstellt die Tabellen, können Sie nach Bedarf verknüpfte oder nicht verknüpfte Teilmengen erstellen:
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");Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Es ist seltsam, dass ein Benutzer einen Entscheidungsbaum erstellen muss, um herauszufinden, ob eine Tabelle verknüpft ist oder nicht.
Ich würde davon ausgehen, dass Jmp weiß , welche Tabellen verknüpft sind.
Warum sind solche Informationen nicht über JSL zugänglich?
Ist es?
Bearbeiten: Danke, dass Sie die Funktion mit JMP18 bereitgestellt haben : )
(siehe unten)
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Eine JSL-Abfrage zum Abfragen einer Tabelle, ob es sich um eine verknüpfte Teilmenge handelt, existierte zuvor nicht. Diese Konversation hat jedoch die Aufmerksamkeit von JMP Development erregt, und jetzt wurde in der nächsten Hauptversion von JMP (JMP 18) eine JSL-Nachricht hinzugefügt.
dt << ist eine verknüpfte Teilmenge; // gibt 1 oder 0 zurück
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?@Hogi - Das ist eine andere Bitte.
Nach meinem Verständnis wird die Verknüpfung zum Zeitpunkt der Tabellenerstellung erstellt (oder nicht). Dieser wird noch untersucht.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Das Trennen der Verknüpfung bedeutet, dass die Zeilen, die die Teilmengentabelle gemeinsam nutzt, aus der Haupttabelle geklont werden. Die Anforderung zum Aufheben der Verknüpfung von dtA könnte mit prototypisiert werden
- Verwenden Sie tables->subset, um eine vollständige Kopie von dtA in dtB zu erstellen
- dtA schließen
- Benennen Sie dtB in den Namen von dtA um
was unvollkommen ist, da alle Plattformen, die auf dtA geöffnet sind, ihre Verbindung zu den Daten verlieren. Es könnte sich herausstellen, dass es ziemlich viel C++-Code für eine ziemlich kleine Menge von Anwendungsfällen ist.@anne_sa erklärt einen Anwendungsfall, der von Vorteil sein könnte. Aber das scheint eine andere Dose von Würmern zu öffnen: Plötzlich ist die verknüpfte Tabelle von Add-in_1 nicht mehr verknüpft, weil Add-in_2 die Verknüpfung aufgehoben hat. Ich neige dazu zu denken, dass die Möglichkeit, nach dem Verbindungsstatus zu fragen, um zu entscheiden, ob ein Klon benötigt wird, hier der Sweet Spot sein könnte.
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Wunderbar 
Werden Sie eine Funktion zum Trennen des Links hinzufügen?
Funktionalität zum Trennen der Verbindung zwischen einer verknüpften Tabelle und der Haupttabelle
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Wenn ich versuche, Tabellen mit der Option zu verketten An erste Tabelle anhängen,
Das Skript stoppt mit der Meldung:
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)
Die Fehlermeldung war sehr hilfreich, um das Problem zu identifizieren.
Aber wie macht man das Skript robust gegenüber verknüpften Teilmengen?
Eine Additionsfunktion:
dt << Liste der verknüpften Teilmengen abrufen()
wird helfen. Dann kann ich die Teilmengen über JSL schließen.
Alternativen:
- Jmp aktualisiert die verknüpften Datentabellen
- Jmp schneidet den Link automatisch
- concatenate erhält eine neue Option: Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
Betreff: Wie erkennt man, ob eine Tabelle eine verknüpfte Teilmenge ist?Es ist nicht einfach, alle verknüpften Teilmengen und Berichte „am Leben“ zu halten, wenn Daten sortiert oder hinzugefügt werden.
Die einfachste Lösung: Verhindern Sie, dass ein Benutzer eine Tabelle sortiert, Zeilen hinzufügt oder Tabellen verkettet, wenn verknüpfte Teilmengen oder Berichte geöffnet sind. *)
Aus der Sicht eines Benutzers:
Ich hoffe, dass es in einer zukünftigen Version von JMP optimiert werden kann.
Ist Ihr Skript abgestürzt oder blieben Sie aufgrund von Fehlermeldungen wie diesen hängen

... dann bitte abstimmen:
Datentabelle sortieren + Zeilen hinzufügen + verketten -> möglich machen
*)
mit einer eingefärbten Teilmenge:
sortieren → nein
Zeilen hinzufügen → nein
verketten → nein
mit offenem Bericht:
Glück → nein
Zeilen hinzufügen → ja (!)
verketten → ja (!)
mit einer verknüpften Übersichtstabelle:
sortieren → nein [warum „trennt SORT die Verbindung nicht“?!?]
Zeilen hinzufügen → ja²
verketten → ja²
² JMP trennt die Verknüpfung automatisch:
