Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />CIAO,
Ho bisogno di raccogliere dati di test parametrici a livello di chip dai tester finali per molti wafer di produzione.
Ogni wafer ha ~ 3000 chip e decine di parametri.
Ho creato un SQL fittizio ai fini di questa richiesta di assistenza:
SELEZIONARE
I.PRODOTTONR,
T.TESTUNITNR,
T. PUNTO DI MISURANR,
T.TEMPO DI CREAZIONE,
T.RESULT_PARAM1,
T.RESULT_PARAM2.
.
.
.
DA
"ARTICOLI" D,
"TEST RISULTATI" T,
"TESTRESULTROWS" TRR,
"TESTROW" TR,
.
.
WHERE I.IDNR = T.IDNR
E T.TESTRESULTNR = TRR.TESTRESULTNR
E TRR.TESTROWIDNR = TR.TESTROWIDNR
E I.LOTIDNR = L.LOTIDNR
E T.VALIDITÀ = '1'
E D.WAFERNR IN
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
AND (T.TESTUNITNR LIKE ('HENE%')
E TR.NOMEVARIABILE IN
( 'ACENUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
......)
RAGGRUPPA PER ...
Se raccolgo tutti i dati per il primo wafer elencato (WAF43K309A), il tempo di raccolta/recupero è di ~ 90 secondi.
Se raccolgo tutti i dati per i primi 2 wafer elencati (WAF43K309A, WAF43K310A), il tempo di raccolta/recupero è di ~ 4 minuti
Se raccolgo tutti i dati per i primi 3 wafer elencati (WAF43K309A, WAF43K310A, WAF43K311A), il tempo di raccolta/recupero è di ~ 7 minuti
Sono sicuro che vedi il problema, il tempo di raccolta / recupero cresce in modo esponenziale con il numero di wafer.
A volte devo farlo durante il fine settimana!!
Utilizzando l'operatore SQL "Union All" e raccogliendo dati per un wafer alla volta, posso recuperare i dati utilizzando approssimativamente la stessa quantità di tempo per ciascun wafer.
Questo va bene se ho solo pochi wafer nella mia lista. Sfortunatamente, molto spesso ho bisogno di raccogliere dati da diverse decine di wafer, anche centinaia di wafer.
Usando una selezione interna potrei fare un elenco dei wafer:
per esempio
.....
E D.WAFERNR IN (
SELEZIONA WAFERNR dall'ARTICOLO
WHERE TESTDATE > SYSDATE-5)
l'elenco di wafer risultante sarebbe:
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
È possibile, utilizzando JSL, utilizzare questo elenco scorrendo l'elenco e raccogliendo dati per un wafer alla volta?
Non vedo l'ora di vedere quali soluzioni creative la comunità potrebbe offrire
Una soluzione sarebbe un grande regalo di Natale
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao Yosef,
Grazie per il tuo contributo.
Mi piace il modo in cui hai creato l'elenco da utilizzare negli script SQL e sono sicuro di poterlo utilizzare in caso di necessità.
In questo caso particolare, l'idea è di evitare l'uso di un elenco di wafer nell'SQL in quanto rallenta l'acquisizione dei dati rispetto all'approccio un wafer alla volta.
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?CIAO
utilizzo il seguente script per creare una riga che contenga un elenco di lotti
lista_lotto = Colonna ( 1 ) << Ottieni valori ;
in_elenco = "('" || Oggetti concatenati ( lista_lotto , "','" ) || "')" ;
stringa_sql = "DOVE \!"LOTTO\!" IN " || in_elenco ;
// / Se vuoi vedere la stringa / / /
spettacolo ( stringa_sql ) ;
* se il numero di lotto ha uno spazio da qualche parte e devi cercare "mi piace" '% numero di lotto' ... non funziona in SQL. dovrai creare uno script diverso
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao msharp,
Molte grazie per il tuo contributo.
Ora ho combinato questa sezione "unione verticale" della sezione dello script nello script principale e funziona a meraviglia
Il tempo necessario per l'estrazione dei dati si è ridotto a una frazione di quello che era prima e la possibilità di scriptare e automatizzare l'intera procedura mi consente di farlo durante la notte quando i nostri server sono sotto un carico più leggero.
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ci sono molti modi per affrontare quest'ultima domanda.Probabilmente la soluzione più semplice e diretta non è molto intuitiva.Quello che vuoi fare è creare un elenco di tabelle e quindi inserire ogni tabella di dati nell'elenco. Quindi puoi concatenare l'elenco insieme in una volta.Ecco lo schema:
myTables = {} ;
Per ( io = 1...
dt = eseguire sql ( ... ) ;
Inserire ( myTables , dt ) ;
) ;
dtAll = Nuova Tavola ( "Tutti i dati" ) ;
dtAll << Concatenare (
eval ( myTables ) ,
Tabella delle uscite ( "Tutti i dati" )
) ;
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao PMroz,
Molte grazie per il vostro sostegno e la vostra pazienza.
Sulla base del tuo contributo, così come quello di EricHill , Ron Horne E msharp Ora sono in grado di impostare la query SQL nidificata come avevo sperato.
Questo metodo è direttamente trasferibile all'attività di acquisizione dati più avanzata menzionata all'inizio di questo post e farà risparmiare molte ore di attesa per la restituzione dei dati dal server.
Ho imparato molto in questo esercizio e apprezzo tutti i tuoi sforzi.
Un'ultima domanda....
Ora che ho tutti i dati raccolti in tabelle di dati separate (fatto per velocizzare l'acquisizione dei dati) c'è un modo, senza dover salvare tutte le tabelle di dati, per eseguire una concatenazione su tutte le tabelle aperte in modo da poter eseguire più facilmente i dati analisi?
Posso già farlo salvando tutte le tabelle di dati e utilizzando JSL per concatenarle alla riapertura, ma sembra sciocco doverlo fare in questo modo.
Augurando a tutti voi un Felice Natale,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Penso che questo farà il trucco:
// Tabella di esempio: non è necessario eseguire questo passaggio se la tabella esiste già. Ma dovresti creare
// una variabile che punta ad essa.
wafer_dt = Nuova Tavola ( "Numeri di wafer" ,
Aggiungi righe ( 9 ) ,
Nuova Colonna ( "Numero wafer" ,
Carattere ,
Nominale ,
Imposta valori (
{ "XC6A49L410.1" , "XC6A49L411.1" , "XC6A49L412.1" , "XC6A49L413.1" ,
"XC6A49L414.1" , "XC6A49L415.1" , "XC6A49L416.1" , "XC6A49L417.1" ,
"XC6A49L418.1" }
)
)
) ;
// Ad esempio, se la tua tabella si chiama Wafer Numbers, questa istruzione assegnerà una variabile a quella tabella
// wafer_dt = tabella dati("Numeri Wafer");
// Memorizza i numeri dei wafer in un elenco
wafer_list = colonna ( wafer_dt , "Numero wafer" ) << ottenere valori ;
stringa_dsn = "DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;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;TSZ=8192;" ;
// Crea un'istruzione SQL in cui il numero di wafer è una variabile da sostituire durante il ciclo
istruzione_sql = evalinsert (
"\[ SELEZIONA WaferNR,WIPSTATUS
DA "DISCETTO"
WHERE WaferNR = '^one_wafer^']\" ) ;
// Crea una connessione al database
dbc = creare una connessione al database ( stringa_dsn ) ;
per ( io = 1 , io <= articoli ( wafer_list ) , io ++,
one_wafer = wafer_list [ io ] ;
// Assegna alla tabella lo stesso nome del wafer.Cambia in base alle tue esigenze
nome_tbl = one_wafer ;
// Recupera i dati per un wafer
dt = eseguire sql ( dbc , istruzione_sql , nome_tbl ) ;
) ;
// Ora che abbiamo finito di recuperare tutti i wafer in tabelle separate
// chiude la connessione al database
chiudere la connessione al database ( dbc ) ;
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ti manca chiaramente il messaggio E l'intento di ciò che ho detto.
Ad ogni modo, non c'è motivo per cui questo post sul forum debba essere più lungo del post di Ron Horne poiché si collega a un forum in cui ho già risolto questo problema passo dopo passo.
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Mi scuso MSHARP se ti ho offeso in un modo o nell'altro con la mia richiesta diretta di assistenza.
Come ho già affermato io stesso, purtroppo non sono un esperto di JSL ma sono riuscito a fare parecchio basandomi sui contenuti offerti da questa community.
In effetti ho frequentato un corso JMP JSL di 2 giorni, ma sfortunatamente, poiché è stato organizzato da un ufficio locale in Europa per un insegnante americano con un corso molto internazionale, ci sono stati molti problemi tecnici e si è perso molto tempo durante i 2 giorni, lasciando una buona parte del materiale e degli allenamenti non coperti.
Finora ho ricevuto un buon feedback da altri membri di questa comunità e sto infatti lavorando con JMP a un prossimo tutorial basato su un'area in cui ho più conoscenza ed esperienza.
In nessuna occasione ho rivendicato l'assistenza offerta dagli altri membri come opera mia. Sono stato aperto nell'affermare da dove proviene l'assistenza e quanto sia bello appartenere a un gruppo così solidale in cui è possibile scalare la curva di apprendimento più velocemente e più lontano che in altre comunità.
Posso solo sperare che altri condividano il mio sentimento e continuino a sostenere e insegnare ai meno capaci.
Cordiali saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Hai capito, vai a farlo.
Penso che tu abbia sbagliato approccio. Se hai bisogno che la comunità jmp ti fornisca manualmente il codice per il caso semplice, non c'è modo che tu possa implementarlo per il caso complicato. Sembra che tu abbia intrapreso un progetto molto al di sopra della tua testa.In tal caso, ti consiglio di leggere la Guida allo scripting o di seguire un corso.
Davvero, per ottenere il massimo da una comunità dovresti prima sviluppare tu stesso un codice; quindi, quando si blocca durante il debug o l'ottimizzazione, la community può aiutarti meglio a refactoring.Chiedere il codice direttamente in questo modo è poco più che plagio.
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao Eric, Ron e PMroz,
Grazie a tutti per il vostro contributo.
Sfortunatamente la mia competenza JSL non è a un livello tale da poter prendere tutti i tuoi input e costruire uno script funzionante.
Non sono stato in grado di accertare la logica e la sequenza dai tuoi 3 input. Sono ancora confuso, ma a un livello superiore
I miei sforzi stanno restituendo i dati solo per l'ultimo wafer nel mio elenco "wafers.jmp".
Che ne dici di prendere un esempio molto più semplice in modo che, almeno, non mi confonda.
Ho un elenco di wafer in un file denominato "wafers.jmp":
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
Devo raccogliere il WIPSTATUS dei wafer elencati utilizzando l'SQL appropriato:
SELEZIONA WaferNR,WIPSTATUS
DA "DISCETTO"
WHERE WaferNR = (tutti i wafer nell'elenco sopra)
Per fare questo ho bisogno di impostare la stringa di connessione:
"DSN=MEASdata;UID=USER;PWD=PASSWORD;DBQ=MDMANU.WORLD;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;TSZ=8192;"
Devo stabilire la variabile "wafer_id" '^WAFER_ID^' .........
impostare un ciclo per creare l'SQL richiesto che raccoglierà i dati richiesti, un wafer alla volta ........
apri la connessione al database...
eseguire l'SQL "mungato" ........
raccogliere tutti i dati in una tabella dati . ........
disconnettersi dal database ??
Usando il semplice esempio di cui sopra, voi ragazzi potreste aiutare nella costruzione di uno script che potrebbe essere testato in modo che io possa tentare di lavorare da solo sul caso più avanzato.
Distinti saluti,
Filippo
PS Tieni presente che questo è solo un semplice esempio di ciò che voglio fare, questa acquisizione di dati richiede millisecondi mentre il caso avanzato attualmente richiede da molte ore a possibilmente giorni poiché non ho la possibilità di estrarre dati per "un wafer alla volta tempo".
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Grazie Jeff per il tuo buon consiglio.
Questa particolare acquisizione di dati è davvero piuttosto impegnativa e richiede un'attenta pianificazione poiché i dati vengono recuperati da molte tabelle DB contenenti molti TB di dati.
3 dei nostri amministratori di database e 2 società esterne hanno lavorato alla sua ottimizzazione.
Da qui la ragione per cercare questo approccio "un wafer alla volta".
Questo approccio è stato recentemente dimostrato con successo, utilizzando lo stesso SQL di Denodo ma al momento non abbiamo Denodo s/w ancora disponibile.
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Se stai eseguendo molte istruzioni SQL in un ciclo, dovresti adottare un approccio diverso:
dbc = aprire la connessione al database ( "" ) ;
per ogni riga (
sql = ...
eseguire sql ( dbc , sql ) ;
) ;
chiudere la connessione al database ( dbc ) ;
In questo modo ti connetti al database solo una volta, il che può farti risparmiare un po' di tempo.
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Suggerirei anche, rispettosamente, di assicurarti che il tuo SQL sia ottimizzato in modo appropriato.
COME EricHill sottolinea che una query senza JOIN di solito si traduce in un prodotto cartesiano che corrisponde a ogni riga di ogni tabella con ogni riga di ogni altra tabella. Questo può richiedere molto tempo e risorse. Il codice di esempio che hai fornito non ha un JOIN. Se questo è rappresentativo del tuo codice effettivo, potrebbe valere la pena verificare se puoi migliorare SQL e JSL.
- Jeff
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao Eric,
Grazie per lo script che ho provato a modificare per l'SQL originale.
La lunga stringa SQL viene creata dall'elenco di wafer in wafers.jmp ma per qualche motivo sto ottenendo risultati solo da un wafer.
Anche se duplico più volte l'ID di un wafer, ottengo comunque solo il valore di un wafer oi risultati dei test.
Spero che la mia comprensione sia corretta...
Per prima cosa ho impostato il modello, come nel tuo esempio ....
Quindi ho impostato la directory predefinita in cui è memorizzato "wafers.jmp" .....
Metti in moto il ciclo.....
per ogni riga (
wafer_id = :WaferID;
sql = Eval Insert( sqlTemplate );
Stampa(sql);
);
Connettiti al database ed esegui sql ???
Apri banca dati(
"DSN=TESTING;UID=tepo;PWD=password;DBQ=Produzione;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;TSZ=8192;",
Eval Inserisci (sql)
);
;
È quest'ultima parte di cui non sono sicuro.
Tutte le idee, suggerimenti.
Sembra che siamo abbastanza vicini....
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Grazie Ron per il link.
Come nuovo arrivato in JMP e nello scripting, non capisco ancora completamente la logica, ma cercherò di capirlo.
Distinti saluti,
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Grazie per il suggerimento, Ron, che mi ha fatto risparmiare un po' di tempo.Quindi, utilizzando l'esempio indicato da Ron, ho inserito gli ID wafer di interesse in una tabella di dati denominata wafers.jmp, quindi ho scritto questo script:
sqlTemplate = "\[
SELEZIONARE
I.PRODOTTONR,
T.TESTUNITNR,
T. PUNTO DI MISURANR,
T.TEMPO DI CREAZIONE,
T.RESULT_PARAM1,
T.RESULT_PARAM2
DA
"ARTICOLI" D,
"TEST RISULTATI" T,
"TESTRESULTROWS" TRR,
"TESTROW" TR,
WHERE I.IDNR = T.IDNR
E T.TESTRESULTNR = TRR.TESTRESULTNR
E TRR.TESTROWIDNR = TR.TESTROWIDNR
E I.LOTIDNR = L.LOTIDNR
E T.VALIDITÀ = '1'
AND D.WAFERNR = '^wafer_id^'
AND (T.TESTUNITNR LIKE ('HENE%')
E TR.NOMEVARIABILE IN
( 'ACENUM',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
aprire ( "wafer.jmp" ) ;
per ogni riga (
wafer_id = : WaferID ;
sql = Inserisci valutazione ( sqlTemplate ) ;
Stampa (sql) ;
) ;
Ovviamente questo stampa solo l'SQL munged; puoi aggiungere il codice per inviare l'SQL al tuo database.
HTH,
Eric
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?CIAO jpol ,
Forse questo esempio può essere utile:
https://community.jmp.com/message/223900#223900
Ron
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ehi, Filippo,
Ok, scusa, volevo solo essere sicuro.Lavorerò su un esempio di looping.
Eric
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ciao Eric.
Grazie per il vostro interesse.
Come affermato, questo è un Sql fittizio che è molto più corto dell'originale.
Speravo di presentare il caso solo da una prospettiva JSL piuttosto che da SQL.
Rgds
Filippo
Ri: Come inserire un ciclo in SQL che viene utilizzato in uno script JSL?Ehi, Filippo,
Il looping è certamente possibile, ma prima di tutto: come scritto, la tua istruzione SQL genera un prodotto cartesiano, che potrebbe spiegare l'aumento esponenziale delle dimensioni.È necessario?
Eric