帮助整合 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>