Listenfeld mit allen offenen TabellenIch versuche, eine Listbox zu erstellen, die alle geöffneten Datentabellen auflistet und automatisch mit neu geöffneten/neu geschlossenen Tabellen aktualisiert wird. Ich habe mit dem folgenden Skript begonnen, aber aus irgendeinem Grund funktioniert die onClose-Funktion nicht.
Schätzen Sie die Hilfe 
names default to here(1);
f1 = function ({Temp_list},
T_list = Temp_list << get name();
lb << remove all;
lb << append (T_list)
);
f2 = function ({Temp_list},
T_list = Temp_list << get name();
lb << remove all;
lb << append (T_list)
);
asub = Subscribe to data table list( , onopen(f1));
Subscribe to data table list(asub , onclose(f2));
nw = new window("Trial",show menu(0),
vlistbox(
T_list = get data table list ();
lb = listbox(T_list);
)
);
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungVerbraucher- und MarktforschungDatenzugriffDatenmischung und -bereinigungVersuchsplanungMassenanpassungBetreff: Listenfeld mit allen offenen TabellenNachdem ich das Abonnieren der Datentabellenliste etwas ausführlicher getestet habe, würde ich es nach Möglichkeit vermeiden. Es scheint überhaupt nicht gut zu funktionieren, Ereignisse werden nicht ausgelöst, die Dokumentation zur Verwendung ist ziemlich schlecht und so weiter. Ich verwende JMP16.1.0 Pro unter Windows 10.
Ich habe eine Anwendung, in der ich so etwas gerne hätte, aber ich denke, ich werde einfach „Datentabellenliste aktualisieren“ oder etwas Ähnliches hinzufügen.
Betreff: Listenfeld mit allen offenen TabellenDanke @jthi ! Das funktioniert!
Wenn es Ihnen nichts ausmacht, könnten Sie auch zeigen, wie Sie die „OnRename“-Klausel einrichten würden?
Betreff: Listenfeld mit allen offenen TabellenSie sollten nur in der Lage sein, neue Werte zu lb hinzuzufügen und sie nur den geschlossenen mit Index zu entfernen (mithilfe von Contains(), um den Index zu erhalten) und auch lokale Variablen zu Funktionen hinzugefügt.
Names Default To Here(1);
f1 = function ({Temp_list}, {tableList},
tableList = Temp_list << get name();
lb << append (tableList)
);
f2 = function ({Temp_list}, {tableList},
tableList = Temp_list << get name();
lb << Remove Item(Contains(lb << get items, tableList));
);
asub = Subscribe to data table list( , onopen(f1));
Subscribe to data table list(asub , OnClose(f2));
nw = new window("Trial",show menu(0),
vlistbox(
lb = listbox(get data table list ());
)
);Betreff: Listenfeld mit allen offenen TabellenDanke @txnelson !! Das ist genau der Fehler, auf den ich gestoßen bin. Ich denke, dass ich in der Zwischenzeit einen Workaround dafür finden muss.
Betreff: Listenfeld mit allen offenen TabellenMit der folgenden JSL habe ich Folgendes herausgefunden.
Names Default To Here( 1 );
f2 = Function( {Temp_list},
T_list = Get Data Table List();
lb << remove all;
lb << append( T_list );
show("Close");
);
f1 = Function( {Temp_list},
T_list = Get Data Table List();
lb << remove all;
lb << append( T_list );
show("add");
);
asub = Subscribe to Data Table List( , onopen( f1 ) );
Subscribe to Data Table List(asub , onclose( f2 ) );
nw = New Window( "Trial",
Show Menu( 0 ),
V List Box(
T_list = Get Data Table List();
lb = List Box( T_list );
)
);
- Das erstellte Listenfeld fügt neue Datentabellen ohne Fehler hinzu.
- Die f1-Funktion wird für jede Addition einmal ausgeführt
- Wenn Sie eine Datentabelle schließen, wird sie nicht aus dem Listenfeld entfernt.
- Wenn Sie eine zweite Datentabelle schließen, wird die zuvor geschlossene Datentabelle aus dem Listenfeld entfernt.
- Wenn Sie das Listenfeld schließen und die JSL ein zweites Mal ausführen und eine Datentabelle schließen, wird eine f2-Funktion zweimal ausgeführt.Die f2-Funktion aus der ersten Ausführung der JSL wird ausgeführt, gefolgt von der Ausführung der zweiten Instanz der f2-Funktion.Dies kann durch Ändern der Show()-Anweisung angezeigt werden.Wenn die Show-Anweisung von geändert wurde
Show( "Close" );
ZuShow( "Close 2" );
Beim Schließen einer Datentabelle werden beide Versionen der Show()-Anweisung angezeigt.
- Nachfolgende Ausführungen der JSL fügen zusätzliche Kopien der f2-Funktion hinzu, wobei jede Kopie für jedes Schließen der Datentabelle ausgeführt wird.
- Clear Globals und Clear Symbols eliminieren nicht die vorherigen Versionen der f2-Funktion.
Dies ist eindeutig ein JMP-Fehler und muss an den JMP-Support-Mitarbeiter weitergeleitet werden.
Ich habe ihnen den Fehler gemeldet.
Betreff: Listenfeld mit allen offenen TabellenIch bringe einige neue Erkenntnisse in dieses Thema, vielleicht hilft es jemandem. Ich habe versucht, etwas Ähnliches wie @Djtjhin zu tun und bin auf dieselben hier beschriebenen Probleme gestoßen, die ich größtenteils dank der Diskussion hier lösen konnte.
Was ich hinzufügen kann, ist die Erklärung des seltsamen Verhaltens, das von @txnelson beschrieben wird. Das Problem ist, dass Sie sich anmelden, ohne den Abonnementnamen wie unten explizit anzugeben:
asub = Subscribe to data table list( , OnOpen( Show("opening...") ) )Bei jeder Ausführung des Skripts wird ein neues Abonnement unter einem neuen generischen Namen („_DTListSubscriber123“) erstellt, wobei der Zähler am Ende erhöht wird.
Der Trick besteht darin, den Abonnenten entweder explizit zu benennen, sodass Sie bei jedem Ausführen des Skripts denselben überschreiben, z. B.:
asub = Subscribe to data table list( "MyDTLSub1", OnOpen( Show("opening...") ) )oder zur Abmeldung am Ende, z.B. im < <>
Unsubscribe to data table list( asub, "ALL" )
Andere Neuigkeiten, @Djtjhin , das Umbenennen funktioniert ziemlich einfach, es scheint, dass das Ereignis NACH dem Umbenennen ausgelöst wird, sodass Get Data Table List() Ihnen den/die neuen Namen liefert. Aber ich habe mir aus einem anderen Grund die Haare gerauft, bevor ich es zum Laufen gebracht habe, aufgrund fehlender Dokumentation . Im Gegensatz zu OnOpen und OnClose benötigt die Funktion OnRename 2 Argumente (neuer und alter Name/Tabelle), sonst erhalten Sie Fehler. Und obwohl Sie sie in diesem speziellen Listbox-Beispiel eigentlich nicht brauchen, müssen Sie, wenn Sie sie brauchen, auch bedenken, dass sie unterschiedliche Variablentypen sind, einer ist eine Tabelle, der andere ein String (siehe unten).
Names Default To Here(1);
f = Function ( { new_name_as_table, old_name_as_string },
print(asub||" renaming: "|| old_name_as_string || " to " || (new_name_as_table << get name) );
lb << set items( Get Data table List() );
);
asub = Subscribe to data table list( "MySub", OnRename( f ) );
nw = new window("Trial",show menu(0),
<< On Close(Unsubscribe to data table list( asub, "ALL")),
vlistbox(
lb = listbox(get data table list ());
)
);
dt = Open( "$SAMPLE_DATA/Tiretread.jmp" );
dt << set name( (dt<<GET name=""></GET>Otherwise I agree with general sentiment that the subscriber it's very hard to work with, you have to be really careful to tie up all the loose ends. Better documentation would be much appreciated.