幫助整合 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 查詢?
- 儘管我正在打開我不想顯示為 Private 的表格,但它們仍然會出現。 我究竟做錯了什麼?
- 我有所有 jmpqueies 的 SQL 查詢,如何將它們放入腳本中,而不是像現在這樣打開每個 jmpquery 文件?
腳本回复:幫助整合 jmp 查詢和腳本。@pmroz @Georg多謝你們!!
將查詢括在 \[ 中可以解決第二個問題。
回复:幫助整合 jmp 查詢和腳本。在 JSL 中開發 SQL 很困難——因為@Georg提及使用 SQL Developer 或 PL/SQL Developer 之類的工具。
我開發了log_execute_sql幾年前的功能 - 它發佈在文件交換中: Oracle ODBC SQL 的錯誤捕獲
這成為我們在 JSL 中調試 SQL 的寶貴幫助。
回复:幫助整合 jmp 查詢和腳本。@pmroz感謝您使用一般報價 \[ \] 的建議,這是我什至沒有想到的另一種方式。
除非它可能那樣工作,否則我個人不喜歡 SQL 中的連字符和雙引號……,因為過去我為此感到非常痛苦。
回复:幫助整合 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 中的列名。你不應該 - 我一直使用這種語法沒有問題。
回复:幫助整合 jmp 查詢和腳本。@spoikayil ,你走對了,連接似乎沒問題。
您的錯誤是 SQL 錯誤,ODBC 驅動程序告訴您 SQL 中的“from”語句之前有錯誤。 所以我認為,即使在引用時,您的列名稱“M32-FICD-DATE”中的“-”也存在問題。 當 select 語句中缺少冒號 (,) 時,您會收到相同的錯誤。 永遠不要在名稱中使用“-”,也不要使用雙引號(正如您已經提到的)。
在 JMP(腳本錯誤)中編寫/開發 SQL 查詢非常困難,因為您很容易像這裡一樣出現語法錯誤。 腳本中的 SQL 還有很多問題,其中一些你甚至看不到(一些隱藏字符……)。 雖然我同時是一位經驗豐富的 SQL 編寫者,但我總是使用不同的工具,如 SQL developer .. 來編寫 SQL。 在我看來,使用 JMP 編寫簡單的 SQL 是不可能的,至少對於復雜的查詢是這樣。 但當然,您可以使用圖形查詢生成器進行簡單查詢。
看起來稍微好一點,當你用“Modify()”替換“Run Foreground()”時,你會打開查詢編輯器,你可以更好地閱讀你的查詢,並對其進行測試。
回复:幫助整合 jmp 查詢和腳本。@pmroz , @Georg非常感謝您的反饋!
我驗證了首選項是否符合 pmroz 的建議,然後嘗試了 Georg 推薦的方法 1 - 將連接字符串和 SQL 查詢分配給單獨的變量,並使用 New SQL Query() 方法運行查詢。
它似乎有效 - 因為我不再遇到以前遇到的 ODBC 驅動程序錯誤。
但是,我收到一個新錯誤,如下所示;我不確定這是否是由於查詢錯誤造成的。
我已經從 jmpquery 文件的 SQL 選項卡中復制了查詢。 我更改了列別名的雙引號'M32-FICD-日期'將 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() /*###*/;回复:幫助整合 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 驅動程序的名稱。
回复:幫助整合 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 );
回复:幫助整合 jmp 查詢和腳本。我在使用 Microsoft Oracle ODBC 驅動程序時遇到了問題。來自 Oracle 的那個工作正常。
這有點乏味,但這是我獲得連接字符串的方式:
- 在 JMP 中,單擊首選項 > 表格.確保ODBC 隱藏連接字符串未選中。
- 點擊文件 > 數據庫 > 打開表
- 點擊新連接
- 如果在機器數據源下沒有看到 Oracle ODBC 驅動程序,請單擊新的
- 選擇適當的 Oracle 驅動程序。在我的機器上是“ OraClient 12Home1 中的 Oracle "
- 點擊結束
- 您將進入 Oracle ODBC 驅動程序配置屏幕
- 選擇適當的 TNS 服務名稱和用戶 ID。
- 單擊測試連接以嘗試連接
- 點擊確定,確定
- Database Open Table 屏幕將顯示模式列表
- 單擊架構,將出現表。
- 單擊一個表,然後單擊打開表
- 該表將有一個名為資源.右鍵單擊綠色三角形並選擇編輯- 這將向您顯示正確的連接字符串。
就像我說的那樣乏味,但是一旦你有了連接字符串,你就可以開始了。不要忘記選中首選項中的 ODBC 隱藏複選框。
回复:幫助整合 jmp 查詢和腳本。PS:我使用的是 32 位 JMP14.1.0,我的 Oracle 驅動程序也是 32 位的回复:幫助整合 jmp 查詢和腳本。謝謝@pmroz對於您的反饋,我嘗試了這個。 我在我的 jmpquery 中復制了連接字符串,但是腳本沒有運行,並且日誌給出了以下錯誤:
[Microsoft][ODBC Driver Manager] 未找到數據源名稱且未指定默認驅動程序\
但是,當我運行 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;");回复:幫助整合 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>