jmp 쿼리 및 스크립트 통합을 지원합니다.최근 제조 데이터를 jmp 테이블로 직접 가져와 분석하기 위해 jmp를 사용하기 시작했습니다.
일반적으로 내 요구 사항은 처리되고 차트를 만드는 모든 배치에 대해 제조 프로세스의 각 프로세스 단계에 대한 데이터를 추출하는 것입니다.
그래서 각 프로세스에 대한 jmpqueires를 만드는 것으로 시작했습니다. 그리고 종종 프로세스 코드와 추출을 쿼리에 대한 입력으로 원하는 날짜를 제공하고 싶습니다.
따라서 모든 jmpqueries에는 다음 필터가 있으며 쿼리를 실행할 때마다 변경할 수 있도록 날짜를 프롬프트 변수로 유지했습니다.

나는 또한 거의 항상 데이터가 차트를 그릴 때 원하는 형식과 모양으로 저장되지 않기 때문에 일부 후처리 스크립트를 가지고 있습니다. 이렇게 하면 원래 쿼리의 추출과 함께 나오는 테이블에서 새 테이블을 만들어야 합니다.
따라서 모든 jmpqueries는 두 개의 테이블을 생성하게 됩니다. 예는 아래에 나와 있습니다.

이것은 꽤 잘 작동했습니다. 지금까지는 여러 jmp 쿼리에서 생성된 여러 테이블을 결합하여 이러한 쿼리를 통합하기 시작했습니다.
그래서 아래 스크립트를 작성하기 시작합니다.
finCDquery = open( "PATH\New M33 final CD.jmpquery", Private );
devCDquery = open( "PATH\New M33 develop CD.jmpquery", Private );
M33finCD = finCDquery << Run Foreground(Private);
M33devCD = devCDquery << Run Foreground(Private);
Data Table( "M33-CD QUERY" ) << Join(
With( Data Table( "M33D-CD QUERY" ) ),
Select(.
.
.
.
이제 제가 도움을 드리고 싶은 사항이 있습니다. 기대한 반응을 얻지 못하기 때문입니다.
- 첫째, 모든 쿼리에는 날짜 프롬프트가 있으므로 그 사이에 날짜를 지정하고 확인을 여러 번 클릭해야 합니다. 내가 제공한 첫 번째 날짜가 모든 후속 jmp 쿼리에 사용되도록 쿼리를 수정하려면 어떻게 해야 합니까?
- 비공개로 표시하고 싶지 않은 테이블을 열었지만 그럼에도 불구하고 계속 표시됩니다. 내가 뭘 잘못하고 있죠?
- 모든 jmpquey에 대한 SQL 쿼리가 있습니다. 지금 하는 것처럼 각 jmpquery 파일을 여는 대신 스크립트에 쿼리를 넣을 수 있습니까?
스크립팅Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.@pmroz @Georg 고마워 얘들아!!
쿼리를 \[로 묶는 것은 두 번째 문제에 대한 트릭을 수행합니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.JSL에서 SQL을 개발하는 것은 어렵습니다. @Georg 언급은 SQL Developer 또는 PL/SQL Developer와 같은 도구를 사용합니다.
나는 개발했다 log_execute_sql 몇 년 전 기능 - 파일 교환에 게시되었습니다. Oracle ODBC SQL에 대한 오류 트래핑
이는 JSL에서 SQL을 디버그하는 데 매우 중요한 도움이 되었습니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.@pmroz 일반 인용 \[ \]을 사용하여 제안해 주셔서 감사합니다. 이것은 제가 생각하지 못한 또 다른 방법입니다.
그런 식으로 작동하지 않는 한, 저는 개인적으로 SQL에서 이름의 하이픈과 큰 따옴표를 좋아하지 않습니다. 왜냐하면 과거에 이로 인해 많은 고통을 겪었기 때문입니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.오류는 작은따옴표를 사용하여 열 머리글을 설정하려고 하기 때문입니다.Oracle은 열 이름을 큰따옴표로 묶기를 원합니다.이것은 작동해야 합니다. 저는 \[ 및 ]\를 사용하여 성가신 이스케이프 문자 없이 문자열에 큰 따옴표를 사용할 수 있도록 합니다.
M32FICDSQL =
"\[SELECT t1.LOTID, t2.COMPIDS AS WAFERID, t1.EQPID, t2.REVDATE AS "M32-FICD-DATE",
t1.PARTID, t1.RECPID, t2.ITEMPROMPT, t2.NUMERICVALUE,
t3.LOTTYPE
FROM PLLDBA.TRES t1
LEFT OUTER JOIN PLLDBA.ACTL t3
ON ( t1.LOTID = t3.LOTID )
INNER JOIN PLLDBA.TRES_RAWDATA t2
ON ( ( t1.TESTOPNO = t2.TESTOPNO ) AND ( t1.REVDATE = t2.REVDATE ) )
WHERE ( ( ( (t1.TESTOPNO LIKE '%JG43%' ) ) AND ( t2.REVDATE >= TO_TIMESTAMP('01Jan2019:18:42:42', 'DDMONYYYY:HH24:MI:SS') ) AND ( t2.ITEMPROMPT IN ( 'ITEM1' , 'MITEM2' , 'ITEM3' , 'ITEM4' ) ) AND ( (t1.RECPID LIKE '%HJ546%' ) ) AND ( (t3.LOTTYPE LIKE '%PT%' ) ) AND ( (t1.PARTID LIKE '%C765G%' ) ) ) )
ORDER BY t2.COMPIDS DESC, t2.REVDATE ASC;]\";
계속 문제가 발생하면 AS 명령을 사용하지 말고 대신 JSL에서 열 이름을 변경하십시오.그럴 필요는 없습니다. 저는 이 구문을 문제 없이 항상 사용합니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.@spoikayil , 당신은 올바른 길을 가고 있습니다. 연결이 정상인 것 같습니다.
귀하의 오류는 SQL 오류이며 ODBC 드라이버는 SQL의 "from" 문 앞에 오류가 있음을 알려줍니다. 그래서 인용한 경우에도 열 이름 'M32-FICD-DATE'에 "-"에 문제가 있다고 생각합니다. select 문에서 콜론(,)이 누락된 경우에도 동일한 오류가 발생합니다. 이름에 "-"를 사용하지 말고 큰따옴표를 사용하지 마십시오(이미 언급했듯이).
JMP(스크립팅 오류)에서 SQL 쿼리를 작성/개발하는 것은 여기와 같은 구문 오류를 쉽게 만들기 때문에 매우 어렵습니다. 그리고 스크립트의 SQL에는 훨씬 더 많은 문제가 있으며, 그 중 일부는 볼 수조차 없습니다(일부 숨겨진 문자 ...). 그 사이에 나는 경험 많은 SQL 작성자이지만 SQL을 작성하기 위해 항상 SQL 개발자 ..와 같은 다른 도구를 사용합니다. JMP를 사용하면 적어도 복잡한 쿼리의 경우 일반 SQL을 작성할 수 없습니다. 그러나 물론 간단한 쿼리에 그래픽 쿼리 빌더를 사용할 수 있습니다.
"Modify()"로 "Run Foreground()"를 대체하면 쿼리 편집기가 열리고 쿼리를 더 잘 읽고 테스트할 수 있습니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.@pmroz , @Georg 귀하의 피드백에 감사드립니다!
기본 설정이 pmroz에서 제안한 대로인지 확인한 다음 Georg가 권장한 방법 1을 시도했습니다. 연결 문자열과 SQL 쿼리를 변수를 분리하고 New SQL Query() 메서드로 쿼리를 실행하는 것입니다.
작동하는 것 같습니다. 이전에 얻었던 ODBC 드라이버 오류가 더 이상 발생하지 않습니다.
그러나 아래와 같은 새로운 오류가 발생합니다. 그리고 그것이 잘못된 쿼리 때문인지 아닌지 확실하지 않습니다.
jmpquery 파일의 SQL 탭에서 쿼리를 복사했습니다. 열 별칭에 대한 큰 따옴표를 변경했습니다. 'M32-FICD-DATE' REVDATE 열의 경우 작은 따옴표로 묶습니다. 그렇지 않으면 문자열의 끝으로 잘못된 큰 따옴표를 포착합니다.
[Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected [SQLSTATE=HY000] in access or evaluation of 'Run Foreground' , Run Foreground() /*###*/
In the following script, error marked by /*###*/
Names Default To Here( 1 );
cnxstrng =
"ODBC:DSN=****;UID=*******;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;STE=F;TSZ=8192;AST=FLOAT;";
M32FICDSQL =
"SELECT t1.LOTID, t2.COMPIDS AS WAFERID, t1.EQPID, t2.REVDATE AS 'M32-FICD-DATE',
t1.PARTID, t1.RECPID, t2.ITEMPROMPT, t2.NUMERICVALUE,
t3.LOTTYPE
FROM PLLDBA.TRES t1
LEFT OUTER JOIN PLLDBA.ACTL t3
ON ( t1.LOTID = t3.LOTID )
INNER JOIN PLLDBA.TRES_RAWDATA t2
ON ( ( t1.TESTOPNO = t2.TESTOPNO ) AND ( t1.REVDATE = t2.REVDATE ) )
WHERE ( ( ( (t1.TESTOPNO LIKE '%JG43%' ) ) AND ( t2.REVDATE >= TO_TIMESTAMP('01Jan2019:18:42:42', 'DDMONYYYY:HH24:MI:SS') ) AND ( t2.ITEMPROMPT IN ( 'ITEM1' , 'MITEM2' , 'ITEM3' , 'ITEM4' ) ) AND ( (t1.RECPID LIKE '%HJ546%' ) ) AND ( (t3.LOTTYPE LIKE '%PT%' ) ) AND ( (t1.PARTID LIKE '%C765G%' ) ) ) )
ORDER BY t2.COMPIDS DESC, t2.REVDATE ASC;";
dt1 = New SQL Query(
connection( cnxstrng ),
queryname( "M32FICD" ),
customSQL( M32FICDSQL )
) << Run Foreground() /*###*/;Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.무엇에 추가하려면 @Georg 내 Oracle 연결 문자열은 다음과 같습니다.
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
"Oracle in OraClient12Home1"이라고 표시된 부분은 Oracle ODBC 드라이버의 이름입니다.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.@spoikayil , 어떻게든 다른 연결이 필요한 데이터베이스에서 데이터를 쿼리하는 여러 방법이 있음을 유의하십시오.
.jmpquery의 경우 연결 문자열이 "ODBC: ..."로 시작해야 하고, 삭제해야 하는 다른 문자열의 경우 jsl 예제를 참조하세요. 그렇지 않으면 게시한 오류가 정확하게 표시됩니다. 과거를 이해하는 데 시간이 좀 걸렸습니다.
이 예에서는 다른 방법을 사용하여 3개의 테이블을 생성합니다.
// Three methods to get data from database via ODBC
Names Default To Here( 1 );
// provide your credentials here (DSN, USER, PWD, DBQ)
cnx_str1 = "ODBC:DSN=__MY_DSN__;UID=__USER__;PWD=__PWD__;DBQ=__MY_DBQ__;";
cnx_str2 = "DSN=__MY_DSN__;UID=__USER__;PWD=__PWD__;DBQ=__MY_DBQ__;";
sql_str = "select * from dual";
//**** 1st method
dt1 = New SQL Query( connection( cnx_str1 ), queryname( "dt_jmpquery" ), customSQL( sql_str ) ) << Run Foreground();
//**** 2nd method
// This fails due to cnx starting with "ODBC:"
// dt2 = open database(cnx_str1, "select * from dual");
// This is ok
dt2 = Open Database( cnx_str2, sql_str, "dt_open_database" );
//**** 3rd method
cnx = Create Database Connection( cnx_str2 );
dt2 = Execute SQL( cnx, sql_str, "dt_execute_SQL" );
Close Database Connection( cnx );
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.Microsoft Oracle ODBC 드라이버에 문제가 있었습니다.그러나 Oracle에서 제공하는 것은 잘 작동합니다.
약간 지루하지만 다음은 연결 문자열을 얻은 방법입니다.
- JMP에서 기본 설정 > 테이블 .확실하게 하다 ODBC 연결 문자열 숨기기 체크가 해제되어 있습니다.
- 클릭 파일 > 데이터베이스 > 테이블 열기
- 클릭 새로운 연결
- Machine Data Source 아래에 Oracle ODBC 드라이버가 표시되지 않으면 다음을 클릭하십시오. 새로운
- 적절한 Oracle 드라이버를 선택하십시오.내 컴퓨터에서는 " OraClient 12Home1의 Oracle "
- 딸깍 하는 소리 마치다
- Oracle ODBC 드라이버 구성 화면이 나타납니다.
- 적절한 TNS 서비스 이름과 사용자 ID를 선택합니다.
- 연결 테스트를 클릭하여 연결을 시도합니다.
- 확인, 확인을 클릭합니다.
- 데이터베이스 열기 테이블 화면에 스키마 목록이 표시됩니다.
- 스키마를 클릭하면 테이블이 나타납니다.
- 표를 클릭한 다음 테이블 열기
- 테이블에는 원천 .녹색 삼각형을 마우스 오른쪽 버튼으로 클릭하고 선택하십시오. 편집하다 - 그러면 올바른 연결 문자열이 표시됩니다.
내가 말했듯이 지루하지만 일단 연결 문자열이 있으면 갈 수 있습니다.환경 설정에서 ODBC 숨기기 확인란을 선택하는 것을 잊지 마십시오.
Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.추신: 저는 32비트 JMP14.1.0을 사용하고 있으며 제 Oracle 드라이버도 32비트입니다.Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.고맙습니다 @pmroz 귀하의 피드백을 위해 이것을 시도했습니다. jmpquery에 연결 문자열을 복사했지만 스크립트가 실행되지 않고 로그에 다음 오류가 표시됩니다.
[Microsoft][ODBC 드라이버 관리자] 데이터 원본 이름을 찾을 수 없고 기본 드라이버가 지정되지 않았습니다.\
그러나 jmpqueries를 실행할 때 동일한 연결이 제대로 작동합니다. 여기에서 무엇을 벗어날 수 있습니까?
내 연결 문자열:
MYDB = create database connection("ODBC:DSN=*****;UID=*****;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;STE=F;TSZ=8192;AST=FLOAT;");Re: jmp 쿼리 및 스크립트 통합에 도움이 됩니다.SQL 쿼리가 있는 경우 SQL 실행을 사용하도록 전환할 수 있습니다.동일한 날짜 범위를 사용하여 두 개의 쿼리를 실행하는 방법은 다음과 같습니다.TO_DATE 함수는 Oracle 구문입니다.
dbc = create database connection("<CONNECTION string="">");
start_date = "01-Jan-2020";
end_date = "30-Apr-2020";
sql1 = evalinsert(
"SELECT m.foo, m.bar
FROM myschema.mytable m
WHERE m.some_date BETWEEN TO_DATE('^start_date^', 'DD-MON-YYYY')
AND TO_DATE('^end_date^', 'DD-MON-YYYY')");
dt1 = execute sql(dbc, sql1);
sql2 = evalinsert(
"SELECT a.field1, a.field2
FROM myschema.another_table a
WHERE a.some_date BETWEEN TO_DATE('^start_date^', 'DD-MON-YYYY')
AND TO_DATE('^end_date^', 'DD-MON-YYYY')");
dt2 = execute sql(dbc, sql2);
close database connection(dbc);
</CONNECTION>