ヘルプ: 「新しいスクリプト」内の実際の値をデータテーブルに送信するための JSL スクリプト【JMP Pro 14.1.0、OS W7 64ビット】
親愛なるみんな、
私は一部の顧客向けにデータテーブルの自動化に取り組んでいます。 データ テーブルには日付列といくつかの製品プロパティ列が含まれており、すべて仕様制限が設定されています。
私がやろうとしていることの 1 つは、データ テーブルに新しいスクリプトを追加して、顧客がデータ テーブルの緑色のホット ボタンをクリックして、興味のあるプロパティの管理図を簡単に取得できるようにすることです。
データ テーブル内のすべての列名を含む「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] を送信します。 次に、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
Re: ヘルプ: 「新しいスクリプト」内の実際の値をデータテーブルに送信する JSL スクリプト素晴らしいですね、解決策を見つけましたね@SDF1 ! このコードのおかげで何度も助けられました。 そして@ian_jmpこれは、SubstituteInto() の非常に優れた機能です。 これを使えば、よりダイナミックでコントロールできることがはっきりとわかります。 ツールボックスに追加する必要があります:)
Re: ヘルプ: 「新しいスクリプト」内の実際の値をデータテーブルに送信する 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
)}
)
)
)
)
)
)
);Re: ヘルプ: 「新しいスクリプト」内の実際の値をデータテーブルに送信する 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;
Re: ヘルプ: 「新しいスクリプト」内の実際の値をデータテーブルに送信する JSL スクリプトこれを行うために私が見つけた最良の方法は、Eval() と EvalExpr() を使用することです...基本的に、スクリプト内の変数は式であり、eval 式はそれらを評価するため、テーブル スクリプトの最終評価には、テーブル スクリプトの最終的な評価には実際の値が含まれます。変数。 以下は、テーブル スクリプトを作成した場所で取得した簡単な例です。変数 (parseUnique) ではなく特定の列名が挿入されます。 parseUnique は、列名のテキスト文字列を :Name() 関数に挿入することによって作成され、列名がより適切に機能するようになります。
式 (tblName) 内で作成した変数については心配する必要はありませんが、外部ソースから取得した変数は関数内の式になります。
parseUnique = EvalInsert(":Name(\!"^uniqueCol^\!")");Eval(
EvalExpr(
dt_algorithm << New Script("Make justResults",
tblName = currentdatatable()<<GETNAME></GETNAME>