幫助:JSL 腳本將“新腳本”中的實際值發送到數據表[JMP Pro 14.1.0,操作系統 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( {} , SpecList[1],....”之後以及 Add Ref Line() 部分。
Dispatch SpecList[1] 按字面意思發送 SpecList[1],而不是從列表中插入文本。 然後,在“添加參考線”部分中,它還按字面意思發送 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 腳本。 原因是我試圖編寫盡可能通用的腳本,以便它可以應用於其他產品,並且不需要深入研究腳本來修改/更新,以便將其推廣到其他產品產品。
我認為問題的一部分是我的變量名稱都存在於我的主腳本中(我將名稱默認設置為此處(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>