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

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

이것은 꽤 잘 작동했습니다. 지금까지는 많은 다른 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 @게오르그 감사합니다!
쿼리를 \[로 묶으면 두 번째 문제에 대한 트릭을 수행합니다.
Re: jmp 쿼리 및 스크립트 통합을 도와주세요.JSL에서 SQL을 개발하는 것은 어렵습니다. @게오르그 멘션은 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 쿼리 및 스크립트 통합을 도와주세요.@sppoikayil , 당신은 올바른 길을 가고 있습니다. 연결이 괜찮은 것 같습니다.
귀하의 오류는 SQL 오류입니다. ODBC 드라이버는 SQL의 "from" 문 앞에 오류가 있음을 알려줍니다. 따라서 인용하더라도 열 이름 'M32-FICD-DATE'에 "-"에 문제가 있다고 생각합니다. select 문에서 콜론(,)이 누락되면 동일한 오류가 발생합니다. 이름에 "-"를 사용하지 말고 큰따옴표를 사용하지 마십시오(이미 언급한 대로).
JMP에서 SQL 쿼리 작성/개발(스크립팅 오류)은 여기에서와 같이 구문 오류를 쉽게 만들기 때문에 매우 어렵습니다. 그리고 스크립트의 SQL에는 훨씬 더 많은 문제가 있으며, 그 중 일부는 볼 수 없습니다(일부 숨겨진 문자 …). 한편 저는 숙련된 SQL 작성자이지만 SQL 작성을 위해 항상 SQL 개발자 ..와 같은 다른 도구를 사용합니다. 제 생각에는 최소한 복잡한 쿼리에 대해서는 JMP를 사용하여 일반 SQL을 작성할 수 없습니다. 물론 간단한 쿼리에는 그래픽 쿼리 빌더를 사용할 수 있습니다.
"Run Foreground()"를 "Modify()"로 대체하면 쿼리 편집기가 열리고 쿼리를 더 잘 읽고 테스트할 수 있습니다.
Re: jmp 쿼리 및 스크립트 통합을 도와주세요.@pmroz , @게오르그 귀하의 피드백에 대단히 감사합니다!
환경 설정이 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 쿼리 및 스크립트 통합을 도와주세요.무엇을 추가하려면 @게오르그 내 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 쿼리 및 스크립트 통합을 도와주세요.@sppoikayil , 어떻게든 다른 연결이 필요한 데이터베이스에서 데이터를 쿼리하는 여러 가지 방법이 있음에 유의하십시오.
.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 연결 문자열 숨기기 선택 해제되어 있습니다.
- 클릭 파일 > 데이터베이스 > 테이블 열기
- 클릭 새로운 연결
- 시스템 데이터 소스 아래에 Oracle ODBC 드라이버가 나열되지 않으면 클릭하십시오. 새로운
- 적절한 Oracle 드라이버를 선택합니다.내 컴퓨터에는 " OraClient 12Home1의 오라클 "
- 딸깍 하는 소리 마치다
- Oracle ODBC 드라이버 구성 화면이 나타납니다.
- 적절한 TNS 서비스 이름과 사용자 ID를 선택하십시오.
- 테스트 연결을 클릭하여 연결을 시도합니다.
- 확인, 확인을 클릭하십시오
- Database Open Table 화면에 스키마 목록이 표시됩니다.
- 스키마를 클릭하면 테이블이 나타납니다.
- 테이블을 클릭한 다음 오픈 테이블
- 테이블에는 다음과 같은 프로그램이 있습니다. 원천 .녹색 삼각형을 마우스 오른쪽 버튼으로 클릭하고 선택하십시오. 편집하다 - 그러면 올바른 연결 문자열이 표시됩니다.
내가 지루하다고 말했듯이 일단 연결 문자열이 있으면 갈 수 있습니다.기본 설정에서 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>