도움말: "새 스크립트"의 실제 값을 데이터 테이블로 보내는 JSL 스크립트[JMP Pro 14.1.0, OS W7 64비트]
여러분 모두에게,
일부 고객의 데이터 테이블을 자동화하는 작업을 진행 중입니다. 데이터 테이블에는 날짜 열과 여러 제품 속성 열이 포함되어 있으며 모두 사양 제한이 있습니다.
제가 하려는 작업 중 하나는 데이터 테이블에 새 스크립트를 추가하여 고객이 쉽게 데이터 테이블의 녹색 핫 버튼을 클릭하고 관심 있는 속성에 대한 관리 차트를 얻을 수 있도록 하는 것입니다.
데이터 테이블의 모든 열 이름을 포함하는 "SpecList"라는 목록이 있고 품질을 위한 "사양 제한 관리" 도구에 필요한 일반적인 _LSL, _USL 및 _Target 열 이름이 포함된 사양 데이터 테이블이 있습니다. 및 프로세스 제어.
New Script 함수 내에서 For 루프를 사용하여 새 스크립트를 생성하고 싶습니다. 적어도 이것이 개념입니다. 테이블에 보내고 싶은 내용의 예는 다음과 같습니다. For 루프에서 [1]이 최종적으로 [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 열이 작동하지 않습니다. 가리키는 참조 대신 작성된 내용을 정확하게 다시 보냅니다. 그러나 위의 원본 스크립트(첫 번째 스크립트)에서 Control Chart Builder 기능을 강조 표시하면 제대로 작동합니다.
이 문제를 해결하여 리터럴 JSL 스크립트 대신 새 스크립트에 참조된 실제 값을 보낼 수 있는 방법을 원합니다. 그 이유는 다른 제품에 적용할 수 있도록 스크립트를 가능한 한 일반적인 것으로 작성하려고 하고 있으며 다른 제품에 적용하기 위해 수정/업데이트하기 위해 스크립트를 너무 깊이 파고들 필요가 없기 때문입니다. 제품.
문제의 일부는 내 변수 이름이 모두 내 기본 스크립트에 있고(이름의 기본값을 여기(1)로 설정함) 데이터 테이블에 새 스크립트를 보낼 때 변수를 평가하는 방법을 모른다는 것입니다. 정의되지 않은 변수에 대한 참조입니다. 데이터 테이블에 기록되는 스크립트에 이러한 변수를 보내야 할 수도 있지만 방법을 잘 모르겠습니다. 전역 변수도 생성하지 않는 것이 좋습니다.
감사해요!,
DS
Re: 도움말: "새 스크립트"의 실제 값을 데이터 테이블로 보내는 JSL 스크립트멋지네요 업무에 대한 해결책을 찾았네요 @SDF1 ! 그 코드는 나에게 여러 번 도움이 되었습니다. 그리고 @ian_jmp , SubstituteInto()를 사용하면 정말 좋은 기능이군요. 나는 그것이 어떻게 더 역동적이고 제어될 수 있는지 확실히 알 수 있습니다. 툴박스에 추가해야겠어요 
Re: 도움말: "새 스크립트"의 실제 값을 데이터 테이블로 보내는 JSL 스크립트안녕 @nathan-clark 그리고 @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>