帮助:JSL 脚本将“新脚本”中的实际值发送到数据表[JMP Pro 14.1.0,OS W7 64 位]
各位,
我正在为一些客户自动化数据表。 数据表包含一个日期列和几个产品属性列,均具有规格限制。
我正在尝试做的一件事是将新脚本添加到数据表中,以便客户可以轻松单击数据表中的绿色热按钮并获取他们感兴趣的任何属性的控制图。
我有一个名为“SpecList”的列表,其中包含数据表中的所有列名,并且我有一个规范数据表,其中包含“管理规范限制”工具质量所需的常用 _LSL、_USL 和 _Target 列名和过程控制。
我想在 New Script 函数中使用 For 循环生成新脚本——至少是这个概念。 下面是我想发送到表格的一个示例,我希望 [1] 最终成为 For 循环中的 [i]:
dtperf << New Script(
"Control Chart " || SpecList[1],
Control Chart Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables( Subgroup( :Date ), Y( Column(dtperf, SpecList[1]) ) ),
Chart( Position( 1 ), Limits ),
Chart( Position( 2 ), Limits ),
SendToReport(
Dispatch(
{},
SpecList[1],
ScaleBox,
{Add Ref Line( dtspecs:Name( "_LSL" )[1], "Solid", "Blue", "LSL", 1 ), Add Ref Line(
dtspecs:Name( "_USL" )[1],
"Solid",
"Blue",
"USL",
1
), Add Ref Line( dtspecs:Name( "_Target" )[1], "Solid", "Blue", "USL", 1 )}
)
)
)
);它的一部分按我的意图工作,其他的则没有。 新脚本的名称如您所愿。 我遇到了麻烦,尤其是 Dispatch 部分。 在 "Dispatch( {} , SpecList[1],...." 之后,并使用 Add Ref Line() 部分。
Dispatch SpecList[1] 从字面上发送 SpecList[1] 而不是从列表中插入文本。 然后,在 Add Ref Line 部分,它还按字面意思发送 dtspecs:Name("_LSL")[1] 而不是数据表中的值。 保存到数据表的脚本如下:
Control Chart Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables( Subgroup( :Date ), Y( Column(dtperf, SpecList[1]) ) ),
Chart( Position( 1 ), Limits ),
Chart( Position( 2 ), Limits ),
SendToReport(
Dispatch(
{},
SpecList[1],
ScaleBox,
{Add Ref Line( dtspecs:_LSL[1], "Solid", "Blue", "LSL", 1 ),
Add Ref Line( dtspecs:_USL[1], "Solid", "Blue", "USL", 1 ),
Add Ref Line( dtspecs:_Target[1], "Solid", "Blue", "USL", 1 )}
)
)
)我已经尝试将 Char()、Num()、Try() 和 Eval() 包裹在相关代码的各个部分中,看看它是否可以工作,但它没有。
此外,变量中的 Y 列不起作用。 它再次发送准确的内容,而不是它指向的引用。 但是,当我在上面的原始脚本(第一个脚本)中突出显示控制图生成器功能时,它工作得很好。
我想要一种方法来解决这个问题,以便它发送引用到新脚本而不是文字 JSL 脚本的实际值。 原因是我正在尝试编写尽可能通用的脚本,以便它可以应用于其他产品,并且不需要深入挖掘脚本来修改/更新以便为其他产品推出产品。
我认为问题的一部分是我的变量名都存在于我的主脚本中(我将名称默认设置为 here(1)),并且当它将新脚本发送到数据表时,它不知道如何评估引用未定义的变量。 我可能需要将这些变量发送到正在写入数据表的脚本,但我不确定如何。 我也不想生成全局变量。
谢谢!,
DS
回复:帮助:JSL 脚本将“新脚本”中的实际值发送到数据表太棒了,你有一个工作解决方案@SDF1 ! 那段代码帮助了我无数次。 和@ian_jmp ,这是 SubstituteInto() 的一些非常好的东西。 我绝对可以看到它如何变得更加动态和可控。 我需要将它添加到我的工具箱中:)
回复:帮助:JSL 脚本将“新脚本”中的实际值发送到数据表你好@内森克拉克和@ian_jmp ,
我非常感谢您的反馈和想法。 使用的一些东西现在超出了我的水平,我不太清楚如何实现它们。
另一方面,根据您的反馈,我修改了我的代码并让它以对我有意义的方式工作。 它可能不是很优雅,但它确实有效并且完全符合我的计划。
一旦我意识到 For 循环需要在所有事物的外部,它就工作得很好。 现在有意义的是,我需要将 CharList[i] 转换为然后需要通过 EvalExpr 运行的表达式,然后需要对所有这些进行评估,以便将具有所需输入的新脚本发送到数据表.
下面是我的代码,我如何让它工作。
谢谢您的帮助!
DS
For( i = 1, i <= N Items( ChartList ), i++,
Eval(
Eval Expr(
dtperf << New Script(
"Control Chart " || Expr( ChartList[i] ),
Control Chart Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables( Subgroup( :Date ), Y( Expr( Column( dtperf, ChartList[i] ) ) ) ),
Chart( Position( 1 ), Limits ),
Chart( Position( 2 ), Limits ),
SendToReport(
Dispatch(
{},
Expr( ChartList[i] ),
ScaleBox,
{Add Ref Line( Expr( dtspecs:Name( "_LSL" )[i] ), "Solid", "Blue", "LSL", 1 ),
Add Ref Line( Expr( dtspecs:Name( "_USL" )[i] ), "Solid", "Blue", "USL", 1 ), Add Ref Line(
Expr(
dtspecs:Name( "_Target" )[i]
),
"Solid",
"Blue",
"USL",
1
)}
)
)
)
)
)
)
);回复:帮助:JSL 脚本将“新脚本”中的实际值发送到数据表FWIW,可能是个人喜好,但我倾向于使用“SubstituteInto()”来处理这种事情:
NamesDefaultToHere(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Template script for Control Chart Builder
myCCB =
Expr(
Control Chart Builder(
Size( 529, 453 ),
Show Control Panel( 0 ),
Show Capability( 0 ),
Variables( Y( YTBD ) ),
Chart( Position( 1 ), Limits( Sigma( "Moving Range" ) ) ),
Chart( Position( 2 ), Limits( Sigma( "Moving Range" ) ) ),
SendToReport(
Dispatch(
{},
yNameTBD,
ScaleBox,
{Add Ref Line( HLineTBD, "Dashed", "Green", "", 1 )}
)
)
)
);
// Update the template script
SubstituteInto(myCCB,
Expr(yTBD), Column(dt, "height"),
Expr(yNameTBD), "height",
Expr(HLineTBD), 55
);
// Save the script in the table
CMD = Expr(dt << newScript("My Control Chart Builder", scriptTBD));
SubstituteInto(CMD,
Expr(scriptTBD), NameExpr(myCCB)
);
CMD;
回复:帮助:JSL 脚本将“新脚本”中的实际值发送到数据表我发现做到这一点的最好方法是使用 Eval() 和 EvalExpr() ...基本上,脚本中的变量是表达式,而 eval 表达式对它们进行评估,因此表脚本的最终评估具有实际值,而不是变量。 下面是一个快速示例,我在其中创建了一个表脚本,它将插入特定的列名,而不是变量 (parseUnique)。 parseUnique 是通过将列名的文本字符串插入 :Name() 函数来创建的,因此列名可以更好地工作。
我不需要担心我在表达式 (tblName) 中创建的变量,但是来自外部来源的任何变量都会成为函数中的表达式。
parseUnique = EvalInsert(":Name(\!"^uniqueCol^\!")");Eval(
EvalExpr(
dt_algorithm << New Script("Make justResults",
tblName = currentdatatable()<<GETNAME></GETNAME>