Aiuta a consolidare query e script jmp.Ho iniziato a utilizzare jmp di recente per importare i dati di produzione direttamente nelle tabelle jmp e analizzarli.
In genere la mia esigenza è estrarre i dati per ogni fase del processo di produzione, per tutti i lotti elaborati e ricavarne grafici.
Quindi ho iniziato a creare jmpqueires per ciascuno dei processi e spesso voglio fornire il codice del processo e la data da cui desidero l'estrazione come input per la query.
Tutte le mie jmpquery hanno quindi i seguenti filtri e ho mantenuto la data come variabile di prompt in modo da poterla modificare ogni volta che eseguo la query

Ho anche alcuni script di post-elaborazione poiché quasi sempre i dati non vengono archiviati nel formato e nella forma che desidero per tracciare i grafici. Questo mi costringe a creare una nuova tabella dalla tabella che esce con l'estrazione della query originale.
Quindi, tutte le mie jmpquery finiscono per generare due tabelle, un esempio è mostrato di seguito;

Funzionava abbastanza bene, fino ad ora, voglio iniziare a consolidare queste query unendo diverse tabelle generate dalle mie diverse query jmp.
Quindi inizio a scrivere lo script seguente che 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(.
.
.
.
Ora, ecco le cose per le quali vorrei avere un po' di aiuto; perché non sto ottenendo la risposta prevista.
- Innanzitutto, ogni query ha il prompt della data, quindi devo aspettare e fornire la data e fare clic su ok più volte nel mezzo: come posso modificare le query in modo tale che la prima data che fornisco venga presa e utilizzata per tutte le successive query jmp?
- Anche se sto aprendo i tavoli che non voglio essere visibile come Privato, continuano comunque a presentarsi. Che cosa sto facendo di sbagliato?
- Ho le query SQL per tutti i miei jmpqueies, come posso inserirli nello script anziché aprire ciascuno dei miei file jmpquery come sto facendo ora?
Accesso ai datiRi: Aiuta a consolidare query e script jmp.@pmroz @Georg Grazie ragazzi!!
Racchiudere la query in \[ fa il trucco per il secondo problema.
Ri: Aiuta a consolidare query e script jmp.È difficile sviluppare SQL in JSL - come @Georg le menzioni utilizzano uno strumento come SQL Developer o PL/SQL Developer.
Ho sviluppato il log_execute_sql funzione alcuni anni fa - è pubblicato nello scambio di file: Trapping degli errori per Oracle ODBC SQL
Questo è diventato un aiuto inestimabile per noi per eseguire il debug di SQL in JSL.
Ri: Aiuta a consolidare query e script jmp.@pmroz grazie per il tuo suggerimento usando la citazione generale \[ \], questo è un altro modo a cui non avevo nemmeno pensato.
A meno che non funzioni in questo modo, personalmente non mi piacciono i trattini nei nomi e le virgolette doppie in SQL..., perché ho avuto molto dolore a causa di ciò... in passato.
Ri: Aiuta a consolidare query e script jmp.L'errore è dovuto al fatto che stai tentando di impostare l'intestazione della colonna utilizzando virgolette singole.Oracle desidera che il nome della colonna sia racchiuso tra virgolette.Questo dovrebbe funzionare - nota che sto usando \[ e ]\ per consentire le doppie virgolette nella stringa senza quei fastidiosi caratteri di 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;]\";
Se continui ad avere problemi, non utilizzare il comando AS e modifica invece il nome della colonna in JSL.Non dovresti - uso sempre questa sintassi senza problemi.
Ri: Aiuta a consolidare query e script jmp.@spoikayil , sei sulla strada giusta, la connessione sembra essere ok.
Il tuo errore è un errore SQL, il driver ODBC ti dice che c'è un errore prima dell'istruzione "from" nell'SQL. Quindi penso che ci sia un problema con "-" nella tua colonna Nome 'M32-FICD-DATE', anche se citato. Si ottiene lo stesso errore quando mancano i due punti (,) nell'istruzione select. Non usare mai "-" nei nomi e non usare mai le virgolette (come hai già detto).
Scrivere/sviluppare query SQL in JMP (errore di scripting) è molto difficile, perché si creano facilmente errori di sintassi come qui. E ci sono molti più problemi con SQL negli script, alcuni dei quali non puoi nemmeno vederli (alcuni caratteri nascosti...). Anche se nel frattempo sono uno scrittore SQL esperto, utilizzo sempre uno strumento diverso come lo sviluppatore SQL .. per scrivere SQL. Con JMP non è possibile scrivere un semplice SQL secondo me, almeno per query complesse. Ma ovviamente puoi usare il generatore di query grafico per query semplici.
Sembra leggermente migliore, quando sostituisci "Esegui in primo piano ()" con "Modifica ()", quindi apri l'editor di query e puoi leggere meglio la tua query e anche testarla.
Ri: Aiuta a consolidare query e script jmp.@pmroz , @Georg grazie mille per il tuo feedback!
Ho verificato che le preferenze fossero quelle suggerite da pmroz, quindi ho provato il metodo 1, consigliato da Georg: assegnare la stringa di connessione e la query SQL a variabili separate ed eseguire la query con il metodo New SQL Query().
Sembra funzionare, poiché non ottengo più l'errore del driver ODBC che ricevevo prima.
Tuttavia, ottengo un nuovo errore come di seguito; e non sono sicuro se ciò sia dovuto a una query errata o meno.
Ho copiato la query dalla scheda SQL del file jmpquery. Ho cambiato le doppie virgolette per l'alias di colonna 'M32-FICD-DATA' per la colonna REVDATE tra virgolette singole, altrimenti rileva le virgolette doppie errate come fine della stringa.
[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() /*###*/;Ri: Aiuta a consolidare query e script jmp.Da aggiungere a cosa @Georg ha detto, la mia stringa di connessione Oracle è simile a questa:
dsn_string = "Driver={Oracle in OraClient12Home1};Dbq=tns_alias_goes_here;UID=username_goes_here;PWD=password_goes_here;";
Si noti che la parte che dice "Oracle in OraClient12Home1" è il nome del driver Oracle ODBC.
Ri: Aiuta a consolidare query e script jmp.@spoikayil , Si noti che esistono diversi metodi per interrogare i dati dai database, che richiedono connessioni in qualche modo diverse.
Per il .jmpquery la stringa di connessione deve iniziare con "ODBC: …", e per gli altri è necessario eliminarla, vedere l'esempio jsl. Altrimenti ottieni esattamente l'errore che hai postato. Mi ci è voluto del tempo per capirlo in passato.
L'esempio genera 3 tabelle utilizzando metodi diversi.
// 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 );
Ri: Aiuta a consolidare query e script jmp.Ho avuto problemi con il driver Microsoft Oracle ODBC.Quello di Oracle funziona bene però.
È un po' noioso, ma ecco come ho ottenuto la stringa di connessione:
- In JMP, fare clic su Preferenze > Tabelle .Assicurarsi ODBC Nascondi stringa di connessione è deselezionato.
- Clicca su File > Database > Apri tabella
- Clicca su Nuova connessione
- Se non vedi un driver Oracle ODBC elencato in Machine Data Source, fai clic su Nuovo
- Selezionare il driver Oracle appropriato.Sulla mia macchina è " Oracle in OraClient 12Home1 "
- Clic Fine
- Arriverai a una schermata di configurazione del driver ODBC di Oracle
- Selezionare il nome del servizio TNS e l'ID utente appropriati.
- Fare clic su Verifica connessione per provare la connessione
- Fare clic su OK, OK
- La schermata Database Open Table mostrerà un elenco di schemi
- Fare clic su uno schema e appariranno le tabelle.
- Fare clic su una tabella e quindi fare clic su Tavolo aperto
- La tabella avrà un programma chiamato Fonte .Fare clic con il tasto destro sul triangolo verde e selezionare Modificare - che ti mostrerà la stringa di connessione corretta.
Come ho detto noioso, ma una volta che hai la stringa di connessione sei a posto.Non dimenticare di selezionare la casella di controllo Nascondi ODBC nelle preferenze.
Ri: Aiuta a consolidare query e script jmp.PS: sto usando JMP14.1.0 a 32 bit e anche il mio driver Oracle è a 32 bitRi: Aiuta a consolidare query e script jmp.Grazie @pmroz per il tuo feedback, ho provato questo. Ho copiato la stringa di connessione nel mio jmpquery, ma lo script non viene eseguito e il registro restituisce il seguente errore:
[Microsoft][ODBC Driver Manager] Nome origine dati non trovato e nessun driver predefinito specificato\
Tuttavia la stessa connessione funziona correttamente quando eseguo jmpqueries. Cosa potrebbe esserci di sbagliato qui?
La mia stringa di connessione:
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;");Ri: Aiuta a consolidare query e script jmp.Se disponi delle query SQL, puoi passare all'utilizzo di execute SQL.Ecco come eseguire due query utilizzando lo stesso intervallo di date.Si noti che la funzione TO_DATE è la sintassi 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>