Ayuda a consolidar consultas y scripts jmp.Empecé a usar jmp recientemente para importar datos de fabricación directamente a las tablas de jmp y analizarlos.
Por lo general, mi requisito es extraer los datos para cada paso del proceso de fabricación, para todos los lotes procesados y hacer gráficos a partir de ellos.
Así que comencé a hacer jmpqueires para cada uno de los procesos, y a menudo quiero dar el código del proceso, así como la fecha a partir de la cual quiero la extracción como entradas para la consulta.
Por lo tanto, todas mis jmpqueries tienen los siguientes filtros, y he mantenido la fecha como una variable de aviso para poder cambiarla cada vez que ejecuto la consulta.

También tengo una secuencia de comandos de procesamiento posterior, ya que casi siempre los datos no se almacenan en el formato y la forma que quiero para trazar gráficos. Esto me obliga a crear una nueva tabla a partir de la tabla que sale con la extracción de la consulta original.
Entonces, todas mis jmpqueries terminan generando dos tablas, un ejemplo se muestra a continuación;

Esto funcionó bastante bien, hasta ahora, quiero comenzar a consolidar estas consultas uniendo diferentes tablas generadas por mis muchas consultas jmp diferentes.
Así que empiezo a escribir el siguiente script que dice:
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(.
.
.
.
Ahora, aquí están las cosas con las que me gustaría tener ayuda; porque no estoy obteniendo la respuesta esperada.
- Primero, cada consulta tiene el indicador de fecha, por lo que debo esperar y dar la fecha y hacer clic en Aceptar varias veces en el medio. ¿Cómo puedo modificar las consultas de modo que la primera fecha que doy se tome y se use para todas las consultas jmp posteriores?
- Aunque estoy abriendo las mesas no quiero ser visible como Privado, siguen apareciendo de todos modos. ¿Qué estoy haciendo mal?
- Tengo las consultas SQL para todos mis jmpqueies, ¿cómo puedo ponerlos en el script en lugar de abrir cada uno de mis archivos jmpquery como lo estoy haciendo ahora?
Acceso a los datosRe: Ayuda para consolidar scripts y consultas jmp.@pmroz @georg ¡¡Gracias chicos!!
Encerrar la consulta en \[ hace el truco para el segundo problema.
Re: Ayuda para consolidar scripts y consultas jmp.Es difícil desarrollar SQL en JSL, como @georg las menciones utilizan una herramienta como SQL Developer o PL/SQL Developer.
desarrollé el log_execute_sql función hace unos años - está publicado en el intercambio de archivos: Captura de errores para Oracle ODBC SQL
Eso se ha convertido en una ayuda invaluable para nosotros para depurar SQL en JSL.
Re: Ayuda para consolidar scripts y consultas jmp.@pmroz gracias por su sugerencia de usar la cotización general \[ \], esta es otra forma en la que ni siquiera pensé.
A menos que funcione de esa manera, personalmente no me gustan los guiones en los nombres y las comillas dobles en SQL... porque tuve mucho dolor debido a eso... en el pasado.
Re: Ayuda para consolidar scripts y consultas jmp.El error se debe a que está intentando configurar el encabezado de la columna con comillas simples.Oracle quiere que el nombre de la columna esté entre comillas dobles.Esto debería funcionar; tenga en cuenta que estoy usando \[ y ]\ para permitir que las comillas dobles estén en la cadena sin esos molestos caracteres de escape.
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;]\";
Si sigue teniendo problemas, no use el comando AS y cambie el nombre de la columna en JSL.No debería tener que hacerlo: uso esta sintaxis todo el tiempo sin problemas.
Re: Ayuda para consolidar scripts y consultas jmp.@spoikayil , estás en el camino correcto, la conexión parece estar bien.
Su error es un error de SQL, el controlador ODBC le dice que hay un error antes de su instrucción "from" en el SQL. Así que creo que hay un problema con "-" en su columna Nombre 'M32-FICD-DATE', incluso cuando se cita. Obtiene el mismo error, cuando faltan dos puntos (,) en la declaración de selección. Nunca use "-" en Nombres, y nunca use comillas dobles (como ya mencionó).
Escribir/desarrollar consultas SQL en JMP (error de secuencias de comandos) es muy difícil, porque fácilmente comete errores de sintaxis como aquí. Y hay muchos más problemas con SQL en los scripts, algunos de los cuales ni siquiera puedes ver (algunos caracteres ocultos...). Aunque soy un escritor experimentado de SQL mientras tanto, siempre uso una herramienta diferente como el desarrollador de SQL ... para escribir SQL. En mi opinión, con JMP no es posible escribir SQL simple, al menos para consultas complejas. Pero, por supuesto, puede usar el generador gráfico de consultas para consultas simples.
Se ve un poco mejor, cuando sustituye "Ejecutar primer plano ()" por "Modificar ()", luego abre el Editor de consultas, y puede leer mejor su consulta y también probarla.
Re: Ayuda para consolidar scripts y consultas jmp.@pmroz , @georg ¡Muchas gracias por tus comentarios!
Verifiqué que las preferencias eran las sugeridas por pmroz, y luego probé el método 1, que Georg había recomendado: asignar la cadena de conexión y la consulta SQL a variables separadas y ejecutar la consulta con el método New SQL Query().
Parece funcionar, ya que ya no recibo el error del controlador ODBC que solía tener antes.
Sin embargo, aparece un nuevo error como el siguiente; y no estoy seguro si eso se debe a una mala consulta o no.
He copiado la consulta de la pestaña SQL del archivo jmpquery. Cambié las comillas dobles para el alias de columna 'M32-FICD-FECHA' para la columna REVDATE entre comillas simples, ya que de lo contrario captura la comilla doble incorrecta como el final de la cadena.
[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: Ayuda para consolidar scripts y consultas jmp.Para agregar a lo que @georg dicho, mi cadena de conexión de Oracle se ve así:
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
Tenga en cuenta que la parte que dice "Oracle en OraClient12Home1" es el nombre del controlador ODBC de Oracle.
Re: Ayuda para consolidar scripts y consultas jmp.@spoikayil , tenga en cuenta que existen varios métodos para consultar datos de bases de datos, que necesitan conexiones diferentes de alguna manera.
Para .jmpquery, la cadena de conexión debe comenzar con "ODBC: …", y para los demás, debe eliminarlo, consulte el ejemplo de jsl. De lo contrario, obtendrá exactamente el error que publicó. Me tomó algún tiempo averiguarlo en el pasado.
El ejemplo genera 3 tablas utilizando diferentes métodos.
// 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: Ayuda para consolidar scripts y consultas jmp.He tenido problemas con el controlador ODBC de Microsoft Oracle.Sin embargo, el de Oracle funciona bien.
Es un poco tedioso, pero así es como obtuve la cadena de conexión:
- En JMP, haga clic en Preferencias > Tablas .Cerciorarse Ocultar cadena de conexión ODBC está desmarcado.
- Haga clic en Archivo > Base de datos > Abrir tabla
- Haga clic en Nueva conexión
- Si no ve un controlador ODBC de Oracle en la lista de Fuente de datos de la máquina, haga clic en Nuevo
- Seleccione el controlador de Oracle adecuado.En mi máquina es " Oracle en OraClient 12Home1 "
- Hacer clic Finalizar
- Accederá a una pantalla de configuración del controlador ODBC de Oracle
- Seleccione el nombre de servicio TNS y el ID de usuario apropiados.
- Haga clic en Probar conexión para probar la conexión
- Haga clic en Aceptar, Aceptar
- La pantalla de tabla abierta de base de datos mostrará una lista de esquemas
- Haga clic en un esquema y aparecerán las tablas.
- Haga clic en una tabla y luego haga clic en Mesa abierta
- La mesa tendrá un programa llamado Fuente .Haga clic derecho en el triángulo verde y seleccione Editar - eso le mostrará la cadena de conexión correcta.
Como dije, tedioso, pero una vez que tienes la cadena de conexión, estás listo para comenzar.No olvide marcar la casilla Ocultar ODBC en las preferencias.
Re: Ayuda para consolidar scripts y consultas jmp.PD: estoy usando JMP14.1.0 de 32 bits y mi controlador Oracle también es de 32 bitsRe: Ayuda para consolidar scripts y consultas jmp.Gracias @pmroz por sus comentarios, probé esto. Copié la cadena de conexión en mi jmpquery, pero el script no se ejecuta y el registro da el siguiente error:
[Microsoft][Administrador de controladores ODBC] No se encontró el nombre de la fuente de datos y no se especificó ningún controlador predeterminado\
Sin embargo, la misma conexión funciona bien cuando ejecuto jmpqueries. ¿Qué podría estar mal aquí?
Mi cadena de conexión:
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: Ayuda para consolidar scripts y consultas jmp.Si tiene las consultas SQL, puede cambiar a ejecutar SQL.Aquí se explica cómo ejecutar dos consultas con el mismo intervalo de fechas.Tenga en cuenta que la función TO_DATE es sintaxis de 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>