幫助整合 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 查詢?
- 儘管我正在打開桌子,但我不想以私人身份可見,但它們仍然不斷出現。 我究竟做錯了什麼?
- 我有所有 jmpqueies 的 SQL 查詢,如何將它們放入腳本中,而不是像現在一樣打開每個 jmpquery 文件?
數據存取回复:幫助整合 jmp 查詢和腳本。@pmroz @喬治多謝你們!!
將查詢括在 \[ 中可以解決第二個問題。
回复:幫助整合 jmp 查詢和腳本。在 JSL 中開發 SQL 很困難 - 因為@喬治提到使用 SQL Developer 或 PL/SQL Developer 等工具。
我開發了日誌執行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 開發人員)來編寫 SQL。 在我看來,使用 JMP 不可能編寫簡單的 SQL,至少對於復雜的查詢來說是這樣。 當然,您可以使用圖形查詢生成器進行簡單查詢。
看起來稍微好一點,當您用“Modify()”替換“Run Foreground()”時,您會打開查詢編輯器,並且您可以更好地讀取查詢並對其進行測試。
回复:幫助整合 jmp 查詢和腳本。@pmroz , @喬治非常感謝您的反饋!
我驗證了首選項是否符合 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 查詢和腳本。添加到什麼@喬治說,我的 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。
- 單擊“測試連接”以嘗試連接
- 點擊確定,確定
- 數據庫打開表屏幕將顯示模式列表
- 單擊架構,將出現表格。
- 單擊一個表,然後單擊開表
- 該表將有一個名為來源。右鍵單擊綠色三角形並選擇編輯- 這將顯示正確的連接字符串。
就像我說的,這很乏味,但是一旦你有了連接字符串,你就可以開始了。不要忘記選中首選項中的 ODBC 隱藏複選框。
回复:幫助整合 jmp 查詢和腳本。PS:我使用的是32位JMP14.1.0,我的Oracle驅動程序也是32位回复:幫助整合 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;");回复:幫助整合 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>