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