Tabellenliste: wie man interaktiv aktualisiert und die Auswahl nicht verliertIch habe Diskussionen zu diesem Thema gesehen und konnte keine Lösung finden.
Das Problem ist folgendes:
Ich arbeite mit der Liste der Tabellen, die in einem Listenfeld angezeigt werden. Ich verwende N Table(), um eine Liste mit Namen für alle Tabellen zu erhalten.
Was ich möchte, ist, dass, wenn ich auf eine Zeile in dieser Liste klicke, um sie auszuwählen, die Liste selbst aktualisiert und überprüft wird, ob neue geöffnete Tische vorhanden sind oder einige Tische geschlossen wurden.
Eine gute Sache, dies zu tun, ist, Set Items (openDTs) jedes Mal zu verwenden, wenn ich zur Auswahl klicke. Es aktualisiert die Liste der Tabellen ganz gut - das Problem ist, dass es die Auswahl verwirft.
Wenn ich Append (openDTs) für das Listenfeld verwende, fügt es alle neuen Tabellen hinzu, die geöffnet wurden, aber wenn ich die Tabelle schließe, wird die geschlossene Tabelle nicht gelöscht.
Was ist der eleganteste und korrekteste Weg, um die Liste der Tische zu aktualisieren, die geöffnete und geschlossene Tische bei jedem Klick auf die Liste widerspiegelt, damit die Auswahl erhalten bleibt?
Betreff: Tabellenliste: wie man interaktiv aktualisiert und die Auswahl nicht verliertmigello,
Kevin Anderson hat ein Skript aus der 2. Auflage unseres Buches JSL Companion in der Diskussion unter diesem Link gepostet
Vergleichen Sie Listen, aber mit Teilstrings
Meine Empfehlung ist also, Ihre erste Funktion zu ändern, die eine Liste der ausgewählten Elemente im Listenfeld zurückgibt. Verwenden Sie dann die Funktion Lfunc() mit contains oder verwenden Sie eine Schnittfunktion, die eine Schnittmenge der ausgewählten Liste mit den ctbls, der Liste der aktuellen Tabellen, findet. Die resultierende Liste sind diejenigen, die Sie auswählen müssen. Der Link beschreibt eine einfache Technik, die assoziative Arrays verwendet, um einen Schnittpunkt zu finden, oder schauen Sie sich das angehängte Skript aus Kapitel 5 an: Funktion uniq_intersect(ctbls, sellist) .
Ich hoffe, das ist klar. Ich habe gestern nicht mehr hinzugefügt, da Ihre andere Funktion so nah war.
Betreff: Tabellenliste: wie man interaktiv aktualisiert und die Auswahl nicht verliertDanke, Georgien!
Dies ist definitiv eine elegantere Art, eine aktuelle Tabellenliste zu haben. Die einzige kleine Frage ist: Was ist der beste Weg, um das Listenfeld mit einem ausgewählten Element zu aktualisieren, ohne die Auswahl zu verlieren?
Betreff: Tabellenliste: wie man interaktiv aktualisiert und die Auswahl nicht verliertmigello,
Wenn Sie JMP 14 verwenden, gibt es einen neuen Befehl Get Data Table List(), der eine Liste der geöffneten Datentabellen zurückgibt. Wenn Sie JMP 14 nicht verwenden, ist der Befehl N Table() erforderlich.
Auch Datentabellenliste abonnieren (, OnOpen() | OnClose() | OnRename() ) ist auf JMP 12, 13,14 verfügbar.
Nachfolgend finden Sie ein Skript zum Untersuchen von Tabellenabonnements. Beachten Sie, dass Sie anstelle von show ctbls die Liste bei jeder Änderung aktualisieren können.
Schlussbemerkung: NTable() „zählt“ unsichtbare Datentabellen, aber private Datentabellen werden nicht gezählt.
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>
Betreff: Tabellenliste: wie man interaktiv aktualisiert und die Auswahl nicht verliertIch habe es jetzt so gelöst:
Ich erinnere mich an den Namen der ausgewählten Tabelle, dann verwende ich Set Items, um sie komplett neu zu schreiben, dann iteriere ich durch die gesamte Liste und vergleiche den gemerkten Namen mit der neuen Liste (Reihenfolge, daher könnten die Indizes jetzt anders sein!). Sobald ich denselben Namen treffe, erinnere ich mich an diesen Index und setze mich mit diesem Index fort.
Hier ist der Code:
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>Wo refreshListofTables Set Items verwendet:
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>Das einzige, was mir nicht gefällt: Das Log-Fenster zeigt "JSL-Rekursion verhindert" an - wo genau ist die Rekursion? Ist
this << Set Selected(recallIndex);
effektiv das Ganze aufrufen
refreshListofTables
wieder, also in Resursion gehen?
Irgendwie drum herum?
Danke,
M