JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕,
저는 많은 생산 웨이퍼에 대한 최종 테스터로부터 칩 레벨 파라메트릭 테스트 데이터를 수집해야 합니다.
각 웨이퍼에는 ~ 3000개의 칩과 10개의 매개변수가 있습니다.
이 지원 요청을 위해 더미 SQL을 만들었습니다.
선택하다
I.PRODUCTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2.
.
.
.
에서
"아이템" D,
"테스트 결과" T,
"테스트 결과" TRR,
"테스트로우" TR,
.
.
여기서 I.IDNR = T.IDNR
그리고 T.TESTRESULTNR = TRR.TESTRESULTNR
그리고 TRR.TESTROWIDNR = TR.TESTROWIDNR
그리고 I.LOTIDNR = L.LOTIDNR
그리고 T.VALIDITY = '1'
AND D.WAFERNR IN
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
AND (T.TESTUNITNR LIKE ('HENE%')
그리고 TR.VARIABLENAME IN
( '아세눔',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
......)
그룹화 ...
나열된 첫 번째 웨이퍼( WAF43K309A)에 대한 모든 데이터를 수집하는 경우 수집/가져오기 시간은 ~ 90초입니다.
나열된 처음 2개의 웨이퍼(WAF43K309A,WAF43K310A)에 대한 모든 데이터를 수집하는 경우 수집/가져오기 시간은 ~ 4분입니다.
나열된 처음 3개의 웨이퍼(WAF43K309A,WAF43K310A,WAF43K311A)에 대한 모든 데이터를 수집하는 경우 수집/가져오기 시간은 ~ 7분입니다.
나는 당신이 문제를 볼 것이라고 확신합니다. 수집/가져오기 시간은 웨이퍼 수에 따라 기하급수적으로 증가합니다.
주말에 가끔 해봐야겠어요!!
SQL "Union All" 연산자를 사용하고 한 번에 하나의 웨이퍼에 대한 데이터를 수집하면 각 웨이퍼에 대해 거의 동일한 시간을 사용하여 데이터를 검색할 수 있습니다.
내 목록에 몇 개의 웨이퍼만 있는 경우에는 괜찮습니다. 불행히도, 나는 종종 수십 개의 웨이퍼, 심지어 수백 개의 웨이퍼에서 데이터를 수집해야 합니다.
내부 선택을 사용하여 웨이퍼 목록을 만들 수 있습니다.
예를 들어
.....
그리고 D.WAFERNR IN (
항목에서 WAFERNR 선택
WHERE TESTDATE > SYSDATE-5)
결과 웨이퍼 목록은 다음과 같습니다.
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
JSL을 사용하여 목록을 반복하고 한 번에 하나의 웨이퍼에 대한 데이터를 수집하여 이 목록을 사용할 수 있습니까?
커뮤니티가 제공할 수 있는 창의적인 솔루션을 기대합니다.
해결책은 훌륭한 크리스마스 선물이 될 것입니다
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 요세프,
입력해 주셔서 감사합니다.
SQL 스크립트에서 사용하기 위해 목록을 작성하는 방식이 마음에 들었고 필요할 때 사용할 수 있다고 확신합니다.
이 특별한 경우, 아이디어는 한 번에 하나의 웨이퍼 접근 방식과 비교할 때 데이터 수집 속도를 늦추기 때문에 SQL에서 웨이퍼 목록을 사용하지 않는 것입니다.
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕
나는 다음 스크립트를 사용하여 많은 목록을 포함하는 줄을 만듭니다.
lot_list = 열 ( 1 ) << 값 가져오기 ;
in_list = "('" || 연결 항목 ( lot_list , "','" ) || "')" ;
sql_string = "어디 \!"많이\!" 안에 " || in_list ;
// / 문자열을 보고 싶다면 / / /
보여주다 ( sql_string ) ;
*로트 번호에 공백이 있고 "like" '%lot number'를 검색해야 하는 경우... SQL에서는 작동하지 않습니다. 다른 스크립트를 만들어야 합니다.
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 엠샤프,
입력해 주셔서 감사합니다.
이제 스크립트 섹션의 이 "수직 결합" 섹션을 기본 스크립트에 결합했으며 잘 작동합니다.
데이터 추출에 필요한 시간이 이전보다 훨씬 줄어들었고 전체 절차를 스크립팅하고 자동화할 수 있어 서버 부하가 적은 밤에 이 작업을 수행할 수 있습니다.
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?이 마지막 질문에 대해서는 여러 가지 방법이 있습니다.아마도 가장 간단하고 쉬운 솔루션은 그다지 직관적이지 않을 것입니다.원하는 작업은 테이블 목록을 만든 다음 각 데이터 테이블을 목록에 푸시하는 것입니다. 그런 다음 목록을 한 번에 함께 연결할 수 있습니다.개요는 다음과 같습니다.
myTables = {} ;
을 위한 ( 나 = 1...
dt = SQL 실행 ( ... ) ;
에 집어 넣다 ( myTables , dt ) ;
) ;
dtAll = 새 테이블 ( "모든 데이터" ) ;
dtAll << 사슬 같이 잇다 (
평가 ( myTables ) ,
출력 테이블 ( "모든 데이터" )
) ;
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕하십니까?
귀하의 지원과 인내심에 감사드립니다.
귀하의 의견뿐만 아니라 에릭힐 , 론 혼 그리고 엠샤프 이제 원하는 대로 중첩된 SQL 쿼리를 설정할 수 있습니다.
이 방법은 이 게시물의 시작 부분에서 언급한 고급 데이터 수집 작업으로 직접 전환할 수 있으며 서버에서 데이터가 반환될 때까지 기다리는 많은 시간을 절약할 수 있습니다.
저는 이 연습에서 많은 것을 배웠고 여러분의 모든 노력에 감사드립니다.
마지막 질문....
이제 모든 데이터를 별도의 데이터 테이블에 수집했으므로(데이터 수집 속도를 높이기 위해 수행됨) 모든 데이터 테이블을 저장하지 않고도 모든 열린 테이블에서 연결을 수행하여 더 쉽게 데이터를 수행할 수 있는 방법이 있습니다. 복수?
모든 데이터 테이블을 저장하고 JSL을 사용하여 다시 열 때 연결하여 이미 이 작업을 수행할 수 있지만 이렇게 해야 하는 것은 어리석은 것 같습니다.
모두 행복한 크리스마스 되시길 바라며,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?나는 이것이 트릭을 할 것이라고 생각합니다.
// 테이블 예 - 테이블이 이미 존재하는 경우 이 단계를 수행할 필요가 없습니다. 하지만 생성해야 합니다.
// 그것을 가리킬 변수.
wafer_dt = 새 테이블 ( "웨이퍼 번호" ,
행 추가 ( 9 ) ,
새 열 ( "웨이퍼 번호" ,
성격 ,
명사 같은 ,
값 설정 (
{ "XC6A49L410.1" , "XC6A49L411.1" , "XC6A49L412.1" , "XC6A49L413.1" ,
"XC6A49L414.1" , "XC6A49L415.1" , "XC6A49L416.1" , "XC6A49L417.1" ,
"XC6A49L418.1" }
)
)
) ;
// 예를 들어 테이블이 Wafer Numbers인 경우 이 명령문은 해당 테이블에 변수를 할당합니다.
// wafer_dt = 데이터 테이블("웨이퍼 번호");
// 웨이퍼 번호를 목록에 저장
wafer_list = 열 ( wafer_dt , "웨이퍼 번호" ) << 값을 얻다 ;
dsn_string = "DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;" ;
// 웨이퍼 번호가 루프 중에 대체될 변수인 SQL 문을 생성합니다.
sql_statement = 평가 (
"\[ SELECT WaferNR,WIPSTATUS
"DISCSET"에서
WHERE WaferNR = '^one_wafer^']\" ) ;
// 데이터베이스에 대한 연결 생성
dbc = 데이터베이스 연결 생성 ( dsn_string ) ;
~을 위한 ( 나 = 1 , 나 <= 나이트 ( wafer_list ) , 나 ++,
원웨이퍼 = wafer_list [ 나 ] ;
// 웨이퍼와 동일한 테이블 이름을 지정합니다.필요에 맞게 변경
tbl_name = 원웨이퍼 ;
// 하나의 웨이퍼에 대한 데이터 검색
dt = SQL 실행 ( dbc , sql_statement , tbl_name ) ;
) ;
// 이제 모든 웨이퍼를 별도의 테이블로 검색하는 작업을 완료했습니다.
// 데이터베이스에 대한 연결을 닫습니다.
데이터베이스 연결 닫기 ( dbc ) ;
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?당신은 분명히 내가 말한 메시지와 의도를 놓치고 있습니다.
어쨌든 Ron Horne은 내가 이미 이 문제를 단계별로 해결한 포럼에 링크되어 있기 때문에 이 포럼 게시물이 Ron Horne의 게시물보다 길 필요가 없었습니다.
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?직접 도움을 요청하여 어떤 식으로든 귀하의 기분을 상하게 했다면 MSHARP에 사과드립니다.
저 자신이 이미 언급했듯이 불행히도 저는 JSL의 전문가는 아니지만 이 커뮤니티에서 제공하는 콘텐츠를 기반으로 꽤 많은 작업을 수행했습니다.
저는 사실 2일 JMP JSL 수업에 참석했지만 불행하게도 매우 국제적인 수업을 하는 미국인 교사를 위해 유럽의 현지 사무소에서 조직했기 때문에 많은 기술적 결함이 있었고 2일 동안 많은 시간을 낭비했습니다. 많은 자료와 운동을 다루지 않습니다.
저는 지금까지 이 커뮤니티의 다른 회원들로부터 좋은 피드백을 받았으며 사실 제가 더 많은 지식과 경험을 가지고 있는 영역을 기반으로 향후 자습서에서 JMP와 협력하고 있습니다.
나는 어떤 경우에도 동료 회원들이 제공한 도움을 내 일이라고 주장한 적이 없습니다. 나는 도움이 어디서 오는지, 그리고 다른 커뮤니티보다 더 빠르고 더 학습 곡선을 오를 수 있는 지원 그룹에 속한다는 것이 얼마나 좋은지 공개적으로 말했습니다.
나는 다른 사람들이 내 감정을 공유하고 능력이 부족한 사람들을 계속 지원하고 가르치기를 바랄 뿐입니다.
감사합니다,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?알겠습니다. 가서 해보세요.
나는 당신이 당신의 접근 방식이 잘못되었다고 생각합니다. 간단한 사례에 대한 코드를 직접 제공하기 위해 jmp 커뮤니티가 필요한 경우 복잡한 사례에 대해 코드를 구현할 수 있는 방법이 없습니다. 머리를 넘어 프로젝트를 진행한 것 같습니다.어떤 경우에는 스크립팅 가이드를 읽거나 수업을 듣는 것이 좋습니다.
실제로 커뮤니티를 최대한 활용하려면 먼저 코드를 직접 개발해야 합니다. 그런 다음 디버깅 또는 최적화 중에 중단되면 커뮤니티에서 리팩터링하는 데 더 나은 도움을 줄 수 있습니다.이와 같이 코드를 똑바로 요구하는 것은 표절에 지나지 않습니다.
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 Eric, Ron 및 PMroz,
입력해 주셔서 감사합니다.
불행하게도 제 JSL 역량은 귀하의 모든 정보를 받아 작동하는 스크립트를 작성할 수 있는 수준이 아닙니다.
3개의 입력에서 논리와 순서를 확인할 수 없었습니다. 아직은 헷갈리지만 더 높은 차원에서
내 노력은 내 "wafers.jmp" 목록의 마지막 웨이퍼에 대한 데이터만 반환하는 것입니다.
적어도 혼동하지 않도록 훨씬 더 쉬운 예를 들면 어떻습니까?
"wafers.jmp"라는 파일에 웨이퍼 목록이 있습니다.
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
적절한 SQL을 사용하여 나열된 웨이퍼의 WIPSTATUS를 수집해야 합니다.
웨이퍼NR,WIP상태 선택
"DISCSET"에서
WHERE WaferNR = (위 목록의 모든 웨이퍼)
이렇게 하려면 연결 문자열을 설정해야 합니다.
"DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;ODA=F;TSZ=8192;"
변수 "wafer_id" '^WAFER_ID^'를 설정해야 합니다........
한 번에 한 웨이퍼씩 필요한 데이터를 수집하는 필수 SQL을 구축하기 위한 루프 설정 ........
데이터베이스 연결을 엽니다...
"munged" SQL 실행 .......
에 모든 데이터를 수집 하나의 데이터 테이블 . .......
데이터베이스에서 연결 해제 ??
위의 간단한 예를 사용하여 테스트할 수 있는 스크립트를 구성하는 데 도움을 주시면 더 고급 사례에서 직접 작업을 시도할 수 있습니다.
친애하는,
필립
추신: 이것은 내가 원하는 것에 대한 간단한 예일 뿐이라는 점에 유의하십시오. 이 데이터 수집은 밀리초가 걸리는 반면 고급 사례는 현재 "한 번에 한 웨이퍼에 대한 데이터를 가져올 가능성이 없기 때문에 몇 시간에서 며칠이 걸릴 수 있습니다. 시간".
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?좋은 조언을 해주신 제프님께 감사드립니다.
이 특정 데이터 수집은 실제로 매우 어렵고 많은 TB의 데이터가 포함된 많은 DB 테이블에서 데이터를 검색하므로 신중한 계획이 필요합니다.
자체 DB 관리자 3명과 외부 업체 2명이 최적화 작업을 진행했습니다.
따라서 이러한 "한 번에 하나의 웨이퍼" 방식을 추구하는 이유입니다.
이 접근 방식은 최근 Denodo의 동일한 SQL을 사용하여 성공적으로 시연되었지만 현재 Denodo s/w를 사용할 수 없습니다.
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?루프에서 많은 SQL 문을 실행하는 경우 다른 접근 방식을 취해야 합니다.
dbc = 열린 데이터베이스 연결 ( "<귀하의-연결-문자열-이동-여기>" ) ;
각 행에 대해 (
SQL = ...
SQL 실행 ( dbc , SQL ) ;
) ;
데이터베이스 연결 닫기 ( dbc ) ;
이렇게 하면 데이터베이스에 한 번만 연결할 수 있으므로 약간의 시간을 절약할 수 있습니다.
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?정중하게도 SQL이 적절하게 최적화되었는지 확인하는 것이 좋습니다.
처럼 에릭힐 JOIN 없는 쿼리는 일반적으로 다른 모든 테이블의 모든 행과 모든 테이블의 모든 행과 일치하는 데카르트 제품을 초래합니다. 이것은 매우 시간과 자원 집약적일 수 있습니다. 제공한 예제 코드에 JOIN이 없습니다. 이것이 실제 코드를 대표하는 경우 SQL과 JSL을 개선할 수 있는지 여부를 조사할 가치가 있습니다.
-제프
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 에릭,
원본 SQL에 대해 수정하려고 시도한 스크립트에 감사드립니다.
긴 SQL 문자열이 wafers.jmp의 웨이퍼 목록에서 생성되고 있지만 어떤 이유로든 하나의 웨이퍼에서만 결과를 얻습니다.
하나의 웨이퍼 ID를 여러 번 복사해도 하나의 웨이퍼 값이나 테스트 결과만 나옵니다.
제 이해가 맞길 바라며...
귀하의 예에 따라 먼저 템플릿을 설정했습니다 ....
그런 다음 "wafers.jmp"가 저장되는 기본 디렉토리를 설정합니다 .....
루프 진행 설정.....
각 행(
wafer_id = :웨이퍼 ID;
sql = 평가 삽입( sqlTemplate );
인쇄( SQL );
);
데이터베이스에 연결하고 SQL ???를 실행합니다.
오픈 데이터베이스(
"DSN=TESTING;UID=tepo;PWD=암호;DBQ=생산;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST =T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0 ;ODA=F;TSZ=8192;",
평가 삽입(sql)
);
;
내가 확신하지 못하는 것은 마지막 부분입니다.
모든 아이디어, 제안.
꽤 친해진 것 같은데....
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?링크 주셔서 감사합니다 론.
JMP와 스크립팅을 처음 접하는 저는 아직 논리를 완전히 이해하지 못하지만 알아내려고 노력할 것입니다.
친애하는,
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?시간을 절약해 준 포인터, Ron에게 감사드립니다.그래서 Ron이 지적한 예를 사용하여 관심 있는 웨이퍼 ID를 wafers.jmp라는 데이터 테이블에 넣은 다음 다음 스크립트를 작성했습니다.
SQL 템플릿 = "\[
선택하다
I.PRODUCTNR,
T.TESTUNITNR,
T.MEASUREMENTPOINTNR,
T.CREATIONTIME,
T.RESULT_PARAM1,
T.RESULT_PARAM2
에서
"아이템" D,
"테스트 결과" T,
"테스트 결과" TRR,
"테스트로우" TR,
여기서 I.IDNR = T.IDNR
그리고 T.TESTRESULTNR = TRR.TESTRESULTNR
그리고 TRR.TESTROWIDNR = TR.TESTROWIDNR
그리고 I.LOTIDNR = L.LOTIDNR
그리고 T.VALIDITY = '1'
AND D.WAFERNR = '^wafer_id^'
AND (T.TESTUNITNR LIKE ('HENE%')
그리고 TR.VARIABLENAME IN
( '아세눔',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
열려 있는 ( "웨이퍼.jmp" ) ;
각 행에 대해 (
wafer_id = : 웨이퍼 ID ;
SQL = 평가 삽입 ( sqlTemplate ) ;
인쇄 ( SQL ) ;
) ;
그것은 물론 munged SQL을 출력할 뿐입니다. 데이터베이스에 SQL을 제출하는 코드를 추가할 수 있습니다.
HTH,
에릭
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 제이폴 ,
아마도 이 예제가 유용할 수 있습니다.
https://community.jmp.com/message/223900#223900
론
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?이봐, 필립
알겠습니다. 죄송합니다. 확인하고 싶었습니다.나는 루핑의 예를 만들 것입니다.
에릭
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?안녕 에릭.
걱정 해 주셔서 감사합니다.
언급했듯이 이것은 원본보다 훨씬 짧은 더미 Sql입니다.
SQL이 아닌 JSL 관점에서 사례를 제시하고 싶었습니다.
Rgds
필립
Re: JSL 스크립트에서 사용되는 SQL에 루프를 삽입하는 방법은 무엇입니까?이봐, 필립
루핑은 확실히 가능하지만 먼저 해야 할 일이 있습니다. 작성된 대로 SQL 문은 기하급수적인 크기 증가를 설명할 수 있는 데카르트 곱을 생성합니다.그게 필요한가요?
에릭