verwirrt über JSL in Ausdrucksform<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich möchte eine kleine Tabelle in einer anderen Tabelle speichern, damit ein Skript, das beide im selben Bericht verwendet, die kleine Tabelle bei Bedarf rekonstruieren kann.Dies scheint eine gute Lösung zu sein, da Benutzer der Tabelle dann auch problemlos diese kleine, verwandte Informationstabelle öffnen können, während nur eine Datentabelle gespeichert wird.
Nach langem Zähneknirschen über Schichten der expr()-Syntax habe ich Folgendes zum Laufen gebracht ...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open("$SAMPLE_DATA/Abrasion.jmp");
ts=dt<< Get Script();
Close(dt,nosave);
ne=nameexpr(ts);
eval(substitute(expr(dt2<
//...später...
dt2<
dtBigClass=currentdatatable();
Aber 2 Fragen...
1) Ist es wirklich so kompliziert?Nachdem ich getscript() zum Abrufen des Skripts verwendet habe, gibt es keine einfachere Möglichkeit, das erhaltene Skript in eine Tabelle einzufügen?
2) Ich bin nicht begeistert von der Verwendung von currentdatatable(), damit die Variable dtBigClass nach der Ausführung des Skripts auf die Tabelle zeigt.Scheint anfällig dafür zu sein, dass dort vielleicht das Falsche reinkommt. Angenommen, das Skript schlägt fehl oder es gibt ein Zeitproblem, es wird immer noch daran gearbeitet, dtBigClass irgendeine Tabelle zuzuweisen.Das Skript sieht aus wie „New Table(“Big Class.. blah, blah“ und ich würde wirklich gerne „ dtBigClass=NewTable(“Big Class...blah blah…“ ausführen.Ich würde mich sehr über eine Lösung freuen, bei der ich das Skript in die Form einer Textzeichenfolge „bringen“ kann, die ich bearbeiten und weiter ausführen kann unkompliziert .
Betreff: Verwirrung über JSL in der AusdrucksformDanke!
Ich schätze beide Antworten.Ich sollte wahrscheinlich härter arbeiten, um die auf eval expr() basierenden zu verstehen, aber ich muss zugeben, dass m Die Go-to-Methode besteht darin, eine Textzeichenfolge auszuwerten (parsen ()).Weniger Kopfzerbrechen, außerdem kann ich den Streicherteil abspielen und direkt untersuchen, was ich baue.Ich konnte jedoch nicht herausfinden, wie ich es in eine Zeichenfolge bringen könnte ...
char(dt<
ts=dt<
und dann char(ts)...
...das funktioniert nicht.
Ebenso scheint Ihre Antwort auf 2 super einfach zu sein, aber mir ist nicht in den Sinn gekommen, dass das funktionieren würde!.Ich bin immer noch ein wenig überrascht – für mich ist es nicht klar, dass es etwas zurückgeben würde, das ich in dtBigClass einfügen könnte, aber es ist großartig.
Betreff: Verwirrung über JSL in der AusdrucksformAusdrucksmanipulationen können frustrierend sein. Es ist nicht immer einfach zu wissen, ob Funktionsargumente zur Laufzeit ausgewertet oder einfach so akzeptiert werden, wie sie geschrieben wurden. Bei der Übertragung von Ausdrücken an GUI-Elemente wie Spaltenformeln oder Tabellenskripte ist in der Regel ein gewisser Mehraufwand erforderlich, da das Argument nicht ausgewertet wird. Manchmal ist es einfacher, eine Zeichenfolge zu erstellen und dann eval(parse()) auszuwerten, als die optimale Verwendung von expr(), evalexpr() usw. herauszufinden.
1) Es kann etwas vereinfacht werden. Dieses Beispiel zeigt zwei Möglichkeiten, dies zu tun
dt = Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ;
dt2 = Offen ( „$SAMPLE_DATA/Abrasion.jmp“ ) ;
//1. Ausdruck
Bewertung ( Evaluierungsexpr ( dt2 << neues Skript ( „BigClass“ , dtBigClass = Ausdruck ( dt << Holen Sie sich das Skript )))) ;
//2. Zeichenfolge
Bewertung ( Analysieren ( "dt2 << newscript(\!"BigClass2\!", dtBigClass2 =" || Verkohlen ( dt << getscript ) || ")" )) ;
Schließen ( dt , nosave ) ;
dt2 << Skript ausführen ( „BigClass“ ) ;
dt2 << Skript ausführen ( „BigClass2“ ) ;
2) Sie können die Zuweisung innerhalb des Skripts wie oben oder wie unten ausführen
dtBigClass = dt2 << Skript ausführen ( „BigClass“ ) ;
Betreff: Verwirrung über JSL in der Ausdrucksform1: Fast so kompliziert.NewScript erwartet, dass sein Argument das Skript ist, was oft die richtige Antwort ist. Dieses Mal nicht.
2: Auch CurrentDatatable gefällt mir für diesen Job nicht.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Abrasion.jmp" );
Eval( Eval Expr( dt2 << NewScript( "BigClass", bigclass = Expr( dt << getscript ) ) ) );
replacement ist eine Möglichkeit, aber Sie können EvalExpr auch verwenden, um nur den Expr auszuwerten.Das Ergebnis von EvalExpr ist ein Ausdruck:

was noch ausgewertet werden muss.EvalExpr suchte nach Expr, wertete es aus und gab dann den ursprünglichen Ausdruck mit der vorgenommenen Ersetzung zurück.Wenn wir auf Zeile 3 zurückblicken, wird noch eine Evaluierung durchgeführt, um den NewScript-Befehl tatsächlich auszuführen (jedoch nicht die Zuweisung zu). große Klasse ).
Wenn das Skript mit dem Namen „BigClass“ ausgeführt wird, weist es die Variable zu große Klasse , wodurch die Notwendigkeit von CurrentDatatable entfällt.