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 il mio requisito è estrarre i dati per ogni fase del processo nel processo di produzione, per tutti i lotti elaborati e creare grafici da essi.
Quindi ho iniziato a creare jmpqueires per ciascuno dei processi e spesso voglio fornire il codice del processo e la data da cui voglio l'estrazione come input per la query.
Tutte le mie jmpqueries 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 uno script di post-elaborazione poiché quasi sempre i dati non sono archiviati nel formato e nella forma poiché voglio che traccino 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 tabelle diverse generate dalle mie diverse query jmp.
Quindi comincio a scrivere lo script seguente che va:
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 con cui vorrei avere un aiuto; perché non sto ottenendo la risposta prevista.
- Innanzitutto, ogni query ha la richiesta 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 essere visualizzati. Che cosa sto facendo di sbagliato?
- Ho le query SQL per tutte le mie jmpquey, come posso inserirle nello script invece di aprire ciascuno dei miei file jmpquery come sto facendo ora?
SceneggiaturaRe: Aiuta a consolidare le query e gli script jmp.@pmroz @Giorgio Grazie ragazzi!!
Racchiudere la query in \[ fa il trucco per il secondo problema.
Re: Aiuta a consolidare le query e gli script jmp.È difficile sviluppare SQL in JSL - come @Giorgio le menzioni utilizzano uno strumento come SQL Developer o PL/SQL Developer.
Ho sviluppato il log_execute_sql funzione qualche anno fa - è pubblicato nello scambio di file: Intercettazione degli errori per Oracle ODBC SQL
Questo è diventato un aiuto prezioso per noi per eseguire il debug di SQL in JSL.
Re: Aiuta a consolidare le query e gli 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 sofferto molto a causa di ciò... in passato.
Re: Aiuta a consolidare le query e gli script jmp.L'errore è dovuto al fatto che stai tentando di impostare l'intestazione della colonna utilizzando virgolette singole.Oracle vuole che il nome della colonna sia racchiuso tra virgolette.Questo dovrebbe funzionare: nota che sto usando \[ e ]\ per consentire alle virgolette doppie di essere 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 cambia invece il nome della colonna in JSL.Non dovresti: io uso questa sintassi tutto il tempo senza problemi.
Re: Aiuta a consolidare le query e gli 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 della tua istruzione "from" nell'SQL. Quindi penso che ci sia un problema con "-" nella colonna Nome "M32-FICD-DATE", anche se citato. Si ottiene lo stesso errore, quando mancano i due punti (,) nell'istruzione select. Non usare mai "-" in Nomi e non usare mai virgolette doppie (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 vedere (alcuni caratteri nascosti ...). Anche se nel frattempo sono uno scrittore SQL esperto, uso 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.
Re: Aiuta a consolidare le query e gli script jmp.@pmroz , @Giorgio grazie mille per il tuo feedback!
Ho verificato che le preferenze fossero come suggerito da pmroz, quindi ho provato il metodo 1, che Georg aveva raccomandato: 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 ricevo 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 domanda errata o meno.
Ho copiato la query dalla scheda SQL del file jmpquery. Ho cambiato le virgolette per l'alias di colonna 'M32-FICD-DATE' per la colonna REVDATE tra virgolette singole, altrimenti prende 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() /*###*/;Re: Aiuta a consolidare le query e gli script jmp.Da aggiungere a cosa @Giorgio 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.
Re: Aiuta a consolidare le query e gli script jmp.@spoikayil , Si noti che esistono diversi metodi per eseguire query sui dati dai database, che richiedono connessioni in qualche modo diverse.
Per .jmpquery la stringa di connessione deve iniziare con "ODBC: …", e per le altre è 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 diversi metodi.
// 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: Aiuta a consolidare le query e gli script jmp.Ho avuto problemi con il driver ODBC di Microsoft Oracle.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 Origine dati macchina, fai clic su Nuovo
- Seleziona il driver Oracle appropriato.Sulla mia macchina è " Oracle in OraClient 12Home1 "
- Clic Fine
- Verrai a una schermata di configurazione del driver Oracle ODBC
- Selezionare il nome del servizio TNS e l'ID utente appropriati.
- Fare clic su Test 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 verranno visualizzate 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.
Re: Aiuta a consolidare le query e gli script jmp.PS: sto usando JMP14.1.0 a 32 bit e anche il mio driver Oracle è a 32 bitRe: Aiuta a consolidare le query e gli 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][Gestione driver ODBC] Nome origine dati non trovato e nessun driver predefinito specificato\
Tuttavia la stessa connessione funziona correttamente quando eseguo jmpqueries. Cosa potrebbe esserci fuori 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;");Re: Aiuta a consolidare le query e gli script jmp.Se hai le query SQL, puoi passare all'utilizzo di esegui 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>