我对 JMP Pro、JMP Live 和 JSL 都非常陌生。我的问题是这样的:我有一个刷新脚本,可以成功地从 SSMS 数据库中提取规格限制并将其应用到列属性中;现在我想从另一个表中提取数据,为数据集中的所有过程变量应用单独的控制限制。当我添加我认为正确的代码块来实现这一点时,它仍然会设置规格限制,但控制限制却没有生效。日志中没有任何错误信息,所以我知道它默默地忽略了这些新代码块,但我不知道这意味着什么。
如果有人能指点我一下,我将不胜感激!
sql_query_main = " SELECT * FROM jmpTop30WideView WHERE Product LIKE '1/2 RS' AND TestType IN ('Retest', 'Hot')";
sql_query_limits = "SELECT Property AS Variable, LSL, Target, USL FROM ProductSpecsLongView WHERE [Product] LIKE '1/2 RS' ";
sql_query_Control = "SELECT Property AS Variable, Avg, LCL, UCL FROM ControlLimitsTable WHERE [Product] LIKE '1/2 RS' ";
main = Open Database(
"DATABASE=XXXXXXXXXXXXXX;
DRIVER={SQL Server};
PWD=%_PWD_%;
SERVER=XXX-XXXXX;
TRUSTSERVERCERTIFICATE=Yes;
UID=%_UID_%;",
sql_query_main
);
limits = Open Database(
"DATABASE=XXXXXXXXXXXXXX;
DRIVER={SQL Server};
PWD=%_PWD_%;
SERVER=XXX-XXX-XXXXX;;
TRUSTSERVERCERTIFICATE=Yes;
UID=%_UID_%;",
sql_query_limits
);
Control = Open Database(
"DATABASE=XXXXXXXXXXXXXX;
DRIVER={SQL Server};
PWD=%_PWD_%;
SERVER=XXX-XXXXXX;;
TRUSTSERVERCERTIFICATE=Yes;
UID=%_UID_%;",
sql_query_Control
);
Column(main, "DateTimeStampUnique") << Set Property("Label", 1);
main << Set Label Columns(:DateTimeStampUnique);
// References
dtMain = main;
dtLimits = limits;
dtControl = Control;
For Each Row(
dtLimits,
variable = dtLimits:Variable[];
lsl = dtLimits:LSL[];
target = dtLimits:Target[];
usl = dtLimits:USL[];
Eval(Eval Expr(Column(dtMain, variable) << Set Property("Spec Limits", {LSL(Expr(lsl)), Target(Expr(target)), USL(Expr(usl)), Show Limits(1)})));
If(Contains(dtMain << Get Column Names, variable),
Column(dtMain, variable) << Set Property("Spec Limits", {LSL(lsl), Target(target), USL(usl)})
);
);
For Each Row(
dtControl,
variable = dtControl:Variable[];
Avg = dtControl:Avg[];
LCL = dtControl:LCL[];
UCL = dtControl:UCL[];
Eval(Eval Expr(Column(dtMain, variable) << Set Property("Control Limits", {Avg(Expr(Avg)), LCL(Expr(LCL)), UCL(Expr(UCL)), Show Limits(1)})));
If(Contains(dtMain << Get Column Names, variable),
Column(dtMain, variable) << Set Property(
"Control Limits",
{AVG(), LCL(), UCL()}
)
);
);
dtMain;
编辑(jthi):添加了jsl格式(我保留了剧透块中的原始脚本,因为其中有很多缺失的括号,我需要进行修正)。
查看更多...
sql_query_main = " SELECT * FROM jmpTop30WideView WHERE Product LIKE '1/2 RS' AND TestType IN ('Retest', 'Hot')";
sql_query_limits = "SELECT Property AS Variable, LSL, Target, USL FROM ProductSpecsLongView WHERE [Product] LIKE '1/2 RS'";
sql_query_Control = "SELECT Property AS Variable, Avg, LCL, UCL FROM ControlLimitsTable WHERE [Product] LIKE '1/2 RS'";
main = 打开数据库(
数据库=XXXXXXXXXXXXXX;
驱动程序={SQL Server};
PWD=%_PWD_%;
服务器=XXX-XXXXX;
信任服务器证书=是;
UID=%_UID_%;",
sql_query_main
);
limits = 打开数据库(
"数据库=XXXXXXXXXXXXXX;
驱动程序={SQL Server};
PWD=%_PWD_%;
服务器=XXX-XXX-XXXXX;;
信任服务器证书=是;
UID=%_UID_%;",
sql_query_limits
);
控制 = 打开数据库(
数据库=XXXXXXXXXXXXXX;
驱动程序={SQL Server};
PWD=%_PWD_%;
服务器=XXX-XXXXXX;;
信任服务器证书=是;
UID=%_UID_%;",
sql_query_Control
);
Column( main, "DateTimeStampUnique") << Set Property( "Label", 1 );
main << 设置标签列( :DateTimeStampUnique );
// 参考
dtMain = main;
dtLimits = limits;
dtControl = Control;
对于每一行(dtLimits,
variable = dtLimits:Variable[];
lsl = dtLimits:LSL[];
target = dtLimits:Target[];
usl = dtLimits:USL[];
评估(评估表达式(
列( dtMain, 变量 ) <<
设置属性(
“规格限制”,
{LSL(表达式(lsl)), Target(表达式(target)), USL(表达式(usl)), 显示限制(1)}
)
));
如果(
包含(dtMain << 获取列名,变量),
列( dtMain,变量 ) << 设置属性(
“规格限制”,
{LSL( lsl ), Target( target ), USL( usl )}
)
对于每一行(dtControl,
variable = dtControl:Variable[];
平均值 = dtControl:平均值[];
LCL = dtControl:LCL[];
UCL = dtControl:UCL[];
评估(评估表达式(
列( dtMain, 变量 ) <<
设置属性(
“控制限值”,
{Avg(Expr(Avg)), LCL(Expr(LCL)), UCL(Expr(UCL)), 显示限制(1)}
)
));
如果(
包含(dtMain << 获取列名,变量),
列( dtMain,变量 ) << 设置属性(
“控制限值”,
{AVG(), LCL(), UCL()}
)
);
);
dtMain;
自动化和脚本编写
我估计如果指定控制图类型,这种方法应该可行,所以不要指定控制图类型。
<< Set Property( "Control Limits", {Avg( Expr( Avg ) ), LCL( Expr( LCL ) ), UCL( Expr( UCL ) ), Show Limits( 1 )} )t
尝试
<< Set Property( "Control Limits", {XBar( Avg( Expr( Avg ) ), LCL( Expr( LCL ) ), UCL( Expr( UCL ) ), Show Limits( 1 ) )} )
(将“XBar”替换为您所需的控制图类型)
另外,我建议你尝试注释掉那些在已经设置好规格限制和控制限制之后仍然试图再次设置它们的冗余的 If() 语句。看看是否能达到你想要的效果。
您提供的 JSL 文件存在语法错误。当我尝试重新格式化时,第 67 行因为缺少分号 (;) 而失败。修正分号后,又因为找不到各个 For Each Row 代码块的右括号 () 而失败。这严重阻碍了我的调试,因为如果 For 代码块没有正确闭合,就很难推断程序的逻辑流程。
请更正这些错误,然后重新提交。
另外,请使用输入窗口顶部的 JSL 图标将您的 JSL 代码插入到讨论区。这样有助于读者更好地评估您的代码。
这条回复加上另一条回复确实有所帮助。现在 JMP Live 中的警告分类功能仍然报错,提示限制值需要保持静态,但这些限制值实际上是用户自定义的。