对 JSL 的表达形式感到困惑<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我想将一个小表存储在另一个表中,以便在同一报告中使用这两个表的脚本可以在需要时重建小表。这似乎是一个不错的解决方案,因为表的用户还可以轻松打开那个小的相关信息表,同时仅存储一个数据表。
在对 expr() 语法层咬牙切齿之后,我确实得到了以下工作......
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = 打开("$SAMPLE_DATA/Abrasion.jmp");
ts=dt<< 获取脚本();
关闭(dt,nosave);
ne=nameexpr(ts);
eval(substitute(expr(dt2<
//...之后...
dt2<
dtBigClass=当前数据表();
但是,2个问题...
1)事情真的有这么复杂吗?使用 getscript() 获取脚本后,是否没有更简单的方法将我获得的脚本“放入”表中?
2)我对运行脚本后使用 currentdatatable() 让变量 dtBigClass 指向表并不感到兴奋。似乎很容易把错误的东西放在那里。 假设脚本失败或存在一些计时问题,它仍在将某些表或其他表分配给 dtBigClass。该脚本看起来像“New Table("Big Class..blah,blah",我真的很想运行“ dtBigClass=NewTable("Big Class...blah blah..."我很高兴有一个解决方案,我可以将脚本“获取”为文本字符串的形式,我可以编辑和运行更多直接地。
回复:对 JSL 的表达形式感到困惑谢谢!
我很欣赏这两个答案。我可能应该更加努力地理解基于 eval expr() 的那些,但我不得不承认我y 首选方法是 eval(parse()) 文本字符串。不用费太多心思,而且我可以运行弦乐部分并直接检查我正在构建的内容。但是,我不知道如何将其放入字符串中......
char(dt<
ts=dt<
然后 char(ts)...
...那是行不通的。
同样,你对2的答案似乎非常简单,但我没想到这会起作用!我仍然有点惊讶 - 对我来说并不明显它会返回一些东西放入 dtBigClass 但它很棒。
回复:对 JSL 的表达形式感到困惑表达式操作可能会令人沮丧。 要知道函数参数是在运行时计算还是只是按照编写的方式接受并不总是那么容易。 通常,当将表达式传输到 GUI 元素(例如列公式或表脚本)时,需要一些额外的工作,因为不会计算参数。 有时构建一个字符串然后 eval(parse()) 比找出最佳用法 expr()、evaexpr() 等更容易。
1)可以稍微简化一下。 这个例子展示了两种方法
dt =打开( “$SAMPLE_DATA/大类.jmp” ) ;
dt2 =打开( “$SAMPLE_DATA/磨损.jmp” ) ;
//1. 表达
评估(求值表达式( dt2 <<新脚本( 《大班》 , dtBigClass =表达式( dt <<获取脚本)))) ;
//2. 细绳
评估(解析( "dt2 << newscript(\!"BigClass2\!", dtBigClass2 =" ||查尔( dt <<获取脚本) || “)” )) ;
关闭( dt ,不保存) ;
dt2 <<运行脚本( 《大班》 ) ;
dt2 <<运行脚本( 《大班2》 ) ;
2)您可以按照上面的方式在脚本中进行分配,或者如下所示
dtBigClass = dt2 <<运行脚本( 《大班》 ) ;
回复:对 JSL 的表达形式感到困惑1:几乎那么复杂。NewScript 期望其参数是脚本,这通常是正确的答案。 这次不行。
2:我也不喜欢 CurrentDatatable 来完成这项工作。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Abrasion.jmp" );
Eval( Eval Expr( dt2 << NewScript( "BigClass", bigclass = Expr( dt << getscript ) ) ) );
替代是一种方法,但您也可以使用 EvalExpr 来仅计算 Expr。EvalExpr 的结果是一个表达式:

这仍然需要评估。EvalExpr 查找 Expr 并对其求值,然后返回进行替换的原始表达式。回顾第 3 行,还执行了一个 Eval 来实际运行 NewScript 命令(但没有分配给大班)。
当名为“BigClass”的脚本运行时,它会分配变量大班,避免了对 CurrentDatatable 的需要。