안녕하세요. 원시 데이터를 데이터 테이블(dt1)로 가져온 다음 사양 제한(dt2)이 있는 다른 데이터 테이블을 여는 상황이 발생했습니다.사양 제한 테이블에는 USL과 LSL만 있습니다.대상 사양 제한(평균(USL,LSL))인 dt2에 계산된 새 열을 삽입합니다.그런 다음 원시 데이터 dt1의 모든 행을 반복하고 테스트 이름과 사양 제한이 일치하면 사양 제한이 있는 열 속성을 설정합니다(예: col << Set Property( "Spec Limits", { LSL( myLSLx ), USL( myUSLx ), Target( mytargetx ), );)... 그런 다음 사양 파일 dt2를 닫고 저장하지 않습니다.
내가 겪고 있는 문제는 계산된 열(dt2:_Target)이 충분히 빠르지 않고 새 계산된 열("_Target"...)을 만든 직후에 값을 읽으려고 할 때 모든 빈 값을 얻는다는 것입니다.dt2 파일을 열어두면 계산된 열 "_Target"에 올바른 값이 표시됩니다.나는 dt2<< 데이터 업데이트 시작; 그것도 작동하지 않지만 스크립트의 잘못된 위치에 넣을 수 있습니까?내가 가진 유일한 해결 방법은 새 열에 대한 수식을 사용하지 않고 스크립트에서 대상 값을 계산하고 모든 행을 인덱싱하여 사양 파일에 배치하는 것입니다.
내 질문의 근원은 행/열의 특정 값을 읽으려고 시도하기 전에 계산으로 모든 열이 완료될 때까지 기다릴 수 있습니까?
작동하지 않습니다
예를 들어,
New Column( "_Target",Numeric,"Continuous",Format( "Best", 12 ),Formula(If( Is Missing( :_LSL ) | Is Missing( :_USL ),
Empty(),
Mean( :_LSL, :_USL )
)
해결 방법
예를 들어,
dt2 = current data table();
New Column( "_Target", Numeric, "Continuous");
dt2_rows = nrows();
for (i=1, i<=dt2_rows, i++,
if(or(!is missing(dt2:_LSL[i]),!is missing(dt2:_USL[i])),
dt2:_Target[i] = ((dt2:_LSL[i]) + (d2t:_USL[i])) / 2;
,
);
이것은 단순한 "쌓기" 주석입니다.@txnelson 의 공식이 제공한 것보다 더 뚱뚱해질 것입니다.열 수식은 for 루프보다 빠르게 실행됩니다. 또한 JMP는 값이 비어 있는 모든 계산에서 empty()를 반환하므로 조건문이 필요하지 않습니다. 따라서 (:USL + :LSL)/2는 값 중 하나 또는 둘 모두가 비어 있으면 비어 있게 됩니다.
참고용입니다.
이 메시지가 스크립팅 가이드에 설명되어 있지 않은 것이 맞습니다. JSL 구문 가이드에 설명되어 있습니다. 첫 번째 책은 JSL의 모든 기능과 메시지에 대한 완전한 설명이 아니지만 두 번째 책은 완전해야 합니다. 두 책은 서로를 보완하고 함께 사용하기 위한 것입니다.
메시지는 도움말 링크와 함께 스크립팅 인덱스에서도 다루어집니다. '수식'을 검색하면 << 수식 실행 및 << 수식 다시 실행 메시지가 포함된 목록이 반환됩니다.
"재방송"도 인식하지 못했습니다. 필요 여부에 관계없이 수식이 재평가되는 것처럼 보입니다. 수식에 난수를 사용하면 그 차이를 확인할 수 있습니다. 대부분의 경우 <
다음은 귀하에게 적합한 간단한 수정입니다.첫째, If() 절을 제거하면 처리 속도가 빨라지고 둘째,
dt << 재실행 수식;
계속하기 전에 JMP가 공식에 대한 처리를 완료하도록 합니다.
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;
테이블에 '수식 실행' 메시지를 보내 보세요.
dt << runFormulas;